李宇成,葛正中
Linux 下高清MIPI差分攝像頭的軟硬件設計
李宇成,葛正中
(北方工業大學電氣與控制學院,北京100144)
以Exynos4412為處理平臺,設計了以MIPI差分接口攝像頭為采集端的高清系統硬件,進行了MIPI接口和DVP接口信號完整性仿真,設計了Linux下攝像頭驅動程序,給出了軟件架構的UML圖。通過硬、軟件調試和實驗驗證,成功實現Linux系統下的高清攝像系統。攝像頭前端采集采用MIPI接口后,性能可達720p/60 fps,相比于傳統DVP接口攝像頭,不僅傳輸幀率提高1倍以上,而且運行穩定,信噪比大幅度提高。
Exynos4412;MIPI差分攝像頭驅動;信號完整性仿真
隨著信息技術的高速發展,遠程視頻教學[1]、遠程視頻會議[2]、遠程監控等與攝像頭相關的應用越來越多,新一代的監控設備正在向高分辨率、小型化、低功耗、高穩定性的方向發展[3]。
隨著互聯網的普及和物聯網概念的推廣,多樣化的用戶定制設計逐漸成為監控市場的主流[4]。市面的攝像頭一般都做成模組,由鏡頭、濾鏡、CMOS傳感器、PCB板和加強筋組成,與應用處理器的接口有DVP和MIPI兩種[5]。目前,國內一般民用監控產品[6]大多低于200萬像素,采用DVP接口[7],質量不穩定,且信噪比和抗干擾性較差。筆者通過對市面上常見的并行接口攝像頭進行研究和比較,實現了差分MIPI接口攝像頭的視頻監控解決方案。
目前,雖然有一些嵌入式Linux下攝像頭設計的介紹論文[8],但都是關于DVP接口攝像頭的,缺乏嵌入式Linux下MIPI接口攝像頭驅動設計與實現方面的公開論文和資料,個別網上資料也僅僅是點到為止,因此,給相關的設計和應用工作帶來不便。
本系統應用MIPI攝像頭接口,采用差分接口完成鏡頭到CPU之間的數據傳輸,具有傳輸速率高、抗干擾性好的特點。系統采用三星公司4核處理器Exynos4412[9],其主頻為1.4 GHz,支持DVP、MIPI接口圖像數據輸入,內部嵌有硬件編解碼器和專用圖像處理器。攝像頭采用Omni Vision公司生產的OV5640 CMOS圖像傳感器[10],分別進行了DVP和MIPI兩種接口的軟硬件設計。操作系統采用Linux3.0系統,進行了硬件電路信號完整性仿真實驗對比,并介紹了Linux驅動程序實現到應用程序測試的整個過程。
系統硬件架構如圖1所示,由圖像采集部分、圖像處理部分和圖像傳輸顯示部分組成,本系統圖像采集部分支持兩種接口的攝像頭(DVP接口和MIPI接口),Exynos4412通過這兩個接口采集圖像數據,然后經過圖像數據格式轉換,通過HDMI高清接口發送圖像到液晶屏顯示,或通過網絡接口傳輸到監控終端。

圖1 系統硬件框圖
1.1視頻采集部分
為了對比MIPI和DVP兩種接口的性能,系統同時支持兩種接口。如圖2中所示,DVP通過并行的數據線CAM_Dn連接到CPU。

圖2 DVP攝像頭接口電路圖
下面的實驗將表明DVP接口的信噪比較差,為了提高視頻采集的質量,筆者同時采用抗干擾性強的MIPI接口攝像頭方案。MIPI是一個比較新的標準,其規范也在不斷修正和改進,目前比較成熟的接口應用有DSI(顯示接口)和CSI(攝像頭接口)。現在CSI已經升級到CSI2.0版本,其是一個單向或雙向的差分串行接口,包含數據信號和時鐘信號,支持多個lane的數據傳輸,一條lane的傳輸速率可達1 Gbps,本系統中MIPI攝像頭采用2條lane進行數據傳輸,完全滿足高清攝像頭傳輸需求。接口電路圖如圖3所示。

