3. RAW图采集流程:Sensor上电、MIPI CSI配置、DMA写入DDR、帧同步机制

RAW图采集是骁龙Camera驱动工作的起点。从Sensor感光到RAW数据写入DDR,涉及硬件上电时序、MIPI链路协商、DMA传输控制以及帧同步信号协同。任何一个环节的驱动参数配置错误,都会导致采集失败或图像质量劣化。本章节将拆解这一完整流程,并给出关键驱动调优点。

3.1 整体流程概览

一次完整的RAW图采集,在驱动层面可抽象为以下四个阶段:

  1. Sensor上电与初始化:驱动通过GPIO/PMIC控制Sensor的AVDD、DVDD、IOVDD电源轨,并发送I2C初始化序列。
  2. MIPI CSI链路建立:Sensor输出MIPI D-PHY/C-PHY信号,CSI接收器完成时钟同步、 Lane对齐与数据解串。
  3. DMA写入DDR:ISP或DMA控制器将解串后的RAW数据,通过AXI总线写入预先分配的DDR缓冲区。
  4. 帧同步与中断:VSYNC/HSYNC信号驱动帧起始与行传输,帧结束中断通知驱动进行下一帧处理。
驱动调优核心观点: 上电时序的毫秒级偏差可能导致Sensor初始化失败;MIPI参数(如CLK频率、Lane速率)与Sensor输出不匹配会直接产生CRC错误或数据错位;DMA地址对齐与带宽配置影响帧率稳定性。
RAW图采集四阶段流程 Sensor上电 AVDD/DVDD/IOVDD I2C初始化序列 MIPI CSI配置 D-PHY/C-PHY Lane速率/CLK同步 DMA写入DDR AXI总线传输 地址对齐/带宽 帧同步 VSYNC/HSYNC 中断处理 驱动调优关键:上电时序延迟、MIPI CLK频率匹配、DMA burst长度、帧中断响应优先级

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)。
MIPI CSI链路结构(D-PHY 4 Lane) Sensor RAW输出 CLK Data0 Data1 Data2 Data3 CSI接收器 D-PHY Combo ISP/DMA RAW数据解析 驱动需配置:lane_cnt=4, clk_rate=400MHz, settle_time=85ns, hs_trail=120ns

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
帧同步时序(VSYNC / HSYNC / 数据传输) VSYNC 帧起始 帧数据传输 HSYNC 行1 行2 DATA 行1数据 行2数据 行3数据 驱动在VSYNC下降沿触发帧完成中断,在VSYNC上升沿准备下一帧DMA缓冲区

3.6 本章小结