中断处理程序:request_irqreturns错误代码-16
Interrupt handler: request_irq returns error code -16
我正在编写一个简单的驱动程序,它可以注册一个中断并处理它。
我正在使用 request_irq
函数,但 returns 这个错误:
genirq: Flags mismatch irq 29. 00004004 (irq-test) vs. 00000004 (e000d000.spi)
- code -16 , EIO 5 , EINVAL 22
这是简单的模块代码:
#define IRQ_Number 29
static irqreturn_t irq_handler( int irq, void *dev_id )
{
static int mycount = 0;
printk("Interrupt! = %d\n", mycount);
mycount++;
return IRQ_HANDLED;
}
static int __init my_init(void)
{
unsigned int irq;
int ret;
irq = IRQ_Number;
ret = request_irq(irq, irq_handler , IRQF_NO_SUSPEND; , "irq-test", NULL);
if(ret != 0) {
printk("ERROR: IRQ request failed %d", irq);
printk(" - code %d , EIO %d , EINVAL %d\n", ret, EIO, EINVAL);
}
return 0;
}
static void __exit my_exit(void)
{
unsigned int irq;
irq=IRQ_Number;
free_irq(irq, NULL);
printk(KERN_INFO "my module: ----> exit\n" );
}
这是 cat /proc/interrupts
的输出:
CPU0 CPU1
16: 1 0 GIC-0 27 Edge gt
17: 0 0 GIC-0 43 Level ttc_clockevent
18: 140949401 1430637760 GIC-0 29 Edge twd
19: 0 0 GIC-0 37 Level arm-pmu
20: 0 0 GIC-0 38 Level arm-pmu
21: 43 0 GIC-0 39 Level f8007100.adc
23: 7 0 GIC-0 57 Level cdns-i2c
25: 0 0 GIC-0 35 Level f800c000.ocmc
26: 332 0 GIC-0 59 Level xuartps
27: 14833917 0 GIC-0 58 Level e0006000.spi
28: 2 0 GIC-0 81 Level e0007000.spi
29: 0 0 GIC-0 51 Level e000d000.spi
30: 3654689 0 GIC-0 54 Level eth0
31: 637 0 GIC-0 56 Level mmc0
32: 0 0 GIC-0 45 Level f8003000.dmac
33: 0 0 GIC-0 46 Level f8003000.dmac
34: 0 0 GIC-0 47 Level f8003000.dmac
35: 0 0 GIC-0 48 Level f8003000.dmac
36: 0 0 GIC-0 49 Level f8003000.dmac
37: 0 0 GIC-0 72 Level f8003000.dmac
38: 0 0 GIC-0 73 Level f8003000.dmac
39: 0 0 GIC-0 74 Level f8003000.dmac
40: 0 0 GIC-0 75 Level f8003000.dmac
41: 0 0 GIC-0 40 Level f8007000.devcfg
48: 0 0 GIC-0 41 Edge f8005000.watchdog
IPI1: 0 0 Timer broadcast interrupts
IPI2: 371883 12507844 Rescheduling interrupts
IPI3: 4 1 Function call interrupts
IPI4: 0 0 CPU stop interrupts
IPI5: 2632663 10068764 IRQ work interrupts
IPI6: 0 0 completion interrupts
我尝试将标志更改为 0 和 IRQF_SHARED
,但出现了同样的错误!
一个return值-16
表示错误16,也就是EBUSY
a.k.a。 "device or resource busy"。你正在尝试请求 IRQ 29,你可以清楚地看到 IRQ 29 已经被 e000d000.spi
注册了。这意味着为该驱动程序编写代码的人决定不使用 IRQF_SHARED
,因此您不能请求它,即使您指定了该标志。使用另一个数字请求不同的中断线,或避免加载对该线进行独占控制的驱动程序。
此外,我不确定您为什么还要打印 EIO
和 EINVAL
的两个值,但这些只是没有任何上下文的错误编号,而不是 return由函数编辑。
我正在编写一个简单的驱动程序,它可以注册一个中断并处理它。
我正在使用 request_irq
函数,但 returns 这个错误:
genirq: Flags mismatch irq 29. 00004004 (irq-test) vs. 00000004 (e000d000.spi)
- code -16 , EIO 5 , EINVAL 22
这是简单的模块代码:
#define IRQ_Number 29
static irqreturn_t irq_handler( int irq, void *dev_id )
{
static int mycount = 0;
printk("Interrupt! = %d\n", mycount);
mycount++;
return IRQ_HANDLED;
}
static int __init my_init(void)
{
unsigned int irq;
int ret;
irq = IRQ_Number;
ret = request_irq(irq, irq_handler , IRQF_NO_SUSPEND; , "irq-test", NULL);
if(ret != 0) {
printk("ERROR: IRQ request failed %d", irq);
printk(" - code %d , EIO %d , EINVAL %d\n", ret, EIO, EINVAL);
}
return 0;
}
static void __exit my_exit(void)
{
unsigned int irq;
irq=IRQ_Number;
free_irq(irq, NULL);
printk(KERN_INFO "my module: ----> exit\n" );
}
这是 cat /proc/interrupts
的输出:
CPU0 CPU1
16: 1 0 GIC-0 27 Edge gt
17: 0 0 GIC-0 43 Level ttc_clockevent
18: 140949401 1430637760 GIC-0 29 Edge twd
19: 0 0 GIC-0 37 Level arm-pmu
20: 0 0 GIC-0 38 Level arm-pmu
21: 43 0 GIC-0 39 Level f8007100.adc
23: 7 0 GIC-0 57 Level cdns-i2c
25: 0 0 GIC-0 35 Level f800c000.ocmc
26: 332 0 GIC-0 59 Level xuartps
27: 14833917 0 GIC-0 58 Level e0006000.spi
28: 2 0 GIC-0 81 Level e0007000.spi
29: 0 0 GIC-0 51 Level e000d000.spi
30: 3654689 0 GIC-0 54 Level eth0
31: 637 0 GIC-0 56 Level mmc0
32: 0 0 GIC-0 45 Level f8003000.dmac
33: 0 0 GIC-0 46 Level f8003000.dmac
34: 0 0 GIC-0 47 Level f8003000.dmac
35: 0 0 GIC-0 48 Level f8003000.dmac
36: 0 0 GIC-0 49 Level f8003000.dmac
37: 0 0 GIC-0 72 Level f8003000.dmac
38: 0 0 GIC-0 73 Level f8003000.dmac
39: 0 0 GIC-0 74 Level f8003000.dmac
40: 0 0 GIC-0 75 Level f8003000.dmac
41: 0 0 GIC-0 40 Level f8007000.devcfg
48: 0 0 GIC-0 41 Edge f8005000.watchdog
IPI1: 0 0 Timer broadcast interrupts
IPI2: 371883 12507844 Rescheduling interrupts
IPI3: 4 1 Function call interrupts
IPI4: 0 0 CPU stop interrupts
IPI5: 2632663 10068764 IRQ work interrupts
IPI6: 0 0 completion interrupts
我尝试将标志更改为 0 和 IRQF_SHARED
,但出现了同样的错误!
一个return值-16
表示错误16,也就是EBUSY
a.k.a。 "device or resource busy"。你正在尝试请求 IRQ 29,你可以清楚地看到 IRQ 29 已经被 e000d000.spi
注册了。这意味着为该驱动程序编写代码的人决定不使用 IRQF_SHARED
,因此您不能请求它,即使您指定了该标志。使用另一个数字请求不同的中断线,或避免加载对该线进行独占控制的驱动程序。
此外,我不确定您为什么还要打印 EIO
和 EINVAL
的两个值,但这些只是没有任何上下文的错误编号,而不是 return由函数编辑。