圖3 MlPl攝像頭接口電路圖
1.2系統可行性分析
系統采用2 lane差分通道進行數據傳輸,理想的理論傳輸帶寬為2 Gbps,換算成字節為256 MB/s,一幀720p YUV圖像為1.5 MB,60 fps需要90 MB/s的帶寬,所以MIPI接口的帶寬大于實際需要的帶寬,可以保證視頻采集速率。在信號完整性方面,MIPI接口采用差分線傳輸,由于干擾源幾乎相同程度地影響差分信號對的每一端,差分信號線對外部電磁干擾(EMI)是高度免疫的。所以經過差分接口傳輸的視頻數據抗干擾性和圖像的效果都會優于并行口。
為了詳細分析并行接口傳輸和差分接口傳輸的差異和優劣,并為后面的PCB布線做準備,筆者對兩種接口的信號完整性進行了仿真,仿真主要針對兩種接口在傳輸信號時的串擾和反射的情況,仿真軟件采用Allegro PCB SI,仿真模型采用IBIS模型,由于篇幅原因,本文著重介紹其中反射仿真的部分以及最終串擾仿真和反射仿真后得到的結論。
2.1攝像頭并行信號與差分信號電路連接圖
圖4、圖5為攝像頭DVP并行接口和MIPI差分接口的信號連接模型,DVP數據傳輸采用8條線直接連接,為圖4中的DATA[7:0]信號線,MIPI傳輸采用兩對差分數據線和一對差分時鐘線傳輸,為圖5中的DATAN[1:0]、DATAP[1:0]和CLKP、CLKN。

圖4 攝像頭并行接口連接圖

圖5 攝像頭差分接口連接圖
在實際的使用中,為了使用和安裝的方便,CMOS攝像頭接口端和處理器之間的距離可能會比較長,例如,在臺式使用的場合下,CMOS攝像頭與CPU之間的距離可能超過50 cm,因此,必須要考慮信號的抗干擾和抗衰減能力,所以除了要仿真在不同的工作頻率下并行接口和差分接口的信號完整性差別外,還要仿真在不同長度的數據傳輸線下兩者信號完整性的差別,以便適應不同應用對于傳輸線線長的需求。
2.2差分線與并行線的仿真
隨著線路的延長,并行高速電路由于線路阻抗和分布參數的影響,信號衰減嚴重,通信質量下降顯著。與并行電路相比,差分電路本身具有很強的抗共模干擾能力;其次,通過相互平行貼近布線,能夠較好地抵抗串擾;另外,因為采用恒流源進行驅動,通過阻抗匹配,適當延長傳輸線不會造成信號明顯衰減,且對信號的傳輸質量影響較小[11]。
仿真參數條件為:連接線長度為65 cm,線寬為10 mil,傳輸信號為“010101”方波,DVP接口時鐘頻率為120 MHz,MIPI接口頻率為480 MHz,為了使仿真結果更加貼近真實情況,使用了有損傳輸線模型。
圖6所示,并行數據線長為65 cm時的信號反射仿真結果,而圖7所示為差分數據線長為65 cm時的仿真結果。

圖6 65 cm并行數據線接收端反射仿真結果
由圖6的仿真結果可得,并行線隨著線長的增加,噪聲容限越來越小,抗干擾能力越來越弱,信號線長為65 cm時,在仿真結果中失真嚴重,信號未達到高電平門限1.56 V,完全不可使用,但差分信號線隨著線長的增加,噪聲容限變化不大,在線長為65 cm時,除了信號延遲加大外,無其他不良影響,仿真結果表示仍然可用。
差分電路的輸出端采用恒流源驅動,接收端高低電平門限電壓大于±100 mV就足夠了,MIPICSI2接口差分信號幅值只有幾百m V,實際應用一般為100~300 m V,最大不超過400 m V,典型值為200 m V,這樣,采用MIPI接口后,系統的功耗也低于并行口。并行口在實際的使用中,由于受信號完整性的限制,時鐘頻率大于100 M Hz時,電路板對信號完整性的要求非常高,所以采用并行口的攝像頭大多為200萬像素以下的攝像頭。
由于MIPI接口采用差分電路進行數據傳輸,所以在高速率、大數據量傳輸時,優勢非常明顯。此外,DVP接口采用8條線傳輸,再加上其他控制線,需要十幾條線;而MIPI接口只需要一對時鐘控制線和幾個lane的差分對數據線即可,減少了布線的數量。綜上所述,MIPI差分接口與DVP接口相比,具有速度快、抗干擾性強、功耗低、節省布線空間、數據線可延長使用的特點。

