欲觀原文,請(qǐng)君移步
1 MIPI簡(jiǎn)介
MIPI是Mobile Industry Processor Interface(移動(dòng)行業(yè)處理器接口)的縮寫。MIPI 聯(lián)盟是一個(gè)開放的會(huì)員制組織。2003年7月,由美國(guó)德州儀器(TI)、意法半導(dǎo)體(ST)、英國(guó) ARM 和芬蘭諾基亞(Nokia)4 家公司共同成立。

MIPI 聯(lián)盟旨在推進(jìn)移動(dòng)應(yīng)用處理器接口的標(biāo)準(zhǔn)化。MIPI 聯(lián)盟下面有不同的 WorkGroup ,分別定義了一系列的手機(jī)內(nèi)部接口標(biāo)準(zhǔn),比如攝像頭接口 CSI 、顯示接口 DSI 、射頻接口 DigRF 、麥克風(fēng)/喇叭接口 SLIMbus 等。而 MIPI CSI-2 (Camera) and MIPI DSI (Display)則是目前業(yè)界使用最廣的兩個(gè) MIPI 接口標(biāo)準(zhǔn),而這也是和視頻傳輸相關(guān)的標(biāo)準(zhǔn),所以本文主要對(duì) CSI-2 攝像頭標(biāo)準(zhǔn)進(jìn)行介紹。
2 MIPI CSI-2簡(jiǎn)介
MIPI CSI(Camera Serial Interface)是由MIPI聯(lián)盟下 Camera 工作組指定的接口標(biāo)準(zhǔn)。CSI-2 是 MIPI CSI 第二版,主要由應(yīng)用層、協(xié)議層、物理層組成,最大支持4通道數(shù)據(jù)傳輸、單線傳輸速度高達(dá)1Gb/s。

2.1 MIPI CSI-2 的層次結(jié)構(gòu)
MIPI CSI-2的分層方法有好幾種,根據(jù)MIPI聯(lián)盟的規(guī)范,CSI-2 可分為5層,如圖1所示,分別為:應(yīng)用層、組包/解包層、底層協(xié)議層(Low Level Protocol)、通道管理層和物理層。

