mipi-csi软件篇

1 MIPI CSI2的发送和接收#

img

上图反映了sensor 和 soc 的数据关系,soc 通过 CCI (Camera Control Interface) 控制 sensor 寄存器,配置正确,sensor 将会通过 mipi 接口输出图像数据。

控制信息是 soc 通过 CCI 发送到 sensor,CCI 接口一般的就是 I2C 接口,最大支持400KHz。

data信息是CSI DPHY发送者发送到CSI DPHY接收者,由sensor端发送到soc的mipi-rx。

2 D-PHY(DSI和CSI的物理层定义)#

D-PHY 是 MIPI 聯盟發布的高速物理層標準,規定了接口層的物理特性和傳輸協議。 DPHY 採用了 200mV 源同步的低压差分信號技術,每個 Lane 的數據綠率範圍支持到2500Mbps。 D-PHY 可以工作在低功耗 (Low Power, LP) 和高速 (High Speed, HS) 兩種模式下。

2.1 传输模式#

LP(Low-Power) 模式:用于传输控制信号,最高速率 10 MHz

HS(High-Speed)模式:用于高速传输数据,速率范围 [80 Mbps, 2.5Gbps] per Lane

传输的最小单元为 1 个字节,采用小端的方式,也就是 LSB first,MSB last。

相关缩写名词:

HS-RX:高速接收器
HS-TX:高速发送器
LP-RX:低功耗接收器
LP-TX:低功耗发送器
LPS: Low Power State, 封包之間的spacing間距。
ST: Start of Transmission (SoT), 封包的起始訊號, 一般為低速轉換為高速的暫態訊號。
ET: End of Transmission (EoT), 封包的結束訊號, 一般為高速轉換為低速的暫態訊號。
PH: Packet Header, 32 bit表示, 為封包的標頭。
PF: Packet Footer, 16 bit表示, 為封包的結尾。

2.2 lane states#

* LP mode 有 4 种状态: LP00、LP01(0)、LP10(1)、LP11 (Dp、Dn)

* HS mode 有 2 种状态: HS-0、HS-1

HS 发送器发送的数据 LP 接收器看到的都是 LP00。

2.3 Lane Levels#

* LP: 0 ~ 1.2V

* HS: 100 ~ 300mV,HS common level = 200mV,swing = 200 mv

2.4 操作模式#

• 数据Lane的3种操作模式

  • Escape mode,

  • High-Speed(Burst) mode

  • Control mode

    ①Escape mode request
    LP-11→LP-10→LP-00→LP-01→LP-00
    exit:LP-10 -> LP-11

当进入 Escape mode 需要发送 8-bit entry command 表明请求的动作,比如要进行低速数据传输则需要发送 cmd: 0x87,进入超低功耗模式则发送 cmd: 0x78。

②High-Speed mode request :
LP-11→LP-01→LP-00->SOT(0001_1101)
exit: EOT -> LP-11

img

③Turnaround request
LP-11→LP-10→LP-00→LP-10→LP-00

这是开启 BTA 的时序,一般用于从 slave 返回数据如 ACK: 0x84.
exit:LP00→LP10→LP11

最常用的就是“低功耗进入高速模式”如下图:

img

我们的D0-D4都是一个差分信号,它从lowpower state进入到HS后,从hi speed mode 中sync出我们的data。

sensor控制的信号由绿色框圈出来,主要是以下三个讯号:

1
2
3
HS-Prepare:表示从low power mode进入到hi speed mode需要prepare一段时间
Hs-zero: 表示从low power mode进入到hi speed mode需要keep LP-00状态一段时间
Hs-trail:表示送完1 st data后需要keep一段时间后才允许进入low power mode,进行下一轮数据传输。

soc端的控制的信号由黄色框圈出来:

1
Hs-settle:表示soc要等一段时间才去开始去parse “sync code”, 当抓到sync code后表示sensor已经进入了hi speed mode, 这个时候就可以sync data了。

注意:

1.每次EOT(end of trans)结束讯号后,都会进入low power mode,而不是sensor 工作后就一直处于hi speed mode。也就是每传一个package,都会走一遍上述的过程。

