从 MIPI ERR1/ERR2 到视频处理高手:Camera 调试必须掌握的底层排障方法


📺 B站 嵌入式孙老师博主个人介绍

📘 博主书籍-京东购买链接*:Yocto项目实战教程

📘 加博主微信,进技术交流群jerrydev


从 MIPI ERR1/ERR2 到视频处理高手:Camera 调试必须掌握的底层排障方法

开篇:先带着几个问题看这篇文章

在调试 RK3576、RK3588、RV1126、RK356x 等平台的 Camera 时,我们经常会遇到类似这样的日志:

mipi0-csi2-hw ERR2:0xf0000
MIPI error: packet: 0x...
ERR1: crc errors
ERR2: header error detected and corrected
CIF_ISP_PIC_SIZE_ERROR
CIF_ISP_DATA_LOSS

很多初学者看到这些日志,第一反应是:是不是驱动写错了?是不是 IQ 文件不对?是不是 sensor 没初始化成功?

但真正有经验的 Camera 工程师,会先问下面几个问题:

  1. 这个错误属于 D-PHY 层、CSI-2 Packet 层、CSI-2 Protocol 层,还是 ISP/VICAP 接收层
  2. TX 端 sensor 实际输出的 MIPI 速率,和 RX 端驱动里配置的 link_freq 是否匹配?
  3. Sensor 实际输出几条 lane?DTS 和驱动配置的 lane 数是否一致?
  4. P/N 有没有接反?lane 顺序有没有错?
  5. LP11、LP01、LP00、HS 这些状态是否符合 MIPI D-PHY 时序?
  6. CRC、ECC 报错到底是数据 payload 错,还是 packet header 错?
  7. HS-prepare / HS-zero / HS-trail / THS-settle 这些参数到底影响什么?
  8. 图像能正常出,但是启动时报一次 ERR2,这算不算严重问题?
  9. 怎么从“会改 DTS”进阶到“能系统定位视频链路问题”?

这篇文章的核心答案是:

想成为视频处理高手,不是先学滤镜、编码、算法,而是先把 Camera 输入链路吃透。MIPI 错误不是单点问题,它是 sensor 寄存器、MIPI 时序、PCB 走线、DTS 配置、驱动 link_freq、CSI2 控制器、VICAP/ISP 吞吐能力共同作用后的结果。会看 ERR1/ERR2,只是入门;能根据错误层级建立排查路径,才是真正的视频调试能力。

Rockchip 的 Camera FAQ 也明确把 MIPI 错误按链路分层:数据路径大致是 MIPI DPHY → MIPI CSI Controller → VICAP/ISP Controller,错误也应该按这个链路分层定位,而不是看到报错就盲目改参数。


在这里插入图片描述

一、先建立视频输入链路的全局图

做 Camera 调试,第一件事不是看代码,而是画链路。

一个典型 MIPI Camera 输入链路如下:

Sensor / HDMI-RX / SerDes
        |
        | MIPI CSI-2 TX
        v
MIPI D-PHY RX
        |
        v
CSI-2 Controller
        |
        v
VICAP / CIF
        |
        v
ISP
        |
        v
RGA / VENC / Display / AI

对应到问题层级:

层级主要模块常见错误重点排查
物理层MIPI D-PHYSOT、SOT Sync、False Control、EOT SyncP/N、lane、LP/HS 时序、信号质量
包层CSI-2 PacketCRC、ECC1、ECC2、ErrIDlink freq、lane、信号完整性、数据格式
协议层CSI-2 ProtocolFrameSync、FrameDataFS/FE、虚拟通道、曝光/VTS/时序
接收层VICAP/ISPPIC_SIZE_ERROR、DATA_LOSS、FIFO Overflow分辨率、吞吐、DDR、AXI、ISP clock

这就是高手和新手的区别。

新手看到 ERR2,只会问“怎么改”。

高手会先问:ERR2 里的哪几个 bit 置位?它属于哪一层?这层前面还有没有更底层错误?

Rockchip FAQ 里也建议 MIPI 问题按优先级处理:先看 D-PHY Level Error,再看 CSI-2 Controller Error,再看 CSI-2 Packet Level Error,然后才是 CSI-2 Protocol Level Error 和 VICAP/ISP 接收错误。


二、ERR1/ERR2 到底是什么?

不同平台打印方式不同,但大方向一致:ERR1/ERR2 是 CSI/MIPI 控制器把硬件错误寄存器打印出来。

