从硬件IRQ编号中获取Linux IRQ编号

时间:2018-08-01 15:43:41

标签: linux linux-kernel driver linux-device-driver device

我有一个GPIO外设,在设备树中定义为:

gpio0: gpio@2300000 
{
    compatible = "fsl,qoriq-gpio";
    reg = <0x0 0x2300000 0x0 0x10000>;
    interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
    gpio-controller;
    #gpio-cells = <2>;
    interrupt-controller;
    #interrupt-cells = <2>;
};

我想为此编写一个中断处理程序(作为内核模块)。但是此IRQ编号(66)是硬件编号,我需要一个虚拟的Linux IRQ编号将其传递给request_irq

如何获得此号码?。只有一个中断控制器(GIC)。

有没有一种方法而无需编写平台设备驱动程序(,因为系统中可能已经有一个工作,并且我认为我无法注册另一个。)

1 个答案:

答案 0 :(得分:1)

根据您的评论,您希望将GPIO注册为中断。 您发布的设备树的节点是中断控制器节点,它与我们手头的任务无关。

要将gpio注册为中断,首先需要找到可以配置为中断的GPIO(在大多数现代处理器中,所有GPIO都支持该GPIO),然后必须确保其他设备不使用该GPIO。通过多路复用(如果它被SPI或UART等某人使用,如果不使用该实体,则可以从设备树中禁用它们。)

现在您拥有可以使用的GPIO引脚。在内核上找到该引脚对应的GPIO号(取决于处理器及其载板的体系结构)。

拥有该功能后,您只需编写一个简单的模块即可导出GPIO并将其用作中断。

以下是http://derekmolloy.ie的摘录

gpio_request(gpioButton, "sysfs");       // Set up the gpioButton
gpio_direction_input(gpioButton);        // Set the button GPIO to be an input
gpio_set_debounce(gpioButton, 200);      // Debounce the button with a delay of 200ms
gpio_export(gpioButton, false);          // Causes gpio115 to appear in /sys/class/gpio
                  // the bool argument prevents the direction from being changed
// Perform a quick test to see that the button is working as expected on LKM load
printk(KERN_INFO "GPIO_TEST: The button state is currently: %d\n", gpio_get_value(gpioButton));

// GPIO numbers and IRQ numbers are not the same! This function performs the mapping for us
irqNumber = gpio_to_irq(gpioButton);
printk(KERN_INFO "GPIO_TEST: The button is mapped to IRQ: %d\n", irqNumber);

// This next call requests an interrupt line
result = request_irq(irqNumber,             // The interrupt number requested
                    (irq_handler_t) ebbgpio_irq_handler, // The pointer to the handler function below
                    IRQF_TRIGGER_RISING,   // Interrupt on rising edge (button press, not release)
                    "ebb_gpio_handler",    // Used in /proc/interrupts to identify the owner
                    NULL);                 // The *dev_id for shared interrupt lines, NULL is okay

Link查看完整代码。