16. 5.15. Управление GPIO с помощью GPIOD API
16.1. Описание
В этом разделе мы переработали драйвер gpiotoggle для Raspberry Pi 3, чтобы использовать современный GPIOD API вместо устаревших gpio_request(), gpio_set_value() и gpio_get_value().
Это важный шаг для совместимости с новыми ядрами и поддержки расширенного оборудования, такого как GPIO-экспандеры и виртуальные GPIO.
—
16.2. Цель
Создать platform driver, который:
получает номер GPIO из Device Tree;
настраивает его как выход;
предоставляет интерфейс через /dev/gpiotoggle:
echo 1 > /dev/gpiotoggle — включить
echo 0 > /dev/gpiotoggle — выключить
cat /dev/gpiotoggle — вывести текущее состояние пина
—
16.3. Подключение и освобождение GPIO
В предыдущих версиях мы использовали GPIO21 как вывод RGB светодиода.
Теперь мы перенесли `gpiotoggle` на GPIO26, а GPIO21 стал свободен — мы сможем использовать его для синего канала RGB LED в следующих разделах (см. 5.18).
Это стало возможным, потому что GPIOD корректно освобождает ресурсы, используя devm_gpiod_get() и автоматически управляется ядром.
—
16.4. Пример Device Tree (фрагмент)
gpiotoggle@1 {
compatible = "kontakts,gpiotoggle";
reg = <1>;
gpios = <&gpio 26 0>;
status = "okay";
};
—
16.5. Проверка работы драйвера
Компиляция и загрузка:
make
sudo insmod gpiotoggle.ko
Проверка в gpioinfo:
gpioinfo | grep 26
# должен показать:
# line 26: unnamed "gpiotoggle" output active-high [used]
Управление:
echo 1 > /dev/gpiotoggle
echo 0 > /dev/gpiotoggle
cat /dev/gpiotoggle
# Вывод:
# GPIO is 1
# или
# GPIO is 0
Выгрузка:
sudo rmmod gpiotoggle
—
16.6. Обновление Device Tree
После редактирования .dts (например, добавления узла gpiotoggle@1) нужно перекомпилировать его и заменить используемый .dtb.
Убедитесь, что у вас установлен Device Tree Compiler (dtc):
sudo apt update
sudo apt install device-tree-compiler
Перейдите в директорию, где находится bcm2710-rpi-3-b.dts, и скомпилируйте его в .dtb:
dtc -I dts -O dtb -o bcm2710-rpi-3-b.dtb bcm2710-rpi-3-b.dts
Сделайте резервную копию оригинального .dtb, затем скопируйте новый в /boot/:
sudo cp /boot/bcm2710-rpi-3-b.dtb /boot/bcm2710-rpi-3-b.dtb.bak
sudo cp bcm2710-rpi-3-b.dtb /boot/
Перезагрузите Raspberry Pi, чтобы применить обновлённый DTB:
sudo reboot
После загрузки проверьте, что узел появился в дереве устройств:
ls /proc/device-tree/soc/gpiotoggle@1
cat /proc/device-tree/soc/gpiotoggle@1/gpios
—
16.7. Преимущества GPIOD
Совместим с будущими ядрами Linux
Позволяет обращаться к GPIO по имени, индексу или в массиве
Автоматическое освобождение через devm_ API
Работа с GPIO-экспандерами и нестандартными контроллерами
Совместимость с Device Tree через gpios = <…>;
—
16.8. Вывод
Мы перешли на GPIOD API и освободили GPIO21, который будет использоваться для RGB-светодиода. Это пример чистой архитектуры, основанной на платформенном драйвере и miscdevice.
Следующим шагом мы реализуем RGB LED driver с тремя GPIO (R/G/B), используя GPIOD и Device Tree.