比如你之前遇到的:

mipi0-csi2-hw ERR2:0xf0000

这类值不能只看十六进制,要拆 bit。

在 FAQ 的寄存器表中,ERR2 bit[19:16] 对应 Control Error,也就是 D-PHY Level Error: False Control Error。如果是 0xf0000,说明 bit19~bit16 全置位,往往表示多个 lane 都检测到了控制序列异常。

False Control Error 的本质是:RX 端看到的 LP 控制状态序列不合法。

正常进入高速传输前,应该类似:

LP11 -> LP01 -> LP00 -> HS

其中:

状态简单理解
LP11空闲状态
LP01请求进入 HS 高速传输
LP00准备切换
HS真正高速传图像数据

如果 P/N 接反,RX 端本来应该看到 LP01,结果会看成 LP10。这样本来合法的 HS request,就会被误判成非法控制序列,触发 False Control Error。FAQ 对 False Control Error 的处理建议中,也明确把 Data lane 的 Dn/Dp 是否接反 放在第一位检查。

所以,ERR2:0xf0000 的正确思路不是先改 IQ,也不是先改分辨率,而是优先确认:

1. Data lane P/N 是否接反
2. Clock lane P/N 是否接反
3. lane 顺序是否正确
4. DTS data-lanes 是否和硬件一致
5. sensor 初始化时是否已经切到 MIPI 模式
6. 上电阶段是否有异常 LP 波形

三、CRC/ECC 报错:它不是玄学,是数据校验失败

很多人看到 CRC、ECC 会觉得抽象。其实很简单:

MIPI CSI-2 传输时,数据不是随便一串 bit 流,而是一个个 packet。每个 packet 有 header,也有 payload。

大致可以理解为:

Packet Header + Payload Data + Checksum

其中:

错误位置含义
ECC1 / ECC CorrectedPacket HeaderHeader 有小错误,但可纠正
ECC2 / ECC DoublePacket HeaderHeader 错误严重,不可靠
CRC / ChecksumPayload Data图像数据内容校验失败
ErrIDPacket HeaderData Type 或 ID 不认识

FAQ 里提到,Checksum 主要针对 package data,ECC1/ECC2 主要针对 packet header。ECC1 是可纠正错误,payload 可能仍然有问题;ECC2 则说明 header 已经不可靠,后续就可能引发 PIC_SIZE_ERROR、DATA_LOSS 等更严重问题。

所以 CRC/ECC 报错时,优先排查这些:

排查项为什么
TX 实际 MIPI 速率 vs RX link_freq速率不匹配会导致采样窗口不对
lane 数是否一致4lane/2lane 配错会导致包重组失败
lane 顺序是否正确多 lane 数据合并时顺序错会破坏 packet
P/N 是否正确极性错会导致 LP/HS 识别异常
高速信号质量抖动、反射、串扰都会造成 bit error
HS-prepare/HS-zero/HS-trailD-PHY 时序不满足会导致 SOT 或采样失败
HTS/H-blanking行间隔太紧可能造成接收端吞吐压力
周围高频干扰MIPI 是高速差分,附近干扰会直接影响误码率

四、link_freq:驱动里的一个数,背后是整条链路的时钟契约

很多人 DTS 写通了,sensor 能 probe,就以为 MIPI 也没问题。其实真正决定 MIPI RX 怎么配置采样参数的,是 sensor driver 里的 mode 信息,尤其是:

.link_freq
.pixel_rate
.hts_def
.vts_def
.width
.height
.bus_fmt

其中 link_freq 非常关键。

它告诉接收端:我这个 sensor 当前模式下,每条 MIPI lane 的高速传输频率是多少。

如果 TX 端实际输出 1782Mbps/lane,但 RX 端按照 1500Mbps 或 2000Mbps 去配置 settle、采样窗口,就可能出现:

SOT error
SOT sync error
CRC error
ECC error
偶发花屏
启动报错但能出图
高温或长线下异常加重

你图片里提到 HDMI-IN 的计算公式:

1080P60: 2200 x 1125 x 16 x 60 / 4 / 2

这个公式的含义是估算每条 MIPI lane 的速率。

解释一下:

参数含义
2200一行总像素,包含 blanking
1125一帧总行数,包含 blanking
16每像素 bit 数,比如 YUV422 16bit
60帧率
44 条 lane 分摊
2DDR 双沿传输或频率换算相关

对 sensor 来说也类似,不能只看有效分辨率,例如 1920x1080,而要看:

总像素 = HTS x VTS
总 bit = HTS x VTS x bpp x fps
lane rate = 总 bit / lane 数

一个视频高手必须记住:MIPI 速率不是由 width x height 单独决定,而是由 HTS、VTS、bit depth、fps、lane 数共同决定。


五、HTS / VTS / H-blanking:为什么有时增加 HTS 能改善?

HTS 可以理解为一行的总长度,不只是有效图像宽度,还包含水平 blanking。

一行总时间 = active pixel 时间 + horizontal blanking 时间

如果 HTS 太小,意味着行与行之间间隔很短,sensor 发数据很紧,接收端、CSI FIFO、ISP 后级压力都会变大。

FAQ 在处理 Data loss 时提到,可以尝试增加 Sensor H-blanking 时间;在 CsiFifoOverflow 中也提到,本质是 ISP 吞吐率和 MIPI 速率不匹配,导致 CSI data lane 输入缓冲 FIFO 溢出。

所以当你遇到:

CRC/ECC 偶发
CsiFifoOverflow
Data loss
高分辨率高帧率异常
低分辨率正常

可以尝试:

1. 降低 fps
2. 增加 HTS
3. 增加 H-blanking
4. 降低 MIPI lane rate
5. 增加 lane 数
6. 提高 ISP/DDR/AXI 吞吐能力

但要注意:增加 HTS 会影响帧率或曝光上限。它不是万能药,而是用时间换稳定性。


六、LP 驱动强度、摆幅、HS 时序:示波器不是可选项,是高手必备工具

很多 MIPI 问题靠 log 只能定位方向,不能定性。真正要确认,必须上示波器。

尤其是下面这些问题:

LP11 是否稳定?
LP01 有没有变成 LP10?
LP00 持续时间是否异常?
HS prepare 是否太短?
HS zero 是否太长或太短?
HS trail 是否不足?
高速差分眼图是否足够?

FAQ 在讲 “MIPI 采集不到数据且未提示出错” 时,也建议读取 DPHY status,并结合示波器确认 Clk lane 是否有高速时钟,确认 clock lane 是 continuous 还是 non-continuous,确认 StopstateClk、StopstateData、RxClkActiveHS 等状态。

你要建立这样的判断:

看到的现象可能原因
RxClkActiveHS = 0clock lane 没有进入 HS
StopstateData 固定不变data lane 没有正常切换
StopstateData 0/1 变化data lane 在 LP/HS 间切换
continuous clock 下 StopstateClk 固定 0正常
non-continuous clock 下 StopstateClk 0/1 变化正常
启动瞬间 False Control上电 LP 序列异常、P/N、初始化顺序
运行中持续 CRC/ECC高速信号质量、速率、lane、时序问题

这里要特别强调:
LP 和 HS 是两个世界。

LP 是低速大摆幅,主要用于状态切换和控制握手。
HS 是高速小摆幅,真正传输图像数据。

所以你不能只测 HS,也不能只测 LP。很多 ERR2、False Control 是 LP 阶段出问题;很多 CRC/ECC 是 HS 阶段出问题。


七、启动时报错但能正常出图,要不要管?

这是实际项目中最常见的问题。

比如你遇到过:

stream ON
dphy0, data_rate_mbps 1782
mipi0-csi2-hw ERR2:0xf0000

但后面能正常预览、正常录像。

这种情况怎么判断?

我的经验是分级处理:

情况处理策略
只在 stream on 后报一次,图像/录像正常低优先级,记录问题,后续优化
每次启动都报,但不影响数据查上电/复位/LP 初始状态
运行中持续报 CRC/ECC必须处理
伴随花屏、丢帧、Data loss必须处理
高温、长线、震动后加重必须处理
量产项目启动报错建议根因闭环,避免边界风险

为什么启动报错但能出图?

可能是 sensor 在上电或 stream on 初期输出了异常 LP 状态,CSI 检测到一次 False Control,但后续真正进入 HS 后数据正常。FAQ 中 SC2310 的案例就提到,上电阶段 MIPI/DVP 管脚复用导致波形不可控,解决方式是先配置 sensor 管脚切到 MIPI 状态,再初始化 DPHY RX,用来规避上电阶段异常波形。

所以启动一次性 ERR 不一定致命,但它告诉你:
链路在边界时序上还不干净。


