
В публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod познакомились с библиотекой Libgpiod, разработанной Bartosz Golaszewski. Библиотека позволяет управлять контактами GPIO одноплатного компьютера, подавать 1/0, подписываться на события (необходимо для обработки прерывания кнопки), и т.д. В отличие от множества библиотек для Raspberry Pi, Libgpiod не заточена под конкретные процессоры и работает на различных архитектурных платформах: ARMv7, ARM64, AMD64, RISC-V. Но компиляция библиотеки из исходного кода, в зависимости от дистрибутива может приводить к тем или иным сложностям и «замусоривает» систему лишними пакетами . Поэтому в дополнение и для создание Docker-контейнеров c .NET приложениями, были собраны контейнеры на базе ОС Alpine и Ubuntu содержащие библиотеку Libgpiod вместе с утилитами для управления GPIO.
- Docker-контейнер devdotnetorg/libgpiod содержит в себе файлы библиотеки *.so и все сопутствующие утилиты: gpiodetect, gpioinfo, gpioget, gpioset, gpiomon, gpionotify.
- Репозиторий на GitHub — devdotnetorg/docker-libgpiod.
Устройства /dev/gpiochip*
Доступ к контактам GPIO осуществляется через устройства /dev/gpiochipX . Для просмотра доступных устройств на одноплатном компьютере, необходимо выполнить команду:
$ ls /dev/gpiochip*
Результат выполнения команды:
root@bananapim64:~# ls /dev/gpiochip* /dev/gpiochip0 /dev/gpiochip1 /dev/gpiochip2
Использование Docker-контейнера devdotnetorg/libgpiod с библиотекой и утилитами Libgpiod
В отличие от нативного запуска утилит libgpiod, доступ к данным устройствам необходимо передать контейнеру devdotnetorg/libgpiod. Предоставим доступ ко всем доступным устройствам /dev/gpiochipX и выполним команду gpiodetect. Утилита gpiodetect выведет список всех чипов GPIO, их метки и количество линий. Команда будет выглядеть следующим образом:
$ docker run --rm --name test-libgpiod --device /dev/gpiochip0 --device /dev/gpiochip1 --device /dev/gpiochip2 devdotnetorg/libgpiod gpiodetect
где «—device /dev/gpiochip0» — доступ к устройству, gpiodetect — название утилиты вызываемой из контейнера.
Результат выполнения команды:
root@bananapim64:~# docker run --rm --name test-libgpiod --device /dev/gpiochip0 --device /dev/gpiochip1 --device /dev/gpiochip2 devdotnetorg/libgpiod gpiodetect gpiochip0 [1f02c00.pinctrl] (32 lines) gpiochip1 [1c20800.pinctrl] (256 lines) gpiochip2 [axp20x-gpio] (2 lines)
Если необходимо использовать специальный образ Docker контейнера собранный на базе Ubuntu, то вызов команды необходимо изменить на следующий:
$ docker run --rm --name test-libgpiod --device /dev/gpiochip0 --device /dev/gpiochip1 --device /dev/gpiochip2 devdotnetorg/libgpiod:2.0.2-ubuntu-22.04 gpiodetect
Собранные контейнеры являются мультиплатформенными за исключением архитектуры RISC-V. Контейнеры для платформы RISC-V содержат в название окончание «*-riscv64», например 2.0.2-riscv64, 2.0.2-alpine-riscv64, 2.0.2-ubuntu-riscv64.
В публикации Управляем контактами GPIO из C# .NET 5, кнопка и светодиод располагались в устройстве /dev/gpiochip1 , поэтому достаточно предоставить доступ только к данному устройству. Повторим выполнение команды gpiodetect, но только предоставляя доступ к /dev/gpiochip1 , команда:
$ docker run --rm --name test-libgpiod --device /dev/gpiochip1 devdotnetorg/libgpiod gpiodetect
Результат выполнения команды:
root@bananapim64:~# docker run --rm --name test-libgpiod --device /dev/gpiochip1 devdotnetorg/libgpiod gpiodetect gpiochip1 [1c20800.pinctrl] (256 lines)
Команда выполнена успешно.
С точки зрения безопасности, исполнения кода в окружение Docker-контейнера существенно уменьшает поверхность вектора атак, из-за предоставления доступа только к тем устройствам, которые необходимы для работы приложения.
Теперь как и в публикации Управляем контактами GPIO из C# .NET 5 включим светодиод на 36 контакте, выставим значение «1», команда:
$ docker run --rm --name test-libgpiod --device /dev/gpiochip1 devdotnetorg/libgpiod gpioset --chip 1 36=1
В результате светодиод включится.
Утилиты gpioinfo, gpioget, gpiofind, gpiomon, gpionotify, вызываются как и в примерах выше.
Bash-cкрипты установки библиотеки для Armbian/Ubuntu/Debian
Установка библиотеки Libgpiod доступна из исходного кода и бинарных файлов, с помощью bash-скрипта setup-libgpiod.sh, более подробно в публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod.
Docker Hub — контейнер с библиотекой Libgpiod devdotnetorg/libgpiod.
GitHub — файлы Dockerfile devdotnetorg/docker-libgpiod.