当前位置: 技术问答>linux和unix
请大家帮帮忙:关于申请中断号失败问题?
来源: 互联网 发布时间:2016-05-09
本文导语: 平台:AT91SAM9260. 按键中断驱动.无论如何,申请中断号,都返回-22. int __init keyirq_init(void) { int rc; set_irq_type( AT91SAM9260_ID_PIOB, IRQT_FALLING); rc = request_irq( AT91SAM9260_ID_PIOB, key1_irq_fun, SA_INTERRUPT...
平台:AT91SAM9260. 按键中断驱动.无论如何,申请中断号,都返回-22.
int __init keyirq_init(void)
{
int rc;
set_irq_type( AT91SAM9260_ID_PIOB, IRQT_FALLING);
rc = request_irq( AT91SAM9260_ID_PIOB, key1_irq_fun, SA_INTERRUPT, "key2345irq", NULL);
if(rc){
printk("keyirq 1 irq not registered, Error:%dn", rc);
return -1;
}
......
}
按键使用的是PB5管脚,根据手册和linux-2.6.19内核代码,AT91SAM9260_ID_PIOB为内核中声明的中断号。
不知道为何总是申请失败?
请各位帮帮忙吧,已经好几天时间了!
int __init keyirq_init(void)
{
int rc;
set_irq_type( AT91SAM9260_ID_PIOB, IRQT_FALLING);
rc = request_irq( AT91SAM9260_ID_PIOB, key1_irq_fun, SA_INTERRUPT, "key2345irq", NULL);
if(rc){
printk("keyirq 1 irq not registered, Error:%dn", rc);
return -1;
}
......
}
按键使用的是PB5管脚,根据手册和linux-2.6.19内核代码,AT91SAM9260_ID_PIOB为内核中声明的中断号。
不知道为何总是申请失败?
请各位帮帮忙吧,已经好几天时间了!
|
-22代表 -EINVAL.
到kernel/irq/manage.c里找request_irq的源代码:
其中关于-EINVAL的代码
/*
* Sanity-check: shared interrupts must pass in a real dev-ID,
* otherwise we'll have trouble later trying to figure out
* which interrupt is which (messes up the interrupt freeing
* logic etc).
*/
if ((irqflags & IRQF_SHARED) && !dev_id)
return -EINVAL;
if (irq >= NR_IRQS)
return -EINVAL;
if (irq_desc[irq].status & IRQ_NOREQUEST)
return -EINVAL;
if (!handler)
return -EINVAL;
目前,根据你的代码,可以排除第一个可能性,其他的没办法知道,你自己可以对照代码查查。
反正代码都是公开的嘛
到kernel/irq/manage.c里找request_irq的源代码:
其中关于-EINVAL的代码
/*
* Sanity-check: shared interrupts must pass in a real dev-ID,
* otherwise we'll have trouble later trying to figure out
* which interrupt is which (messes up the interrupt freeing
* logic etc).
*/
if ((irqflags & IRQF_SHARED) && !dev_id)
return -EINVAL;
if (irq >= NR_IRQS)
return -EINVAL;
if (irq_desc[irq].status & IRQ_NOREQUEST)
return -EINVAL;
if (!handler)
return -EINVAL;
目前,根据你的代码,可以排除第一个可能性,其他的没办法知道,你自己可以对照代码查查。
反正代码都是公开的嘛
|
可能该中断已经被占用了吧
按道理内核移植时有段程序就是初始化中断的
默认情况下应该初始化没问题的,你可以把AT91SAM9260_ID_PIOB改成其他的中断号试试就知道了
若都有问题,说明移植时候的初始化有问题
但感觉不可能,若网络是正常的就说明上述猜测错误,因为网卡也需要中断
其实最直接的方式是查看内核中的中断使用状态
cat /proc/interrupts
看看AT91SAM9260_ID_PIOB是不是已经被其他模块占用了
Linux的proc文件系统做的非常好,可以动态查看一些信息
可用于系统的诊断
我们自己的驱动程序也应该借鉴这种思想
这样可以提高我们驱动软件的可测性,便于分析问题
按道理内核移植时有段程序就是初始化中断的
默认情况下应该初始化没问题的,你可以把AT91SAM9260_ID_PIOB改成其他的中断号试试就知道了
若都有问题,说明移植时候的初始化有问题
但感觉不可能,若网络是正常的就说明上述猜测错误,因为网卡也需要中断
其实最直接的方式是查看内核中的中断使用状态
cat /proc/interrupts
看看AT91SAM9260_ID_PIOB是不是已经被其他模块占用了
Linux的proc文件系统做的非常好,可以动态查看一些信息
可用于系统的诊断
我们自己的驱动程序也应该借鉴这种思想
这样可以提高我们驱动软件的可测性,便于分析问题
|
不知道有没有试过SA_SHIRQ