2.hs-settle为mclk/8 *n(这个n表示配置几个clk,对应code的话配置这个mipi_dev_attr_s->dphy)

当hs-settle的时间太长会压到data中的“sync code”,那么就会出现sync code parse不到,出现ecc err. 又或者从data中parse到一个假的“sync code”,那么最后就会出现数据不太对,出现ecc err.

Ecc还有一种出现可能就是lane mapping 出错,当我们传输数据出现ecc err, 有可能就是传输short pack时,4 byte的short pack拼接的不对(详见CSI的数据包结构),导致出现ecc error.

3.如果hs-trail持续的太短(拉高的太快),有可能会压到最后面的data,所以会出现crc/wc(word count ) err.另外,如果hs -settle太大,也有可能hs-trail也会是错误的数据,所以出现wc, crc err,因此不一定是hs-trail的问题,得先确保前面的ecc/decode无误后再来调整hs-trail。

一般排查流程如下:

img

2.5 时钟模式#

  • 连续时钟模式:数据包传输间隔,clk lane 保持在高速模式;
  • 非连续时钟模式:数据包传输间隔,clk lane 进入 LP-11 状态,退出hi speed mode;

2.6 时序要求#

在调试 DSI 或者 CSI 的时候, HS mode 下的几个时序非常重要:T_LPX,T_HS-SETTLE ≈ T_HS-PREPARE + T_HS-ZERO,T_HS-TRAIL,一般遵循的原则为:Host 端的 T_HS-SETTLE > Slave 端的 T_HS-SETTLE。

img

2.7 Start-of-Transmission ( SoT )过程#

img

当要进行数据传输的时候,data lane 将会通过信号(SoT)退出停止状态,进入高速模式。过程如下:

TX Side RX Side
退出停止状态 ( LP-11 ) 检测停止状态
进入 HS-Rqst 状态 ( LP-01 ),并处于该状态的时间间隔为 TLPX 检测到 lane 从 LP-11 转变为 LP-01
进入 Bridge 状态 ( LP-00 ),并处于该状态的时间间隔为 THS-PREPARE 检测到 lane 从 LP-01 转变为 LP-00,间隔 TD-TERM-EN 时间之后将使能传输
同时退出低功耗模式,进入高速模式
处于 HS-0 状态,时长为 THS-ZERO 使能 HS-RX 并等待 THS-SETTLE,以忽略转换状态
开始从数据流中等待同步序列
时钟上升边缘插入 HS 同步序列 ‘00011101’
识别到同步序列 ‘00011101’
高速模式开始传输有效数据
接收到有效数据

2.8 End-of-Transmission ( EoT )过程#

在数据完成传输时,通过结束传输(EoT)过程,数据通道退出高速模式并进入停止状态,这个过程状态变化如下:

TX Side RX Side
传输数据 接收到数据
在完成最后一个字节数据的传输之后,保持该状态的时间间隔为 THS-TRAIL
关闭 HS-TX,启用 LP-TX,并在 THS-EXIT一段时间内处于停止状态 ( LP-11 ) 检测到 lane 状态进入停止状态 ( LP-11 ),关闭传输功能
忽略 THS-SKIP一段时间内的 lane 变化,以忽略转换状态
检测有效数据的最后一次转换,确定最后一次有效数据并忽略包尾序列

接收器是如何判断数据将要开始传输了呢?

当出现LP11→LP01→LP00时,接收器将会判断,将会有数据达到,同时,使用示波器查看mipi波形,将会发现在PL00(THS-PREPARE)时会有一个小脉冲(峰刺),一般的,在这个小脉冲之后,接收器将会打开比较器(由于在THS-PREPARE会有这个小脉冲的存在,所以在接收器中,会通过设置接收器的settle time,避开这个小脉冲,在这个脉冲之后再打开比较器),准备接收数据。而HS-00011101则表示有效数据开始,同时数据的开头,将会有数据表明将要数据的数据量,所以mipi接收器将会按其数据量接收,直到接收完成。
每根 lane(data lane/clk lane)从 LP 模式切换到 HS 模式都会有 LP11→LP01→LP00 这样的一个时序,同时还要检查 HS-00011101 ,HS-00011101 主要是用于同步,只有前面正确采集到 00011101 ,才能保证 clk 和 data 相位一一对应。

