Linux IRQCHIP_DECLARE:未运行init函数

Linux IRQCHIP_DECLARE:未运行init函数,linux,linux-kernel,linux-device-driver,kernel-module,xilinx,Linux,Linux Kernel,Linux Device Driver,Kernel Module,Xilinx,我试图在我正在开发的嵌入式ARM FPGA系统中使用Xilinx中断控制器驱动程序。 在这个驱动程序的末尾是一行: IRQCHIP_DECLARExilinx_intc_xps,xlnx,xps-intc-1.00.a,xilinx_intc_of_init 我在设备树中为中断控制器添加了一个条目 xil_intc: xil_intc@41810000 { compatible = "xlnx,xps-intc-1.00.a";

我试图在我正在开发的嵌入式ARM FPGA系统中使用Xilinx中断控制器驱动程序。

在这个驱动程序的末尾是一行:

IRQCHIP_DECLARExilinx_intc_xps,xlnx,xps-intc-1.00.a,xilinx_intc_of_init

我在设备树中为中断控制器添加了一个条目

    xil_intc: xil_intc@41810000 {           
        compatible = "xlnx,xps-intc-1.00.a";                                    
        interrupt-parent = <&intc>;
        interrupts = <0x0 0x1e 0x04>;
        reg = <0x41810000 0x10000>;
        interrupt-controller;
        #interrupt-cells = <2>;
        xlnx,kind-of-intr = <0x0>;
        xlnx,num-intr-inputs = <0x1>;
    };
但是,据我所知,xilinx_intc_of_init函数在启动期间从未被调用。我在函数的开头添加了一个pr_信息,但我从未看到它被调用

似乎表明问题的唯一信息是:

[0.177772]irq:未找到/amba/xil的irq域_intc@41810000 !

我已经成功地编写和编译了其他设备驱动程序,在设备树中添加了条目,并让它们加载并显示在dmesg中,但由于某些原因,我无法让这个驱动程序正常工作

对调试这个有什么建议吗

值得一提的是,我正在将驱动程序编译成一个内核模块,使用modules\u install进行安装,并在/etc/modules中添加了一个条目,以便在启动时加载它


编辑:我使用的是4.6内核。

我得出结论,从/lib/modules加载irqchip驱动程序在引导过程中太晚了

最后,我用修改后的配置重新构建了整个内核,以包含这个驱动程序,然后初始化工作正常

我想教训是IRQCHIP驱动程序必须编译到内核中,而不是像其他设备驱动程序那样作为内核模块工作?我找不到任何这样的文档,但这就是我观察到的行为

IRQCHIP_DECLARE(xilinx_intc_xps, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);
驱动程序irq xilinx intc.c正在使用上述调用向irq子系统注册

如果irq驱动程序使用IRQCHIP_DECLARE宏,它将按照以下顺序调用xilinx_intc_of_init回调函数

start_kernel() –> init_IRQ() --> irqchip_init() --> of_irq_init() --> call-back function (xilinx_intc_of_init)
如果驱动程序是使用IRQCHIP_DECLARE注册的,则必须将其编译到内核中,并在内核启动时调用回调函数

它不像其他设备驱动程序那样作为内核模块/覆盖层工作