圖1
協(xié)議結(jié)構(gòu)層次詳細(xì)描述如下
名稱描述
應(yīng)用層即是處理原始圖像數(shù)據(jù)的各種算法模塊
組包/解包層負(fù)責(zé)將數(shù)據(jù)按照一定的次序,切割成8比特?cái)?shù)據(jù)。
底層協(xié)議層為新生成的數(shù)據(jù)加上包頭包尾,形成符合協(xié)議要求的數(shù)據(jù)流。
通道管理層將生成的數(shù)據(jù)流按照一定次序和要求,進(jìn)行讀寫管理,輸出數(shù)據(jù)流。
物理層生成MIPI最后的信號(hào)波形。
2.2? ? CSI-2協(xié)議層
CSI-2 協(xié)議層允許多數(shù)據(jù)流(CSI-2TX)共用一個(gè)主機(jī)處理器端 CSI-2 接收信號(hào)接口(CSI-2RX)。協(xié)議層就可以描述有多少數(shù)據(jù)流被標(biāo)記并組合在一起,指定了多數(shù)據(jù)流怎樣被標(biāo)記和交叉存取,因此每個(gè)數(shù)據(jù)流可以在 SOC 處理器 CSI-2 接收器中被正確的重建,才能把各個(gè)數(shù)據(jù)流正確地恢復(fù)出來(lái)。
2.3? ? 打包/解包層
CSI-2支持多種像素格式圖像應(yīng)用,包括從6位到24位每個(gè)像素的數(shù)據(jù)格式。
在發(fā)送端,數(shù)據(jù)由本層被發(fā)送到LLP層(Low Level Protocol)前,本層將應(yīng)用層傳來(lái)的數(shù)據(jù)由像素打包成字節(jié)數(shù)據(jù);
在接收端,執(zhí)行相反過(guò)程,將LLP層發(fā)來(lái)的數(shù)據(jù)解包,由字節(jié)轉(zhuǎn)成像素,然后才發(fā)送到應(yīng)用層。8位每像素的數(shù)據(jù)在本層被傳輸時(shí)不會(huì)被改變。
2.4? ? LLP(Low Level Protocol)層
LLP層包括為串行數(shù)據(jù)在傳輸開始(SoT)到傳輸結(jié)束(EoT)之間傳輸事件和傳輸數(shù)據(jù)到下一層,建立位級(jí)和字節(jié)級(jí)同步的方法。LLP最小數(shù)據(jù)粒度是1字節(jié)。LLP層也包括,每字節(jié)中各位數(shù)值分布解釋,即“端”(Endian)分布。
2.5? ? 通道管理(Lane Management)層
為性能不斷提升,CSI-2 是通道可擴(kuò)展的。數(shù)據(jù)通道數(shù)目可以是1,2,3,4,這個(gè)依賴于應(yīng)用中的帶寬需求。接口發(fā)送端分配(“distributor”功能)輸出數(shù)據(jù)流到一個(gè)或更多通道。在接收端,接口從通道收集字節(jié)并將之合并(“merger”功能)成為重新組合的數(shù)據(jù)流,恢復(fù)原始數(shù)據(jù)流序列。
2.6? ? 物理層(PHY Layer)
定義了傳輸介質(zhì) (electrical conductors,導(dǎo)體),輸入/輸出電路信號(hào)的電氣特性(electrical parameters)和時(shí)鐘機(jī)制(時(shí)序)。即如何從串行位流(Bit Stream)中獲取“0”和“1”信號(hào)。規(guī)范中的這一部分記錄了傳輸介質(zhì)的特性,并依據(jù)時(shí)鐘和數(shù)據(jù)通道之間發(fā)信號(hào)和產(chǎn)生時(shí)鐘的關(guān)系規(guī)定了電學(xué)參數(shù)。
3? ? MIPI CSI2的物理連接
除地線外,MIPI CSI2一般會(huì)有1對(duì)I2C通信引腳,1對(duì)MIPI差分時(shí)鐘引腳和1~4對(duì)MIPI差分?jǐn)?shù)據(jù)信號(hào)引腳,如圖2所示。

圖2
信號(hào)描述如下
名稱描述
DATA1+/DATA1-MIPI協(xié)議組包生成的差分模擬數(shù)據(jù)信號(hào)第1組
DATA2+/DATA2-MIPI協(xié)議組包生成的差分模擬數(shù)據(jù)信號(hào)第2組
CLOCK+/CLOCK-協(xié)議組包生成的差分模擬時(shí)鐘信號(hào)
SCL/SDAIIC控制通道
在典型的應(yīng)用中發(fā)送端在完成對(duì)圖像的各種處理后,按照協(xié)議對(duì)數(shù)據(jù)進(jìn)行打包,然后通過(guò)差分信號(hào)線向接收端傳輸信號(hào),差分信號(hào)線一般有一對(duì)時(shí)鐘差分線和多對(duì)數(shù)據(jù)差分線,數(shù)據(jù)差分信號(hào)線的數(shù)量與需要傳輸?shù)臄?shù)據(jù)量的要求有關(guān),數(shù)據(jù)量越大多對(duì)數(shù)據(jù)線能更容易滿足鏈路的需求。一般情況下兩百萬(wàn)到五百萬(wàn)像素的手機(jī)使用兩對(duì)差分?jǐn)?shù)據(jù)線,即兩個(gè)數(shù)據(jù)通道。而當(dāng)攝像頭像素進(jìn)一步提高到八百萬(wàn)甚至一千三百萬(wàn)時(shí)一般會(huì)使用四個(gè)數(shù)據(jù)通道,即四對(duì)差分?jǐn)?shù)據(jù)線。
與外部進(jìn)行控制信號(hào)交互時(shí),采用的是I2C接口,在MIPI的發(fā)送端使用的是I2C從端的IP,MIPI CSI-2接口的控制寄存器連接I2C的從端,這樣外部接收裝置可以通過(guò)I2C去配置MIPI發(fā)送端的內(nèi)部寄存器,以此改變MIPI CSI-2接口內(nèi)部狀態(tài)機(jī)的持續(xù)時(shí)間和最后輸出數(shù)據(jù)時(shí)的通道數(shù),又或者在調(diào)試過(guò)程中讀出這些寄存器,去做相應(yīng)的檢查,以判斷發(fā)送端的工作狀態(tài),再通過(guò)接收端的現(xiàn)象來(lái)分析發(fā)送端是否工作在正常的狀態(tài)。
4? ? MIPI CSI2的工作模式
D-PHY有兩種傳輸模式。
HS 高速傳輸模式,用于傳輸突發(fā)數(shù)據(jù),同步傳輸,信號(hào)為差分信號(hào),電平范圍為100mv-300mv,傳輸速度范圍是80-1000Mbps。在該模式下傳輸時(shí),當(dāng)差分線正端收到 1.2V 信號(hào),負(fù)端收到 0V信號(hào)時(shí),這時(shí)接收端識(shí)別為 1。反之為0。
LP 低功耗模式,用于傳輸控制指令,異步傳輸,信號(hào)線為單端,電平范圍是0-1.2v,沒有用時(shí)鐘線,時(shí)鐘是通過(guò)兩個(gè)數(shù)據(jù)線異或而來(lái)的,速度只有10Mbps。在該模式下傳輸時(shí),當(dāng)正端接收到300m V,負(fù)端接收到100m V 時(shí)接收端識(shí)別為1,反之則識(shí)別為0。

