我使用 uio_pdrv_genirq 驱动程序 来控制 Xilinx MPSoC 系统上的多个 FPGA 模块。我已经使用它与相当多的 FPGA 模块(~170)几个月了,直到现在从未遇到过任何困难。然而,目前我遇到了一个问题,其中许多 UIO 设备无法在
/dev
下枚举(并且在 /sys/class/uio
下也不可见)。请注意,我在设备树中设置了 compatible = "generic-uio"
并将 uio_pdrv_genirq.of_id=generic-uio
设置为 bootarg。
如果我检查正在运行的设备树中的 UIO 设备数量,我会看到:
$ sudo dtc -I fs /proc/device-tree | grep generic-uio | wc -l
171
但是,如果我检查
/dev
下的数字,我会看到:
$ ls /dev/uio* | wc -l
158
我在
dmesg
中没有看到任何表明枚举失败的内容。
未枚举的设备是一些Xilinx AXI DMA 内核。然而,这些枚举的 UIO 设备在以前版本的设计中表现得很好。我所做的与这些内核相关的唯一更改是将它们的中断输出连接到 Xilinx AXI 中断控制器(我还制作了一个
generic-uio
设备)。
以下是设备树中的 AXI DMA 核心配置示例:
dma@80000000 {
xlnx,include-sg;
clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_s2mm_aclk";
interrupts = <0x0 0x2>;
clocks = <0x3 0x48 0x3 0x47 0x3 0x49>;
interrupt-parent = <0x30>;
xlnx,addrwidth = <0x20>;
compatible = "generic-uio";
interrupt-names = "s2mm_introut";
xlnx,sg-length-width = <0x1a>;
reg = <0x0 0x80000000 0x0 0x10000>;
phandle = <0xa6>;
#dma-cells = <0x1>;
dma-channel@80000030 {
xlnx,device-id = <0x0>;
interrupts = <0x0 0x2>;
compatible = "xlnx,axi-dma-s2mm-channel";
dma-channels = <0x1>;
xlnx,datawidth = <0x80>;
};
};
在之前的设计版本中,我在
/dev
下看到了更多设备:
$ ls /dev/uio* | wc -l
174
知道这里会发生什么吗?如何解决这些设备未显示在
/dev
下的问题?
如果您需要更多信息,请告诉我,我很乐意提供。
我设法通过使用
/delete-property/ interrupts;
删除 AXI DMA 核心实例的中断属性来实现此功能。由于我使用 uio_pdrv_genirq
驱动程序来管理 AXI 中断控制器,因此我使用其 UIO 实例(及其驱动程序)来处理来自 AXI DMA 内核的中断。
我认为这里的根本问题是 AXI DMA 核心中断连接到 AXI 中断控制器而不是直接连接到处理器,导致驱动程序无法管理这些中断。但是,如果设备没有中断属性,则
uio_pdrv_genirq
驱动程序可以在不中断的情况下管理设备。但是,当然,在这种情况下,您无法读取和写入 /dev/uioX
实例来等待和启用中断。