Linux 版本:v4.19
平台:Xilinx Ultrascale+ Zynq
在赛灵思可编程逻辑中,我创建了一个内存映射设备。我正在uio_pdrv_genirq
用作我的设备驱动程序。该设备显示为uio0
,我可以毫无问题地对其进行读写。
到目前为止,我还没有与此设备相关的中断。随着我的设计成熟,我想为设备添加一个中断。所以我创建了适当的逻辑,将中断连接到 CPU,并更新了设备树配置以告诉 Linux 中断的存在。我已经彻底检查过了,我很确定我在设备树中指定了正确的中断 ID。
但是,一旦我指定中断,我就开始遇到问题。当我尝试打开设备时,我的用户空间程序挂起。我已经用printf()
:s 验证了我不再退出此功能。
fid = open("/dev/uio0", O_RDWR | O_SYNC);
显然这与中断有关。也许我缺少一些额外的中断控制器设备树配置?或者在打开设备之前我必须在用户空间做些什么?
这是我的设备和中断控制器的设备树配置:
my_device@a0040000 {
compatible = "generic-uio";
reg = <0x0 0xa0040000 0x0 0x40000>;
interrupt-parent = <&gic>;
interrupts = <0 89 4>;
};
gic: interrupt-controller@f9010000 {
compatible = "arm,gic-400", "arm,cortex-a15-gic";
#interrupt-cells = <3>;
reg = <0x0 0xf9010000 0x10000>,
<0x0 0xf9020000 0x20000>,
<0x0 0xf9040000 0x20000>,
<0x0 0xf9060000 0x20000>;
interrupt-controller;
interrupt-parent = <&gic>;
interrupts = <1 9 0xf04>;
};