10. 5.9. GPIO Descriptor Consumer Interface
10.1. Введение
Интерфейс GPIO-дескрипторов (GPIOD) был введён для замены устаревшего API на базе номеров GPIO. Вместо оперирования «магическими числами», новый подход использует дескрипторы (struct gpio_desc) и связи, описанные в Device Tree.
Этот подход: - безопаснее, - читабельнее, - и лучше интегрируется с Device Tree и ACPI.
10.2. Преимущества интерфейса дескрипторов
Автоматическая привязка к нужному контроллеру GPIO
Распознавание по имени (label), а не по номеру
Упрощённое управление ресурсами с помощью devm_ функций
Совместимость с pinctrl и другими подсистемами ядра
10.3. Как это выглядит в Device Tree
Пример узла потребителя GPIO (драйвера кнопки):
hellokeys@0 {
compatible = "arrow,hellokeys";
gpios = <&gpio 17 0>, <&gpio 27 0>;
gpio-names = "key1", "key2";
status = "okay";
};
Описание: - gpios — список пинов GPIO с флагами (в данном случае 0 = input, 1 = output) - gpio-names — метки, которые затем используются в драйвере
10.4. Как это используется в драйвере
struct gpio_desc *key_gpio;
key_gpio = devm_gpiod_get(&pdev->dev, "key1", GPIOD_IN);
if (IS_ERR(key_gpio)) {
dev_err(&pdev->dev, "Failed to get key1 GPIO\\n");
return PTR_ERR(key_gpio);
}
if (gpiod_get_value(key_gpio)) {
pr_info("Button is pressed!\\n");
}
10.5. Функции, предоставляемые API
devm_gpiod_get() — получить дескриптор GPIO по имени
gpiod_direction_input() / gpiod_direction_output()
gpiod_set_value() / gpiod_get_value()
gpiod_put() — освободить дескриптор (не нужен с devm_)
10.6. Области применения
Платформенные драйверы (platform_driver)
Клиентские устройства в I2C/SPI подсистемах
Управление кнопками, реле, светодиодами, сенсорами
10.7. Вывод
Интерфейс GPIO-дескрипторов является рекомендуемым способом работы с пинами в современных драйверах Linux. Он устраняет проблемы с жёсткой привязкой номеров GPIO, делает код читаемым и переносимым, и тесно интегрируется с Device Tree.