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

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

Литература

  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