4. MIPI接口详解

MIPI接口,说白了就是摄像头和处理器之间的“高速公路”。我做了这么多年Camera驱动,见过太多因为MIPI配置不对导致的黑屏、花屏问题。这一章,咱们就把这条高速路的规矩彻底讲清楚。

4.1 整体架构:三层分工

MIPI CSI-2的架构分三层,每一层各司其职。我习惯用快递系统来打比方,你一听就懂。

  • 应用层:打包货物的人。决定数据怎么封装,比如RAW10、YUV422这些格式。
  • 协议层:贴快递单的人。负责把数据拆成包,加上包头包尾,告诉接收方“这是哪一帧、哪一行”。
  • 物理层:送货的卡车司机。负责在Lane上高速传输0和1,保证信号不丢包。

核心要点:调试MIPI问题时,先确认物理层通不通,再看协议层对不对。我见过有人花三天查协议,结果发现是D-PHY电压配错了。

MIPI CSI-2 三层架构 应用层 (Application Layer) 像素格式封装:RAW8/10/12、YUV422、RGB565、JPEG 协议层 (Protocol Layer) 数据包拆装:短包(帧开始/结束)、长包(行数据)、ECC校验 物理层 (Physical Layer - D-PHY) 差分信号传输:时钟Lane + 数据Lane,HS/LP模式切换 数据流向:Sensor → 应用层打包 → 协议层组包 → 物理层发送

4.2 D-PHY物理层:信号怎么跑

D-PHY是MIPI的物理层标准。说白了,就是一对差分线(Dp/Dn)在跑数据。我刚开始调驱动时,总觉得差分信号很玄乎,其实你把它想象成两个人抬轿子——一个抬正相,一个抬反相,步调一致才能走得稳。

4.2.1 两种模式:HS和LP

模式 电压摆幅 速率 用途
HS (High Speed) 200mV 差分 80 Mbps ~ 4.5 Gbps 传输像素数据
LP (Low Power) 1.2V 单端 ~10 Mbps 控制信号、总线周转

嗯,这里要注意:HS模式才是真正干活的时候,LP模式只是用来打招呼的。我曾经遇到一个案子,Sensor输出的LP信号时序不对,导致SoC一直识别不到数据开始,画面全黑。查了两天才发现是LP-11状态保持时间不够。

4.2.2 Lane结构

一个MIPI接口至少有一条时钟Lane和一条数据Lane。时钟Lane负责提供同步时钟,数据Lane负责传数据。数据Lane可以扩展,1条、2条、4条都很常见。

个人经验:4条Lane的配置最常用。但如果你板子走线空间紧张,2条Lane也能跑1080P@30fps,只要把速率翻倍就行。不过速率高了信号容易出问题,这是个取舍。

4.3 CSI-2协议层:数据怎么打包

协议层负责把像素数据打包成“数据包”。每个包都有固定的格式,就像快递包裹必须有面单一样。

4.3.1 包结构

  • 短包 (Short Packet):只有32位数据,用于帧同步、行同步。比如帧开始(FS)、帧结束(FE)、行开始(LS)。
  • 长包 (Long Packet):包含真正的像素数据。结构是:包头(32位) + 数据负载 + 包尾(16位CRC校验)。
// 长包结构示意
// [Data ID (8bit)] [Word Count (16bit)] [ECC (8bit)] [Payload] [CRC (16bit)]
// 举例:RAW10格式,一行1920像素
// Data ID = 0x2A (虚拟通道0,数据类型RAW10)
// Word Count = 1920 * 10 / 8 = 2400 字节
// ECC = 对前32位做纠错码
// Payload = 2400字节像素数据
// CRC = 对Payload做循环冗余校验

避坑指南:我曾经遇到一个Bug,画面出现随机条纹。查到最后发现是Word Count算错了——RAW10每像素10bit,不是2字节!Word Count的单位是字节,一定要按位宽换算清楚。

4.3.2 数据类型 (Data Type)

协议层用Data ID字段告诉接收方“我传的是什么格式”。常见的DT值如下:

数据类型 DT值 (Hex) 说明
RAW6 0x28 6位原始数据
RAW8 0x2A 8位原始数据,最常用
RAW10 0x2B 10位原始数据
RAW12 0x2C 12位原始数据
YUV422 8bit 0x1E YUV格式
JPEG 0x40 压缩图像数据

