概述:本文重点讨论自动驾驶中camera主流方案,主控soc上mipi_csi2搭配max96712的camera完整链路软件框架和实现方案,主要讨论了GMSL1和GMSL2两种方案,本文为本人调试过程中记录,如果不对地方欢迎讨论:853906167@qq.com

1.Camera链路完整框架:  

1.1 链路框架图:

GMSL1方案:               3Gbps 

NOTE:

摄像头模组采用森云SG2-AR0231C-0202-GMSL

GMSL2方案:          6Gbps

NOTE:

摄像头模组采用森云SG2-AR0233C-5200-GMSL2

1.2 camera模组信息:

SG2-AR0231C-0202-GMSL(GMSL1):

模组框图:

默认地址信息(8bit表示,7bit表示需要自己转换):     

MAX96705 : 0x80         转成7bit对应为0x40

AP0202 : 0xBA

AR0231 : 0X20

关键参数:

HDR支持

1920*1080/22fps

YUV422@8bit输出

SG2-AR0233C-5200-GMSL2(GMSL2):

模组框图:

默认地址信息(8bit表示,7bit表示需要自己转换):     

MAX9295A : 0x80         转成7bit对应为0x40

GW5200 : 0xDA

AR0233 : 0X20

关键参数:

HDR支持

LFM支持                            ---- LED闪烁抑制

LED在道路上的普遍使用,却带来“LED闪烁”现象。“LED闪烁”是由LED驱动方式而产生的现象,LED灯以交流方式驱动,驱动频率一般在90Hz以上,即最慢脉冲周期为11毫秒左右,LED在11毫秒周期内实现一次亮灭,为节能及延长使用寿命,占空比通常不超过50%,如果相机曝光时间较短(例如3毫秒),则有可能曝光时间正好对上LED被关灭期,这时候图像传感器抓到的就是LED灭掉的图像,如果是LED阵列,在这种情况下拍到的图像就是一部分亮,一部分暗,这就是“LED闪烁”现象

1920*1080/30fps

YUV422@8bit输出

2.I2C地址确定:       以GMSL1为例说明

max96712:

首次上电通过CFG0上拉情况确定,具体详情如下:

我们电路配置为0xD6,bit0为方向位,所以右移一位后7bit地址为0x6B

DEV_ADDR(0x00)为地址寄存器,可通过0x6B写入新的地址,如写入0x90,实际地址右移掉方向位bit0变为0x48,后续通过该地址操作max96712

max96705:

default addr:0x80,右移一位后就是0x40,在i2c配置分别依次打开lane通道的时候会分别去写入新的地址到reg(0x00)上,LaneA、LaneB、LaneC、LaneD分别设置为0x41,0X42,0X43,0X44.

如下:

regArray[0] = 0x00;
sendBuf[0] = 0x80 + 2 * (i + 1);
i2c_ptr->I2cWrite(0x40, regArray, 1, sendBuf, 1);    //分别配置ABCD通道max96705 i2c 地址

note : max96705 有个i2c address translatation功能

//set i2c_source A

regArray[0] = 0x09;         
sendBuf[0] = 0xba + 2 * (i + 1);
i2c_ptr->I2cWrite(0x41 + i, regArray, 1, sendBuf, 1);

//set i2c dst A
regArray[0] = 0x0a;
sendBuf[0] = 0xba;
i2c_ptr->I2cWrite(0x41 + i, regArray, 1, sendBuf, 1);

如上例子i=0时候,就是将0xba+2(0xbc,对应的i2c address 是0x5e)转换为0xba,也就是下面说道的ap0202默认地址。i分别从0到3就会分别把0x5e,0x5f,0x60,0x60转换成0xba

AP0202:

 我们的模组默认是连接到VDDIO_H,所以是0xBA,和上面max96705的i2c address translation功能结合就可以达到配置ap0202的目的

max9295A:

default addr : 0x80,右移一位后为0x40,再依次打开96712上的laneA-laneD通道时候分别将相应的MAX9295A改为0x41-0x44,代码如下:

linux下i2c-tools工具使用:

linux下的开源代码i2c-tools工具包,提供了多个i2c工具,可以基于该工具包扫描地址(i2c-detect),测试i2c寄存器读取写入等

3. pipeline说明

GMSL1 pipeline图:

说明:

GMSL1模式下,每个串行器不能包含多个pipe,且进入max96712后也不能随意搭配内部pipe,固定连接如上图红色部分:

GMSL1 A -->PIPE 0

GMSL1 B -->PIPE1

GMSL1 C -->PIPE 2

GMSL1 D -->PIPE3

GMSL2 pipeline图:

说明:

串行器可以配置为pipe X/pipe Y/pipe Z/pipe U 4个输出pipe,一般情况下配置为一个即可(我们配置为pipe Z),但是如果需要输出RAW原始数据或者HDR数据可以配置超过一个pipe,如上图GMSL2 A/GMSL2 D都配置了两个输出pipe

96712解串器可以为pipe0-pipe7选择输入的PORTA-PORTD中的pipex/y/z/u,详情可以参见寄存器0xF0,0xF1,0xF2,0xF3

pipe、map_src、map_dst、mipi-csi2相关寄存器和通路选择配置、VC虚拟通道配置等请参加0X90A开始的相关寄存器,如0x90a/0x90b/0x92d/0x90d/0x90e等等

我们为96712的4个通道数据分别分配了VC为0/1/2/3等4个虚拟通道号,占用两个bit位

4.PWM触发帧同步

默认方案:不使用外部GPIO来触发FSYNC,使用内部FSYNC信号

配置如下:

reg : 0x4a0          val : 0x02

PWM外部GPIO输入96712触发FSYNC

配置如下:

reg : 0x4a0         val : 0x08

reg : 0x4af          val : 0x9f

note:

该模式下需要soc触发PWM并输出到max96712的FSYNC同步管脚,可以实现控制多个camera的图像触发时间、同步、帧率,如下图分别提供了20Hz/25Hz测试情况

20Hz:    应用层10帧图片获取间隔500ms

 25Hz:  应用层10帧图片获取间隔时间400ms

5.图像基础

YUV简述

分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV分为planar和packed两种格式,planar格式是先存储所有像素的Y,再存储UV,分为2-planar/3-planar。packed格式每个像素Y,U,V连续交替存储

YCbCr中的Cb标识U,Cr标识V

YUV422 8bit:         重点说明,其他格式自行学习

采样图例:

 传输样式:

 frame format:

note:

注意YUV422格式的数据如果传输顺序不匹配可能导致颜色异常