11. 5.10. GPIOs Mapped to IRQs
11.1. Введение
Многие GPIO-линии могут использоваться не только для ввода/вывода, но и для генерации прерываний (IRQ). Это позволяет драйверам эффективно реагировать на события, такие как нажатие кнопки, без постоянного опроса состояния пина.
Linux предоставляет механизм привязки GPIO к IRQ с помощью gpiod_to_irq() и регистрации обработчика прерывания через request_irq().
11.2. Поддержка в Device Tree
Пример описания GPIO с поддержкой IRQ в .dts:
hellokeys@0 {
compatible = "arrow,hellokeys";
gpios = <&gpio 17 0>;
gpio-names = "key1";
interrupt-parent = <&gpio>;
interrupts = <17 2>; // GPIO 17, falling edge
status = "okay";
};
Здесь: - interrupts = <gpio_num flags> — описание линии и триггера; - флаг 2 соответствует falling edge (IRQ_TYPE_EDGE_FALLING); - interrupt-parent указывает на контроллер.
11.3. Пример использования в драйвере
struct gpio_desc *key_gpio;
int irq;
key_gpio = devm_gpiod_get(&pdev->dev, "key1", GPIOD_IN);
irq = gpiod_to_irq(key_gpio);
ret = devm_request_irq(&pdev->dev, irq, key_isr,
IRQF_TRIGGER_FALLING, "key1_irq", NULL);
if (ret) {
dev_err(&pdev->dev, "Failed to request IRQ\n");
return ret;
}
static irqreturn_t key_isr(int irq, void *dev_id) {
pr_info("Interrupt from key1\n");
return IRQ_HANDLED;
}
11.4. Объяснение ключевых компонентов
gpiod_to_irq() — преобразует дескриптор GPIO в номер IRQ;
request_irq() или devm_request_irq() — регистрация обработчика;
IRQF_TRIGGER_FALLING и др. — флаги триггера: edge/level, high/low;
gpio-keys — стандартный драйвер, который тоже использует IRQ.
11.5. Важные замечания
Убедитесь, что в DT описан interrupt-parent;
Некоторые пины не поддерживают IRQ — зависит от SoC;
Нельзя одновременно использовать poll() и IRQ на одном GPIO.
11.6. Вывод
Привязка GPIO к IRQ — важный инструмент для драйверов, где требуется мгновенная реакция на внешние события. Интерфейс gpiod_to_irq() делает это безопасным и переносимым способом, интегрированным в подсистему gpio + irq.