gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,

时间:2020-12-29 04:12:52
平台是amlogic,amlogic平台将gpio口转换中断口有点不同,有平台专属的函数,但是我用这个gpio_to_irq为什么能出错了,gpio_request都报错,说明管脚没有被占用。
               开发板上预留的几个gpio口全试过了都是返回-6的错误。内核报-6 意思 /* No such device or address */  。求教大家,,,

8 个解决方案

#1


gpio_request都没报错,   上面打错了,,,,,

#2


我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏

#3


引用 2 楼 jklinux 的回复:
我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,

#4


引用 3 楼 zxc18076752045 的回复:
Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的

#5


引用 4 楼 jklinux 的回复:
Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)

#6


引用 5 楼 zxc18076752045 的回复:
Quote: 引用 4 楼 jklinux 的回复:

Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)


只能查看平台设备的"pdata->irq "是怎样提供了

#7


引用 6 楼 jklinux 的回复:
Quote: 引用 5 楼 zxc18076752045 的回复:

Quote: 引用 4 楼 jklinux 的回复:

Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)


只能查看平台设备的"pdata->irq "是怎样提供了


追开发板上power按键,去内核找他的代码,发现根本就没用中断,用的是轮询,他用一个宏隔开中断和轮询,我打开这宏,使用中断方式,发现power键失灵了,没用了,真是坑死人,难怪我之前怎么弄中断就是没反应,卖着开发板的自己都不用中断。 害的我tp还要去改用轮询方式

#8


有够坑的了…………不过按键有些人喜欢用定时轮询,避免抖动问题

#1


gpio_request都没报错,   上面打错了,,,,,

#2


我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏

#3


引用 2 楼 jklinux 的回复:
我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,

#4


引用 3 楼 zxc18076752045 的回复:
Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的

#5


引用 4 楼 jklinux 的回复:
Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)

#6


引用 5 楼 zxc18076752045 的回复:
Quote: 引用 4 楼 jklinux 的回复:

Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)


只能查看平台设备的"pdata->irq "是怎样提供了

#7


引用 6 楼 jklinux 的回复:
Quote: 引用 5 楼 zxc18076752045 的回复:

Quote: 引用 4 楼 jklinux 的回复:

Quote: 引用 3 楼 zxc18076752045 的回复:

Quote: 引用 2 楼 jklinux 的回复:

我估计有可能是芯片厂商并没有实现好这个gpio_to_irq的接口功能。

gpio_to_irq是linux内核里提供给驱动人员调用使用,但具体的功能还是由芯片厂商具体来实现的。


不能通过gpio查找相应的中断号的话,可以去arch/arm/mach-xxx/include/mach/irqs.h头文件里查看是否有提供中断号的宏


arch/arm/下没有对应平台的mach-xxx文件夹,这个平台内核走dts,我在他的dts文件里找到他用到的头文件,就在include/dt-bindings/下找到对gpio管脚号的宏定义,找不到中断相关的。 gpio_to_irq 返回-6的错误 这个函数为什么能出错,,,


在设备树里看是那么平台设备是怎样传中断号的


哎 看不懂 找到份amlogic平台中断相关文档 但是照那样做也没什么用 感觉就是那中断号一直不对。下面是我找到的资料,,

configure gpio irq
默认用FILTER_NUM7,设置GPIO触发模式为下降沿。
通过amlogic自定义的函数接口gpio_for_irq()注册并设置该GPIO IRQ。
实际内核标准的接口是gpio_to_irq()。
unsigned int irqflag = AML_GPIO_IRQ(pdata->gpioirq, FILTER_NUM7, GPIO_IRQ_FALLING)
gpio_for_irq(pdata->gpio, irqflag);
 
request irq
最后就是正常的注册中断处理函数。
如果没有配置interrupts属性,需要在驱动里手动加上一个中断号的偏移值。目前这个偏移值是96。
比如配置的gpioirq=2,则传给request_irq的中断号参数是2+96=98.
#define INT_GPIO_0 96

ret = request_irq(pdata->gpioirq + INT_GPIO_0, yourmodule_isr, IRQF_DISABLED, "gpioirqdemo", pdata))
如果配置了interrupts属性,并且该属性配置正确,也即interrtups属性与gpio irq的值是一一对应的,那么就可以直接在驱动里使用interrupts参数值:
ret = request_irq(pdata->irq, gpioriq_demo_isr, IRQF_DISABLED, "gpioriqdemo", pdata)


只能查看平台设备的"pdata->irq "是怎样提供了


追开发板上power按键,去内核找他的代码,发现根本就没用中断,用的是轮询,他用一个宏隔开中断和轮询,我打开这宏,使用中断方式,发现power键失灵了,没用了,真是坑死人,难怪我之前怎么弄中断就是没反应,卖着开发板的自己都不用中断。 害的我tp还要去改用轮询方式

#8


有够坑的了…………不过按键有些人喜欢用定时轮询,避免抖动问题