Начало работы с WiringRP

Загрузка репозитория #

ПРЕДУПРЕЖДЕНИЕ

Библиотека собирается и предназначена ТОЛЬКО для одноплатных компьютеров 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, а в ней следующие каталоги:

  1. driver - содержит исходный код драйвера repka_gpio.

  2. examples - содержит исходный код примеров использования библиотеки.

  3. wiringRP - содержит исходный код библиотеки.

Сборка #

Для сборки библиотеки WiringRP необходимо, находясь в текущем каталоге (в нашем случае это домашняя директория /home/имя_пользователя/), выполнить следующие команды в терминале RepkaOS:

# Установка утилиты cmake
sudo apt-get install cmake
# Переход в каталог библиотеки
cd wiring-repka
# Создание каталога build
mkdir build
# Переход в каталог build
cd build
# Формирование файлов сборки
cmake ..
# Сборка библиотеки
cmake --build .

После успешного завершения процесса сборки в текущей директории появятся следующие каталоги:

  1. bin - содержит собранные примеры использования библиотеки WiringRP.
  2. lib - содержит файл статической библиотеки libwiringrp.a.
  3. 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 после запуска системы необходимо выполнить загрузку модуля ядра вручную или настроить его автозапуск.

Подробнее о загрузке модуля ядра 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, в Вашу программу может понадобиться подключить заголовочные файлы библиотек.

Для каждой подключаемой пользователем библиотеки необходимо:

  1. Скопировать заголовочный файл библиотеки в каталог пользовательской программы.
  2. Подключить заголовочный файл в пользовательскую программу с помощью инструкции #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"

// Глобальные переменные и константы
// ...

// Пользовательский код
// ...

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

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

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

Навигация

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