Загрузка репозитория #
ПРЕДУПРЕЖДЕНИЕ
Библиотека собирается и предназначена только для одноплатных компьютеров Repka Pi.
Библиотека WiringPI доступна для загрузки из репозитория 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:
cd wiring-repka
mkdir build
cd build
cmake ..
cmake --build .
После успешного завершения процесса сборки в текущей директории появятся следующие каталоги:
bin- содержит собранные примеры использования библиотеки WiringRP.lib- содержит файл статической библиотекиlibwiringrp.a.driver- содержит файлы модуля ядраrepka_gpio.ko.
Загрузка модуля ядра repka_gpio #
Для версии платы Repka Pi 5, данный модуль используется библиотекой WiringRP для получения безопасного доступа к контактам GPIO-разъема. Он собирается отдельно в каталоге driver с помощью cmake. Для его включения необходимо перейти в каталог с собранным драйвером (в нашем случае это /home/имя_пользователя/wiring-repka/build/driver/) и выполнить следующие команды в терминале RepkaOS:
# переход в каталог модуля ядра
cd ~/wiring-repka/build/driver/
# установка модуля ядра
insmod repka_gpio.ko
# установка прав доступа для символьных устройств
chmod 666 /dev/repka_gpio*
chmod 666 /dev/gpiochip*
chmod 666 /dev/ttyS0
chmod 666 /dev/ttyS2
chmod 666 /dev/ttyS3
chmod 666 /dev/i2c-1
chmod 666 /dev/i2c-2
chmod 666 /dev/spidev0.0
chmod 666 /dev/spidev1.0
После чего, необходимо убедиться, что модуль ядра загрузился:
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.
После завершения работы ОС модуль ядра repka_gpio выгрузится автоматически.
ПРЕДУПРЕЖДЕНИЕ
При запуске ОС автоматическая загрузка драйвера не осуществляется.
Для работы с библиотекой WiringRP с помощью модуля ядра repka_gpio, после каждого запуска системы необходимо выполнять загрузку драйвера вручную или настроить его автозапуск.
Разработка программ #
Попробуем создать собственную программу, которая будет управлять напряжением GPIO-контакта 111 на Repka Pi 4 (аналогичную программу можно сделать на Repka Pi 3 и Repka Pi5, но номера контактов 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 <stdio.h>
#include <stdlib.h>
#include <stdbool.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 <stdio.h>
#include <stdlib.h>
#include <stdbool.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 <stdio.h>
#include <stdlib.h>
#include <stdbool.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, если программа не укладывается в парадигму, используемую в стандартном шаблоне.