如果从事摄像头类驱动软件,需要准备哪些基础,一篇文章总结完。
本文主要总结了摄像头camera常见的MIPI硬件接口,以及软件驱动框架V4L2,从硬件接口框架参数到软件框架,掌握这些你就基本具备了开展对应的摄像头驱动开发的基础。
从独立件来看,包括传感器模组和核心板两部分;
所以驱动软件的核心就是保证两者之间的连接,硬件接口常见两种MIPI和USB,MIPI接口调试中重点关注PHY层;软件驱动框架常见的V4L2和UVC。
摄像头传感器(sensor)模组作为影像输入,提供数据来源;
核心板接收并处理模组的输入进行处理以及显示;
硬件接口提供物理连接方式,摄像头驱动软件就是驱动这两者的软连接,一般借助于一些成熟的软件驱动框架实现。
常见概念:
视频输入技术,是指通过光电技术将拍摄到的真实图像,通过摄像机转存到存储介质上的技术。
摄像头模组,作为视频输入设备,物理上捕捉图像的设备,广泛应用于实时监控、车载、录像拍照等多个领域。
本地摄像头,指本文使用的本地集成的camera。
网络摄像头,可以直连网络;通过使用视频编解码器连接到便携网络设备上,然后通过网络将图像回传到人机交互终端上。
MIPI,(移动产业处理器接口)定义了一系列移动设备内部的接口标准,MIPI接口同时定义4对差分信号用于传输图像数据,又定义了一对差分时钟信号,最初是为了减少LCD与主控芯片之间连线的数量(代替并行接口)而制定,最终支持了高清显示器以及摄像头。
以RK3399芯片平台为例,内部集成了三个MIPI接口:DPHY0(TX0)、DPHY1(TX1RX1)、DPHY2(RX0),其中TX只能发送数据,RX只能接收数据到ISP0。有两个 PHY,每个PHY同时支持1lane、2lane或者4lane,最大可支持13M pixel raw sensor。
摄像头MIPI接口
摄像头传感器驱动接口有两方面构成:(1)通过IIC接口实现控制命令和配置参数的发送与接收,实现初始化传感器、配置其参数(如分辨率、帧率、曝光等);(2)通过MIPI接口实现图像数据的正确传输和解析。
IIC总线:两根信号线(SCL时钟线和SDA数据线),摄像头传感器通常作为从设备,由主设备(如处理器)通过IIC接口完成针对从设备的配置和控制。
IIC功能:通过IIC接口,主设备可以向摄像头传感器发送控制命令和配置参数,如设置图像分辨率、曝光时间、白平衡等。
MIPI接口:用差分信号传输技术,可以有效减少信号干扰和功耗,是一种高性能、低功耗的串行通信接口。
MIPI功能:支持多种数据编码格式(如YUV、RGB、RAW等)和不同的数据位宽(如8位、10位、12位等)的摄像头传感器的图像数据传输。另外一些高级功能比如相位对焦、HDR也需要通过MIPI接口实现。
其他供电以及时钟类接口,按照硬件连接即可。
MIPI接口参数
以下是一些常用MIPI参数的示例规格(仅供参考,不同的硬件平台和标准会有所不同):
参数名称 | 示例规格 | 说明 |
---|---|---|
数据速率 | 1.5 Gbps / 3 Gbps / 6 Gbps | 支持的数据传输速率范围,具体取决于硬件平台和标准 |
通道数 | 2 Lane / 4 Lane | 支持的MIPI通道数量,增加通道数可提高数据传输速率 |
时钟频率 | 100 MHz / 200 MHz | 驱动MIPI接口的时钟信号频率,影响数据传输速率和稳定性 |
上升时间/下降时间 | < 100 ps | MIPI信号的上升和下降时间,影响信号完整性 |
眼图张开度 | > 80% @ 1 Gbps | 评估信号完整性的关键指标,影响数据传输的可靠性和稳定性 |
参数说明:
(1)数据速率(Data Rate)指通过MIPI接口传输数据的速度,以Gbps(吉比特每秒)为单位。
不同的MIPI标准和硬件平台支持的数据速率范围不同。提高MIPI速率可以加快数据传输速度,使得相同时间内可以传输更多的图像数据,从而增加码流。而低功耗或低成本的解决方案则可能支持较低的数据速率。
在调试过程中,需要根据系统要求和摄像头性能选择合适的数据速率,并通过驱动配置进行设置。利用调试工具(如示波器、逻辑分析仪)监测MIPI信号的波形和时序,确保调整后的速率在硬件支持的范围内,并且信号质量良好。
(2)通道数(Lane Count)指用于数据传输的MIPI通道数量。每个通道都可以独立传输数据,因此增加通道数可以提高总的数据传输速率。
常见的通道数有1、2、4等。不同的摄像头和处理器支持的最大通道数可能不同。
在调试过程中,需要根据系统的数据带宽需求和硬件支持情况选择合适的通道数。
(3)时钟频率(Clock Frequency)指用于驱动MIPI接口的时钟信号的频率。时钟频率直接影响数据传输的速率和稳定性。
时钟频率的规格取决于所使用的MIPI标准和硬件设计。工程师需要根据系统要求和硬件规格来设置合适的时钟频率。
在调试过程中,需要确保时钟信号的稳定性和准确性,以避免数据传输错误或延迟。
(4)信号完整性参数,包括信号的上升时间、下降时间、眼图张开度等,这些参数直接影响MIPI信号的传输质量和稳定性。
信号完整性参数的规格通常根据所使用的传输线质量、信号驱动器和接收器的性能以及系统的电气特性来确定。
在调试过程中,需要使用示波器、逻辑分析仪等工具来监测和分析MIPI信号的波形和时序,以确保信号完整性满足要求。
(5)总结
当MIPI参数修改后,需要根据响应修改,重新向sensor厂商申请一份相应规格的sensor setting,以确保摄像头能够正常工作并输出符合要求的图像数据。
比如调整MIPI速率实际上是在调整数据传输的时钟频率。因此,需要调整sensor内部的时钟分频器,从而确保sensor的时钟配置与新的速率相匹配。
修改通道数后,因为在多通道传输中,需要确保各个通道之间的数据同步。因此需要使用共同的时钟信号、同步信号,这可能需要调整sensor的同步机制。
MIPI-CSI硬件接口
摄像头模组是以V13850模组为例,硬件使用的是MIPI CSI接口,软件在Android平台把OV13850模组的驱动和配置都在硬件抽象层完成。
摄像头控制的使用的是MIPI-CSI模式,除了MIPI接口还包括三电源供电、i2c、mclk和GPIO等引脚。
使用的三个电源包括VDDIO(IO电源与MIPI信号线的电压保持一致)、AVDD(模拟电源2.8V或3.3V)和DVDD(数字电源1.5V或者更高)。
GPIO主要包括有电源使能管脚、PowerDown引脚、复位引脚等。原理图如下:
MIPI camera.jpg
MIPI phy物理层
01MIPI 协议架构
MIPI接口的整体架构包括物理层、协议层和应用层。
应用层向协议层提供数据,并指定数据的传输需求和规则;
协议层则根据这些需求和规则,将数据封装成适合传输的格式,为物理层提供数据传输的框架和规则;
物理层PHY(Physical Layer)则负责将协议层封装好的数据通过物理介质发送出去,PHY层直接与物理介质相连,负责物理信号与数字信号的转换,是确保数据能够正确、高效地通过物理介质的关键。
02MIPI PHY
MIPI接口调试中重点关注PHY的原因:
(1)PHY层是数据传输的基础,直接涉及物理连接,从而直接影响传输质量。
(2)PHY层具备复杂性,MIPI标准定义了多种PHY层规范适用各种场景,PHY层涉及的技术细节非常丰富,包括差分信号传输、时钟恢复、数据编解码等。
(3)PHY层具有调试的便捷性和快速定位问题的优势,PHY层可以使用示波器、逻辑分析仪等工具直接观察和测量信号的波形、时序和电平等信息。
03MIPI PHY的类型
类型 | 通道 | 工作模式和特点 | 主要应用 |
---|---|---|---|
C-PHY | 每条lane包含彼此差分的三条数据线 | 有极高的传输速率 | 图像采集设备 |
D-PHY | 每条lane通常是一对差分线对 | 支持高速(High-Speed)和低功耗(Low-Power)两种 | 显示设备 |
Combo-PHY | 结合了C-PHY和D-PHY的特点 | Combo-PHY可以在C-PHY和D-PHY模式之间进行切换,从而实现灵活的数据传输。 |
驱动软件框架V4L2
V4L2(Video4Linux2)是Linux内核中用于视频设备的通用API,它支持视频捕捉、流媒体播放、视频输出等。
V4L2可支持三类设备:视频输入输出设备、VBI设备和radio设备,其中V4L2最广泛使用的视频输入设备就是摄像头输入设备。
V4L2核心源码目录是/kernel/drivers/media/v4l2-core/。
V4L2的驱动核心v4l2_dev.c,包含主要结构体 video_device 的注册,在/dev目录下创建设备节点video等。
V4L2中的关键结构体v4l2_device、
v4l2_subdev、
video_device等。
V4L2中ioctl常用命令VIDIOC_QUERYCAP、
VIDIOC_S_FMT等。
驱动代码核心流程:
(1)初始化V4L2设备,注册设备节点(如/dev/video0
)。
(2)注册camera子设备,如ISP sensor设备。
(3)通过VIDIOC_QUERYCAP
查询设备支持的功能;
(4)使用VIDIOC_S_FMT
设置图像的分辨率、像素格式等;
(5)通过VIDIOC_REQBUFS
请求缓冲区,并使用mmap
将缓冲区映射到用户空间;
(6)使用VIDIOC_STREAMON
和VIDIOC_STREAMOFF
控制视频流的开始和停止。
V4L2架构的框架图如下
V4L2框架图.jpg
V4L2核心驱动框架:V4L2框架的核心部分主要负责构建内核中标准的视频设备驱动框架,并提供统一的接口函数。它包括了视频设备的注册、注销、查询等功能,以及与子设备的交互接口。
V4L2下层接口驱动框架:负责将具体的视频设备(如摄像头sensor)挂接到V4L2框架上。它包括了与硬件相关的接口实现,如I2C、SPI等通信协议的实现,以及与sensor等子设备的交互逻辑。
子设备具体驱动:子设备驱动(如sensor驱动、ISP驱动等)通过V4L2提供的接口与主设备交互。它们实现了具体的硬件控制逻辑,如sensor的初始化、图像数据的采集等。
字符设备接口:在Linux中,所有的外设都被当做文件来处理。V4L2框架通过字符设备接口(如/dev/videoX)向用户空间提供视频设备的访问能力。用户空间的应用程序可以通过标准的文件操作接口(如open、read、write、ioctl等)来访问视频设备。
视频缓冲区管理:V4L2框架提供了视频缓冲区的管理机制,用于在内核空间和用户空间之间高效地传输视频数据。这通常通过videobuf2等模块来实现。
总结整理总是水磨功夫,全篇成文跨度太久,求一个点赞关注,打打气!