前言
前段时间完成了基于Xavier平台+Max9286串行解串器的多路视频输入项目,现在终于有点时间对整个项目中学到的东西进行一番总结,涵盖的内容会包含Xavier的Camera子系统、DPHY与MIPI标准协议、linux下的驱动开发(V4L2+IIC)等。
现在开始我们的第一部分吧------Xavier的Camera子系统。
总览
Xavier的Camera子系统主要由NVIDIA Camera Serial Interface (NVCSI)与Video Input(VI)两个部分组成,其中NVCSI为VI的输入源,NVCSI采集到的数据经由VI处理后转发至DDR内存中。
整体框图如下:
特性如下:
- 物理层支持DPHY1.2(每Lane(2线)支持2.5Gbps)与CPHY1.1(每lane(3线)支持2.5Gsym/s)
- 基于MIPI CSI-2 v2.0版本协议栈
- 包含6个像素解析器(PP)
- 每个像素解析器支持16路虚拟通道(VC)解析
- 支持数据类型交织解析
- 拓展数据类型支持raw16/raw20
- 每个时钟支持同时输出8个像素数据
NVCSI
NVCSI在物理层上同时支持DPHY与CPHY,可以配置成4X4Lane
、6X2lane
、6X1Lane
。每个lane都能支持16路虚拟通道以及数据类型交织传输。
- 虚拟通道:由MIPI CSI标准定义,在协议中由2段数据域共同确定,虚拟通道在多摄像头输入的场景下十分有用,以max9286为例,通过对各个link的Camera(1280*720)设置虚拟通道ID,能够实现4路图像分离,而不是获得一个
(1280*4)*720
的合并图像。 - 数据类型交织:在HDR Line-by-Line的模式下,NVCSI支持解析同一个虚拟通道上的不同数据类型。
- 频率目标:NVCSI支持并行像素处理,这使得它能够允许更高的带宽与更低的时钟频率。在单个像素小于等于16Bit的情况下(Bit-Per-Pixel:BPP<=16),一个时钟能够同时处理8个像素(Pixel-per-clock:8PPC),若BPP>16,则只能同时处理4个像素(4PPC)。
支持的数据格式:
- RAW6/7/8/10/12/14/16/20
- RGB888/666/565/555/444
- YUV420-8bit(Legacy)
- YUV420-8bit
- YUV422-8bit/10bit
NVCSI CORE
NVCSI CORE主要工作在于处理CSI-2中的Low-Level协议层,将字节序包解包为各个像素。CORE内包含了6个Packet Parse(PP)功能单元,这意味着能够同时处理6路独立的来自NVCSICIL的数据流。
NVCSI CORE内部框图如下,下文会对各个单元进行说明:
包头包尾解析(HFP)
来自NVCSISCIL的数据流首先通过多路复选器转发至Header Footer Parser(HFP),HFP会对提取包头信息,并进行ECC校验纠错,校验通过后判断是长包还是短包,若为长包则根据Word Count字段进行CRC计算并与包尾CRC字段对比,校验通过后转发至Color Parser(CP)进行处理,若为短包且为SOF(Start of Frame)或EOF(End of Frame),则会置位寄存器以通知VI单元。
Color Parser控制(PP FSM)
PP FSM会丢弃来自sensor的LS(Line Start)与LE(Line End)短包,而自己生成LS与LE短包,产生CP使能信号控制Color Parse,同时会对过短的Line进行单独的处理。
Color Parser
CP主要工作在于将包中的字节负载解码为像素,解码方式取决于包头中Data Type。
DPCM解压
当图像Sensor使用DPCM对图像进行压缩,它会将压缩后的数据和一个用户自定义的数据类型构建数据包进行发送,软件层面需要覆盖这种数据类型,使得Color Parser能够知道如何将该字节数据转换为像素,进而送入DPCM进行解压。
支持的DPCM比率如下:
VIMUX
VIMUX收集来自NVCSICORE各个单元模块生成的信息(SOF、EOF、VC、DTYPE、Frame Number、SOL、EOL、Embedded Data、Pixel Data、Error Flag等),并发送给VI单元。
NVCSI SCIL
SCIL单元模块集成所有PHY接口与控制为一体,DPHY与CPHY的数据同一放入SCIL的FIFO中,NVCSI CORE可以直接从FIFO中获取数据而无需与PHY交互。
SCIL功能框图如下:
SCIL主要由以下功能:
- 校正DPHY的边沿歪斜(Deskew);
- 控制PHY层Pair(DPHY)、Trio(CPHY)的极性;
- 控制brick的LP至HS或HS至LP状态的转换;
- 处理来自Sensor的LP状态的数据;
- 在ULPS(Ultra Low Power State)状态下,控制Brick的供电;
- 提供电气参数(PHY时序等)寄存器的配置;
- 监测信号错误并通知NVCSICORE;
- 控制多Lane传输时的字节对齐;
- Lane聚合;
- 侦测SOT(Start of Transmission)与EOT(End of Transmission)信号;
NVCSI SCIL可以控制各个独立的Lane进行组合,对于AB和CD Pad,可以配置为以下几种形式
- D-PHY: 1x 4 lanes, 2x 2 lanes, 2x 1 lane, 1x 1 lane, 1x 2 lanes, 1x 1 lane + 1x 2 lanes
- C-PHY: 1x 4 trios, 1x 3 trios + 1x 1 trio, 2x 2 trios, 2x 1 trio, 1x 1 trio, 1x 3 trios, 1x 2 trios + 1x 1 trio, 1x 2 trios
对于EF和GH Pad,可以配置为以下几种形式 - D-PHY: 1x 4 lanes, 1x 2 lanes, 1x 1 lane
- C-PHY: 1x 4 trios, 1x 3 trios, 1x 2 trios, 1x 1 trio
根据CSI-2标准,SCIL主要服务于Low Level Protocol与Lane managenment两大功能:
Low Level Protocol:从SOT到EOT之间的数据采集,建立Bit Level或Byte Level级别的数据同步,并转发至NVCSI CORE。
Lane Management:为了提高性能,CSI的lane是可拓展的,DPHY中,最多可以配置为4路Data Lane,在CPHY中最多可以配置为4路Data Trio,SCIL会将来自各个Lane的数据通过Lane Merge单元进行数据组合,恢复出来自Sensor的原始数据流序列(具体的Merge实现在CSI-2标准文档中由详细描述)。
Video Input(VI)
VI单元用于接收来自NVCSI的数据,经过处理最终转发至Memory中。VI仅有一条Pipeline通过时分复用的方式处理来自NVCSI各个通道的数据。
VI中内置了一个NV自家的实时处理单元Falcon,通过软件的方式对VI进行控制,以拓展VI能力。
VI性能
VI的最大时钟支持到660MHz,在一个Clock处理8个像素(即8PPC)的情况下,总处理能力约为5.2Gpps(piexl per sec),若以YUV420-8bit(bbp=16) 720p 30fps来计算,则理论上(不考虑各种开销)约可以同时处理150个视频流,可怕的带宽
。
VI各单元模块功能
- CSI Multiplexer(CSI MUX):CSIMUX作为Pipeline的前端,处于数据流处理缓冲地带,由于一次只能处理一个像素包,CSIMUX则会为每一个输入通道创建一个缓冲区,然后在上一次象素包处理完成后,输送新的象素包进行处理。
- Channel Selector(CHANSEL):CHANSEL的任务主要是对每个传入的像素数据进行检查,根据每个传入通道的配置,对该数据进行模式匹配,根据物理信道(即哪个CSI信道)、数据类型、虚拟信道ID和帧ID的任意组合进行匹配。同时也为每个通道维护每一帧的状态,向NOTIFY发送类似SOF、EOF等事件。
- Pixel Formatter(PIXFMT):由于CSI-2标准提供的像素格式比较少,PIXFMT单元会预先将接收到的像素数据按照通道指定的像素格式转换为特定的内部格式。这样即方便了VI的处理,也方便了Xavier自带的ISP处理。
- DPCM:若像素数据需要进一步ISP处理,为了降低VI与ISP之间的带宽,DPCM可对数据进行压缩。
- Memory Atom Packer(ATOMP):ATOMP是Pipeline处理的最后阶段了,它在接收完不同宽度的像素包后,产生内存请求,产生内存地址,单处理到EOL或EOF事件时,则会向NOTIFY发出通知。
- Output Water-Level Buffer(OFIF):ATOMP一般来说应该直接将数据输出到MCCIF指定内存中,但是内存buffer并不能在容量不足时通知到ATMOP,因此OFIF则是用来指示当前内存使用是否达到预设值,是的话则向NOTIFY发出通知。
Notification Engine(NOTIFY):NOTIFY用于接收来自整个VI的消息,并将消息转发至VI内部的实时微控制器FALCON,FALCON根据消息对VI内部进行相应的调度。
- CSI MUX:SOL、EOL;
- CHANNEL:SOL、SOF、Unrecognized Channel、Frame Dropped、Incorre Size;
- ATOMP:EOF、EOL;
- OFIF:Packet Dropped、Buffer Full;
- FALCON:VI中的实时微控制器,用于接收NOTIFY事件,并对该事件进行及时处理。
哈哈哈,写的太好了https://www.cscnn.com/
想想你的文章写的特别好https://www.237fa.com/
怎么收藏这篇文章?