本文结合 NVIDIA DRIVE 平台上的 NvSIPL 摄像头驱动适配实践,从 Sensor、Serializer、Deserializer 到 CSI 接收端,系统梳理车载摄像头的数据传输、控制与诊断链路。通过对基线代码与项目代码的分析,介绍驱动适配涉及的配置文件、核心接口、初始化流程和 SerDes 拓扑,重点解析 MFP 引脚分配、FSYNC 帧同步、RESET 复位,以及 Embedded Data 的产生、传输与解析机制。
文章汇总项目中各摄像头模组的能力地图,横向比较分辨率、帧率、RAW/YUV 输出、HDR、曝光与增益控制等常用功能,并梳理内外触发、多摄像头帧同步、片上 ISP、LOFIC/SPD、补光同步、温度读取及 OTP/EEPROM 等特色能力。结合测试图生成、内外回环、链路裕量测试和 IMX728S 诊断实例,分析故障检测、错误上报、自检与链路恢复的实现方式。
在采集链路之外,文章进一步介绍多画面合成显示,以及双 Thor 平台通过 PCIe C2C 跨芯片传输摄像头图像的方案,说明摄像头驱动、NvSIPL、NvSciStream/NvSciC2C 与接收端图像处理、编码之间的协作关系。通过区分硬件支持、驱动实现、配置启用与应用层能力,为模组选型、Camera Bring-up、跨芯片图像传输和故障排查提供实践参考。
加载 CameraModule 驱动库 │ ├─ CNvMCameraModule_GetNames()│ └─ CNvMCameraModule_Create()↓ CNvMMAX96712_96717_AR0341 对象 ↓ DoSetConfig()├─ 创建/配置 MAX96717 对象 ├─ 创建/配置 AR0341 Sensor 对象 ├─ GetAR0341Driver()├─ GetCDIDeviceContext()└─ SetupConnectionProperty()└─ SetSensorConnectionProperty()↓ DoCreateCDIDevice()├─ 创建 MAX96717 CDI Device ├─ 创建 AR0341 CDI Device │ └─ DriverCreate()│ └─ DevBlkCDII2CPgmrCreate()└─ 创建 TransportLink ↓ 给 CameraModule 上电并等待 200ms ↓ EnableModuleLink()└─ InitTransportLinks()└─ CNvMTransportLink_Max96712_96717F::Init()├─ 配置 MAX96717 ├─ 配置 GMSL GPIO ├─ 配置 MIPI PHY ├─ 配置 RAW12 Video Pipe └─ 释放 AR0341 Reset ↓ DetectModuleLink()└─ DetectModule()└─ AR0341CheckPresence()↓ CNvMMAX96712CameraModule::Init()├─ AR0341::InitModule()│ ├─ AR0341SetDefaults()│ │ ├─ Sensor Software Reset │ │ └─ 写1920×1536 RAW12 60fps 寄存器表 │ └─ AR0341Trigger()[外同步模式]│ └─ TransportLink::PostSensorInit()└─ MAX96712 配置 FSYNC[外同步模式]↓ CNvMMAX96712CameraModule::PostInit()├─ MiscInitModule()├─ TransportLink::MiscInit()│ ├─ ERRB 配置 │ └─ Register CRC/诊断配置 └─ AR0341::PostInitModule()↓ Deserializer Start ├─ 检查 CSI PLL ├─ 检查 GMSL Link Lock └─ Enable CSI Output ↓ CNvMMAX96712CameraModule::Start()├─ TransportLink::Start()└─ AR0341::StartModule()└─ AR0341StreamOn()└─ 写 AR0341 0x0100=0x0100 ↓ 开始输出图像所有模组能力地图
| 模组目录 | Sensor / Serializer | 专用功能 |
|---|---|---|
imx728x96717 | IMX728 / MAX96717 | Chip ID、完整初始化、曝光、模拟/数字增益、白平衡、Embedded Data 解析、寄存器读写/转储、PCLK、链路模式、错误数据 |
ox03c10x96717 | OX03C10 / MAX96717F | HDR 曝光、HCG/LCG/SPD/VS 增益、WB、Embedded Data、PCLK、寄存器访问、模块电源、错误诊断 |
ar0233c | AR0233C / MAX9295A | 基础 Detect/Init/Stream、错误信息、电源延时;没有识别到专用曝光增益接口 |
ar0341 | AR0341 / MAX96717 | 基础控制、Sensor StreamOn、专用 Trigger、错误读取;支持普通、Trigger、Bypass、Mix 模式配置 |
ar0341c | AR0341C / MAX96717F | 基础 Detect/Init/Stream、错误读取、电源控制 |
ar0820c | AR0820C / MAX9295A | 基础 Detect/Init/Stream、错误读取、电源控制 |
ar0823_717 | AR0823 / MAX96717 | 外部触发、基础启停、错误诊断、电源;有 Bypass/Mix 配置 |
ar0823c | AR0823C / MAX96717 | 外部触发、基础启停、错误诊断、电源 |
imx728 | IMX728D / MAX96717 | 完整曝光、增益、WB、Embedded Data、寄存器、错误读取、启停流 |
isx031 | ISX031 ISP / MAX96717 | ISP 模组;曝光、增益、格式、PCLK、寄存器、错误诊断;区分触发与 NO_TRIGGER 配置 |
ov2311_c | OV2311 / MAX96717F | 曝光、增益、格式/Embedded Data、寄存器、错误诊断;VCSEL 模组、多种触发/30FPS变体 |
imx623_primax | IMX623 / MAX96717F | WB/增益、寄存器、PCLK、链路模式、错误诊断;触发与自由运行配置 |
imx623_sunny | IMX623 / MAX96717F | WB/增益、寄存器、PCLK、链路模式、错误诊断 |
imx728c | IMX728C / MAX96717 | 完整曝光、增益、格式、PCLK、寄存器、链路模式、错误诊断 |
imx728s | IMX728S / MAX96717F | 功能最丰富:曝光、增益、WB、格式、寄存器、EEPROM、PMIC、GPIO、Sensor 电源、FSYNC Monitor 错误、FUSA 诊断 |
isx031 | ISX031 / MAX96717F | 基础启停、错误读取、电源管理;大量控制可能由模组内部 ISP 完成 |
isx031c | ISX031C / MAX96717F | 基础启停、错误读取、电源管理 |
ox03c10 | OVX3C / MAX96717F | 曝光、HDR 增益、WB、寄存器读写/转储、EEPROM 写访问、错误数据、FOV60/FOV100 区分 |
ox08b40 | OVX8B / MAX96717 | 曝光、HDR 增益、WB、寄存器读写/转储、EEPROM 写访问、错误数据、FOV30/FOV120 区分 |
max9295e | Loopback / MAX9295E | 非普通 Sensor 模组;用于 Serializer loopback、正向/反向 Link Margin Test、链路诊断 |
imx623 | IMX623 / MAX96717F | 完整曝光、增益、WB、格式、寄存器、链路模式;包含多种固定曝光配置和 internal 模式 |
ox08d10a | OX08D10A / MAX96717 | 曝光、HDR 增益、WB、PCLK、寄存器、链路模式、错误诊断;I20/I30、T20/T30、多 FOV |
oax4000 | OVX8B ISP 类模组 / MAX96717 | 基础初始化、启停、错误、电源;Sensor 图像控制更可能在 ISP/模组固件侧 |
ox01g10 | OX01G10 / MAX96717F | 基础初始化、启停、错误、电源;专用曝光增益入口未被识别 |
ox05b1s | OX05B1S / MAX96717 | 基础初始化、启停、错误、电源、EEPROM 读写 |
ox08d10 | OX08D10 / MAX96717 | 曝光、HDR 增益、WB、PCLK、寄存器、链路模式、错误诊断;DESAY/LCE/SUNNY 多供应商版本 |
ox08dc | OX08DC / MAX96717 | 曝光、HDR 增益、WB、PCLK、寄存器、链路模式、错误诊断;自由运行及 T10/T20/T30 |
sc233at | SC233AT / MAX96717F | 初始化、启停、Sensor 寄存器、错误、EEPROM bridge、链路模式 |
ox03h10 | OX03H10 / MAX96717F | 完整曝光增益、WB、寄存器、错误、链路测试;明确实现外触发 10/20/30 FPS |
ox08d10 | OX08D10 / MAX96717 | 曝光、HDR 增益、WB、PCLK、寄存器、错误、链路模式;自由运行及 T10/T20/T30 |
ox08d10a | OX08D10A / MAX96717 | 与 OX08D10 类似,A 版本 Sensor;自由运行及 T10/T20/T30 |
按当前 JSON 中 inputFormat: “422” 判断,共有 9 类 YUV422 摄像头,对应 19 个解串器驱动目录
| 模组 | 输出格式 | 分辨率 | 驱动系列 |
|---|---|---|---|
| AR0233C | YUV422 YUYV 8-bit | 1920×1080 | MAX96712、MAX96792A |
| AR0820C | YUV422 YUYV 8-bit | 3840×2160 | MAX96712、MAX96792A |
| ISX031 ISP | YUV422 YUYV 8-bit | 1920×1536 / 1920×1200 | MAX96712、MAX96792A |
| ISX031 | YUV422 YUYV 8-bit | 1920×1536 | MAX96712、MAX96792A |
| ISX031C | YUV422 YUYV 8-bit | 1920×1536 | MAX96712、MAX96792A |
| OAX4000 / OVX8B ISP 模组 | YUV422 UYVY 8-bit | 3840×2160 | MAX96712 |
| OX01G10 | YUV422 YUYV 8-bit | 1280×960 | MAX96712、MAX96724、MAX96792A |
| OX05B1S | YUV422 UYVY 8-bit | 2560×1920 | MAX96712、MAX96792A |
| SC233AT | YUV422 UYVY 8-bit | 1920×1198 | MAX96712、MAX96724、MAX96792A |
新模组开发真正要做的内容
1. 平台和模组 JSON
通常需要定义:
- Platform 名称。
- DeviceBlock 和 Deserializer。
- CSI Port、PHY mode、lane/trio 数。
- Link index。
- CameraModule 名称。
- Sensor、Serializer、EEPROM 名称和 I²C 地址。
- VCID、DataType、宽高、Embedded Top/Bottom 行。
- Frame rate。
- Trigger mode。
- Reset GPIO、FSYNC GPIO。
- Sensor reference clock。
最容易出错的是“JSON 名字”和 C++ 注册字符串不完全一致。必须逐字符一致。
2. CameraModule 包装层
新模组至少需要关注:
- SetConfigModule
- SetSensorConnectionProperty
- DetectModule
- InitModule
- PostInitModule
- StartModule
- StopModule
- DeinitModule
- GetPowerOnDelayMs
- GetPowerOffDelayMs
- GetErrorSize
- GetErrorInfo
- GetSensorRegisterValue
- SetSensorRegisterValue
- GetSensorPCLK
- GetLinkMode
不是每个模组都要重新实现全部函数;能由基类完成的应尽量复用。
3. Sensor CDI 层
典型功能包括:
- Driver create/destroy。
- 默认状态初始化。
- Chip ID / Revision 检测。
- Sensor 初始化寄存器表。
- Stream On/Off。
- Exposure 时间到寄存器的换算。
- Analog/Digital Gain 换算。
- White Balance Gain。
- Group Hold。
- Embedded Data 解析。
- 温度、帧计数器和错误状态读取。
- 任意寄存器读写。
- Register Dump。
- PCLK/VTS/HTS 计算。
- Sensor Error Data。
4. Serializer/Deserializer 链路
公共 TransportLink 负责的内容很多,新手很容易误认为都在 Sensor 驱动里:
- GMSL Link lock。
- Serializer 地址重映射。
- Sensor/EEPROM broadcast 地址映射。
- Serializer reference clock。
- Sensor Reset GPIO。
- FSYNC GPIO。
- MIPI lane mapping、polarity、2-lane/4-lane。
- RAW 数据类型和 Embedded Data。
- Deserializer pipeline、VC 和输出端口。
- Link Error、CRC、ERRB 和 FUSA 检查。
推荐的 Bring-up 调试顺序
必须逐层推进,不要上来就调 ISP 或图像质量。
阶段 1:供电
确认:
- Deserializer 本身供电。
- PoC/负载开关输出。
- 模组 PMIC。
- Serializer 电源。
- Sensor 各路电源。
- Reset 电平和时序。
这里至少有四层:板级电源、PoC、模组 PMIC、Sensor reset。找不到模组自己的 Power 函数,不代表没有执行供电。
阶段 2:Serializer 链路
目标:
- Deserializer 能锁住 GMSL link。
- 能读 Serializer Chip ID。
- Serializer alias 地址正确。
- 没有同地址冲突。
- Link rate、GMSL1/GMSL2 模式正确。
如果这一步不通,不要继续查 Sensor 初始化表。
阶段 3:Sensor I²C
目标:
- 地址翻译配置成功。
- 读出正确 Chip ID 和 Revision。
- Reset 已释放。
- Sensor reference clock 存在。
- I²C 波形和地址正确。
常见现象: - Serializer 可读、Sensor 不可读:优先查 reset、MCLK、地址翻译和电源。
- 单路正常、多路失败:优先查 broadcast/alias 地址冲突。
阶段 4:初始化表
先只做:
- Software reset。
- PLL/MCLK。
- RAW 格式。
- 分辨率。
- HTS/VTS。
- MIPI lane。
- VC/DataType。
- Embedded Data。
- Stream On。
不要一开始混入 AE、AWB、复杂 FUSA 检查。
阶段 5:确认视频链路
依次确认:
- Sensor frame counter 在增加。
- Serializer video lock。
- Deserializer link/pipe lock。
- Deserializer CSI 输出。
- SoC CSI/VI 没有 CRC、ECC、short frame。
- SIPL 收到 frame completion。
- ISP/Consumer 才开始工作。
“无图”不是一个问题,它至少可能落在七个不同层级。
阶段 6:曝光和增益
重点检查:
- Exposure 单位是秒、微秒还是行数。
- PCLK、HTS、VTS 换算。
- 曝光上限是否预留 margin。
- HDR 各曝光通道顺序。
- HCG/LCG/SPD/VS 映射。
- Analog/Digital Gain 范围。
- Group Hold 是否正确释放。
- 写入值和 Embedded Data 回读值是否一致。
阶段 7:触发同步
必须区分:
- Sensor 自由运行。
- Deserializer 内部产生 FSYNC。
- SoC/外部输入 FSYNC。
bEnableTriggerModeSync、bEnableInternalSync、Sensor JSON 的 isTriggerModeEnabled 是不同概念,而且公共配置流程可能覆盖模组层设置。
阶段 8:错误与恢复
最终验证:
- 拔插同轴。
- 短时断链。
- Sensor I²C NACK。
- CRC/ECC 错误。
- Frame timeout。
- DisableLink/EnableLink。
- 带 power cycle 的恢复。
- 多路相机中单路恢复是否影响其他路。
最常见问题和优先排查点
| 现象 | 高概率原因 |
|---|---|
| Link 不锁 | PoC、同轴、Serializer 电源、GMSL mode/rate、Deserializer link 配置 |
| Serializer 能读,Sensor 不能读 | Sensor reset、MCLK、PMIC、I²C translator、Sensor 地址 |
| Sensor ID 正确但没有视频 | 初始化表、PLL、Stream On、MIPI lane、RAW DataType |
| Deserializer 有视频,SIPL 无帧 | CSI Port、VCID、DataType、宽高、PHY lane/trio 配置 |
| 有帧但图像错色 | Bayer order、RAW10/12/14、Embedded 行、ISP tuning |
| 图像滚动或偶发撕裂 | FSYNC、帧率、VTS、触发极性、GPIO 映射 |
| 曝光调节无效 | Group Hold、曝光通道映射、单位换算、AE 插件覆盖 |
| 多路时才失败 | Alias 地址冲突、broadcast 配置、带宽、供电、FSYNC group |
| 运行一段时间掉帧 | CRC/ECC、线缆裕量、温度、PoC、电磁干扰、错误恢复 |
| 恢复失败 | DisableLink 时 I²C 已失效、复位不彻底、PoC 未重新上电、旧状态未清理 |