mipi csi调试助手:
测量 sensor 有相应的 mipi 信号输出,但是主控并没有接收到数据,通过查看主控的 mipi 寄存器发现,mipi接收器还处于 LP 模式,这种情况一般是mipi没有检测到sensor发送的从 LP 进入 HS 的时序。此时可测量sensor 开始输出图像数据时,clk lane 是否有 LP11→LP01→LP00 这样的一个时序。同时,应该先开 mipi,sensor 再开始 mipi 数据传输;
由于THS-PREPARE会有一个小脉冲的存在,所以,主控在接收mipi数据的时候,需要通过设置主控的settle time,这个时间需要在这个小脉冲之后,这样接收才不会有问题;
当出现 sensor 有数据输出,但是主控没有接收成功,这个情况一般是 mipi 的时序问题,sensor 端的时序没有和主控端的配合好,这个时候,可以尝试的减小sensor端的THS-PREPARE,增大THS-ZERO和THS-TRAIL;
由于一些主控的需求,在一帧数据完成之后,需要一定的时间才可以进行相应的ISP处理,当一帧传输完毕之后的LP11时间达不到主控ISP的时间要求导致ISP报错,可通过调节THS-TRAIL时间,以此得到ISP对帧间的时序长度要求 。

3 CSI-2数据包协议#

CSI-2 是針對攝像頭的數據協議, 規定了主機與外設通信的數據包格式。CSI-2 可以支持不同像素格式的圖像應用, 數據傳輸的最小粒度是字節。 為增加 CSI-2 的性能,可以選擇數據 Lane 的數量, CSI-2 協議規訂了發送端將像素數據打包成字節的機制, 並指明多個數據 Lane 分配和管理的方式。字節數據以數據包的形式組織,數據包在SoT 與 EoT 之間傳輸。 接收端根據協議解析相應的數據包, 恢復出原始的像素數據。

CSI-2 的數據包分為長包和短包兩種,包含有校驗碼,能進行誤碼糾正和錯誤檢測。長包和短包都是在 SoT 和 EoT 之間傳輸,在數據傳送的間隙, D-PHY 處於 LP 模式。 CSI-2數據包的傳輸機制如圖所示。 PH 和 PF 分別表示 Packet Header 和 Packet Footer。

3.1 一个数据包结构#

img

3.2 包类型#

• 短包:4 bytes (固定)
• 长包:6~65541 bytes (可变)

3.2.1 短包结构#

一个short packet(也叫做pack head(PH))

img

包结构(4个字节):
• 数据标识(DI) 1个字节
• WC (长度固定为2个字节)
• 错误检测(ECC) 1个字节

包大小:
• 长度固定为4个字节

3.2.2 pack footer(PF)的结构#

img

3.2.3 长包结构#

img

包头部(4个字节)(PH):
•   数据标识(DI) 1个字节
•   数据计数WC (2个字节 )(PH和PF之間的資料個數)
•   错误检测(ECC) 1个字节
•  数据填充(0~65535 字节)
• 长度=WC*字节

包尾:校验和(2个字节)(PF)

长包 = 短包(包头) + 数据 + 包尾

包大小:
4 + (0~65535) + 2 = 6 ~ 65541 字节

3.2.4 H-blanking & V-blanking#

传输多个pack和传输一个pack时对应的图像如下, VVALID/HVALID/DVALID可以先把它想成是影像的同步訊號VSync/HSync/DE,而Data就是影像資料,以方便理解。

从图中可以看到,当水平同步讯号HVALID为Low的这段区间,剛好就是每行的Blanking间隔, 也就是H-blanking。

img

从下图可以看到上一FE到下一FS之间的间隔为V-blanking.

img

frame的封包示意图:

img

3.2.5 MIPI帧数据类型DI#

img

Data Identifier (DI) 为虚拟通道(VC, 2 bit)和资料类型(DT, 6 bit)组成。

3.2.5.1 VC(virtual channel)#

可以看出MIPI最多可以輸入4组影像来源,其ID为0~3,且內容可以是任意的內容,下图就表示用virtual chn来传输不同格式的数据。比如一般Sony, OV的HDR 模式基本都是VC mode,包括2帧HDR, 3帧HDR。

