全志V853视频输入驱动框架详解:从VIN模块到虚通道实战
一、视频输入基础
1. VIN camera驱动框架
涉及 V4l2 驱动部分的知识在这里不深入讲解,后面有时间再深入分析一下。
VIN camera 驱动使用过程可简单的看成是 vin 模块 + device 模块 + af driver + flash 控制模块的方式。
- vin.c 是驱动的主要功能实现,包括注册/注销、参数读取、与 v4l2 上层接口、与各 device 的下层接口、中断处理、buffer 申请切换等;
- modules/sensor 文件夹里面是各个 sensor 的器件层实现,一般包括上下电、初始化,各分辨率切换,yuv sensor 包括绝大部分的v4l2 定义的ioctrl 命令的实现;而 raw sensor 的话大部分 ioctrl 命令在 vin 层调用 isp 库实现,少数如曝光/增益调节会透过 vin 层到实际器件层;
- modules/actuator 文件夹内是各种 vcm 的驱动;
- modules/flash 文件夹内是闪光灯控制接口实现;
- vin-csi 和 vin-mipi 为对 csi 接口和 mipi 接口的控制文件;
- vin-isp 文件夹为 isp 的库操作文件;
- vin-video 文件夹内主要是 video 设备操作文件;

2. Camera通路框架
- VIN 支持灵活配置单/双路输入双 ISP 多通路输出的规格
- 引入 media 框架实现 pipeline 管理
- 将 libisp 移植到用户空间解决 GPL 问题
- 将统计 buffer 独立为 v4l2 subdev
- 将的 scaler(vipp)模块独立为 v4l2 subdev
- 将 video buffer 修改为 mplane 方式,使用户层取图更方便
- 采用 v4l2-event 实现事件管理
- 采用 v4l2-controls 新特性

3. 视频输入组件
3.1 ISP
以全志为例,在全志 V853 芯片中,ISP组 件在使用过程中是支持分时复用的,ISP 分时复用周期图如下所示:

isp00/isp01/isp02/isp03 分别代表一个周期的1/4,每一个周期中的会被分为4等分,当该周期运行到那一等分的时候,就会去连接到一个摄像头并采集图像数据。通过分时复用的方式,使得芯片端的 ISP 硬件可以同时连接4个摄像头。
注意:
- V853芯片支持两路 MIPI+一路并口的摄像头,分时复用只会有三个源。
- 在线编码无法使用分时复用,因为在线编码对实时性要求很高,使用分时复用可能会发生带宽不连续,延迟叠加等。
3.2 VIPP
Video Input Post Processor,即视频输入后处理器。它是一种用于图像传感器的硬件组件,可以对图像进行缩小、打水印、去坏点、增强等处理。它可以支持不同的图像数据格式,如 Bayer raw data 或 YUV 格式。

VIPP 硬件有4个VIPP通道,4个VIPP通道与ISP一致也可以分时复用,对于应用层来说,我们可以从VIPP通道中取数据,例如上图中 VIPP10 ,1表示VIPP硬件通道号,0表示分时复用的情况。
注意:由于硬件中只有4路VIPP,那么在开发中只能获取4路不同分辨率的图像。
3.3 虚通道
虚通道(Virtual Channel,简称 VC)是一种用于管理和绑定不同功能模块之间的通信路径。在MPP中,音频和视频的处理是独立的,为了避免混乱和通道错乱,引入了虚通道的概念。
虚通道允许将不同的功能模块绑定在一起,以便更好地控制和管理视频处理流程。例如,虚通道可以将视频输入(VI)、视频处理(VPSS)、视频编码(VENC)等模块连接起来,形成一个完整的视频处理流程。

基于前面的VIPP硬件,会为它创建若干个虚通道,虚通道的数量在理论上是不受限制的,我们可以创建很多个虚通道用于传输到其他地方去使用。因为虚通道的本质是对实际VIPP通道中的每一帧图像做引用技术,每个虚通道从VIPP通道获取这一帧图像后,会把这一帧的引用技术+1,如果将这一帧数据还回去的话就将这一帧的引用技术-1。只有当这一帧的引用技术降为0的时候,这一帧数据才会真正还给V4L2驱 动 /dev/video0。
注意:
- 如果很多个虚通道都使用同一个 VIPP 通道的数据,那么它们就是公用一个 buffer
- 只要有一个虚通道没有及时还帧,就意味着这一帧 buffer 没有被还回去,其他虚通道也无法使用
- 如果占用太多帧没有还,那么其他虚通道也拿不到帧
- 虚通道要满足:及时还帧,用时创建,用完销毁
4. VI 组件内部结构
视频输入组件内部主要是由通道管理器组成,如下图所示:

ViChnManager:是通道管理器,维护一个通道的链表(通道指的是虚通道)负责管理和调度虚拟通道资源。
VI_CHN_MAP_S 是一个结构体或配置,用于定义视频输入通道(VI Channel)的属性和映射关系。这通常涉及到视频捕获硬件的配置,如分辨率、像素格式、缓冲区数量等。
MM_COMPONENTTYPE 通常指的是多媒体组件类型,它可能是一个接口或抽象类,用于定义多媒体处理组件的通用属性和行为。这样的组件可能包括编解码器、过滤器、转换器等。
5. 全志视频输入组件使用示例
5.1 开启和关闭摄像头
示例:演示 mpi_vi 组件的reset流程,vi 组件运行过程中停止,销毁,再重新创建运行。
步骤:
点击链接全志V853视频输入驱动框架详解:从VIN模块到虚通道实战阅读原文
