3. RAW图采集流程:Sensor上电、MIPI CSI配置、DMA写入DDR、帧同步机制
RAW图采集是骁龙Camera驱动工作的起点。从Sensor感光到RAW数据写入DDR,涉及硬件上电时序、MIPI链路协商、DMA传输控制以及帧同步信号协同。任何一个环节的驱动参数配置错误,都会导致采集失败或图像质量劣化。本章节将拆解这一完整流程,并给出关键驱动调优点。
3.1 整体流程概览
一次完整的RAW图采集,在驱动层面可抽象为以下四个阶段:
- Sensor上电与初始化:驱动通过GPIO/PMIC控制Sensor的AVDD、DVDD、IOVDD电源轨,并发送I2C初始化序列。
- MIPI CSI链路建立:Sensor输出MIPI D-PHY/C-PHY信号,CSI接收器完成时钟同步、 Lane对齐与数据解串。
- DMA写入DDR:ISP或DMA控制器将解串后的RAW数据,通过AXI总线写入预先分配的DDR缓冲区。
- 帧同步与中断:VSYNC/HSYNC信号驱动帧起始与行传输,帧结束中断通知驱动进行下一帧处理。
驱动调优核心观点: 上电时序的毫秒级偏差可能导致Sensor初始化失败;MIPI参数(如CLK频率、Lane速率)与Sensor输出不匹配会直接产生CRC错误或数据错位;DMA地址对齐与带宽配置影响帧率稳定性。
3.2 Sensor上电与初始化
Sensor上电是驱动与硬件交互的第一步。骁龙平台通常使用PMIC(电源管理芯片)或GPIO直控方式为Sensor供电。上电时序必须严格遵循Sensor Datasheet规定的延迟要求。
3.2.1 电源轨与上电时序
典型Sensor需要三路电源:
| 电源轨 | 典型电压 | 驱动控制方式 | 调优关注点 |
|---|---|---|---|
| AVDD(模拟) | 2.8V | PMIC LDO / GPIO + 稳压器 | 上电稳定时间 ≥ 1ms |
| DVDD(数字核心) | 1.2V | PMIC LDO | 纹波 < 30mV |
| IOVDD(I/O接口) | 1.8V | PMIC LDO / 外部直供 | 必须在MIPI信号建立前稳定 |
常见踩坑点: 部分Sensor要求AVDD先于DVDD上电,且两者之间延迟至少5ms。驱动中若使用GPIO同时拉高,可能导致Sensor内部POR(Power-On Reset)失败,表现为I2C通信无应答或MIPI无输出。
3.2.2 I2C初始化序列
上电完成后,驱动通过I2C总线向Sensor写入寄存器配置,包括:
- 软件复位:确保Sensor处于已知状态。
- 输出模式设置:RAW10/RAW12/RAW16、输出尺寸、帧率。
- MIPI配置:Lane数、CLK频率、Virtual Channel。
- 模拟增益与曝光:初始值设定。
// 驱动中I2C初始化序列示例(伪代码)
static struct regval_list sensor_init_regs[] = {
{0x0103, 0x01}, // 软件复位
{0x0100, 0x00}, // 进入待机模式
{0x0340, 0x07}, // 输出高度高字节
{0x0341, 0x80}, // 输出高度低字节 (1920)
{0x0342, 0x0A}, // 输出宽度高字节
{0x0343, 0x80}, // 输出宽度低字节 (2688)
{0x0306, 0x00}, // MIPI CLK分频系数
{0x0307, 0x78}, // MIPI CLK = 24MHz / 0x78 * 2
{0x0100, 0x01}, // 进入流模式
};
3.3 MIPI CSI配置
MIPI CSI(Camera Serial Interface)是Sensor与SoC之间的高速串行链路。骁龙平台的CSI接收器集成在ISP或独立的C-PHY/D-PHY combo模块中。
3.3.1 D-PHY vs C-PHY
| 参数 | D-PHY | C-PHY |
|---|---|---|
| 物理层 | 差分对(CLK+Data Lane) | 三线制(无独立CLK) |
| 每Lane带宽 | 最高 2.5 Gbps | 最高 5.7 Gbps(等效) |
| 骁龙平台支持 | SDM845 及之后全系列 | SM8250 及之后 |
| 驱动配置复杂度 | 较低(需配置CLK频率) | 较高(需配置电压摆幅) |
3.3.2 CSI驱动关键参数
在骁龙Camera驱动(通常位于 drivers/media/platform/msm/camera)中,MIPI CSI配置涉及以下参数:
- lane_cnt:使用的Data Lane数量(1/2/3/4)。
- clk_rate:CLK Lane频率,单位Hz。需根据Sensor输出带宽计算。
- settle_time:Lane进入HS模式前的稳定时间,单位ns。
- hs_trail:HS传输结束后的trail时间。
带宽计算公式: 总带宽 = clk_rate × lane_cnt × 2(DDR)。例如:clk_rate=400MHz,4 Lane,总带宽 = 400M × 4 × 2 = 3.2 Gbps。需大于Sensor输出RAW数据带宽(帧率 × 分辨率 × bpp)。
3.4 DMA写入DDR
MIPI解串后的RAW数据,通过DMA(Direct Memory Access)引擎直接写入DDR,无需CPU干预。骁龙平台使用IFE(Image Front End)或VFE(Video Front End)内部的DMA控制器。
3.4.1 DMA传输模式
| 模式 | 描述 | 适用场景 |
|---|---|---|
| Line-based | 每行数据独立触发DMA传输 | 高分辨率、低延迟 |
| Frame-based | 整帧数据完成后一次性传输 | 低帧率、后处理 |
| Ping-pong | 双缓冲区交替写入 | 连续采集、避免 tearing |
3.4.2 驱动DMA配置参数
// 骁龙Camera驱动DMA配置结构体示例
struct msm_vfe_dma_config {
uint32_t buf_addr_base; // DDR缓冲区基地址(需4K对齐)
uint32_t buf_stride; // 行跨度(bytes),需对齐到16字节
uint32_t buf_height; // 帧高度(行数)
uint32_t burst_len; // AXI burst长度(通常为8/16)
uint32_t format; // RAW10/RAW12/RAW16
bool ping_pong_en; // 是否启用ping-pong模式
};
调优要点:
- 地址对齐:DDR缓冲区基地址必须4K对齐,否则DMA传输可能产生总线错误。
- 行跨度(stride):必须 ≥ 图像宽度 × bpp / 8,且对齐到16字节。错误stride会导致图像错位。
- Burst长度:骁龙平台推荐AXI burst_len=16,可最大化DDR带宽利用率。
3.5 帧同步机制
帧同步是确保每一帧RAW数据完整、连续的关键。Sensor通过VSYNC(垂直同步)和HSYNC(水平同步)信号控制帧与行的传输。
3.5.1 同步信号时序
- VSYNC:帧起始信号。高电平表示新帧开始,低电平表示帧内数据传输。
- HSYNC:行起始信号。每行数据开始前触发。
- PCLK:像素时钟,每个时钟周期传输一个像素。
驱动通过中断捕获VSYNC的上升沿和下降沿,实现帧同步:
// 帧中断处理伪代码
static irqreturn_t sensor_irq_handler(int irq, void *dev_id) {
struct sensor_device *sensor = dev_id;
uint32_t irq_status = readl(sensor->base + IRQ_STATUS);
if (irq_status & VSYNC_RISING) {
// 新帧开始:准备DMA缓冲区
dma_prepare_next_buffer(sensor);
}
if (irq_status & VSYNC_FALLING) {
// 帧结束:通知应用层处理
complete(&sensor->frame_done);
}
if (irq_status & ERROR_IRQ) {
// 帧错误处理(如MIPI CRC错误)
dev_err(sensor->dev, "Frame error detected\n");
sensor_reset_stream(sensor);
}
return IRQ_HANDLED;
}
3.5.2 帧同步常见问题
| 问题现象 | 可能原因 | 驱动调优方案 |
|---|---|---|
| 帧率不稳定 | VSYNC中断响应延迟过高 | 提高中断优先级,使用 threaded IRQ |
| 图像撕裂 | DMA缓冲区切换与VSYNC不同步 | 启用ping-pong模式,在VSYNC下降沿切换 |
| 丢帧 | DMA带宽不足或burst长度过小 | 增大burst_len,优化DDR时钟频率 |
| MIPI CRC错误 | CLK频率过高或Lane信号质量差 | 降低clk_rate,增加settle_time |