img

img

3.2.5.2 DT(data type)#

Data Type目前定义多种资料形态,范围从0x000x3F,其中0x000x0F为短封包类型,0x10~0x3F为長封包类型,如下表:

img

用于同步的短包Data Type:

img

soc到外设发送的包类型:

img

外设到soc的数据包类型:

img

4 mipi支持的图像格式#

MIPI CSI 共支持五種pixel資料格式的傳輸, 包含 YUV422-8bit、 YUV422-10bit、 RAW8、RAW10 和 RAW12。

4.1 RGB格式#

传统的红绿蓝格式,比如RGB565,RGB888,其16-bit数据格式为5-bit R + 6-bit G + 5-bit B。G多一位,原因是人眼对绿色比较敏感。

格式 描述
RGB565 1. 每个像素用16位表示,RGB分量分别使用5位、6位、5位。2. 内存中排列(高字节->低字节):R R R R R G G G G G G B B B B B
RGB555 1. 每个像素用16位表示,RGB分量都使用5位(剩下1位不用)2. 内存中排列(高字节->低字节):X R R R R G G G G G B B B B B(X表示不用,可以忽略)
RGB24(RGB888) 1. 每个像素用24位表示,RGB分量各使用8位。在内存中RGB各分量的排列顺序为:BGR BGR BGR ……2. 内存中排列(高字节->低字节):B B B B B B B B G G G G G G G G R R R R R R R R
ARGB32(ARGB8888) 1. 每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)2. 内存中排列(高字节->低字节):B B B B B B B B G G G G G G G G R R R R R R R R A A A A A A A A

4.2 YUV格式#

YUV是一种色彩编码方法,是一种彩色编码系统,相对于RGB色彩空间,YUV传输带宽占用更低,传输数据不易出错。

Y’UV、YUV、YCbCr、YPbPr 几个概念其实是一回事儿。由于历史关系,Y’UV、YUV 主要是用在彩色电视中,用于模拟信号表示。YCbCr 是用在数字视频、图像的压缩和传输,如 MPEG、JPEG。今天大家所讲的 YUV 其实就是指 YCbCr。Y 表示亮度(luma),CbCr 表示色度(chroma)。

人眼的视觉特点是对亮度更敏感,对位置、色彩相对来说不敏感。所以在视频编码系统中为了降低带宽,可以保存更多的亮度信息(luma),保存较少的色差信息(chroma)。

luminance 亮度,luma 是在视频编码系统中指亮度值;

chrominance 色度,chroma 是在视频编码系统中指色度值。

Y’UV 设计的初衷是为了使彩色电视能够兼容黑白电视。对于黑白电视信号,没有色度信息也就是(UV),那么在彩色电视显示的时候只显示亮度信息。

YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。色度(UV)定义了颜色的两个方面─色调与饱和度,分别用CB和CR表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

4.2.1 YUV采样模式(subsamping)#

原则:在数字图像中
1) 每一个图形像素都要包含 luma(亮度)值;
2)几个图形像素共用一个 Cb + Cr 值,一般是 2、4、8 个像素。

主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。

4.2.1.1 YUV444采样#

全采样,对每个像素点的的YUV分量都进行采样,这样的三个分量信息量完整。
假设4*4像素,采样格式如下:

1
2
3
4
[y u v] [y u v] [y u v] [y u v]
[y u v] [y u v] [y u v] [y u v]
[y u v] [y u v] [y u v] [y u v]
[y u v] [y u v] [y u v] [y u v]

那么19201080文件的大小:19201080*3(B),那么一个像素对应3个字节。

4.2.1.2 YUV422采样#

部分采样,可节省1/3存储空间和1/3的数据传输量。UV分量是Y分量采样的一半,Y分量和UV 分量按照2 : 1的比例采样。如果水平方向有10个像素点,那么采样了10个Y分量,而只采样了5个UV分量。其中,每采样过一个像素点,都会采样其Y分量,而U、V分量就会间隔一个采集一个。
假设4*4像素,采样格式如下:

1
2
3
4
[y u] [y v] [y u] [y v]
[y v] [y u] [y v] [y u]
[y u] [y v] [y u] [y v]
[y v] [y u] [y v] [y u]