八、从普通调试到视频处理高手:要建立一套排查流程

下面这张流程图,可以作为你以后分析 MIPI 问题的固定模板。

不能出图

能出图但报错

只启动报一次

运行中持续报

D-PHY Error

CRC/ECC

FrameSync

FIFO/DataLoss

出现 MIPI ERR1/ERR2 或图像异常

能否正常出图?

先查 I2C/电源/MCLK/reset/pwdn

判断报错是否持续出现

重点查 LP 初始状态/上电时序/False Control

按错误层级定位

错误类型

P/N、lane、LP/HS、SOT、settle、示波器

link_freq、lane数、信号质量、HS时序

FS/FE、VC、曝光限制、VTS

ISP clock、DDR、AXI、HTS、吞吐

修正硬件/DTS/驱动时序

长时间录像/高低温/多次开关流验证

真正的视频处理高手,不是记住某一个寄存器,而是有流程:

先分层
再定位
再验证
再压力测试
最后闭环

九、核心参数速查表

参数所在位置影响出错表现
data-lanesDTS endpointRX 使用几条 lane无图、CRC/ECC、lane 错
link_freqsensor driverMIPI 速率配置SOT、CRC、ECC
pixel_ratesensor driverV4L2 时序计算帧率、曝光、ISP 配置异常
HTSsensor reg/driver行总长度吞吐压力、Data loss
VTSsensor reg/driver帧总行数fps、曝光范围、FrameSync
bppsensor mode每像素 bit 数MIPI 速率计算错误
bus_fmtsensor driverRAW/YUV 格式颜色异常、解析错误
reset/pwdnDTS + 硬件上电时序I2C 不通、启动异常
xvclk/mclkDTS + CRUsensor 输入时钟I2C 正常但无图、时序异常
HS-preparesensor/D-PHYHS 前准备时间SOT 错
HS-zerosensor/D-PHYHS 起始保持SOT/SOTSync
HS-trailsensor/D-PHYHS 结束保持EOT/CRC
LP drivesensor regLP 电平质量False Control
DPHY statusSoC reg当前 LP/HS 状态判断是否进入高速

十、实战检查清单

以后你遇到 MIPI 错误,可以按下面顺序来:

1. 先确认链路是否跑通

dmesg | grep -iE "mipi|csi|dphy|ERR"
media-ctl -p
v4l2-ctl --list-devices

确认:

sensor 是否 probe
dphy 是否 matches sensor
csi2 是否 stream ON
data_rate_mbps 是否合理
是否能出图

2. 再确认 DTS

重点看:

data-lanes = <1 2 3 4>;
remote-endpoint = <...>;
clocks = <...>;
reset-gpios = <...>;
pwdn-gpios = <...>;
power-domains = <...>;

两端 endpoint 的 lane 数要一致。

3. 再确认 sensor driver

重点看:

link_freq_menu_items
pixel_rate
hts_def
vts_def
width
height
bus_fmt
mipi lane setting

尤其是驱动里的 link_freq 是否和 sensor 寄存器实际输出一致。

4. 再确认硬件

MIPI P/N
lane 顺序
阻抗
走线长度
连接器虚焊
排线接触
供电纹波
附近高速干扰源

你图片里提到的“排线是否松动、是否飞线、是否接触不良、附近是否有高频干扰”,这些都是非常实战的经验点。

5. 最后上示波器

重点测:

LP11
LP01
LP00
HS prepare
HS zero
HS trail
高速差分质量
clock lane continuous/non-continuous

结尾:视频处理高手的底层能力是什么?

很多人以为视频处理高手就是会 OpenCV、会编码、会调 ISP IQ。

这些当然重要,但在嵌入式 Camera 项目里,更底层的能力是:

看得懂 sensor datasheet
算得出 MIPI lane rate
配得对 DTS endpoint
读得懂 ERR1/ERR2
分得清 D-PHY/CSI/ISP 错误
会用示波器验证 LP/HS
知道什么时候改 HTS/VTS/link_freq
知道什么时候怀疑硬件,什么时候怀疑驱动

你现在遇到的 ERR2:0xf0000、CRC、ECC、link_freq、LP 驱动强度、HS 时序,其实都是视频输入链路的核心知识点。

把这些吃透之后,你就不只是“能让 Camera 出图”,而是能做到:

出问题能定位
偶发问题能复现
硬件软件能分界
参数修改有依据
量产风险能提前发现

这才是真正的视频处理高手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值