5.9. GPIO Descriptor Consumer Interface ======================================= Введение -------- Интерфейс GPIO-дескрипторов (GPIOD) был введён для замены устаревшего API на базе номеров GPIO. Вместо оперирования "магическими числами", новый подход использует дескрипторы (`struct gpio_desc`) и связи, описанные в Device Tree. Этот подход: - безопаснее, - читабельнее, - и лучше интегрируется с Device Tree и ACPI. Преимущества интерфейса дескрипторов ------------------------------------- - Автоматическая привязка к нужному контроллеру GPIO - Распознавание по имени (label), а не по номеру - Упрощённое управление ресурсами с помощью `devm_` функций - Совместимость с pinctrl и другими подсистемами ядра Как это выглядит в Device Tree ------------------------------- Пример узла потребителя GPIO (драйвера кнопки): .. code-block:: dts 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` — метки, которые затем используются в драйвере Как это используется в драйвере -------------------------------- .. code-block:: c 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"); } Функции, предоставляемые API ----------------------------- - `devm_gpiod_get()` — получить дескриптор GPIO по имени - `gpiod_direction_input()` / `gpiod_direction_output()` - `gpiod_set_value()` / `gpiod_get_value()` - `gpiod_put()` — освободить дескриптор (не нужен с `devm_`) Области применения ------------------- - Платформенные драйверы (`platform_driver`) - Клиентские устройства в I2C/SPI подсистемах - Управление кнопками, реле, светодиодами, сенсорами Вывод ----- Интерфейс GPIO-дескрипторов является рекомендуемым способом работы с пинами в современных драйверах Linux. Он устраняет проблемы с жёсткой привязкой номеров GPIO, делает код читаемым и переносимым, и тесно интегрируется с Device Tree.