圖7 65 cm差分線接收端反射仿真結果
PCB繪制使用Allegro軟件完成,根據原理圖進行布線,在這個過程中,為了保證系統信號完整性,繪制PCB圖過程中除了差分線繪制要等距等長外,還需要注意:
①在高頻電路中,為了避免串擾,平行線的間距應為線寬的3倍,這時平行線間可避免70%的互感,可忽略不計。
②差分線要盡量做到等長、等距,在調整差分線等長時,盡量在過孔連接處或者端點處調節。
③根據電路原理,盡量減少閉合環路的面積,在一段電路的環路中,盡量不要插入另一段信號線。
為了在實際效果中比較MIPI接口和DVP接口攝像頭的差別,作者分別設計了兩種接口的驅動,由于DVP接口的驅動比較常見,筆者這里只介紹MIPI接口驅動。Linux差分攝像頭驅動相對比較復雜,其中,包括i2c sensor部分驅動和Fimc攝像頭接口部分驅動,Fimc部分又分為圖像數據傳輸部分和處理部分,數據傳輸部分即是MIPI接口csi部分,各部分驅動關系如圖8所示。

圖8 驅動整體框圖
4.1i2c sensor部分驅動程序設計
OV5640攝像頭以i2c作為sensor芯片的控制接口,通過此接口來設置攝像頭的圖像采集分辨率、圖像格式、時鐘等。攝像頭芯片控制部分驅動是一個i2c設備驅動,Linux系統中有一套完整的i2c設備驅動框架,在這套框架中實現了設備與驅動分離,系統可以先注冊i2c driver,然后注冊i2c device,當i2c driver和i2c device的名稱匹配時,執行i2c driver中的probe函數進行i2c設備的初始化。攝像頭工作模式的設置就是通過此部分完成的。圖9為Linux內核i2c驅動整體框架。
如圖9所示,Linux i2c驅動子系統中,i2c core在內核中注冊了i2c_client、i2c_adapter和i2c_driver。i2c_client用于表示一個i2c設備,如筆者所使用的OV5640攝像頭芯片在Linux內核中就是一個i2c_client;i2c_adapter用于表示i2c控制器,每一個i2c控制器對應一個i2c_adapter,如Exynos4412中有7個i2c控制器,對應的就可以注冊7個i2c_adapter;i2c_driver是i2c設備驅動的軟件實現主體。Linux依靠i2c_driver和i2c_client的匹配機制實現了驅動、設備分離機制。在i2c子系統中,所有注冊的i2c_client、i2c_adapter、i2c_driver都分別有自己的鏈表,當注冊一個i2c_client時,系統會去遍歷i2c_driver鏈表,找到與i2c_client名稱相同的i2c_driver,然后,執行對應的probe函數,實現對i2c設備的操作。
圖10是通過分析得到的Linux系統中OV5640攝像頭i2c sensor驅動的UML圖。由圖可知,OV5640的i2c_client中device成員變量的driver_ data指針指向了v4l2_subdev,v4l2_ subdev描述了一個視頻子系統,里面包含了視頻子系統中需要的操作函數集,對OV5640的設置操作就是通過v4l2_ subdev中的操作函數集v4l2_subdev_ops來完成,其中s_mbus_fmt()函數用于設置OV5640 MIPI工作模式參數,例如工作時鐘設置、MIPI數據傳輸格式設置、色彩矩陣設置、白平衡設置等,此函數為筆者實現,而設置OV5640工作模式時,需要用到i2c_ adapter描述的i2c控制器,i2c_adapter中的algo變量描述了i2c協議算法的實現。

