Загрузка репозитория #
ПРЕДУПРЕЖДЕНИЕ
Библиотека собирается и предназначена ТОЛЬКО для одноплатных компьютеров Repka Pi.
Библиотека WiringRP доступна для загрузки из репозитория GitFlic. Перед загрузкой перейдите в каталог, который Вы планируете использовать для хранения проектов, например в Вашу домашнюю директорию /home/имя_пользователя/. Для загрузки библиотеки выполните следующие команды в терминале RepkaOS:
# Установка Git
sudo apt-get install git
# Переход в домашнюю директорию
cd ~
# Загрузка репозитория WiringRP
git clone https://gitflic.ru/project/repka_pi/wiring-repka.git
После окончания загрузки, в текущем каталоге появится папка wiring-repka, а в ней следующие каталоги:
-
driver- содержит исходный код драйвера repka_gpio. -
examples- содержит исходный код примеров использования библиотеки. -
wiringRP- содержит исходный код библиотеки.
Сборка #
Для сборки библиотеки WiringRP необходимо, находясь в текущем каталоге (в нашем случае это домашняя директория /home/имя_пользователя/), выполнить следующие команды в терминале RepkaOS:
# Установка утилиты cmake
sudo apt-get install cmake
# Переход в каталог библиотеки
cd wiring-repka
# Создание каталога build
mkdir build
# Переход в каталог build
cd build
# Формирование файлов сборки
cmake ..
# Сборка библиотеки
cmake --build .
После успешного завершения процесса сборки в текущей директории появятся следующие каталоги:
bin- содержит собранные примеры использования библиотеки WiringRP.lib- содержит файл статической библиотекиlibwiringrp.a.driver- содержит файл модуля ядраrepka_gpio.ko.
Загрузка модуля ядра repka_gpio #
Для безопасного управления контактами GPIO-разъема библиотека WiringRP использует собственный модуль ядра repka_gpio. Для его активации необходимо перейти в каталог с собранным модулем ядра (в нашем случае это /home/имя_пользователя/wiring-repka/build/driver/) и выполнить следующие команды в терминале Repka OS:
# Переход в каталог модуля ядра
cd ~/wiring-repka/build/driver/
# Загрузка модуля ядра
insmod repka_gpio.ko
После чего необходимо убедиться, что модуль ядра загрузился:
lsmod | grep repka_gpio
После выполнения данной команды, в случае успешной загрузки, мы увидим следующее:
root@Repka-Pi:~/wiring-repka/build/driver# lsmod | grep repka_gpio
repka_gpio 12288 0
После успешной загрузки модуля ядра будут созданы следующие символьные устройства:
- Для Repka Pi 3 и Repka Pi 4:
/dev/repka_gpio0и/dev/repka_gpio1. - Для Repka Pi 5:
/dev/repka_gpio0,/dev/repka_gpio1,/dev/repka_gpio2,/dev/repka_gpio3и/dev/repka_gpio4./dev/repka_pmu1и/dev/repka_pmu2./dev/repka_bus./dev/repka_vccio1_4,/dev/repka_vccio3_5,/dev/repka_vccio2и/dev/repka_vccio6./dev/repka_emmc.
Теперь необходимо установить права доступа для символьных устройств, используемых библиотекой WiringRP:
# Символьные устройства, созданные модулем ядра repka_gpio, и периферийные интерфейсы Repka Pi 3.
for dev in \
/dev/repka_gpio* \
/dev/gpiochip* \
/dev/ttyS{0,2,3} \
/dev/i2c-{1,2} \
/dev/spidev{0.0,1.0}
do
if [ -c "$dev" ]; then
sudo chmod 666 "$dev"
fi
done
# Символьные устройства, созданные модулем ядра repka_gpio, и периферийные интерфейсы Repka Pi 4.
for dev in \
/dev/repka_gpio* \
/dev/gpiochip* \
/dev/ttyS{0,2,3} \
/dev/i2c-{1,2,3} \
/dev/spidev0.0
do
if [ -c "$dev" ]; then
sudo chmod 666 "$dev"
fi
done
# Символьные устройства, созданные модулем ядра repka_gpio, и периферийные интерфейсы Repka Pi 5.
for dev in \
/dev/repka_gpio* \
/dev/repka_pmu{1,2} \
/dev/repka_bus \
/dev/repka_vccio{1_4,3_5,2,6} \
/dev/repka_emmc \
/dev/gpiochip* \
/dev/ttyS{0,1} \
/dev/i2c-{2,4,5,7,8} \
/dev/spidev{0.0,0.1,3.0}
do
if [ -c "$dev" ]; then
sudo chmod 666 "$dev"
fi
done
После завершения работы Repka OS модуль ядра repka_gpio выгрузится автоматически.
ПРЕДУПРЕЖДЕНИЕ
При запуске Repka OS автоматическая загрузка модуля ядра не осуществляется.
Для работы с библиотекой WiringRP с помощью модуля ядра repka_gpio после запуска системы необходимо выполнить загрузку модуля ядра вручную или настроить его автозапуск.
Разработка программ #
Попробуем создать собственную программу, которая будет управлять логическим уровнем сигнала на контакте GPIO-разъема.
Создаем каталог проекта в любом удобном для Вас месте, например в Вашей домашней директории:
# переход в домашнюю директорию
cd ~
# создание каталога проекта
mkdir awesome-project
# переход в каталог проекта
cd awesome-project
После того как мы перешли в созданный каталог проекта, необходимо скопировать сюда заголовочный файл библиотеки и собранную библиотеку (пути могут отличаться - будьте внимательны):
# копирование заголовочного файла библиотеки в каталог проекта
cp ~/wiring-repka/wiringRP/wiringRP.h .
# копирование файла библиотеки в каталог проекта
cp ~/wiring-repka/build/lib/libwiringrp.a .
Теперь, находясь в каталоге проекта, создадим файл awesome-program.c с нашей программой, который будет содержать следующее:
#include <stdlib.h>
#include "wiringRP.h"
// Глобальные переменные и константы
const int LED = 8; // Контакт PA8 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP.
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
digitalWrite(LED, HIGH); // Вывод на контакт GPIO-разъема логической "1"
delay(1000);
digitalWrite(LED, LOW); // Вывод на контакт GPIO-разъема логического "0"
delay(500);
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
// Завершение работы библиотек
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
// Глобальные переменные и константы
const int LED = 111; // Контакт PD15 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
digitalWrite(LED, HIGH); // Подача на контакт GPIO-разъема логической "1"
delay(1000);
digitalWrite(LED, LOW); // Подача на контакт GPIO-разъема логического "0"
delay(500);
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
// Завершение работы библиотек
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
#include <stdlib.h>
#include "wiringRP.h"
// Глобальные переменные и константы
const int LED = 117; // Контакт GPIO3_C5 GPIO-разъема
void setup() {
// Инициализация библиотеки WiringRP
// Используется режим нумерации SUNXI
if (setupWiringRP(WRP_MODE_SUNXI) < 0) {
goto error;
}
// Инициализация пользовательских объектов
if (pinMode(LED, OUTPUT) < 0) {
goto error;
}
return;
error:
onClose(2);
}
void loop() {
// Основной цикл программы
digitalWrite(LED, HIGH); // Подача на контакт GPIO-разъема логической "1"
delay(1000);
digitalWrite(LED, LOW); // Подача на контакт GPIO-разъема логического "0"
delay(500);
}
ONDESTROY() {
// Освобождение занятых ресурсов, выключение напряжения на пинах
digitalWrite(LED, LOW);
pinMode(LED, DISABLE);
// Завершение работы библиотек
releaseWiringRP();
// Выход из программы
exit(0);
}
MAIN_WIRINGRP();
После чего выполним сборку и запуск нашей программы:
gcc awesome-program.c -L./ -lwiringrp -o awesome-program
./awesome-program
Наша программа работает!
Также можно воспользоваться шаблоном для упрощения написания программ. Вы можете использовать стандартный шаблон examples/template.c или examples/template_adv.c, если программа не укладывается в парадигму, используемую в стандартном шаблоне.
Подключение библиотек #
При работе с периферийными интерфейсами Repka Pi и другими расширенными возможностями библиотеки WiringRP, в Вашу программу может понадобиться подключить заголовочные файлы библиотек.
Для каждой подключаемой пользователем библиотеки необходимо:
- Скопировать заголовочный файл библиотеки в каталог пользовательской программы.
- Подключить заголовочный файл в пользовательскую программу с помощью инструкции
#include.
Например, Ваша цель — использовать функции для работы с SPI-интерфейсами в своей программе. Для этого требуется подключить заголовочный файл библиотеки spi.h.
Для того чтобы это сделать, необходимо перейти в каталог Вашего проекта (в нашем случае это ~/awesome-project) и выполнить следующую команду в терминале Repka OS:
ПРЕДУПРЕЖДЕНИЕ
Заголовочные файлы библиотеки WiringRP находятся в дочернем каталоге wiring-repka/wiringRP. В данном примере подразумевается, что библиотека WiringRP расположена в домашней директории пользователя ~/.
Перед выполнением следующей команды, пожалуйста, убедитесь что Вы указали правильный путь к заголовочному файлу библиотеки!
# копирование заголовочного файла библиотеки WiringRP для работы с SPI-интерфейсами в каталог пользовательской программы
cp ~/wiring-repka/wiringRP/spi.h .
А в файле Вашей программы (в нашем случае это awesome-program.c) необходимо в самом начале файла подключить библиотеку с помощью инструкции #include “spi.h“:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include "wiringRP.h"
// Подключение библиотеки работы с SPI-интерфейсами
#include "spi.h"
// Глобальные переменные и константы
// ...
// Пользовательский код
// ...