Управляем контактами GPIO в Linux из Docker-контейнера библиотекой Libgpiod

В публикации Работа с 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.

Литература

  1. Libgpiod/libgpiod.git — Bartosz Golaszewski git.kernel.org
  2. About libgpiod — Bartosz Golaszewski git.kernel.org
  3. Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod
  4. Управляем контактами GPIO из C# .NET

Вам также может понравиться

About the Author: Anton

Programistik