Управление контактами GPIO в Linux на C# .NET IoT, уже было рассмотрено в публикации Управляем контактами GPIO из C# .NET 5 в Linux. Дабы не повторятся желательно ознакомится с выше указанной публикацией. Но для работы с GPIO в .NET IoT необходимо разобраться с нумерацией ножек процессора и иметь в наличие как минимум светодиод. Но что делать если на руках только одноплатный компьютер? В большинстве случаев на плате компьютера распаяны светодиоды, которые подключены к контроллеру GPIO (gpiochip). Таким образом, данные светодиоды доступны для управления из C# .NET IoT. В зависимости от дистрибутива, светодиоды могут быть задействованы в ОС как устройства, которые необходимо выключить в конфигурации дерева устройств Linux. На плате Banana Pi BPI-M64 размещено три светодиода красного, зеленого и синего цвета. Красный светодиод занят под функцию индикации подачи электропитания. Два остальных светодиода доступны для любых задач. Будем управлять встроенным синим светодиодом из .NET кода.
Оглавление
- Постановка задачи
- Светодиоды RED, GREEN, BLUE на плате Banana Pi BPI-M64
- Выяснение линий GPIO для светодиодов
- Файл наложения устройств DTS для отключения устройства
- Проверка управления синим светодиодом на GPIO143
- Подготовка устройства
- Подготовка среды запуска (ПК)
- Управление светодиодом (LED) в Linux из .NET кода
- Литература
Постановка задачи
Реализовать программу(blink) мигания светодиодом на C# .NET IoT использую библиотеку Libgpiod. Будет использован синий светодиод из доступных на самой плате Banana Pi BPI-M64. Т.к. светодиод задействован в дереве устройств (device tree) Linux, то необходимо создать файл DTS для освобождения назначенной функции.
- Плата Banana Pi BPI-M64 установлена версия Armbian_21.02.1_Bananapim64_bionic_current_5.10.12_minimal.img.xz, основана на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux bananapim64 5.10.12-sunxi64 #21.02.1 SMP Wed Feb 3 20:42:58 CET 2021 aarch64 aarch64 aarch64 GNU/Linux.
Светодиоды RED, GREEN, BLUE на плате Banana Pi BPI-M64
Светодиоды красный, зеленый, синий, располагаются на плате Banana Pi BPI-M64, возле 40-контактного разъема совместимого с Raspberry Pi 3. Управлять светодиодами можно используя виртуальную файловую систему Sysfs.
Светодиоды красный, зеленый, синий на Banana Pi BPI-M64. Красный светодиод — индикация электропитание, состояние включено.
Перейдем по пути /sys/class/leds/ и посмотрим содержимое каталога:
root@bananapim64:~# cd /sys/class/leds/ root@bananapim64:/sys/class/leds# ls bananapi-m64:blue:user bananapi-m64:green:user bananapi-m64:red:pwr root@bananapim64:/sys/class/leds#
В каталоге будут доступны светодиоды с именами:
- bananapi-m64:blue:user
- bananapi-m64:green:user
- bananapi-m64:red:pwr
Для включения синего светодиода с именем «bananapi-m64:blue:user» необходимо выполнить команду:
echo 1 > /sys/class/leds/bananapi-m64:blue:user/brightness
В результате выполнения команды синий светодиод включится.
Включен синий светодиод на плате Banana Pi BPI-M64
Более подробно о LED в публикации Работа с GPIO в Linux на примере Banana Pi BPI-M64. Часть 3. Device Tree overlays. LED, ШИМ (PWM), КНОПКА раздел LED (светодиод).
Выяснение линий GPIO для светодиодов
Для управления светодиодом необходимо знать его номер GPIOXX в контроллере GPIO(gpiochip). Существует три варианта решения этой задачи (перечислены в порядке увеличения сложности):
Способ 1. Просмотр раздела DEBUG в Sysfs
Список задействованных контактов и контроллеров GPIO можно узнать выполнив команду:
cat /sys/kernel/debug/gpio
Результат выполнения команды:
Исходя из полученных данных следует, что все светодиоды располагаются в контроллере — gpiochip1, номера контактов:
Номер контакта | Метка линии |
gpio-120 | bananapi-m64:red:pwr |
gpio-142 | bananapi-m64:green:user |
gpio-143 | bananapi-m64:blue:user |
Синий светодиод подключен к gpio-143 в GPIO контроллере gpiochip1.
Способ 2. Используя утилиту gpioinfo из библиотеки Libgpiod
Для управления контактами GPIO из .NET все равно потребуется установить библиотеку Libgpiod. Установка и работа с Libgpiod в публикации Работа с GPIO в Linux. Часть 6. Библиотека Libgpiod. Утилита gpioinfo выводит информацию о линиях GPIO всех доступных контроллеров GPIO. В таблице вывода по колонкам будет указано: номер линии, название контакта, направление ввода/вывода, текущее состояние. Для получения номера линии GPIO синего светодиода выполним команду:
gpioinfo
Результат выполнения команды:
Исходя из полученных данных следует, что синий светодиод находится на линии 143, т.е. GPIO143, в GPIO контроллере gpiochip1.
Способ 3. Чтение datasheet к плате Banana Pi BPI-M64
Это самый сложный вариант, который требует понимания схем datasheet. В документе banana pi BPI-M64-V1_1-Release 201609.pdf на странице GPIO-IR-KEY-LED (page 10), указанна схема подключения светодиодов LED0, LED1, LED3. Далее на странице CPU (page 2), указано следующее:
- LED0 подключен к ножке процессора PD24
- LED1 подключен к ножке процессора PE14
- LED2 подключен к ножке процессора PE15
Datasheet к плате Banana Pi BPI-M64
Используя формулу вычисления номера GPIO — (позиция буквы в алфавите — 1) * 32 + позиция вывода (более подробно в пункте Формула для вычисления номера GPIOXX). Получаем следующие результаты:
- LED0 = (4 — 1) * 32 + 24 = 120
- LED1 = (5 — 1) * 32 + 14 = 142
- LED2 = (5 — 1) * 32 + 15 = 143
К сожалению из datasheet нельзя сказать к какому из gpio-120, gpio-142, gpio-143, подключен синий светодиод, выручит только простой последовательный перебор.
Файл наложения устройств DTS для отключения устройства «gpio-leds»
Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.
Самое сложное при формирование файла dts заключается в нахождение нужного узла, в который необходимо вставить единственную строку status = «disabled».
Для поиска необходимого узла выполним декомпиляцию DT (основное дерево устройств) в читаемый вид формата DTS (исходный файл для дерева устройств). Файл DTD платы Banana Pi BPI-M64 — sun50i-a64-bananapi-m64.dtb. Из него получим файл DTS, командой:
dtc -I dtb -O dts /boot/dtb/allwinner/sun50i-a64-bananapi-m64.dtb -o /boot/dtb/allwinner/sun50i-a64-bananapi-m64.dts
Теперь рассмотрим полученный файл sun50i-a64-bananapi-m64.dts.
Фрагмент узла /leds/, файл sun50i-a64-bananapi-m64.dts
Узел синего светодиода blue располагается в по пути /leds/, в этот узел необходимо добавить строку status = «disabled»;
Создадим файл DTS с названием sun50i-a64-led-blue-disabled.dts:
/dts-v1/; /plugin/; / { compatible = "allwinner,sun50i-a64"; fragment@0 { target-path = "/leds/"; __overlay__ { blue { //turn off the device status = "disabled"; }; }; }; };
Рассмотрим параметры:
- target-path — путь по которому будет вставлен фрагмент fragment@0;
- status — значение «disabled» выключает данное устройство.
Разместим файл по пути /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:
$ dtc -O dtb -o sun50i-a64-led-blue-disabled.dtbo sun50i-a64-led-blue-disabled.dts
Запустим утилиту конфигурирования платы: armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): led-blue-disabled. После перезагрузки платы, устройство gpio-leds по пути /leds/blue будет выключено.
Проверка управления синим светодиодом на GPIO143
После перезагрузки необходимо убедится в доступности GPIO143 для использования из пользовательского пространства (userspace). Выполним команду, которую уже выполняли выше Способ 1. Просмотр раздела DEBUG в Sysfs) и включим светодиод командой gpioset
Результат выполнения команды:
В таблице линия GPIO143 не отобразилась, значит, она не используется ОС или каким либо приложением. С помощью команды gpioset, подали логическую «1» на линию 143 контроллера GPIO 1. Светодиод включился, каких либо сообщений об ошибке не было. В случае занятости линии утилита gpioset вывела бы сообщение об использование линии. Теперь переходим к .NET коду.
Подготовка устройства
На плате Banana Pi BPI-M64 должна быть установлена платформа .NET Runtime 5.0 и отладчик vsdbg, как это сделать указано в публикации Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux).
Подготовка среды запуска (ПК)
Отладку будем запускать из среды Visual Studio Code на ПК под ОС Windows 7. Как установить и настроить среду в публикации Создание первого приложения на .NET 5.0 в Visual Studio Code для ARM.
Управление светодиодом (LED) в Linux из .NET кода
Создадим .NET 5.0 консольное приложение — dotnet-iot-blink. Добавим Nuget-пакет System.Device.Gpio. В качестве основы возьмем пример Blink an LED.
Разместим в Program.cs следующий программный код, который будет включать, и выключать светодиод с интервалом в 1 секунду:
using System; using System.Device.Gpio; using System.Device.Gpio.Drivers; using System.Threading; namespace dotnet_iot_blink { class Program { static void Main(string[] args) { Console.WriteLine("Blinking LED."); //for Linux const int GPIOCHIP = 1; const int LED_PIN = 143; //GPIO143 - bananapi-m64:blue. Board: Banana Pi BPI-M64 GpioController controller; var drvGpio = new LibGpiodDriver(GPIOCHIP); controller = new GpioController(PinNumberingScheme.Logical, drvGpio); // controller.OpenPin(LED_PIN, PinMode.Output); bool ledOn = true; while (true) { controller.Write(LED_PIN, ((ledOn) ? PinValue.High : PinValue.Low)); Thread.Sleep(1000); ledOn = !ledOn; } } } }
Описание кода:
- GpioController — класс контроллера для управления контактами GPIO;
- LibGpiodDriver(GPIOCHIP) — драйвер обертки библиотеки Libgpiod, в качестве аргумента указываем номер gpiochip;
- GpioController(PinNumberingScheme.Logical, drvGpio) — инициализация контроллера, PinNumberingScheme.Logical — формат указания контактов. Есть два варианта, по названию контакта или по его номеру. Но т.к. названия контактов не заданы, то обращение будет только по номеру;
- controller.OpenPin — открытие контакта и задание ему режима работы, PinMode.Output на вывод;
- controller.Write(LED_PIN, PinValue.High | PinValue.Low) — выставление контакту LED_PIN значение PinValue.High или PinValue.Low.
Демонстрация работы программного кода
Приложение dotnet-iot-blink на GitHub — .NET IoT Samples.