圖9 Linux內核i2c驅動整體框圖
4.2Fimc驅動設計

圖10 OV5640攝像頭i2c sensor部分驅動的UML圖
Fimc是Exynos4412內部的攝像頭數據接口控制器和圖像數據轉碼器。第4.1節中介紹的i2c負責攝像頭工作模式的初始化,Fimc用于完成CPU與攝像頭之間的圖像數據接口的控制。Fimc指定數據接收通道(通過MIPI或者DVP),圖像數據經DMA方式存放到圖像緩存區后,觸發中斷通知系統讀取數據。Fimc驅動使用了Linux內核的平臺機制,程序開發者需要定義設備信息、注冊platform device,在設備注冊過程中,查詢事先設計好的對應驅動程序,然后將設備注冊驅動到Linux內核中。通過分析得到的Fimc驅動的UML結構圖如圖11所示。

圖11 Fimc驅動的UML圖
如圖11所示,struct fimc_global為Linux內核中描述Fimc控制器的全局結構,里面包括一個ctrl[FIMC_DEVICES]數組,用來存放具體的Fimc控制器ADT fimc_ control,還包括一個camera[FIMC_MAXCAMS]數組,用來存放系統中攝像頭配置信息,如本設計中的struct s3c_ platform_fimc ov5640_Mipi結構。s3c_platform_fimc結構由筆者設計和添加,主要內容如下所示:
static struct s3c_platform_camera ov5640_Mipi={
.id=CAMERA_CSI_D,//表示使用哪一個傳輸結構,這里
//表示使用CSI_D
.i2c_busnum=6,//表示這個攝像頭控制總線使用的i2c
//控制器的編號
.type=CAM_TYPE_MIPI,//表示使用的傳輸結構的類型
//為MIPI
.fmt=MIPI_CSI_YCBCR422_8BIT,//表示傳輸使用的數
//據格式
.info=&ov5640_i2c_info_Mipi,//表示攝像頭i2c控制部
//分的信息
.pixelformat=V4 L2_PIX_FMT_YUYV,//表示采集圖像
//輸出的格式
.Mipi_lanes=2,//表示此攝像頭使用幾個lane通道進行
//傳輸
.Mipi_align=32,//表示圖像數據的對其方式
.initialized=0,
……
};
有了上述關于攝像頭接口的信息后,就可以對Fimc控制器進行初始化了,如圖11中,fimc_control通過其成員v4l2_ device指向攝像頭信息的platform_device,從而獲得Fimc的資源信息和上述的s3c_platform_camera ov5640_Mipi的信息。v4l2架構對攝像頭控制器Fimc的具體操作函數在video_device中,其中包含兩個操作函數集,為v4l2_ioctl_ops和v4l2_file_operations,這兩個函數集中包含了v4l2的核心操作函數,其中筆者修改和設計的函數為v4l2_ioctl_ops中的fimc_streamon函數,在此函數里完成csi通道采集圖像寄存器的配置。
通過一系列Linux內核框架的初始化、OV5640工作方式初始化、Fimc初始化后,驅動部分準備完畢,等待應用程序的調用。
5.1測試應用程序編寫
應用程序的流程如圖12所示。
圖12中,應用程序首先打開設備文件,獲得文件句柄,執行ioctl對設備進行初始化操作,當應用程序ioctl(fd,VIDIOC_S_INPUT,&input)設置輸入時,會調用內核中v4l2_ioctl_ops結構的vidioc_s_input函數,這個函數會執行v4l2_i2c_new_subdev_board函數,注冊OV5640 i2c_device,從而觸發OV5640 i2c_driver中的probe函數初始化攝像頭。然后,應用程序設置采集圖像格式、在內核中申請圖像數據緩存、將映射緩存到應用空間、開啟采集圖像開關、讀取圖像數據、將圖像轉換為RGB格式、轉存圖像數據到HDMI的圖像緩存區,DVP攝像頭和MIPI攝像頭都采用v4l2驅動框架,所以應用測試程序流程相似。
5.2實驗結果
測試工具為PC機一臺,主要測試MIPI和DVP接口攝像頭采集圖像的圖像質量和幀率,攝像頭到CPU端的延長線長度統一為50 cm。測試程序驅動攝像頭連續工作30 min,統計采集播放的總幀數,然后計算平均幀率。
經過測試,使用DVP接口的攝像頭,當攝像頭到CPU端延長線長度為30 cm時,攝像頭無法工作,而MIPI接口的攝像頭在延長線長為50 cm時,依舊正常工作,把DVP接口攝像頭的延長線縮短為10 cm,在保證圖像清晰的情況下,效果為720p/25 fps,并且隨著時鐘頻率的增加,圖像清晰度逐漸下降,圖像逐漸摻進雪花、黑色斑點,當改變時鐘逐步提高幀率到30 fps時,圖像無法使用,不清晰且充滿黑色斑點。而使用MIPI接口的攝像頭最終效果可達720p/60 fps,圖像顏色失真小、無雪花、無黑色斑點,且運行流暢。

