tolst0v
tolst0v
17 просмотров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
    
  2. После чего установится 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();
    
  3. После чего необходимо собрать пример и запустить:

    gcc -o blink <example-name>.c -lwiringrp
    
    ./blink
    

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

  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
    

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

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

Навигация

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