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.