如何使用GPIOH_4作为外部引脚中断?

我想使用GPIOH_4做一个外部的引脚中断,通过低电平触发中断,但是一直失败。我查看过这个Topic

How to request GPIOH_5 as INT mode
但是下面在topic中使用的h文件我没有找到。

#include <asm/irq.h>
#include <linux/amlogic/aml_gpio_consumer.h>
#include <linux/amlogic/gpio-amlogic.h>
#include <linux/amlogic/iomap.h>

我自己的驱动代码如下

myirq_node = of_find_node_by_path ("/myirq");

gpio_num = of_get_named_gpio (myirq_node,"gpios",0);

gpio_request (gpio_num,"myirq_pin");

gpio_direction_input (gpio_num);

irq_num = gpio_to_irq (gpio_num);

debug的时候发现,irq_num是-6。
设备树代码如下

myirq {
    compatible = "myirq";
    gpios = <&gpio GPIOH_4 GPIO_ACTIVE_LOW>;
    interrupt-parent = <&gpio_intc>;
    interrupts = <99 IRQ_TYPE_LEVEL_LOW>;
};

我看A311D的芯片手册,好像VIM3只有8个GPIO的外部中断,这8个外部中断可以连到任何一个GPIO引脚,在How to request GPIOH_5 as INT mode中有一个AML_GPIO_IRQ的函数,我猜应该就是完成对GPIO外部中断的分配任务,但是由于找不到相应的头文件,所以不知道如何配置。设备树的写法我也不是很清楚,按照How to request GPIOH_5 as INT mode中,我把gpios = <&gpio xxx xxx>换成interrup-pin = <&gpio xxx xxx>,驱动代码也进行相应更改后,irq_num仍然是-6.
我的系统是Ubuntu mainline。

@Terry @Frank @numbqq 可以给我一些建议嘛? :sob:

你上面看的帖子是很早之前3.14内核的,和你用的主线的不一样的。irq_num是-6你需要去具体跟一下代码,看看是返回什么错误。

hi @numbqq
我查过代码具体过程如下

/*    linux/gpio.h    */
static inline int gpio_to_irq (unsigned int gpio)
{
    return __gpio_to_irq(gpio);
}

/*    asm-generic/gpio.h    */
static inline int __gpio_to_irq (unsigned gpio)
{
    return gpiod_to_irq(gpio_to_desc(gpio));
}

/*    linux/gpio/consumer.h    */
static inline int gpiod_to_irq (const struct gpio_desc *desc)
{
    WARN_ON(desc);
    return -EINVAL;
}

EINVAL好像是无效参数的意思。但是在代码中可以看到,gpio_to_irq的参数不管是什么,都一定会返回EINVAL,所以我想知道如何才能配置GPIO作为外部中断。
:sob:

Hi!@numbqq
在之前的帖子中忘记说了

/*    asm-generic/gpio.h    */
static inline int __gpio_to_irq (unsigned gpio)
{
    return gpiod_to_irq (gpio_to_desc(gpio));
}

在上面的这个函数中,不仅仅gpiod_to_irq会直接返回错误类型EINVAL,gpio_to_desc也会直接返回一个空指针NULL,并且有类似“GPIO永远不能使用“的注释。
所以说在vim3中,gpio_to_irq应该本身就不可用。我想khadas应该会提供一些替代函数来帮助用户完成GPIO外部中断的配置。
希望有人能给我一些建议。:pleading_face: :pleading_face: :pleading_face: