Что это за библиотека? #
WiringRP — это специализированная библиотека для работы с GPIO и периферийными интерфейсами на одноплатном компьютере Repka Pi. Она разработана как облегчённая и адаптированная реализация известных библиотек WiringPi и WiringOP, но реализована исключительно для одноплатного компьютера Repka Pi.
WiringRP позволяет:
- Управлять GPIO-пинами: настраивать направление (вход/выход), читать и записывать значения.
- Использовать знакомые интерфейсы и стиль программирования, аналогичный WiringPi.
- Писать простые C-программы для управления светодиодами, кнопками, датчиками и другим оборудованием.
Отвечая на вопрос, для чего использовать библиотеку WiringRP, стоит сказать о следующих ее преимуществах:
- Упрощает доступ к аппаратным возможностям платы Repka Pi.
- Позволяет использовать код и примеры, знакомые по Raspberry Pi.
- Не требует глубоких знаний MMIO или структуры регистров SoC.
Изначально WiringRP была разработана специально для Repka Pi 3, чтобы упростить управление GPIO без необходимости работать напрямую с регистрами. С выпуском Repka Pi 4 многие пользователи активно просили добавить поддержку новой модели. Мы услышали эти запросы — и теперь постепенно занимаемся портированием ее для Repka Pi 4, с учётом обновлённой аппаратной архитектуры и адресации периферии.
Какой функционал портирован? #
На момент написания этого поста, в библиотеку WiringRP для Repka Pi 4 успешно портированы два ключевых компонента:
-
Взаимодействие с GPIO-портами
-
Поддержка прерываний от пинов
Что такое GPIO? #
GPIO (General Purpose Input/Output) — это универсальные цифровые пины, которые можно программно настроить как вход или выход. Через них плата может:
-
Управлять внешними устройствами (например, зажигать светодиоды, управлять реле),
-
Принимать сигналы от кнопок, датчиков, переключателей.
Пример использования в WiringRP
:
pinMode(LED_1, OUTPUT); // Настройка пина как выход
digitalWrite(LED_1, HIGH); // Включение светодиода
Этот механизм реализован через регистры SoC и обёрнут в удобные функции, позволяющие писать компактный и понятный код.
Что такое прерывания? #
Прерывания позволяют реагировать на события сразу в момент их возникновения, а не проверять состояние пина вручную в цикле.
Например, когда пользователь нажимает кнопку, срабатывает функция-обработчик:
interruptCreate(BUTTON_1, pushButton1);
При нажатии кнопки вызывается pushButton1()
, которая может, например, переключить светодиод. Это значительно экономит ресурсы процессора и упрощает архитектуру программ.
Пример обработчика:
void pushButton1(__u32 event, __u64 time) {
if (event && digitalRead(BUTTON_1))
LED_1_ON = !LED_1_ON; // Переключаем состояние
}
Какие планы? #
С портированием GPIO и прерываний, WiringRP на Repka Pi 4 уже позволяет реализовывать полноценные проекты: от мигающих светодиодов до интерактивных устройств с кнопками и датчиками.
Но этого недостаточно, чтобы сделать библиотеку по-настоящему ценной, поэтому в ближайшее время планируется реализовать портирование следующего:
- Аппаратный и программный PWM
- Интерфейс SPI
- Интерфейс I²C (Wire)
- Последовательный порт UART
Изначально мы вдохновлялись решениями, которые есть в WiringOP и WiringPi, но со временем обнаружили некоторые существенные недостатки. Поэтому пришло время пойти иным (своим) путем в развитии данной библиотеки. В ближайшее время мы планируем достаточно серьезный пересмотр архитектуры библиотеки, что позволит сделать ее по-настоящему надежной и невероятно эффективной.
Откуда скачать WiringRP и как установить? #
Скачать актуальную версию библиотеки можно в списке релизов в нашем официальном репозитории WiringRP на GitFlic - вот ссылка.
Установка Deb-пакета #
В случае если вы скачали deb-пакет, установка выглядит следующим образом:
-
Необходимо установить deb-пакет с помощью команды:
dpkg --install <archive_name>.deb
-
После чего установится deb-пакет и вам будет доступна библиотека WiringRP. Можно проверить ее работу с помощью следующего простого примера, который мигает светодиодом:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include "wiringrp/wiringRP.h" // Глобальные переменные и константы const int LED_1 = 360; void setup() { // Инициализация библиотек wiringRP if(setupWiringRP(WRP_MODE_SUNXI) < 0) exit(EXIT_FAILURE); // Инициализация пользовательских объектов pinMode(LED_1, OUTPUT); } void loop() { // Основной цикл программы digitalWrite(LED_1, HIGH); delay(1000); digitalWrite(LED_1, LOW); delay(500); } ONDESTROY(){ // Освобождение занятых ресурсов, выключение напряжения на пинах digitalWrite(LED_1, LOW); pinMode(LED_1, DISABLE); // Завершение работы библиотек releaseWiringRP(); exit(0); // выход из программы } MAIN_WIRINGRP();
-
После чего необходимо собрать пример и запустить:
gcc -o blink <example-name>.c -lwiringrp
./blink
Сборка из исходного кода #
-
После распаковки zip-архива с исходным кодом перейдем в распакованную директорию и выполним следующие команды:
mkdir build cd build cmake .. make
-
После чего будет собрана библиотека, а также драйвер repka_gpio, который позволяет взаимодействовать с портами GPIO через символические устройства /dev/repka_gpio0 и /dev/repka_gpio1, вместо /dev/mem. Такой механизм позволяет обезопасить нас от случайной записи не в тот сегмент оперативной памяти. Для установки драйвера необходимо сделать следующее:
mkdir /lib/modules/6.12.9/extra/ cp driver/repka_gpio.ko /lib/modules/6.12.9/extra/ depmod reboot