4.4 Lane速率计算:到底能跑多快

这是调驱动时最常算的公式。说白了,就是算一算你的MIPI总线能不能撑住Sensor输出的数据量。

4.4.1 计算公式

单Lane速率 (Mbps) = (帧率 × 分辨率宽 × 分辨率高 × 每像素位数) / (Lane数 × 1000000)

举例:1920x1080 @ 30fps, RAW10, 4 Lane
= (30 × 1920 × 1080 × 10) / (4 × 1000000)
= 622080000 / 4000000
= 155.52 Mbps

嗯,算出来是155.52 Mbps。但实际配置时,我建议留20%~30%的余量。为什么?因为还有消隐区(Blank)的开销。Sensor输出一行数据,中间有H-Blank,帧之间有V-Blank,这些时间也要算进去。

实际经验:我一般按公式算完后,再乘以1.3。比如上面算出来155.52 Mbps,实际配置到200 Mbps左右比较稳妥。如果配得太紧,帧率可能跑不满,或者出现丢帧。

4.4.2 常见分辨率速率参考

分辨率 帧率 格式 Lane数 单Lane速率
640x480 60 YUV422 1 ~74 Mbps
1920x1080 30 RAW10 4 ~156 Mbps
3840x2160 30 RAW10 4 ~622 Mbps
3840x2160 60 RAW10 4 ~1244 Mbps

注意:D-PHY v1.2的单Lane理论上限是4.5 Gbps,但实际板子上超过1.5 Gbps就容易出信号完整性问题。4K@60fps用4 Lane跑1.2 Gbps,对PCB走线要求很高。我建议这种场景考虑C-PHY或者用8 Lane。

4.5 多路数据流同步:多个摄像头怎么协调

现在的手机动辄三摄、四摄,多路数据流同步是个大难题。CSI-2协议层提供了两种机制来解决这个问题。

4.5.1 虚拟通道 (Virtual Channel)

虚拟通道是CSI-2协议层的一个字段,占2位,所以最多支持4个虚拟通道(VC0~VC3)。多个Sensor可以共享同一条MIPI总线,通过VC来区分数据属于哪个Sensor。

// 虚拟通道在Data ID中的位置
// Data ID [7:6] = Virtual Channel
// Data ID [5:0] = Data Type
// 例如:0x6A = VC1 + RAW8
//       0x2A = VC0 + RAW8

我做过一个双摄项目,主摄用VC0,副摄用VC1,共用4条Lane。主摄跑30fps,副摄跑15fps,通过VC区分。但要注意,两个Sensor的帧率必须同步,否则会出现数据交错。

4.5.2 帧同步 (Frame Sync)

多路数据流同步的核心是帧同步。说白了,就是让所有Sensor在同一时刻开始曝光、同一时刻输出数据。硬件上通常用一根SYNC信号线连接所有Sensor,软件上通过I2C配置同步模式。

我的做法:一般先让主摄输出FS(帧开始)信号,副摄检测到这个信号后开始曝光。这样能保证所有Sensor的帧边界对齐。如果不对齐,双摄融合算法会算出错误的深度图。

4.5.3 同步时序要求

参数 要求 说明
帧开始偏差 < 1行时间 所有Sensor的FS信号偏差不能超过一行
曝光时间一致 ±1% 曝光时间差异会导致亮度不一致
MIPI时钟同源 必须 所有Sensor使用同一时钟源

避坑指南:我曾经遇到一个案子,双摄画面总是差几行。查到最后发现是Sensor的PLL配置不同,导致内部时钟有微小偏差。解决办法是让两个Sensor用同一个MCLK,并且PLL配置完全一致。

4.6 本章小结

MIPI接口是Camera系统的命脉。物理层决定了信号能不能传过去,协议层决定了数据怎么解析,速率计算决定了能不能跑满帧率,多路同步决定了多摄能不能协同工作。调MIPI时,我建议按这个顺序排查:先看D-PHY的LP状态机是否正常,再看HS模式能否锁定,然后检查协议层的包结构,最后确认速率是否在预算范围内。