3、高通Camera驱动基础:V4L2框架、CSI接口、MIPI协议、Sensor驱动注册流程
本章深入剖析高通Camera驱动栈的底层基石。理解V4L2框架、CSI接口、MIPI协议以及Sensor驱动注册流程,是后续进行HAL3适配与调试的前提。我们将从软件框架、硬件接口、协议标准到驱动实现,逐层拆解。
3.1 V4L2框架:Camera驱动的软件骨架
V4L2(Video for Linux 2)是Linux内核中视频设备驱动的标准框架。在高通平台上,Camera Sensor、ISP、CCI(I2C控制器)等设备均通过V4L2接口暴露给用户空间。
3.1.1 V4L2核心概念
| 概念 | 说明 | 高通平台对应实体 |
|---|---|---|
| Video Device | 字符设备节点(如 /dev/video0) | ISP、JPEG、VFE等硬件模块 |
| Subdev | 子设备,代表一个硬件组件 | Sensor、Flash、Actuator、EEPROM |
| Media Controller | 管理设备间拓扑连接 | Media Device(/dev/media0) |
| Buffer Queue | 数据流缓冲区管理 | Frame Buffer、Meta Buffer |
| Control | 设备控制接口(曝光、增益等) | V4L2_CID_EXPOSURE_AUTO等 |
3.1.2 V4L2设备拓扑结构
高通Camera系统中,多个V4L2 Subdev通过Media Controller连接成一条完整的pipeline。以下是一个典型的Sensor到ISP的拓扑关系图。
关键点: 在HAL3适配中,必须确保Media Controller拓扑正确,否则Stream On会失败。
3.2 CSI接口与MIPI协议:物理层与传输层
CSI(Camera Serial Interface)是MIPI联盟定义的摄像头串行接口标准。在高通平台上,CSI接口连接Sensor与ISP,负责高速图像数据的传输。
3.2.1 MIPI CSI-2 协议分层
| 层级 | 功能 | 高通实现 |
|---|---|---|
| PHY Layer | 物理层,差分信号传输 | D-PHY / C-PHY |
| Lane Management | 数据通道分配与合并 | CSI-2 RX Controller |
| Low-Level Protocol | 数据包格式(长包/短包) | Escape Mode, Sync Codes |
| Pixel/Byte Packing | 像素数据打包格式 | RAW10, RAW12, YUV422等 |
| Application Layer | 帧结构、嵌入式数据 | Frame Start/End, Embedded Data |
3.2.2 CSI接口关键信号
- CLK+ / CLK-:差分时钟线,提供数据传输时钟。
- DATA0+ / DATA0- 至 DATA3+ / DATA3-:差分数据线,最多支持4条Lane。
- MIPI CSI-2 数据包结构:包含SoT(Start of Transmission)、Packet Header、Data Payload、Packet Footer、EoT(End of Transmission)。
实战提示: 在调试CSI接口时,使用示波器测量CLK与DATA线的共模电压与差分摆幅。高通平台通常要求D-PHY电压摆幅为200mV~400mV。
3.2.3 CSI接口配置流程
- PHY初始化:配置D-PHY参数(电压、摆率、Termination)。
- Lane映射:将Sensor输出的Lane映射到ISP的CSI RX端口。
- 时钟设置:配置CSI时钟频率,确保满足带宽需求。
- 数据格式协商:Sensor与ISP协商像素格式(如RAW10)。
- 启动流:发送MIPI CSI-2 Frame Start包,开始数据传输。
3.3 Sensor驱动注册流程:从设备树到V4L2 Subdev
高通平台Camera Sensor驱动的注册遵循Linux内核设备模型,结合设备树(Device Tree)与V4L2 Subdev框架。
3.3.1 设备树节点配置
在设备树中,Sensor节点通常挂载在CCI(I2C)总线下,包含以下关键属性:
// 设备树示例:sensor节点
&cci_i2c0 {
status = "okay";
qcom,camera@34 {
compatible = "qcom,camera";
reg = <0x34>; // I2C地址
qcom,csiphy-sd-index = <0>; // CSI PHY索引
qcom,csid-sd-index = <0>; // CSID索引
qcom,sensor-name = "imx586";
qcom,mount-angle = <90>;
qcom,actuator-src = <&actuator0>;
qcom,eeprom-src = <&eeprom0>;
qcom,led-flash-src = <&led_flash0>;
clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
clock-names = "cam_src_clk";
qcom,clock-rates = <24000000>; // MCLK频率
};
};
3.3.2 驱动注册核心步骤
| 步骤 | 函数/操作 | 说明 |
|---|---|---|
| 1. I2C Probe | i2c_driver.probe() | 检测设备树匹配,获取资源 |
| 2. 时钟与电源 | clk_prepare_enable() / regulator_enable() | 使能MCLK、AVDD、DVDD、IOVDD |
| 3. Sensor初始化 | sensor_init_regs() | 通过I2C写入Sensor寄存器序列 |
| 4. V4L2 Subdev注册 | v4l2_i2c_subdev_init() | 初始化并注册Subdev |
| 5. Media Entity注册 | media_entity_pads_init() | 定义输入/输出Pad |
| 6. 控制处理器注册 | v4l2_ctrl_handler_setup() | 注册曝光、增益、帧率等控制 |
| 7. 异步探测完成 | v4l2_async_register_subdev() | 通知框架设备就绪 |
3.3.3 驱动注册流程图
3.4 实战案例:高通平台Sensor驱动调试要点
常见问题: Sensor驱动注册成功但无法Stream On。通常原因包括:
1. MCLK频率与Sensor要求不匹配(常见24MHz/19.2MHz)。
2. CSI Lane映射错误,导致ISP无法锁定数据。
3. Sensor初始化序列中寄存器地址或值错误。
1. MCLK频率与Sensor要求不匹配(常见24MHz/19.2MHz)。
2. CSI Lane映射错误,导致ISP无法锁定数据。
3. Sensor初始化序列中寄存器地址或值错误。
3.4.1 调试手段
- 内核日志:通过
dmesg | grep -i sensor查看驱动加载信息。 - Media Controller工具:使用
media-ctl -p查看拓扑连接状态。 - V4L2工具:使用
v4l2-ctl --list-devices确认设备节点存在。 - I2C验证:使用
i2cget读取Sensor寄存器,验证通信正常。
3.4.2 关键代码片段:Sensor初始化序列
// sensor_init_regs() 示例
static const struct regval_list sensor_init_regs[] = {
{0x0103, 0x01}, // 软件复位
{0x0100, 0x00}, // 进入待机模式
{0x0340, 0x0C}, // 帧高度高字节
{0x0341, 0x80}, // 帧高度低字节 (3200)
{0x0342, 0x0D}, // 帧宽度高字节
{0x0343, 0x20}, // 帧宽度低字节 (3360)
{0x0344, 0x00}, // X起始地址
{0x0345, 0x00},
{0x0346, 0x00}, // Y起始地址
{0x0347, 0x00},
{0x0202, 0x00}, // 曝光时间高字节
{0x0203, 0x64}, // 曝光时间低字节 (100)
{0x0204, 0x00}, // 增益高字节
{0x0205, 0x10}, // 增益低字节 (16x)
{0x0100, 0x01}, // 进入流模式
};
int sensor_init_regs(struct i2c_client *client) {
int ret;
for (int i = 0; i < ARRAY_SIZE(sensor_init_regs); i++) {
ret = i2c_smbus_write_word_data(client,
sensor_init_regs[i].reg,
sensor_init_regs[i].val);
if (ret < 0) {
pr_err("sensor: reg write failed at 0x%04x\n",
sensor_init_regs[i].reg);
return ret;
}
usleep_range(1000, 2000); // 寄存器间延时
}
return 0;
}
核心总结: V4L2框架提供了标准化的设备管理接口,CSI/MIPI协议定义了物理传输规范,而Sensor驱动注册流程则是将硬件能力映射到内核框架的关键桥梁。掌握这三层,就掌握了高通Camera驱动的底层基础。