圖12 測試應用程序流程圖
本文提出一種基于MIPI接口的高清攝像系統軟硬件解決方案。首先給出了系統的總體硬件結構,針對DVP和MIPI兩種接口做了信號完整性仿真,比較了兩種接口的性能,給出了設計MIPI接口攝像頭的Linux驅動程序以及測試程序的編寫思路和步驟。實驗表明,本系統的MIPI接口攝像頭可實現720p/60 fps的圖像采集,且運行穩定、抗干擾性好,圖像質量遠遠高于采用DVP接口運行的攝像頭。
[1]文玉鋒,侯虹.基于P2P技術的遠程視頻教學系統研究[J].電化教育研究,2009(4):62-64.
[2]李宇成,黃堂猛.基于S5PV210的1080P網絡攝像頭設計[J].計算機工程與設計,2014,35(11):3813-3819.
[3]陳炎斌,金鋼.基于Camera Link標準的DSP+FPGA高速實時數字圖像處理系統設計[J].現代科學儀器,2010(6):6163.
[4]茅炎菲,黃忠東.基于RTSP協議網絡監控系統的研究與實現[J].計算機工程與設計,2011,32(7):2523-2530.
[5]徐大鵬,孫海江.HDSDI視頻嵌入式圖像采集系統設計[J].計算機測量與控制,2015,23(9):3213-3215.
[6]劉登誠,沈蘇彬,李莉.基于V4L2的視頻驅動程序設計與實現[J].微計算機信息,2011,27(10):56-59.
[7]Tareq Khan,Khan Wahid.Universal bridge interface for DVP compatible image sensors[J].Microprocessors and Microsystems,2011,35(6):547-556.
[8]Nicolas Simond,Patrick Rives.What can be done with an embedded stereorig in urban environments[J].Robotics and Autonomous Systems,2008,56(9):777-789.
[9]Samsung Electronics.Exynos 4412 RISC Microprocessor,2012.
[10]Omni Vision Technologies.OV5640 color CMOS QSXGA image sensor with OmniBSI technology,2011.
[11]李宇成,王曉彤.IBIS模型在視頻高速電路設計中的應用[J].工業控制計算機,2015,28(8):31-35.
李宇成(教授)主要研究方向為智能控制、嵌入式系統、圖像處理;葛正中(碩士),主要研究方向為嵌入式系統應用。
Hardware and Software Design of HD MlPl Differential Camera under Linux
Li Yucheng,Ge Zhengzhong
(Institute of Electrical and Control Engineering,College of North China University of Technology,Beijing 100144,China)
Using Exynos4412 as the processing platform,the high definition system hardware based on MIPI differential interface camera is designed.The signal integrity simulation of the MIPI interface and DVP interface is carried out.The Linux MIPI camera driver is designed,and the software architecture of UML is given.The experiment results prove that the HD camera system under the Linux is successfully realized.The system performance is up to 720p/60 fps using the MIPI interface.Compared with the traditional DVP camera interface,not only the transmission frame rate increases more than one time,but alsothe signal-to-noise ratio is greatly improved and the system is stable.
Exynos4412;MIPI differential camera driver;signal integrity simulation
TP277
A
??薛士然
2016-04-18)