
В публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod познакомились с библиотекой Libgpiod, разработанной Bartosz Golaszewski. Библиотека позволяет управлять контактами GPIO одноплатного компьютера, подавать 1/0, подписываться на события (необходимо для обработки прерывания кнопки), и т.д. В отличие от множества библиотек для Raspberry Pi, Libgpiod не заточена под конкретные процессоры и работает на различных архитектурных платформах: ARMv7, ARM64, AMD64. Но компиляция библиотеки из исходного кода, в зависимости от дистрибутива может приводить к тем или иным сложностям. Поэтому в дополнение и для создание Docker-контейнеров c .NET приложениями, были собраны контейнеры на базе ОС Alpine и Ubuntu 20.04 LTS (Focal Fossa) содержащие библиотеку Libgpiod вместе с утилитами для управления GPIO.
- Docker-контейнер devdotnetorg/libgpiod содержит в себе файлы библиотеки *.so и все сопутствующие утилиты: gpiodetect, gpioinfo, gpioget, gpioset, gpiofind, gpiomon.
- Репозиторий на 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
Соответственно, доступ к данным устройствам необходимо передать контейнеру 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 для ARMv7, то вызов команды необходимо изменить на следующий:
$ docker run --rm --name test-libgpiod --device /dev/gpiochip0 --device /dev/gpiochip1 --device /dev/gpiochip2 devdotnetorg/libgpiod:1.6.3-focal-armhf gpiodetect
В публикации Управляем контактами 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 1 36=1
В результате светодиод включится.
Утилиты gpioinfo, gpioget, gpiofind, gpiomon, вызываются как и в примерах выше.
Bash-cкрипты установки библиотеки для Armbian/Ubuntu
Можно установить библиотеку Libgpiod и из исходного кода с помощью bash-скрипта setup-libgpiod-armv7-and-arm64.sh, более подробно в публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod. Изменения касаются только перемещения bash-скриптов из репозитория devdotnetorg/dotnet-libgpiod-linux в devdotnetorg/docker-libgpiod. Репозиторий devdotnetorg/dotnet-libgpiod-linux переведен в режим Read-only, и все обновления будут только в репозитории devdotnetorg/docker-libgpiod.
Docker Hub — контейнер с библиотекой Libgpiod devdotnetorg/libgpiod.
GitHub — файлы Dockerfile devdotnetorg/docker-libgpiod.