5? ? MIPI CSI2的數(shù)據(jù)包格式
MIPI CSI2是一個(gè)面向字節(jié)的,基于包的協(xié)議;它支持任意大小的數(shù)據(jù)通過(guò)短包和長(zhǎng)包格式傳輸。各個(gè)包之間由EOT-LPS-SOT序列隔開,如圖所示。

LLP包有兩種:長(zhǎng)包和短包。每個(gè)包的傳輸以SoT(start of transmission)開始,EoT(end of transmission)結(jié)束,中間間隙是LPS(Low Power State低功耗狀態(tài))。
5.1? ? MIPI CSI2的長(zhǎng)包格式
MIPI CSI2的長(zhǎng)包主要有包頭、數(shù)據(jù)包和包尾三部分構(gòu)成。而包頭又可細(xì)分為:數(shù)據(jù)標(biāo)識(shí)(data identifier)、數(shù)據(jù)包大小(word count)和錯(cuò)誤校驗(yàn)碼(ECC)構(gòu)成如下圖所示。

其中,數(shù)據(jù)標(biāo)識(shí)大小為1字節(jié),包含虛擬數(shù)據(jù)通道號(hào)[7:6]和數(shù)據(jù)類型[5:0]。
數(shù)據(jù)包大小為2字節(jié),其內(nèi)容為傳送數(shù)據(jù)的長(zhǎng)度,以“字”為單位。
錯(cuò)誤校驗(yàn)碼大小為1字節(jié),負(fù)責(zé)對(duì)數(shù)據(jù)包的傳輸錯(cuò)誤進(jìn)行檢查及糾錯(cuò)。
數(shù)據(jù)包可以傳送數(shù)據(jù)的大小為0~65535字節(jié)。
包尾大小為2字節(jié),是數(shù)據(jù)負(fù)荷的檢查和。
5.2? ? MIPI CSI2的短包格式
與長(zhǎng)包相比,短包沒有數(shù)據(jù)包和包尾。數(shù)據(jù)標(biāo)識(shí)DI中的數(shù)據(jù)類型在0x00到0x0F之間。WC字段是短包的數(shù)據(jù)域,這個(gè)數(shù)據(jù)可由用戶定義。ECC采用的是Hamming Code的方式,能對(duì)1bit錯(cuò)誤進(jìn)行糾錯(cuò),2bit錯(cuò)誤進(jìn)行檢查,如下圖所示。

