中断处理程序: request_irq返回错误代码-16。

问题描述 投票:0回答:1

我正在编写一个简单的驱动程序,它可以注册一个中断并处理它。request_irq 函数,但它返回这个错误。

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但得到了同样的错误!我正在写一个简单的驱动程序,它可以注册一个中断并处理它。

linux-kernel driver interrupt-handling irq
1个回答
1
投票

返回值为 -16 表示错误16,即 EBUSY 也就是 "设备或资源繁忙"。你正在尝试请求IRQ 29,你可以清楚地看到IRQ 29已经由 e000d000.spi. 这意味着为该驱动编写代码的人决定不使用 IRQF_SHARED,因此即使指定了该标志,也不能请求它。使用另一个数字来请求不同的中断线,或者避免加载独占该线的驱动程序。

另外,我不知道为什么你还要打印两个值的 EIOEINVAL但这些只是没有任何上下文的错误数字,而不是函数返回的东西。

© www.soinside.com 2019 - 2024. All rights reserved.