【v4l2】Linux多媒体框架 - videobuf2详解
框架分析
框架可以分为两部分看:控制流+数据流,之前已经大概的描述了控制流,数据流部分就是video buffer,V4l2 buffer的管理是通过videobuf2来完成的,它充当于用户空间和驱动空间之间的中间层,并提供模块化的内存管理功能。
上图大体包含了videobuf2的框架
1.vb2_queue:核心的数据结构,用于描述buffer队列,其中struct vb2_buffer *bufs[]是存放buffer节点的数组,该数组中的成员代表了vb2 buffer.并将在queued_list和down_list两个队列中进行流转。
2.struct vb2_buf_ops:buffer的操作函数集,由驱动来实现,并由框架通过call_bufop宏来对特定的函数进行调用;
3.struct vb2_mem_ops:内存buffer分配函数接口,buffer类型分为三种:(1)虚拟地址和物理地址都分散,,可以通过dma-sg来完成;(2)物理地址分散,虚拟地址连续,可以通过vmalloc分配;(3)物理地址连续,可以通过dma-config来完成;三种类型在vb2框架总都有实现,框架可以通过call_memop来调用。
相关头文件在include/media下面:
<media/videobuf-dma-sg.h>
<media/videobuf-vmalloc.h>
<media/videobuf-dma-config.h>
4.struct vb2_ops:vb2队列操作函数集,由驱动来实现对应的接口,并在框架中通过call_vb_qop宏被调用。
流程分析
以omap3isp/ispvideo.c为例进行分析:
buffer申请(REQUBUFS):
buffer enqueue(QBUF):
buffer dequeue(DQBUF):
stream on :