tolst0v
tolst0v
191 просмотров0 комментариев

WiringRP частично портирована на Repka Pi 4

Что это за библиотека? #

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-пакет, установка выглядит следующим образом:

  1. Необходимо установить deb-пакет с помощью команды:

    dpkg --install <archive_name>.deb
    

Сборка из исходного кода #

  1. После распаковки zip-архива с исходным кодом перейдем в распакованную директорию и выполним следующие команды:

    mkdir build
    cd build
    cmake ..
    make
    
  2. После чего будет собрана библиотека, а также драйвер 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
    

Проверим на примере #

Для проверки работоспособности библиотеки мы будем использовать простой пример с миганием светодиода. Мы должны понимать, что мигание светодиода - это смена логического уровня на одном из GPIO-пинов. Чтобы увидеть, как светодиод мигает мы воспользуемся замечательной платой для тестирования GPIO-пинов “PI ALL GPIO TEST BOARD“.

Также для проверки напишем простенький пример (я его назову blink.c) с миганием светодиода. Будем использовать GPIO-пин под номером 360, он же PL8, он же 32:

#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:

gcc -o blink blink.c -lwiringrp

А теперь запустим:

./blink

После запуска мы увидим, что светодиод загорается на одну секунду с промежутком в полсекунды.


Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Темы

Навигация

ВойтиРегистрация