1.摄像头介绍
摄像头是ADAS核心传感器,摄像头常见的结构如下图1所示,主要包括镜头,基座,传感器以及PCB部分。
图 1
对于现在来说,sensor主要分为两类,一类是cmos,一类是CCD。cmos是现在的趋势,对于镜头来讲,一个镜头只能适用于一种传感器,且一般镜头的尺寸应该和sensor的尺寸一致。对于sensor来说,现在依然延续着Bayer阵列的适用,如下图2所示。图3展示了其工作流程。
图 2
图 3
2.ISP部分介绍
ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正,噪声去除,坏点去除,内插,白平衡,自动曝光控制等。依赖于ISP才能在不同的光学条件下都能较好的还原现场细节,ISP技术在很大程度上决定了摄像头的成像质量。可以分为独立与集成两种形式。如下图4所示是整体框图:
图 4
ISP的Firmware包含三部分,一部分是ISP控制单元和基础算法库,一部分是AE/AWB/AF算法库,一部分是sensor库。Firmware设计的基本思想是单独提供3A算法库,由ISP控制单元调度基础算法库和3A算法库,由ISP控制单元调度基础算法库和3A算法库,同时sensor库分别向ISP基础算法库和3A算法库注册函数回调,以实现差异化的sensor适配。ISPfirmware架构如下图5所示:
图 5
不同的sensor都以回调函数的形式,向ISP算法库注册控制函数。ISP控制单元调度基础算法库和3A算法库时,将通过这些回调函数获取初始化参数,并控制sensor,如调节曝光时间,模拟增益,数字增益,控制lens步进聚焦或旋转光圈等。
一般,ISP分为内置和外置二种,nxp的s32v234芯片内置ISP处理模块。
3.s32v234的整体图像数据流框图
4.camera驱动
s32v234采用mipicsi(串行)或viu(并行)接口,使用i2c总线进行配置。camera的驱动程序软件有3层(见图6).第一层在内核空间中运行,实现所需的最小i2c的设备交互。
第二层是作为底层内核驱动程序API的用户空间抽象层,在第二层上实现一个特定的传感器设备代码。第三层完成大多数驱动程序功能。第二层和第三层一起称为通用camera用户库。
目前,s32v234的camera用户库支持一下传感器:
- Sony IMX224MQV( MipiCsi-2)
- Omnivision Ov10640 (VIU/MipiCsi-2)
- Omnivision Ov10635(VIU)
- Maxim Serializer/Deserializer HW setup with 4 OV10640 cameras
图 6
5.FastDMA
FDMA是s32v234SOC旨在实现vision ADAS应用而设计的。图像处理需要高带宽数据传输和大内存区域用于数据处理和存储。为了实现这点,正在处理的数据是分布在两个不同的内存块之间。
- SRAM具有高速访问,但内存空间有限(4MB)仅允许立即要存储的输入/输出数据(最多几个图像行)
- DDR是带宽低,大内存空间存储一系列完整图像帧
为了有效的使用设置,数据必须在SRAM和DDR之间保持恒定的流量。这个fdma是专门为完成实际数据传输而设计的,为减少主机cpu和sequencer之间的负载消耗。图7显示了fdma相关的交互。sequencer具有重要作用。sequencer专门用于图像数据预处理的管理,除其功能外,sequencer还能够调度fdma transactions和接受事务完成信号。
图 7
6.SDI(Sensor Data Interface)
传感器设备接口(SDI)是用于控制图像数据输入的运行时库,SDI被设计为作为s32v234soc内部的抽象处理图像信号预处理(isp)系统。ISP支持各种接口和其他hw块(一般为ISP引擎)作为图像传感器数据。
- 输入:Mipi-Csi2,Viu,Ethernet,FDMA
- 预处理:标量/矢量图像处理单元(IPU),H264解码器,Jpeg解码器,视觉加速器
- 输出:H264编码器,Ethernet,FMDA
为了实现预处理,设计了唯一的静态RAM(sram)块。为了减少主机cpu加载ISP子系统,包括了ArmM0的视觉加速块(主负责基于行处理),主要处理来自各种事件。由于这些特性,ISP提供了非常低的延时,高度可编程。
上图描述了SDI的功能,SDI功能设计主要覆盖了以下内容:
- HW资源分配(ISP,SRMA/DDR存储)
- 数据预处理的流水线配置
SDI库旨在创建API的中间层用于用户应用程序。为了控制各种HW,SDI使用由驱动程序提供的API。为了最小化OS代码依赖性,SDI利用来自OAL(操作系统层)抽象层,主要包括SRAM和DDR分配。OAL是内核模块,用于连续物理内存分配。
SDI的初始化: