我正在研究运行Yocto的Zynq-7000,并且试图向Linux用户空间公开DMA控制器(在FPGA架构中运行的AXI DMA IP块)。
在简单情况下,DMA控制器的存储空间为0x60字节,起始地址通常为0x40400000。在此范围内的是用于控制读写的寄存器,其中:
0x40400000-> 0x4040002F控制从内存中读取。
0x40400030-> 0x4040005F控制写入内存。
DMA控制器具有两个中断,每个中断用于读取和写入。
我设法使用uio-pdrv-genirq将此内存公开给用户空间,但是我只能包含一个中断。即使我在设备树中添加了第二个中断,驱动程序也只会忽略它(这在读取驱动程序代码时也很明显)。
即使我可以通过修改驱动程序来注册第二个中断,AFAICT也无法从用户空间得知触发了哪个中断,因此访问仍需要序列化。
为了解决这个问题,我尝试在设备树中添加两个设备。一台设备通过自己的中断控制读取,一台设备通过自己的中断控制写入。我将它们都设置为与uio-pdrv-genirq驱动程序兼容。然后,我将内存空间设置为:
起始地址:0x40400000; 大小:0x30;对于阅读。
起始地址:0x40400030; 大小:0x30;对于写。
如预期的那样,在这种情况下将创建两个设备。
但是,在用户空间应用程序中,当我尝试映射设备树中设置为小于0x1000(页面大小)的内存空间时,mmap失败。
基本上,我如何将具有两个中断的设备(或等效地,两个具有接近地址的设备)暴露给用户空间,以便可以正确推断中断?