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