短包只是將長(zhǎng)包中的WC的位置作為包的數(shù)據(jù)域,也就是說(shuō),短包每次最多只能發(fā)兩個(gè)字節(jié)的數(shù)據(jù)。和長(zhǎng)包一致,同樣需要先發(fā)LSB,再發(fā)MSB。應(yīng)當(dāng)注意的是,短包一般是用來(lái)發(fā)送同步控制信號(hào)的,一般不建議使用短包來(lái)發(fā)送用戶數(shù)據(jù)。
同步信號(hào)的類型如下:

而當(dāng)Data Type為0x08到0x0F時(shí),則為Generic Short Packet Code,即可發(fā)送用戶自定義數(shù)據(jù)。
比如下面的例子,短包發(fā)幀同步信號(hào),長(zhǎng)包發(fā)數(shù)據(jù)。

6? ? 基于FPGA的MIPI接口實(shí)現(xiàn)
6.1? ? 接口描述
源碼請(qǐng)看【資料獲取】
csi_4lane_raw10#(
.series("7SERIES")
)inst(
.ref_clock_in(ref_clock_in),
.reset(reset),
.mipi_phy_if_clk_hs_n(mipi_phy_if_clk_hs_n),
.mipi_phy_if_clk_hs_p(mipi_phy_if_clk_hs_p),
.mipi_phy_if_clk_lp_n(mipi_phy_if_clk_lp_n),
.mipi_phy_if_clk_lp_p(mipi_phy_if_clk_lp_p),
.mipi_phy_if_data_hs_n(mipi_phy_if_data_hs_n),
.mipi_phy_if_data_hs_p(mipi_phy_if_data_hs_p),
.mipi_phy_if_data_lp_n(mipi_phy_if_data_lp_n),
.mipi_phy_if_data_lp_p(mipi_phy_if_data_lp_p),
.m_axis_video_aclk(m_axis_video_aclk),
.m_axis_video_aresetn(m_axis_video_aresetn),
.m_axis_video_tready(m_axis_video_tready),
.m_axis_video_tuser(m_axis_video_tuser),
.m_axis_video_tlast(m_axis_video_tlast),
.m_axis_video_tvalid(m_axis_video_tvalid),
.m_axis_video_tdata(m_axis_video_tdata)
);
端口描述如下:(輸入為MIPI接口數(shù)據(jù)流,輸出為axi stream數(shù)據(jù)流)
端口I/O描述
ref_clock_inI200M輸入?yún)⒖紩r(shí)鐘
resetI復(fù)位,高有效
mipi_phy_if_clk_hs_n mipi_phy_if_clk_hs_pIHS鏈路差分時(shí)鐘
mipi_phy_if_clk_lp_n mipi_phy_if_clk_lp_pILP鏈路差分時(shí)鐘
mipi_phy_if_data_hs_n mipi_phy_if_data_hs_pIHS鏈路差分?jǐn)?shù)據(jù)
mipi_phy_if_data_lp_n mipi_phy_if_data_lp_pILP鏈路差分?jǐn)?shù)據(jù)
m_axis_video_aclkI視頻輸入時(shí)鐘
m_axis_video_aresetnI視頻輸入復(fù)位,低有效
m_axis_video_treadyI視頻輸入準(zhǔn)備信號(hào)
m_axis_video_tuserO視頻輸出的幀開始
m_axis_video_tlastO視頻輸出行結(jié)尾
m_axis_video_tvalidO視頻輸出數(shù)據(jù)有效
m_axis_video_tdataO視頻輸出數(shù)據(jù)
6.2? ? 模塊分析
程序接口如下圖,主要由三個(gè)模塊組成:
解串模塊(csi_rx_4_lane_link)
協(xié)議解析模塊(csi_rx_packet_handler)
RAW10bit(csi_rx_10bit_unpack)生成模塊

IP

IP層次

IP頂層模塊

