+ -
当前位置:首页 → 问答吧 → request_irq返回-22,这是怎么回事?

request_irq返回-22,这是怎么回事?

时间:2007-09-11

来源:互联网

我设的中断号是165,上网搜资料说可能是IRQ>15或者handle=NULL。所以改成10,结果request_irq返回-16

作者: yaoweisun   发布时间: 2007-09-11

楼主是什么平台及什么内核版本
#define EBUSY 16 /* Device or resource busy */
表示中断已经被使用,要不你设置成共享中断试试看

作者: hefuhua   发布时间: 2007-09-11

#define EINVAL 22 /* Invalid argument */

作者: hefuhua   发布时间: 2007-09-11

/usr/src/linux-2.6.21.5/kernel/irq/manage.c
....
int request_irq(unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id)
{
....
if (!handler)
return -EINVAL;
....
}

作者: hefuhua   发布时间: 2007-09-11

lz的本意是想测试中断处理函数,还是确实有一个设备驱动要注册中断?如果想测试的话,你可以“cat /proc/interrupts“然后选择一个没人用的中断号,然后怎样触发是另外的故事。如果你是有一个真实的设备,那么这个设备的中断号是固定的,通常由ACPI来描述,你并不能随意选取的

作者: tkit   发布时间: 2007-09-11

我是在pxa270上做实验,中断号165是书上给出的

作者: yaoweisun   发布时间: 2007-09-11

2.4内核

作者: yaoweisun   发布时间: 2007-09-11

tkit 说的那样,看看cat /proc/interrupts 有没有165,如果有就直接用好了,中断的很多特殊要求因为x86的8259中断管理芯片的局限性才搞那么多规矩,其它平台可以根据硬件自由使用.

作者: hefuhua   发布时间: 2007-09-11

我也是用中断出现了同样的问题,是在做AD转换时,我的返回值是-16,中断号用IRQ_ADC_DONE申请的,请问谁知道是怎么回事?谢谢。

作者: arm_linux1982   发布时间: 2007-09-12

中断号165??
一般说来没有这么大的中断号吧?好像高版本的内核支持比较大的中断号了,最初的只支持0x32以下的硬件中断号

作者: tb01412   发布时间: 2007-09-12

yaoweisun,问题解决了吗?

作者: arm_linux1982   发布时间: 2007-09-13

分析一下/kernel/irq/manage.c的代码就明白了,如下:

...
if (irqflags & IRQF_SHARED) && !dev_id)
  return -EINVAL;
...

我想遇到申请中断返回-22的朋友多半是在申请的时候使用了IRQF_SHARED标志,却在dev_id这个参数传递了NULL吧。

解决方法非常简单,只需要把这个参数设为非空即可,因为如果IRQF_SHARED的话,中断机制需要将dev_id传递给Handler.如果实在不需要这个参数的话,就按照如下处理就行:
static int noused;
request_irq(...., &noused);

作者: kevin_neu   发布时间: 2011-11-08