linux - IRQCHIP_声明 : init function is not being run

标签 linux linux-kernel linux-device-driver kernel-module xilinx

我正在尝试在我正在开发的嵌入式 ARM FPGA 系统中使用 Xilinx 中断 Controller 驱动程序。 (https://github.com/torvalds/linux/blob/master/drivers/irqchip/irq-xilinx-intc.c)

该驱动程序的末尾是一行:

IRQCHIP_DECLARE(xilinx_intc_xps, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);

我已在设备树中为中断 Controller 添加了一个条目。

    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_info ,但我从未看到它被调用。

唯一表明存在问题的消息是:

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

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

关于调试这个有什么建议吗?

对于它的值(value),我将驱动程序编译到内核模块中,使用modules_install进行安装,并在/etc/modules中添加了一个条目来加载它启动。

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

最佳答案

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注册的,则必须将其编译到内核中,并且将在内核启动时调用回调函数。

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

关于linux - IRQCHIP_声明 : init function is not being run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46739529/

相关文章:

Linux命令根据字符分割文件中的每一行并仅将指定列写入另一个文件

linux - 尝试插入访问导出符号的模块时出现 "Invalid parameters"错误

linux - 为什么有些嵌入式板需要设备树而有些则不需要?

linux-kernel - Linux 内核如何知道如何执行二进制格式

android binder驱动实现

c - 用于嵌入式系统中 RS232 设备的 Linux 设备驱动程序

linux - 为 libwebsocket Warmcat 安装新版本的 libtool

c++ - 在 Linux 系统调用中的 C 程序中出现错误 ‘\342’ stray ‘\210’ stray ‘\222’

c - 为什么我的两台运行 linux 的计算机从 C 代码中产生不同的结果

linux - 在 64 位 Linux 上执行 32 位二进制文​​件时的 SIGSEGV