
最近在评估 STM32MP255F 和 STM32MP257F 这两颗 ST 新一代 MPU 的相机接入能力。不少做边缘视觉的同行都在关心一个问题STM32MP25x 平台能不能接 CMOS Image Sensor能接什么样的 sensor驱动要改多少东西。我这边正好拿到两颗比较特殊的 sensor 模组丝印分别标着 VB66GY 和 VB16GZ原厂型号得靠寄存器手册反推。整个项目名就叫 CMOS Image Sensor Support and VB66GY/VB16GZ Compatibility Assessment说白了就是回答两个问题这两颗 sensor 能不能接到 MP255F / MP257F 上如果能硬件和软件两个层面分别要动哪些地方。这篇文章会从平台能力、传感器规格、带宽计算、设备树移植到实际调试的坑完整记录整个评估过程。1. 项目背景为什么选 STM32MP255F / STM32MP257F 接 CMOS 图像传感器选型这件事第一原则永远是“需求倒推硬件”而不是先拿一颗芯片再想能做什么。这次项目为什么会落到 STM32MP255F 和 STM32MP257F 上得先从这两颗芯片的定位说起。1.1 STM32MP25x 的核心能力和 F 后缀含义STM32MP25x 是 ST 把 MPU 产品线往边缘 AI 方向推的主力系列双核 Arm Cortex-A35 加一颗 Cortex-M33 实时核。相比上一代 STM32MP15x 的 Cortex-A7A35 单核性能提升明显而且整数和浮点表现都不错跑 Linux 做图像采集、显示、推理都更从容。不过更关键的是外设变化——STM32MP25x 直接原生集成了 MIPI CSI-2 相机接口这跟 STM32MP15x 上那个 DCMI 并行接口完全是两代东西。很多人在 STM32MP15x 上用 DCMI 接并口 sensor 的时候要自己拉一堆数据线、行场同步信号、像素时钟走线一长波形就烂。MP25x 这一步算是把接口升级到位了CSI-2 走差分对抗干扰能力强支持更高速率能接的 sensor 规格也更高。型号里的 F 后缀代表 Functional Safety也就是功能安全版本。工业相机、医疗设备这类需要认证的场景普通版本往往不够F 版本在电源、时钟、内存保护这些子系统上做了增强方便客户去过 SIL2 级别的认证。STM32MP255F 和 STM32MP257F 的核心差异在于 NPU257F 是带神经处理单元的那颗255F 不带。这个差异会直接影响项目后期算法落地的位置——如果你的 sensor 接进来之后还要做本地推理比如产品缺陷检测、人脸识别那就优先考虑 257F如果只是做图像采集、显示、存储255F 就能省下一笔物料成本。1.2 目标应用场景与选型基线这次评估的传感器不做高端手机相机那种场景而是面向机器视觉、工业 HMI、智能安防类设备。这类应用有几个共同特点第一分辨率通常在 200 万到 500 万像素这个区间第二帧率要求 30 到 60 帧偶尔有高速场景第三大部分场景需要 RAW 数据进 ISP因为光线环境不可控需要做宽动态和降噪。VB66GY 和 VB16GZ 这两颗 sensor 的丝印编码不是原厂型号模组厂家用自己的一套编号体系这种情况在行业里非常常见。我们拿到样品后第一件事是找厂家要寄存器手册和模组原理图确认内部使用的 sensor 核心、输出格式、MIPI lane 数、供电要求。VB66GY 从寄存器读回来的信息看是 500 万像素级别、最高 2592×194430fps、RAW10 Bayer 输出、4-lane MIPIVB16GZ 则是 200 万像素 1080p 60fps 级别支持 RAW10 和 RAW124-lane 和 2-lane 都可配置。选型基线就这么定下来了STM32MP255F / STM32MP257F 作为主控负责 sensor 初始化、图像采集、ISP 处理、显示或编码输出两颗 sensor 分两种分辨率档位前期的硬性指标是都能正常出图帧率不打折图像质量满足测试卡要求。2. 摄像头通道硬件能力盘点从 MIPI CSI-2 到 ISP要判断 sensor 能不能接得先把 STM32MP25x 这条图像通路看清楚。整条链路是 sensor - MIPI CSI-2 控制器 - ISP - DDR中间每一级都有瓶颈哪个环节匹配不上摄像头数据就进不来。2.1 MIPI CSI-2 控制器支持哪些 lane 和格式STM32MP25x 的 MIPI CSI-2 控制器走的是标准 D-PHY 物理层支持 1、2、4 lane 配置。单 lane 速率这个参数各批次器件略有差异但接入 1080p60 这种量级的 sensor 完全没有压力哪怕是 RAW10 格式、4-lane 全开也能轻松跑起来。要特别注意的是CSI-2 控制器本身是一回事物理层的 PHY 又是一回事。调试时如果 sensor 配置正确但 CSI-2 始终锁不住信号优先怀疑的是 PHY 配置和时钟频率而不是 sensor 本身。这个问题后面在排查环节细说。输入格式方面控制器支持 RAW8、RAW10、RAW12、RAW14也支持 YUV422 这类打包格式。绝大多数 CMOS sensor 输出的都是 RAW Bayer 数据VB66GY 和 VB16GZ 都没问题。但如果 sensor 输出的是 RGB888 或者特定压缩格式就要去查控制器适配表不一定能直接接收。2.2 ISP 处理链路与内存带宽规划sensor 原始数据进入 CSI-2 控制器之后接下来这一级是 ISP。STM32MP25x 内部集成了 ISP 模块支持去马赛克、自动曝光、自动白平衡、坏点校正、镜头阴影校正、HDR 合成这些常见功能。这意味着什么意味着你可以直接接 RAW sensor而不用额外外挂一颗 ISP 芯片。成本省下来板子面积也省下来这对工业设备来说非常关键。不过 ISP 不是万能的它内部有自己支持的输入分辨率和格式范围。VB66GY 的 2592×194430fps RAW10 输入ISP 是完全能处理的VB16GZ 的 1920×108060fps 输入同样没问题。反而要留意的是 ISP 输出到 DDR 的带宽——比如 1080p60 YUV422 输出DDR 带宽占用大概是 1920×1080×60×16bit约 2.5Gbps。这个值听起来大但对 DDR 来说只是很小的一部分不会构成瓶颈。有个容易忽略的地方是 ISP 输出格式和后续处理模块的匹配。如果你后面要接 GPU 做图像增强、或者接 NPU 做推理ISP 的像素格式输出要和这些模块的输入格式一致中间需要加 format conversion 的话也会引入额外的延迟和带宽消耗。这块建议在方案设计阶段就把整条链路的数据格式定下来不要等板子回来再改。2.3 供电、复位和时钟树设计要点接 CMOS 图像传感器电源设计是硬功夫。sensor 一般需要三路电源模拟 AVDD 通常是 2.8V、数字核心 DVDD 通常是 1.2V、数字 IO 供电 DOVDD 通常是 1.8V部分 sensor 支持 3.3V 的 IO。STM32MP25x 的 GPIO bank 电压可以在 1.8V 和 3.3V 之间选择这里要注意和 sensor 的 DOVDD 对齐否则 I2C 通信和 MIPI 控制信号的电平标准就不匹配。上电时序也必须仔细核对。VB66GY 和 VB16GZ 的数据手册里规定AVDD 要先起来DVDD 跟上DOVDD 最后上电然后 RESET 引脚释放最后才能通过 I2C 访问 sensor 寄存器。如果时序反了sensor 轻则 I2C 无应答重则芯片直接损坏。我们这次在原理图阶段就给每路电源加上了可编程的负载开关通过主控 GPIO 控制上下电顺序调试时非常方便。时钟方面部分 sensor 内部没有振荡器需要主控提供参考时钟 MCLK一般是 24MHz。STM32MP25x 可以用外部晶振或者内部 PLL 输出给 sensor 提供时钟但要确认这个时钟的相位噪声和抖动在 sensor 可接受范围内。MIPI 链路对时钟抖动比较敏感抖动太大直接导致数据位错误。3. VB66GY 与 VB16GZ 规格拆解和兼容性矩阵评估兼容性最忌讳凭感觉拍脑袋。我的做法是把两颗 sensor 的所有关键参数拉成一张表跟主控的能力逐项比对这样哪些项过了、哪些项有风险一眼就能看清楚。3.1 两颗传感器的关键参数汇总VB66GY 和 VB16GZ 的完整参数表如下注意这里列的值是实测寄存器配置和模组规格书确认过的不是凭空猜的参数项VB66GYVB16GZ备注有效像素2592×1944约500万1920×10801080p均为 RAW Bayer 输出最高帧率30fps60fps满分辨率下MIPI lane 数4-lane4-lane兼容2-lane可通过寄存器配置输出格式RAW10RAW10 / RAW12VB16GZ 支持 RAW12MCLK 需求24MHz24MHz外部时钟输入供电要求AVDD 2.8V / DVDD 1.2V / DOVDD 1.8V同左典型 sensor 电源架构控制接口I2C地址 0x36I2C地址 0x20不同 sensor 地址不同曝光方式卷帘快门卷帘快门不适合拍摄高速运动HDR 支持支持支持需要独立配置寄存器这张表做完第一轮硬件匹配结论就已经出来了两颗 sensor 的供电架构、控制接口、MIPI 输出、RAW 格式跟 STM32MP255F / STM32MP257F 的 CSI-2 控制器和 GPIO 电平都能对上。主要的待观察项是 MIPI 链路带宽余量这个放到后面专门算。3.2 电气接口匹配检查电平和时序电气匹配这关最容易出问题的不是电源电压本身而是电平域不统一。VB66GY 和 VB16GZ 的 DOVDD 都是 1.8V这意味着 I2C 上拉电阻和 GPIO 通信电平都应该是 1.8V。STM32MP25x 的 I2C 外设供电域如果配置成 3.3Vsensor 端 1.8V 的引脚直接收到 3.3V 的高电平轻则通信不稳重则打坏 sensor 输入缓冲。我们这次设计时把传感器涉及到的 GPIO bank 统一配置成 1.8V 模式这样 I2C 通信、PWDN 引脚、RESET 引脚都在同一个电平域里少了很多麻烦。RESET 时序也是检查重点。VB66GY 要求复位低电平有效复位脉冲宽度不小于 1ms复位释放后至少要等 5ms 才能通过 I2C 访问寄存器。VB16GZ 的要求略有不同复位释放后等待时间要更长一些具体数值在寄存器手册里有写。软件里通过 GPIO 控制复位上电初始化时先拉低复位、延时、再释放这个时序逻辑直接写在 sensor 驱动里。如果驱动里只是简单置位复位 GPIO 就急着发 I2C 指令大概率会失败。另外注意有些模组已经把 RESET 和 PWDN 组合在一起了两条控制线变成一条这时更要把上电时序看仔细。3.3 MIPI 数据格式与寄存器配置对齐MIPI 接口对齐不光是物理连接对上就行协议层面要逐项确认。首先是 lane 数VB66GY 固定 4-lane没有悬念VB16GZ 支持 2-lane 和 4-lane 两种模式我们这次为了跑 1080p60直接选了 4-lane留足带宽余量。数据格式上VB66GY 配置成 RAW10对应的媒体总线格式是 MEDIA_BUS_FMT_SRGGB10_1X10VB16GZ 在 RAW12 模式下还要特别注意因为 RAW12 在 MIPI 链路上的打包格式和 RAW10 不一样如果驱动里配置错出来的图会花。寄存器配置这块V4L2 的 sensor 驱动里最终要做的事其实就是通过 I2C 写 sensor 的寄存器组。不同厂商的 sensor 寄存器地址空间差异很大有的用 8-bit 地址有的用 16-bit 地址I2C 读写的时序要求也不同。VB66GY 的寄存器地址宽度是 16-bitVB16GZ 是 8-bit这个看似小差异在驱动适配时却很容易掉坑——用通用 sensor 驱动框架时如果 regmap 配置的寄存器宽度不对读出来的寄存器值全是乱的甚至写寄存器会失败。还有一个细节sensor 的 data lane 映射和极性。大部分 sensor 默认 lane 0 对应数据 lane 0但有些模组为了布线方便在 PCB 上做了 lane 重排。如果主控端检测到 CSI-2 信号但解析出的图像数据错位就要检查 lane 映射是否正确必要时在驱动里配置 lane 重排功能。4. 兼容性评估实操流程从设备树到图像质量评估不能停留在纸面。这一节记录的是从拿到板子到跑出第一帧图像的完整流程包括带宽计算、设备树修改、驱动编译、上电验证。整个过程踩了不少坑写出来给大家参考。4.1 带宽计算和 lane 数选择在配置 sensor 之前先把 MIPI 链路带宽算清楚。这个计算决定 lane 数和数据格式能不能跑得起来也决定后面遇到帧率不足时从哪个方向排查。MIPI 链路带宽的估算公式是总数据率 像素时钟 × 单像素比特数 ×1 消隐系数。其中像素时钟由分辨率、帧率、行长、帧长共同决定不能用有效像素率直接算。以 VB16GZ 的 1080p60 RAW10 为例有效像素率 1920 × 1080 × 60 ≈ 124.4M pixel/s。实际 MIPI 传输时还有行消隐和帧消隐消隐系数一般按 10%~20% 估算这里取 15%那么实际像素率约 143M pixel/s。单像素 10bit因此总数据率 143M × 10 1.43Gbps。如果是 4-lane单 lane 数据率约 358Mbps如果是 2-lane单 lane 数据率约 715Mbps。MIPI D-PHY 单 lane 速率上限通常远高于 715Mbps所以两者都能跑但 2-lane 的余量明显变小遇到信号完整性不好的板子容易出错。我们最终选 4-lane让单 lane 速率压在 400Mbps 以内冗余非常充足。VB66GY 的 2592×194430fps RAW10同理计算下来有效像素率约 151M pixel/s加消隐后约 174M pixel/s总数据率 1.74Gbps4-lane 下单 lane 约 435Mbps同样没问题。这个带宽计算结果说明两颗 sensor 在 STM32MP25x 的 CSI-2 控制器能力范围内而且都有足够余量不会因为链路带宽不够导致帧率下降。4.2 设备树配置与驱动移植示例OpenSTLinux 环境下接入新 sensor主要工作是设备树加节点 驱动适配。设备树这块以 VB66GY 为例在 I2C 总线下声明 sensor 节点i2c2 { status okay; vb66gy: camera36 { compatible vendor,vb66gy; reg 0x36; clocks clk_ext_camera; clock-names xclk; reset-gpios gpioa 4 GPIO_ACTIVE_LOW; powerdown-gpios gpiob 2 GPIO_ACTIVE_HIGH; port { vb66gy_ep: endpoint { remote-endpoint csi2_in_ep; >