使用UIO驱动程序映射一对中断或小地址空间

时间:2015-12-16 14:13:01

标签: linux-kernel linux-device-driver

我正在使用运行Yocto的Zynq-7000,我正在尝试将一个DMA控制器(在FPGA架构中运行的AXI DMA IP块)暴露给Linux用户空间。

在简单的情况下,DMA控制器的存储空间为0x60字节,通常为起始地址0x40400000。在此范围内是用于控制读取和写入的寄存器,其中:

  • 0x40400000 - > 0x4040002F控制从内存中读取。
  • 0x40400030 - > 0x4040005F控制写入内存。

DMA控制器有两个中断,分别用于读写操作。

尝试1:

我设法使用uio-pdrv-genirq将这个内存暴露给用户空间,但我只能包含一个中断。即使我在设备树中添加了第二个中断,驱动程序也会忽略它(通过读取驱动程序代码也很明显)。

即使我可以通过修改驱动程序注册第二个中断,AFAICT也无法从用户空间告诉哪个中断被触发,因此访问仍然需要序列化。

尝试2:

为了解决这个问题,我尝试在设备树中添加两个设备。一个设备用自己的中断控制读操作,一个设备用自己的中断控制写操作。我将它们设置为与uio-pdrv-genirq驱动程序兼容。然后我将内存空间设置为:

  • 起始地址:0x40400000;大小:0x30;对于阅读。
  • 起始地址:0x40400030;大小:0x30;对于写作。

正如预期的那样,在这种情况下会创建两个设备。

但是,在用户空间应用程序中,当我尝试映射设备树中设置为小于0x1000(页面大小)的内存空间时,mmap失败。

基本上,我如何向用户空间公开具有两个中断的设备(或者等效地,两个具有接近地址的设备),以便可以正确地推断出中断?

0 个答案:

没有答案