基于PCIE XDMA的linux V4L2 video驱动开发(一)
Xilinx官方提供的XDAM驱动只是提供了最基本的dma传输、bar空间读写、中断等功能。如果你想利用fpga采集摄像头数据,然后通过上位机来显示,一般在网上或者开发板教程找到的方案例程是这样的:摄像头数据->fpga采集->pcie->QT应用程序;但是会有一个问题,如果你把采集到摄像头数据能更好地展示出来,或者你想把视频录制保存下来,你可能需要自己实现一个播放器!!!为什么不能用现成的播放器,既可以播放视频、又可以录制视频,而且还可以推流到服务器?只要改一下方案就可以了,如下:

我们只需要在Xilinx官方提供的pcie驱动上面实现一层video driver就可以了。
同样也可以用pcie包装成各种标准的驱动接口,这样就可以直接使用标准的上层应用了,我们常说的“免驱“就是这样搞的,免驱的意思是系统自带了驱动。做成标准驱动的意义在于:1、有非常多的已经成熟的应用软件可以直接使用;2、一些中间库,大多数都是基于标准驱动来开发的。总之可以非常大地减少开发成本。

下面将开始如何基于Xilinx官方提供的PCIE XDAM驱动开发一个标准的linux video驱动。关于PCIE XDAM驱动,笔者在另外一篇文章有提到:Xilinx官方XDMA驱动解析_xilinx xdma官方驱动-CSDN博客。
1、linux video驱动开发
关于linux video驱动的应用和驱动框架在笔者的另一篇文章:https://blog.csdn.net/slov8/article/details/143086205
1.1 整体框架
linux video驱动使用的是V4L2(Video for linux2)框架。本文所有的代码都是从内核里面薅出来的,你想要实现的所有驱动的功能内核里面都有实例,前提是你看得懂,hahaha....
一般的摄像头的软硬件层次是这样的:

/dev/videoX主要用来传输图像数据,数据量比较大;/dev/v4l-subdevX主要传输摄像头模块的控制信息,比如对焦、控制摄像头电机、控制图像处理模块等操作;当然/dev/videoX节点也可以通过ioctl的方式来控制摄像头,比如亮度、对比度等,/dev/v4l-subdevX算是对/dev/videoX的ioctl的一种扩展。
本文是用fpga来做摄像头采集,所以整体框架需要改一下,如下:

其中PCIE xdma driver包含了访问fpga ddr和bar空间的驱动,/dev/videoX用来访问ddr空间来获取图像数据,/dev/v4l-subdevX用来访问bar空间来发送一些控制信息以及获取摄像头的状态信息。
1.2 数据传输

整个数据传输流程也比较简单,既可以使用/dev/v4l-subdevX来操作bar空间,也可以通过/dev/videoX的ioctl来操作。
1.3 程序源码
video驱动代码主要是参考了linux源码目录drivers/media/test-drivers/vivid下的video驱动代码。所有的代码基本都可以抄过来的,前提是你看得懂,哈哈哈哈哈。
笔者根据参考代码,经过设计,编码,最后输出的源码可以通过以下链接免费获取:
二、总结
1、本文主要讲述在Xilinx的官方pcie xdma驱动的基础上开发一个标准的v4l2驱动,VLC播放器可以通过标准的v4l2驱动来捕获摄像头数据,即使不用现成的播放器,在自己开发播放器时,通过标准的驱动接口,再利用很多第三方库,如VLC sdk,也可以快速开发自己的播放器。
2、本案例的v4l2驱动主要通过dma来传输摄像头数据,对于摄像头的控制信息则是通过通用的ioctl和/dev/v4l-subdevX来传输。其他Ethernet driver、uart driver、hdmi driver等都可以套用这样的传输框架。
三、参考资料
1、linux内核的vivid代码:drivers/media/test-drivers/vivid
2、Xilinx官方的XDMA驱动代码:GitHub - Xilinx/dma_ip_drivers: Xilinx QDMA IP Drivers
后记
笔者坚持从开源项目获取的资料和代码都免费公开。开源的东西,回归开源。
下一篇文章,笔者将重点介绍linux video驱动框架。
更多推荐
所有评论(0)