我有一个典型的V4L2驱动程序,已配置用于内存映射IO方法。该驱动程序将虚拟地址移交给我的用户空间应用程序。所有这些都工作正常。
我有另一个驱动程序,希望输入内核物理地址作为输入。我想将V4L2驱动程序的输出连接到该驱动程序的输入,但是它需要一个物理地址(此驱动程序控制FPGA功能)。
我的理解是内核例程:virt_to_phys()例程不适用于DMA分配的内存映射地址。这是真的?如果是这样,如何从传递到用户空间的DMA内存映射的V4L2虚拟地址中获取物理地址?
我只是在这里整理概念证明的内容,因此很难对某些地址进行编码不是问题。这是在专用嵌入式平台上运行的唯一应用程序。
谢谢, -安德烈斯
答案 0 :(得分:1)
这可以通过3个步骤进行解释:
V4L2应用程序将调用VIDIOC_REQBUF分配缓冲区。如果内存类型为VB2_MEMORY_MMAP。 V4l2框架驱动程序将分配缓冲区并将其打包为vb2_dc_buf结构类型,并将此结构指针存储在planes [plane] .mem_priv中。此结构将具有DMA物理地址。
应用程序必须通过传递planes [plane] .mem_priv来调用VIDIOC_EXPBUF。然后,v4l2框架实现vb2_core_expbuf(),在其中调用诸如vb2_dc_get_dmabuf()和dma_buf_fd()之类的DMA特定API来获取DMA缓冲区fd。
应用程序可以将此文件(通过此fd)导出到第二个驱动程序,第二个驱动程序将导入第二个驱动程序并使用DMA API将其转换回DMA物理地址