CSI(Camera Serial Interface)是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。
本文主要是个人学习MIPI CSI-2 Spec的翻译和总结,并简单罗列了CSI-2和DSI-2的差异。
CSI-2可分为5层,分别为:应用层、组包/解包层、底层协议层(Low Level Protocol)、通道管理层和物理层。
CCI是一种二线制、双向、半双工、串行接口,兼容I2C,可以支持400KHz的数据传输。其读写都遵循I2C协议。包括单数据读写以及连续数据读写。最大支持16bit寄存器寻址,能够支持8bit,16bit,32bit,64bit数据宽度。寄存器数据发送顺序是由高到低。
CSI-2的接收器需要配置成一个Master, 发送器配置为Slave 在CCI bus上。CCI能够处理总线上的多个从机,然而多主机机制CCI是不支持的,任何本节没有提到的I2C command都要被忽略,以防引起不必要的操作。注意,当提到CCI时,术语主和从不应该与D-PHY操作中使用的类似术语相混淆;他们没有关系。
数据传输是按照i2c协议标准来传输的。START, RPEATED START 和 STOP条件也是I2C协议标准的数据传输方式。
一个基本的CCI消息包括START条件、带有读写位的从设备地址、从设备的应答、指向从设备内部寄存器的子地址(索引)、从设备的应答信号、从设备的写操作数据字节、从设备的应答/反应答和STOP条件。在读取操作中,数据字节来自从机,应答/非应答来自主机。如图3所示。
在CCI中,从机地址位7-bit.
CCI支持8位数据的8位索引或8位数据的16位索引。该从属设备定义了所使用的消息类型。
CCI兼容设备能够支持四种不同的读操作和两种不同的写操作;随机位置单次读、随机位置顺序读、当前位置单次读、当前位置顺序读、随机位置单次写、从随机位置开始顺序写。读/写操作将在下面的章节中介绍。
从设备的索引必须在每次读写操作后自动递增。这也将在下面的部分中进行解释。
在单次从随机位置读取时,主服务器对所需要的索引做一个虚拟的写操作,发出一个重复的启动条件,然后再用读操作来定位从服务器。确认从机地址后,从机开始向SDA行输出数据。如图4所示。主处理器通过设置一个否定的确认和停止条件来终止读操作。
通过对slave进行读操作,也可以从上次使用的索引中读取数据。通过设置数据从最后使用的索引到SDA行来响应。如图5所示。主处理器通过设置一个非应答和停止条件来终止读操作。
如图6,主机向索引地址发送虚拟写操作,收到从机应答之后主机发起一笔Repeat Start条件,随后发送读地址读操作,等待从机应答后连续读取数据,当主机读取到最后一个字节数据后,发送非应答信号给从机,并发送停止条件。
当前位置顺序读与随机位置顺序读类似,唯一区别是当前位置顺序读没有虚拟写操作,如图7,主机通过发送非应答和停止位来终止读操作。
如图8,主机向从机发起一笔写操作,随后发起索引地址和数据,当收到从机应答时候。写操作由主机发送Stop来终止。
如图9,表示连续写操作时序,每接收到一个字节数据后,从机自动增加索引地址。主机发送Stop来停止连续写操作。
对于只有原始Raw Bayer输出的Camera模块,7位从地址应该是011011Xb,其中X = 0或1。对于所有其他摄像机模块,7位从地址应该是011110Xb。
CSI-2 协议标准支持以下寄存器宽度:
通常,上面章节中描述的面向字节的访问协议提供了一种访问多字节寄存器的有效方法。但是,寄存器应该驻留在一个面向字节的地址空间中,并且多字节寄存器的地址应该是它的第一个字节的地址。因此,连续多字节寄存器的地址将不是连续的。例如,一个32位寄存器的第一个字节位于地址0x8000,可以通过从随机地址0x8000开始的四个字节的顺序读取来读取。如果有一个额外的4字节寄存器,其第一个字节位于0x8004,那么可以使用一个4字节来访问它顺序读取当前位置协议。
当访问多字节寄存器时,必须遵循以下重新计时规则:
CCI 消息在多字节寄存器中第一个字节总是MSB,最后一个字节为LSB低位。
每个设备都可以有单字节寄存器和多字节寄存器。在内部,设备必须理解哪些地址对应不同的寄存器宽度。
为保证从多字节寄存器中读取的数据值是一致的,即所有字节在时间上是一致的,当读取寄存器的MS字节时,设备内部将寄存器的内容转移到一个临时缓冲区。临时缓冲区的内容在SDA行上以字节序列的形式输出。
图15和图16说明了多字节寄存器读取操作。临时缓冲区总是更新,除非读取操作在同一个多字节寄存器内是增量的。
在这个定义中,对于寄存器是通过单独的、没有中间数据写入的单字节读消息增量地访问,还是通过单一的多位置读进行访问,没有区别消息。该协议与索引值的行为完全相关。
关于何时更新临时缓冲区的示例如下:
除非以增量方式访问多字节寄存器的内容,否则不能保证回读的值是一致的。
通过START和STOP条件将临时缓冲区的内容重置为零。
为了保证写数据的一致性,要被写入多字节寄存器的数据被暂存到一个buffer中,只有当最后一个LS字节被写入后才是整个multi-byte值被传输完成,图17和18 表示多字节寄存器写操作。
只写入多字节寄存器的LS或MS字节的CCI消息是不允许的。单字节写入多字节寄存器地址可能会导致设备中的不正常行为。
请参看spec
CSI-2协议标准手册英文版PDF
CSI-2实现的物理层由1~4个单向数据通道和一个时钟通道组成。所有的CSI-2发射器和接收器都应该支持时钟通道上的连续时钟行为,也可以选择支持非连续时钟行为。对于连续的时钟行为,时钟通道保持高速模式HS,在数据包传输之间产生主动时钟信号。对于非连续的时钟行为,时钟Lane在数据包传输之间进入LP-11状态。
CSI-2发送器的最低物理层要求是:
CSI-2接收器的最低物理层要求是
所有的CSI-2实现应支持所有数据通道上的前向escape ULPS。
CSI-2是一个lane可扩展的规范。需要比一个数据通道提供更多带宽的应用程序,或者避免高时钟速率的应用程序,可以将数据路径扩展到2、3或4 个Lane,并获得峰值总线带宽的近似线性增加。上层数据和串行位流之间的映射是明确定义的,以确保主机处理器和使用多个数据通道的外设之间的兼容性。
从概念上讲,在PHY层和更高的功能层之间有一个处理多通道配置层。在发送器中,该层在N个Lanes上分配一系列数据包字节,每个Lanes是物理层逻辑(序列化器等)和传输电路的独立单元。在接收端,它收集来自N lane的传入字节,并将它们合并成完整的数据包,然后传递到数据包分配器。
Lane分发器接受一个任意字节长度的传输,缓冲N个字节(其中N = Lane的数量),然后在N个Lanes上并行发送N个字节的分组。在发送数据之前,所有的lane并行执行SoT序列,以指示相应的接收单元数据包的第一个字节已经开始。在SoT之后,lane以轮循的方式并行地发送第一个数据包的连续字节组。
虽然多个lane都以并行的“start packet”同时开始,但它们可能在不同的时间结束,每隔一个周期(字节)发送“End packet”码。
链路接收端的N个phy并行收集字节数,并将这些字节数送入合并lane层。这将重构传输字节的原始序列,然后可以将其划分为数据包解码器层的单个数据包。
当使用多个数据Lane时,通过CCI接口对Lane的分发与合并进行重构。
一个“N”数据Lane接收器应与一个“M”数据Lane发射器连接,通过Lane分布的CCI配置,当使用多个数据巷时,在CSI-2发射器和接收器内合并层。因此,具有四个数据通道的接收器应与具有1、2、3或4个数据通道的发送器一起工作。同样,具有四个数据通道的发送器也应与具有4个或更少数据通道的接收器一起工作。发射端1至M通道与接收端1至M通道相连。
LLP是基于字节,以包为单元的协议,支持长短两种包格式。
LLP支持两种包结构,分别为长包与短包,包格式与长短取决于具体的物理层。无论何种类型的包,均由SoT信号开始,EoT信号结束。
图30显示了Low - Level Protocol Long Packet的结构。长数据包应该用数据类型0x10到0x37来标识。关于数据类型的描述请参见Table 3。一个长包应该由三个元素组成:32位包头(PH),一个具有可变数量的8位数据字的应用程序特定数据负载和一个16bit包尾(PF)。数据包头进一步由三个元素组成:一个8位的数据标识符,一个16位的单词计数字段和一个8位的ECC。包尾有一个元素,一个16位的校验和。关于包元素的进一步描述,请参见6.2到6.5节。
图31显示了短包数据结构,短包定义数据类型0x00~0x0F, Table 3描述了数据类型,短包只包含一个包头PH,不存在包尾PF, 并且包头里的Word count字段由短包的数据字段替代。
对于帧同步数据类型的短包,数据字段表示帧数,对于行同步数据类型的短包,短包数据字段表示行数,可以参考Table 6 针对帧和行同步数据类型的描述。
针对一般的短包数据类型,短包数据字段可由用户自定义。
ECC(Error Correction Code) 字段允许单比特纠错和2-bit检测。
上图可以发现,短包有两类Data Type
同步短包:用于对帧或行起停进行标识,起到同步作用。
数据标识符包含了虚拟通道标志VC值和数据类型DT值,如图32,虚拟通道标志符占用数据标识符的高两个bit, 低六个bit为数据类型标识。
虚拟通道标识符的目的是为交叉在数据流中的不同数据流提供单独的通道。
虚拟通道标识号位于数据标识符DI字节的高两个bit。接收器将监视虚拟信道标识符,并将交错的视频流解复用到相应的信道。最多支持4个数据流;有效的通道标识符是0到3。外设中的虚拟通道标识符应该是可编程的,以允许主机处理器控制数据流如何解复用。逻辑通道的原理如图33所示。
图34展示了一个使用虚拟通道支持的数据流示例。
Data Type值指定有效负载数据的格式和内容。最多支持64种数据类型。
有8个不同的数据类型类,如表3所示。在每个类中,最多有8个不同的数据类型定义。前两个类表示短数据包数据类型。其余六个类表示长数据包数据类型。
数据标识符DI和字节计数值Word Count的正确解析对包结构至关重要。报文头纠错码字节,允许纠正数据标识符和字数中的bit错误和2-bit错误检测。
数据标识符字段DI[7:0]应映射到ECC输入的D[7:0], Word Count LS Byte (WC[7:0])映射到D[15:8], Word Count MS Byte (WC[15:8])映射到D[23:16]。这个映射如图35所示,它也是一个ECC计算示例。
具体ECC纠错方法,此处略,请参考CSI-2 Spec
为了检测传输中可能的错误,对每个数据包计算校验和。校验和被实现为16位的CRC。生成多项式是x16+x12+x5+x0。
校验和的传输如图40所示。
16位校验和序列作为包尾的一部分传输。当Word count为零时,CRC值应为0xFFFF。
在低级别协议数据包之间,必须始终有一个过渡到低功耗状态(LPS)。图44显示了与LPS的数据包间隔。
短包有两种:一种是同步短包,一种是普通短包。而同步短包又分为帧同步包和行同步包两种。
数据短包传送类型如下:
每个图像帧应该以包含帧起始码的帧起始(FS) 包开始。FS包后面应该有一个或多个包含图像数据的长包和零个或多个包含同步码的短包。每个图像帧应以包含帧结束码的 帧结束(FE) 包结束。关于同步数据类型的描述请参见表6。
对于FS和FE同步包,短包数据字段应该包含一个16位的帧号。对于给定帧对应的FS和FE同步包,这个帧号应该是相同的。
当使用16位的帧号时,应该是非零的,以区别于用例中帧号是无效的并保持为零。
16位帧数的行为应如下:
帧号必须是非零值。
图45和图46分别包含了由多个数据包和单个数据包组成的数据帧的例子。
对于以Line Start(LS)和Line End(LE) 为标志的行同步包数据字段需要包含一个16-bit的行号(line number),对于与给定行相对应的LS和LE包,此行号应相同。行号是逻辑行号,不一定等于物理行号
16位行号在使用时应是非零的,以区别于行号无效并保持为零的情况。
16-bit 行号的行为如下:
color spacing 主要分为RGB和YUV两种。
这一节描述的YUV数据格式定义了数据类型,如表10,YUV420数据类型传输的行数应为偶数。
YUV420数据格式分为Legacy数据格式和non-legacy数据格式。Legacy YUV420数据格式是为了与现有系统兼容。non-Legacy YUV420数据格式能够实现更低的成本。
Legacy YUV8-bit数据传输通用发送UYY…/ VYY…序列在奇数/偶数行,元素U在奇数行被传送(1,3,5…) V元素在偶数行(2,4,6…)被传送,传送时序如图58。
表11 表示的是YUV420 8-bit 数据包长度,每一个包必须是表中值的倍数。
传输的位序遵循一般的CSI-2规则,LSB优先。像素到字节的映射如图59所示。
YUV422 8-bit传输格式为UYVY 序列,如图70
数据包长度:
像素到字节转换:
表16定义了RGB数据包类型,主要有以下几种RGB444,RGB555, RGB565, RGB666,RGB888。
RGB888数据传送序列BGR方式传送,如图77。数据帧格式如图79。
Raw6/7/8/10/12/14模式用于从图像传感器传输图像数据。数据类型如表20:
6位Raw数据传输通过CSI-2总线传输像素数据。每行由行开始/结束同步代码分隔。这个序列在图88 (VGA case)中进行了说明。RAW6报文大小约束如表21所示。每个包的长度必须是表中值的倍数。
本文没有讲到的章节,请具体参看CSI-2 Spec
CSI-2 Spec