我在硬件驱动程序中安装中断处理程序时遇到问题,在特定情况下,对于Beaglebone Green上的am3358电子捕获单元eCAP0。
我正在运行一个构建版本https://eewiki.net/display/linuxonarm/BeagleBone+Black,使用Mainline 4.9.30-bone4(非实时)内核和debian-8.7-minimal-armhf-2017-01-14文件系统构建。
驱动程序是在早期的3.8内核上开发和工作的,但现在无法在4.9内核下接收任何中断。
通过调用以下方式注册中断:
status = request_irq(31,ecap_interrupt,0,ECAP_NAME,& ecap_data.devid);
31是am335x-techref中每个表6.3的eCAP0INT中断号。
调用成功,状态为零,但即使eCAP单元检测到事件,也不会调用中断例程。 此外,看看/ proc / interrupts,我看到了:
22:103 INTC 14 Level 49000000.edma_ccerrint
26:0 INTC 96 Level 44e07000.gpio
31:0 44e07000.gpio 4 Edge ecap
33:0 44e07000.gpio 6 Edge 48060000.mmc cd
59:0 INTC 98 Level 4804c000.gpio
92:0 INTC 32等级481ac000.gpio
这表明(1)在IRQ 31上没有检测到中断,并且(2)第三列列出了可疑的“44e07000.gpio”而不是大多数其他中断线的INTC。后者让我相信中断没有从捕获单元中适当地映射,而是映射到某种gpio映射,尽管我不知道/ proc / interrupts中的第三列和第四列是什么。
尝试使用此代码探测中断也会失败,并且没有检测到中断:
do {
iowrite16(0x0000, &ecap_data.pecap[ECAP_ECEINT]); // Disable all interrupts
iowrite16(0x00ff, &ecap_data.pecap[ECAP_ECCLR]); // And clear status
mask = probe_irq_on();
iowrite16(0x0010, &ecap_data.pecap[ECAP_ECEINT]); // Re-enable CEVT4 interrupt
iowrite16(0x0010, &ecap_data.pecap[ECAP_ECFRC]); // And force-trigger it
udelay(5);
istatus = probe_irq_off(mask);
if (istatus == 0) {
printk(KERN_INFO "No interrupt reported\n");
}
} while (istatus <= 0 && count++ < 5);
我确信在我看来有一些中断映射/启用这是我缺少的4.x内核的新内容。
非常感谢任何帮助和解释!