1. Sensor驱动基础:CMOS Sensor工作原理、IMX系列Sensor家族概览、MIPI CSI-2接口协议详解

1.1 CMOS Sensor工作原理:从光子到像素

做Sensor驱动这么多年,我经常被新人问一个问题:“Sensor到底是怎么把光变成数字信号的?”说白了,这个过程并不复杂,但细节里全是坑。

CMOS Sensor的核心是一个光电二极管阵列。每个像素点就是一个感光单元。光子打到硅基上,产生电子-空穴对——这就是光电效应。产生的电子数量,直接决定了这个像素的亮度值。

但这里有个关键点:每个像素只能感知亮度,不能感知颜色。那彩色图像怎么来的?

答案是Bayer阵列。Sensor表面覆盖了一层彩色滤光片,按RGGB(红绿绿蓝)的规律排列。为什么绿色有两个?因为人眼对绿色最敏感,Sensor设计者就多给了绿色一些采样点。

核心流程:

  1. 曝光:快门打开,光子进入,光电二极管积累电荷
  2. 读出:行选通信号逐行打开,电荷通过列放大器读出
  3. ADC转换:模拟电压转换为数字值(10bit/12bit/14bit)
  4. 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驱动知识体系。每次带新人,我都会先让他们看这张图。

Sensor驱动知识体系 物理层 光电转换 · Bayer阵列 接口层 MIPI CSI-2 · D-PHY 控制层 I2C · 寄存器配置 协议细节 包格式 · 数据类型 · 帧同步 · 时钟恢复 HS/LP切换 · Lane均衡 · ECC校验 驱动实现 设备树配置 · 时钟使能 · 上电时序 · 寄存器初始化 中断处理 · DMA传输 · 帧回调 · 性能调优 三层架构:物理层决定“能不能看到”,接口层决定“传得对不对”,控制层决定“配得好不好”

1.5 本章小结

这一章我们聊了三个基础:

  • CMOS Sensor怎么工作的——从光子到像素,核心是光电效应和Bayer阵列
  • IMX系列有哪些型号——从IMX2xx到IMX5xx,各有各的定位
  • MIPI CSI-2怎么传数据——D-PHY物理层、包格式、帧同步机制

这些是后面所有章节的基石。你想想看,如果连MIPI的HS/LP切换都搞不清楚,后面调图像质量时,出了问题根本不知道从哪查起。

给新人的建议:别急着写代码。先把Sensor的datasheet通读一遍,重点关注上电时序和寄存器初始化流程。我见过太多人,代码写了一大堆,结果Sensor根本没正常工作——因为上电时序不对。