19201080文件的大小:19201080+192010800.5+192010800.5(B),那么UV的数量减少了一半,相对于YUV444空间节省了1/3。

4.2.1.3 YUV420采样#

部分采样,可节省1/2存储空间和1/2的数据传输量。YUV 420采样,并不是指只采样U分量而不采样V分量。而是指,在每一行扫描时,只扫描一种色度分量(U或者V)和Y分量按照2 : 1的方式采样。比如,第一行扫描时,YU 按照 2 : 1的方式采样,那么第二行扫描时,YV分量按照 2:1的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和Y分量相比都是2:1 。其实yuv420的取名方式不是很高明,更确切的命名为yuv420yuv402,也就是第一行只有U,而第二行只有V。
假设4*4像素,采样格式如下:

1
2
3
4
[y u] [y] [y u] [y]
[y v] [y] [y v] [y]
[y u] [y] [y u] [y]
[y v] [y] [y v] [y]

19201080文件的大小:19201080+192010800.25+192010800.25(B)相对于YUV444空间节省1/2,因此也是比较主流的采样方式。

4.2.2 YUV存储方式#

YUV的格式有两大类:planar(平面格式)和packed(打包格式)

4.2.2.1 planner存储#

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

一般默认是3个平面,即y平面,u平面,v平面。但还有一种semi-planar是两个平面。也就是说uv为同一个平面,即一个y平面,一个uv平面。

4.2.2.1.1 yuv420 planner#

img

img

例如:

img

可以看到第一行的Y1Y2和第二行的Y7Y8共同使用一组U1V1。

4.2.2.1.2 yuv420sp#

two-planer双平面,Y一个平面,UV在同一个平面交叉存储。也叫做semi-planar的YUV格式。

  1. nv12

    先存储全部的Y分量,然后UV分量交叉存储。

    img

  2. nv21

    先UV分量交叉存储, 然后存储全部的Y分量。

img

4.2.2.1.3 yuv422 planner#

3平面,数据量:u=v=y/2,不画图展示

4.2.2.1.4 yuv422sp#

img

可以看到y0y82个像素公用一组u0v0。

4.2.2.2 packed存储#

packed的YUV格式,每个像素点的Y、U、V都是连续交叉存储的。

4.2.2.2.1 yuyv#

该格式属于4:2:2类型,且是用packed形式存储的,相邻的2个像素共用一个Cb(U)和Cr(V),以16个像素为例如下图:

img

4.2.2.2.2 yvyu#

与YUYV相似,只是存储时UV分量顺序不同而已。

4.2.2.2.2 uyvy

与YUYV相似,只是存储时UV分量顺序不同而已。

img

4.3 RAW 格式#

RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。Raw data(Raw RGB)经过彩色插值就变成RGB。

img

sensor上每个像素只采集特定颜色的光的强度,因此sensor每个像素只能为R或G或B 。

4.3.1 bayer阵列#

人眼对绿色比较敏感,所以一般bayer格式的图片绿色格式的像素是是r和g像素的和,那么bayer格式一般有下面4种:

img

5 mipi csi数据包传输#

raw8格式传输:

img

raw10格式传输:

img

raw12格式传输:

img

从图像看,RAW8是一传输个字节对应一个pixel, 而raw10是5个byte去对应4个pixel,第5个byte用来存储pixel 0~3的bit[0:1]。同理raw12用3个byte存储2个pixel。

img

6 色彩深度#

8位彩色,有256种深度。
16位彩色:65,536种颜色。
24位彩色:每种原色都有256个层次,它们的组合便有256256256种颜色。
32位彩色:除了24位彩色的颜色外,额外的8位是储存重叠图层的图形资料(alpha透明度)。

7 图像解析度/分辨率#

Resolution:

1280 * 720 = 921600 1M 100万像素 720P H65 sensor
1920 * 1080 = 2073600 2M 200万像素 1080P Imx307/imx327 sensor
2560 * 1440 = 36864002560 * 1600 = 40960002592 * 1944 = 5038848 4M/5M 400万像素500万像素 2K Imx335/sc4210 sensor
3840 * 2160 = 8294400 8M 800万像素 4K Imx334 sensor