IP輸出接口時(shí)序
6.2.1? ? 解串模塊
解串模塊主要完成字節(jié)對(duì)齊和字對(duì)齊,程序結(jié)構(gòu)框圖如下圖所示。

csi_rx_hs_clk_phy:
dphy_clk:輸入查分時(shí)鐘
reset?:?輸入復(fù)位
ddr_bit_clock?:?輸出單端時(shí)鐘
ddr_bit_clock_b?:?輸出反向單端時(shí)鐘
byte_clock?:?輸出字節(jié)時(shí)鐘頻率為輸入頻率的1/4
csi_rx_clock_det:檢測(cè)外部時(shí)鐘是否穩(wěn)定:等待參考時(shí)鐘穩(wěn)定200個(gè)時(shí)鐘周期,并且byte_clock時(shí)鐘穩(wěn)定3個(gè)時(shí)鐘釋放復(fù)位。
csi_rx_idelayctrl_gen:idelayctrl配合idelay使用
csi_rx_hs_lane_phy:抖動(dòng)補(bǔ)償和串化
通過(guò)控制延時(shí),使得CLK和經(jīng)過(guò)IBUFDS的BitClk對(duì)齊,從而消除IBUFIO和BUFR還有net的延時(shí)。這樣所有的輸入信號(hào)都只經(jīng)過(guò)了一個(gè)IBUFDS,延時(shí)相等。對(duì)Idelay的控制,可以手動(dòng)調(diào)節(jié),也可以用自動(dòng)算法。

csi_rx_byte_align:對(duì)齊某一字節(jié),相當(dāng)于找同步字
csi_rx_word_align:將不同通道之間的字節(jié)對(duì)齊到某一個(gè)字
6.2.2? ? 協(xié)議模塊
csi_rx_packet_handler,解析數(shù)據(jù)協(xié)議,根據(jù)協(xié)議解出vsync_out,Line_valid,里面包括長(zhǎng)短包判斷,ECC校驗(yàn)產(chǎn)生valid等。
6.2.3? ? RAW 10bit生成模塊
csi_rx_10bit_unpack:解包為RAW 10bit,如果是8bit則不需要此模塊
6.3? ? 實(shí)例應(yīng)用
本次實(shí)例是應(yīng)用于xlinx 的xc7z035ffg676上,開發(fā)環(huán)境為vivado 2017.4。
6.3.1? ? 硬件結(jié)構(gòu)框圖
硬件結(jié)構(gòu)框圖如下:主要包括MIPI接口的解碼,外設(shè)IIC配置sensor,GPIO復(fù)位外部Sensor。

6.3.2? ? IIC配置
Main函數(shù)里面:先進(jìn)性IIC初始化,GPIO初始化,進(jìn)行復(fù)位,然后配置Sensor配置。

6.3.3? ? 實(shí)驗(yàn)結(jié)果
可以看到成功解串出來(lái)數(shù)據(jù)。

7? ? 參考鏈接
D-PHY Layout參考:https://zhuanlan.zhihu.com/p/92682047
CSI-2參考:https://blog.csdn.net/u011652362/article/details/81741134
MIPI入門:
https://blog.csdn.net/l471094842/article/details/95619198?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
附:資料獲取

資料包

文檔

github源碼

本工程源碼
獲取資料方法一:集贊
關(guān)注小編公眾號(hào)后,將本文轉(zhuǎn)發(fā)至朋友圈,集齊6個(gè)贊,截圖發(fā)送到后臺(tái),小編會(huì)在24小時(shí)之內(nèi)回復(fù)。備注:【領(lǐng)取MIPI資料】即可領(lǐng)取資料
獲取資料方法二:轉(zhuǎn)發(fā)群
關(guān)注小編公眾號(hào)后,將本文轉(zhuǎn)發(fā)至不低于100人的群(相關(guān)行業(yè)),截圖發(fā)送到后臺(tái),小編會(huì)在24小時(shí)之內(nèi)回復(fù)。備注:【領(lǐng)取MIPI資料】即可領(lǐng)取資料