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

yaoweisun 2007-09-11 04:20:54
我设的中断号是165,上网搜资料说可能是IRQ>15或者handle=NULL。所以改成10,结果request_irq返回-16
...全文
4412 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin_neu 2011-11-08
  • 打赏
  • 举报
回复 1
分析一下/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);

arm_linux1982 2007-09-13
  • 打赏
  • 举报
回复
yaoweisun,问题解决了吗?
arm_linux1982 2007-09-12
  • 打赏
  • 举报
回复
我也是用中断出现了同样的问题,是在做AD转换时,我的返回值是-16,中断号用IRQ_ADC_DONE申请的,请问谁知道是怎么回事?谢谢。
tb01412 2007-09-12
  • 打赏
  • 举报
回复
中断号165??
一般说来没有这么大的中断号吧?好像高版本的内核支持比较大的中断号了,最初的只支持0x32以下的硬件中断号
hefuhua 2007-09-11
  • 打赏
  • 举报
回复
tkit 说的那样,看看cat /proc/interrupts 有没有165,如果有就直接用好了,中断的很多特殊要求因为x86的8259中断管理芯片的局限性才搞那么多规矩,其它平台可以根据硬件自由使用.
yaoweisun 2007-09-11
  • 打赏
  • 举报
回复
2.4内核
yaoweisun 2007-09-11
  • 打赏
  • 举报
回复
我是在pxa270上做实验,中断号165是书上给出的
tkit 2007-09-11
  • 打赏
  • 举报
回复
lz的本意是想测试中断处理函数,还是确实有一个设备驱动要注册中断?如果想测试的话,你可以“cat /proc/interrupts“然后选择一个没人用的中断号,然后怎样触发是另外的故事。如果你是有一个真实的设备,那么这个设备的中断号是固定的,通常由ACPI来描述,你并不能随意选取的
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
  • 打赏
  • 举报
回复
#define EINVAL 22 /* Invalid argument */
hefuhua 2007-09-11
  • 打赏
  • 举报
回复
楼主是什么平台及什么内核版本
#define EBUSY 16 /* Device or resource busy */
表示中断已经被使用,要不你设置成共享中断试试看

4,467

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