2. MIPI CSI-2接口协议详解

MIPI CSI-2,说白了就是摄像头和处理器之间的“高速公路”。我刚开始调驱动时,总觉得这玩意儿就是个传输管道,后来踩了坑才明白——协议层的每一个细节,都可能让图像花掉、丢帧、甚至黑屏。

这一节,咱们从物理层到协议层,再到 Linux 下的调试手段,把 CSI-2 彻底讲透。

2.1 D-PHY 物理层:信号怎么跑起来的?

D-PHY 是 MIPI 的物理层标准。它用差分信号传输,一对线叫一个 Lane。每个 Lane 包含 Dp(正极)和 Dn(负极),靠电压差传数据。

我个人习惯把 D-PHY 的工作模式分成两种:

  • 高速模式(HS):数据传输阶段,电压摆幅小(约 200mV),速率高(每 Lane 最高 2.5Gbps)。
  • 低功耗模式(LP):控制信号阶段,电压摆幅大(1.2V),速率低,但省电。

你想想看,如果 HS 和 LP 切换时序不对,接收端就会误判。我在项目中遇到过一块 sensor,LP→HS 的切换时间比 spec 多了 5ns,结果图像上半部分全是条纹。后来用示波器一抓,才发现是驱动里配置的 D-PHY 初始化序列少了一个 delay。

关键参数速查表

参数HS 模式LP 模式
电压摆幅~200mV1.2V
速率80Mbps - 2.5Gbps~10Mbps
传输方向单向(sensor→host)双向(控制)
典型用途图像数据同步、唤醒、Escape 模式

2.2 CSI-2 协议层:数据怎么组织的?

物理层只管传比特,协议层才定义这些比特是什么意思。CSI-2 协议层分三层:

  1. 像素/字节打包层:把 raw data 按格式打包(比如 RAW10、YUV422)。
  2. LLP(Low Level Protocol)层:负责包结构、ECC、CRC。
  3. 通道管理层:管理 Lane 分配和虚拟通道。

嗯,这里要注意——每个包都包含一个 8-bit 的 Data Identifier(DI),它由 虚拟通道号(VC,2-bit) 和 数据类型(DT,6-bit) 组成。

避坑指南

我曾经调过一块 sensor,图像一直偏色。查了两天,最后发现是 sensor 输出的 DT 是 RAW10,但 ISP 端配置成了 RAW12。解析方式不同,颜色当然不对。所以拿到 sensor 的第一件事,就是确认 DT 值。

2.2.1 Lane 数:用几条车道?

CSI-2 支持 1/2/4 Lane 配置。Lane 数越多,带宽越大,但 PCB 走线也更复杂。

举个例子:一个 1920x1080@60fps 的 sensor,RAW10 格式,每帧数据量约 20.7Mbit。如果用 1 Lane @ 1Gbps,刚好够;但如果你要跑 120fps,就得用 2 Lane 或 4 Lane。

我个人习惯先算带宽余量:

带宽需求 = 分辨率 × 帧率 × 位深 × 1.2(协议开销)
可用带宽 = Lane数 × 每Lane速率

余量建议留 20% 以上,否则高动态场景容易丢包。

2.2.2 虚拟通道(VC):一条线传多路数据

虚拟通道允许在同一个物理链路上传输多路独立的图像流。比如双目摄像头,左眼用 VC0,右眼用 VC1,host 端根据 VC 号区分。

VC 号在 DI 的高 2-bit 里。我见过有人把两个 sensor 配成同一个 VC,结果图像混在一起,根本分不清谁是谁。

注意

VC 只在协议层区分,物理层不关心。所以如果 host 端驱动没按 VC 号分发数据,图像就会串流。

2.2.3 数据类型(DT):告诉你怎么解析

DT 是 6-bit 值,定义了每个像素的格式。常见的有:

DT 值(Hex)格式说明
0x2BRAW88-bit 原始数据
0x2CRAW1010-bit 原始数据
0x2DRAW1212-bit 原始数据
0x1EYUV422 8-bitYUV 格式
0x24RGB888RGB 格式

DT 不对,图像必花。我建议在驱动初始化时,打印出 sensor 实际发送的 DT,和预期值做对比。

2.3 Linux 下的调试方法

理论讲完了,咱们看看实际怎么调。Linux 下调试 CSI-2,我主要用这几招:

2.3.1 用 v4l2-ctl 抓流

# 查看设备
v4l2-ctl --list-devices

# 抓一帧 raw 数据
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=RG10 --stream-mmap --stream-to=frame.raw --stream-count=1

如果抓不到数据,先检查 sensor 是否出图。我习惯用示波器抓 MIPI 时钟 Lane,看有没有 HS 跳变。

2.3.2 调试 MIPI 错误中断

大多数 SoC 的 CSI 控制器都有错误状态寄存器。比如:

# 读取错误计数(以 i.MX8 为例)
cat /sys/kernel/debug/mipi_csi/errors

常见错误包括:

  • ECC 错误:传输过程中比特翻转,通常是信号质量问题。
  • CRC 错误:包尾校验失败,可能是 Lane 数配置不对。
  • 帧同步错误:FS/FE 包丢失,检查帧同步时序。

我的经验

ECC 错误如果持续增长,先检查 PCB 走线等长。我遇到过一块板子,Dp 和 Dn 差了 3mm,结果 4 Lane 模式下高频丢包。改成 2 Lane 就好了——但这不是长久之计,最后还是改板子解决的。

2.3.3 用 trace 工具分析时序

Linux 的 ftrace 可以抓 MIPI 中断的时序:

echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo mipi_csi_isr > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/trace_pipe

看中断间隔是否均匀。如果某帧中断延迟突然变大,说明系统调度有问题,可能导致帧丢失。

2.4 知识结构图

下面这张图总结了 CSI-2 的核心层次和调试要点:

MIPI CSI-2 协议栈与调试要点 MIPI CSI-2 协议栈与调试要点 D-PHY 物理层 差分信号 / HS / LP Lane 数:1/2/4 CSI-2 协议层 VC / DT / ECC / CRC 包结构 / 帧同步 应用层 V4L2 / ISP 驱动 图像格式解析 Linux 调试方法 v4l2-ctl 抓流 验证数据通路 错误中断分析 ECC/CRC/帧同步 ftrace 时序分析 中断间隔/调度延迟 调试时从物理层→协议层→应用层逐级排查,不要跳步

2.5 常见问题与排查思路

最后,我整理了一份排查清单,遇到问题可以按这个顺序查:

  1. 无图像:先看时钟 Lane 有没有 HS 跳变 → 再看 sensor 配置 → 最后查驱动 probe。
  2. 图像花屏:检查 DT 是否匹配 → 检查 Lane 映射 → 检查 ECC 错误计数。
  3. 图像偏色:确认 RAW 格式 → 检查 bit 顺序(LSB/MSB)→ 查 ISP 配置。
  4. 间歇性丢帧:看 CRC 错误 → 检查 PCB 走线 → 降低 Lane 速率测试。

重要提醒

不要一上来就怀疑硬件。我见过太多人花两周查 PCB,最后发现是 sensor 的 I2C 地址配错了。先确认软件层,再动硬件。