当前位置:  开发笔记 > 运维 > 正文

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

如何解决《使用UIO驱动程序映射一对中断或较小的地址空间》经验,为你挑选了0个好方法。

我正在研究运行Yocto的Zynq-7000,并且试图向Linux用户空间公开DMA控制器(在FPGA架构中运行的AXI DMA IP块)。

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

0x40400000-> 0x4040002F控制从内存中读取。

0x40400030-> 0x4040005F控制写入内存。

DMA控制器具有两个中断,每个中断用于读取和写入。

尝试1:

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

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

尝试2:

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

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

起始地址:0x40400030; 大小:0x30;对于写。

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

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

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

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有