我正在为在ARM上运行的设备编写驱动程序。
这是probe()和interrupt_handler()的代码:
static irqreturn_t interrupt_handler(int irq, void *dev_id){
printk(KERN_ALERT "MY_IRQ: Interrupt handler executed!\n");
return IRQ_HANDLED;
}
static int mydevice_probe (struct platform_device *pdev) {
printk("-----------------------------------------PROBE CALLED \n");
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if(r == NULL) {
printk("platform_get_resource failed\n");
return -ENODEV;
}
irq = platform_get_irq(pdev,0);
if (irq < 0) {
printk("platform_get_irq failed\n");
return -ENODEV;
}
ret = request_irq(irq, interrupt_handler, IRQF_SHARED, pdev->name, &dev_num);
ret = misc_register(&mydevice_miscdevice);
return 0;
}
request_irq
成功返回0并且IRQ#17被分配给驱动程序。
问题是,当发出中断时,中断处理程序不会被执行。
有什么想法吗?我错过了什么?
很多,非常感谢!
答案 0 :(得分:2)
首先,良好做法问题 - 对request_irq
和misc_register
的调用应受if
和printk
失败的return -EIO
条款的保护。
也许您没有启用中断。您可能应该添加代码以清除,然后在调用request_irq
后启用中断。