Beaglebone Green

时间:2017-07-02 18:35:57

标签: linux-device-driver embedded-linux beagleboneblack

我在硬件驱动程序中安装中断处理程序时遇到问题,在特定情况下,对于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内核的新内容。

非常感谢任何帮助和解释!

0 个答案:

没有答案