IRQCHIP_DECLARE: 初始化函数未被 运行
IRQCHIP_DECLARE: init function is not being run
我正在尝试在我正在开发的嵌入式 ARM FPGA 系统中使用 Xilinx 中断控制器驱动程序。
(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);
我在设备树中为中断控制器添加了一个条目。
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: no irq domain found for /amba/xil_intc@41810000 !
我已经成功地编写和编译了其他设备驱动程序,在设备树中添加了条目,并将它们加载并显示在 dmesg
中,但由于某种原因我无法使这个工作。
关于调试这个有什么建议吗?
为了它的价值,我正在将驱动程序编译到内核模块中,使用 modules_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
注册的,则必须将其编译到内核中,并且将在内核启动时调用回调函数。
它不像其他设备驱动程序那样作为内核 modules/overlay 工作。
我正在尝试在我正在开发的嵌入式 ARM FPGA 系统中使用 Xilinx 中断控制器驱动程序。 (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);
我在设备树中为中断控制器添加了一个条目。
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: no irq domain found for /amba/xil_intc@41810000 !
我已经成功地编写和编译了其他设备驱动程序,在设备树中添加了条目,并将它们加载并显示在 dmesg
中,但由于某种原因我无法使这个工作。
关于调试这个有什么建议吗?
为了它的价值,我正在将驱动程序编译到内核模块中,使用 modules_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
注册的,则必须将其编译到内核中,并且将在内核启动时调用回调函数。
它不像其他设备驱动程序那样作为内核 modules/overlay 工作。