1. Sensor驱动基础:CMOS Sensor工作原理、IMX系列Sensor家族概览、MIPI CSI-2接口协议详解
1.1 CMOS Sensor工作原理:从光子到像素
做Sensor驱动这么多年,我经常被新人问一个问题:“Sensor到底是怎么把光变成数字信号的?”说白了,这个过程并不复杂,但细节里全是坑。
CMOS Sensor的核心是一个光电二极管阵列。每个像素点就是一个感光单元。光子打到硅基上,产生电子-空穴对——这就是光电效应。产生的电子数量,直接决定了这个像素的亮度值。
但这里有个关键点:每个像素只能感知亮度,不能感知颜色。那彩色图像怎么来的?
答案是Bayer阵列。Sensor表面覆盖了一层彩色滤光片,按RGGB(红绿绿蓝)的规律排列。为什么绿色有两个?因为人眼对绿色最敏感,Sensor设计者就多给了绿色一些采样点。
核心流程:
- 曝光:快门打开,光子进入,光电二极管积累电荷
- 读出:行选通信号逐行打开,电荷通过列放大器读出
- ADC转换:模拟电压转换为数字值(10bit/12bit/14bit)
- ISP处理:去马赛克、白平衡、伽马校正等
我在项目中遇到过一个问题:同一款Sensor,在不同主控平台上出来的图像颜色完全不一样。后来排查发现,是ADC的参考电压没配置对。嗯,这种坑,手册上不会直接告诉你。
1.2 IMX系列Sensor家族概览
Sony的IMX系列,可以说是嵌入式图像领域的“标准件”了。从手机到安防,从车载到工业,到处都能看到它的身影。
我个人习惯把IMX Sensor分成几个梯队:
| 系列 | 典型型号 | 分辨率 | 应用场景 |
|---|---|---|---|
| IMX2xx | IMX219, IMX258 | 8MP ~ 13MP | 手机副摄、入门开发板 |
| IMX3xx | IMX307, IMX335 | 2MP ~ 5MP | 安防监控、车载环视 |
| IMX4xx | IMX415, IMX477 | 8MP ~ 12MP | 高端安防、工业检测 |
| IMX5xx | IMX500, IMX585 | 12MP+ | AI视觉、旗舰手机 |
你想想看,为什么IMX系列这么流行?我觉得有几点:
- 寄存器接口统一:大部分IMX Sensor都走I2C,寄存器地址格式高度相似
- MIPI输出标准:数据格式、同步信号完全遵循CSI-2规范
- 文档质量高:Sony的应用笔记虽然厚,但该有的信息都有
我的经验:移植一个新IMX Sensor时,先找一个同系列的参考驱动。比如你做过IMX307,再去做IMX335,寄存器配置有80%以上是相同的。别从头写,那是浪费时间。
1.3 MIPI CSI-2接口协议详解
MIPI CSI-2,全称是Camera Serial Interface 2。它是MIPI联盟定义的摄像头串行接口标准。说白了,就是Sensor和主控之间怎么传数据的一套规矩。
我刚开始接触MIPI时,被那些术语搞得头大:D-PHY、Lane、LP模式、HS模式……后来做多了才发现,核心就几个概念。
1.3.1 物理层:D-PHY
D-PHY是MIPI的物理层标准。它用差分信号传输,一对线叫一个Lane。典型的配置是1个Clock Lane + 2/4个Data Lane。
每个Lane有两种工作模式:
- HS(High Speed)模式:高速传输数据,电压摆幅小(约200mV),速率可达1Gbps+
- LP(Low Power)模式:低功耗控制信号,电压摆幅大(1.2V),速率慢
这里有个容易踩的坑:HS和LP的切换时序。我曾经在调试IMX307时,发现图像偶尔出现条纹。查了三天,最后发现是LP-11到HS的建立时间不够,导致第一个像素数据丢失。
避坑指南:MIPI的HS-Trail和HS-Prepare参数,必须严格按照Sensor datasheet来配。不要想当然地“差不多就行”。差一个UI(Unit Interval),图像就可能花掉。
1.3.2 协议层:CSI-2包格式
CSI-2的数据是以包(Packet)为单位传输的。每个包分为:
- SoT(Start of Transmission):传输开始序列
- PH(Packet Header):包头部,包含数据类型和长度
- Payload:有效数据(比如像素值)
- EoT(End of Transmission):传输结束序列
数据类型(Data Type)决定了Payload的格式。常见的DT值:
| Data Type | 含义 | 典型应用 |
|---|---|---|
| 0x2B | RAW10 | 10bit原始数据 |
| 0x2C | RAW12 | 12bit原始数据 |
| 0x1E | YUV420 8bit | 视频流 |
| 0x24 | RGB888 | 显示用数据 |
1.3.3 帧同步:VSYNC和HSYNC
CSI-2没有专门的VSYNC/HSYNC引脚。那帧同步怎么做?
答案是:内嵌同步码。在数据流中插入特殊的包:
- Frame Start(FS):帧起始包
- Frame End(FE):帧结束包
- Line Start(LS):行起始包
- Line End(LE):行结束包
主控端的CSI-2接收器(比如NXP的MIPI CSI-2 IP)会解析这些包,恢复出帧同步信号。所以驱动里配置的“帧格式”,本质上就是告诉Sensor:你按什么分辨率、什么格式、多少帧率往外发数据。
1.4 知识结构总览
下面这张图,是我自己总结的Sensor驱动知识体系。每次带新人,我都会先让他们看这张图。
1.5 本章小结
这一章我们聊了三个基础:
- CMOS Sensor怎么工作的——从光子到像素,核心是光电效应和Bayer阵列
- IMX系列有哪些型号——从IMX2xx到IMX5xx,各有各的定位
- MIPI CSI-2怎么传数据——D-PHY物理层、包格式、帧同步机制
这些是后面所有章节的基石。你想想看,如果连MIPI的HS/LP切换都搞不清楚,后面调图像质量时,出了问题根本不知道从哪查起。
给新人的建议:别急着写代码。先把Sensor的datasheet通读一遍,重点关注上电时序和寄存器初始化流程。我见过太多人,代码写了一大堆,结果Sensor根本没正常工作——因为上电时序不对。