By Toradex 秦海
隨著工業產品智能化發展,攝像頭作為圖像采集在嵌入式設備中需求越來越多,目前常見的攝像頭接口有專用的Parallel Camera接口和MIPI CSI接口,以及USB/Ethernet Camera等采用USB, Ethernet等接口,本文就著重展示攝像頭專用接口MIPI CSI在嵌入式Linux下的應用.
MIPI (Mobile Industry Processor Interface) 攝像頭接口標准是由MIPI® Alliance Camera Working Group針對傳統並行攝像頭存在的問題提出的一個串行高速攝像頭接口定義, 目前有MIPI CSI-2和MIPI-CSI-3兩個協議定義,本文涉及的均為MIPI CSI-2協議接口, 目前已經從V1.0 發布發展到V1.3發布, D-PHY下傳輸帶寬也從1Gbps/lane提高到2.5Gbps/lane, V1.3新引入的C-PHY則更高,關於MIPI
CSI詳細說明請參考這裡.
1). 准備a). 本文所使用的硬件平台為Toradex 工業產品級Apalis i.MX6D和T30
ARM核心板模塊,搭配Apalis Eva Board開發板和Apalis T30 Mezzanine 擴展卡
b). MIPI CSI-2攝像頭使用基於OV5640的攝像頭模塊
c). Parallel Camera攝像頭使用Toradex ACM攝像頭(基於ADV7180)模塊搭配監控攝像頭
d). 軟件使用Toradex官方發布的嵌入式Linux V2.5 Beta3發布
2). 物理連接示意圖
3). Apalis i.MX6Da). 模塊支持兩路Parallel Camera接口和一路MIPI CSI-2 V1.0接口(1-4 lane)
b). V2.5Beta3版本Linux image已經包含OV5640和ADV7180的驅動和相應的device tree patch,因此上電後系統可以直接識別攝像頭設備/dev/video0(ADV7180)和/dev/video2(OV5640)
-----------------
root@apalis-imx6:~# dmesg |grep adv
[ 8.650491] adv7180 3-0021: no sensor pwdn pin available
[ 8.799108] mxc_v4l2_master_attach: ipu0:/csi0 parallel attached adv7180:mxc_
v4l2_cap0
root@apalis-imx6:~# dmesg |grep ov5640
[ 8.837746] ov5640_mipi 3-003c: request of ov5640_mipi_reset failed
[ 9.003448] mxc_v4l2_master_attach: ipu0:/csi1 parallel attached ov5640_mipi:
mxc_v4l2_cap2
[ 9.015727] camera ov5640_mipi is found
[ 10.675197] ov5640_set_virtual_channel: virtual channel=1
[ 98.019038] ov5640_set_virtual_channel: virtual channel=1
[ 98.421393] ov5640_set_virtual_channel: virtual channel=1
-----------------
c). 運行下面gstreamer pipeline測試MIPI CSI-2攝像頭
-----------------
/* 640x480分辨率抓取並播放 framerate=90 */
gst-launch -vvv imxv4l2src device=/dev/video2 capture-mode=0 fps-n=90 ! imxv4l2sink disp-width=640 disp-height=480
/* 720P分辨率抓取並播放 framerate=60 */
gst-launch -vvv imxv4l2src device=/dev/video2 capture-mode=4 fps-n=60 ! imxv4l2sink disp-width=1280 disp-height=720
/* 1080P分辨率抓取並播放 framerate=15 */
gst-launch -vvv imxv4l2src device=/dev/video2 capture-mode=5 fps-n=15 ! imxv4l2sink
-----------------
d). 分別對應的CPU占用率如下
-----------------
//640x480
CPU1 - 48%
CPU2 - 1%
//720P
CPU1 - 100%
CPU2 - 1%
//1080P
CPU1 - 100%
CPU2 - 1%
-----------------
d). 和Parallel Camera攝像頭同時顯示
./ 原生ipu driver無法支持兩路camera同時顯示,需要對image source code 打patch,然後按照這裡的說明重新編譯kernel 和 modules,並部署到Apalis
i.MX6模塊.
./ 然後運行下面gstreamer pipeline來進行同時顯示
-----------------
gst-launch -vvv imxv4l2src device=/dev/video2 capture-mode=0 fps-n=30 ! imxv4l2sink device=/dev/video17 disp-width=640 disp-height=480 & gst-launch -vvv tvsrc device=/dev/video0 ! imxv4l2sink device=/dev/video16 disp-width=640 disp-height=480 axis-top=480
-----------------
./ 顯示效果如下
./ 此時CPU占用率
-----------------
CPU1 60%
CPU2 40%
-----------------
4). Apalis T30a). 模塊支持兩路Parallel Camera接口和一路MIPI CSI-2 V1.0接口(1-4 lane)
b). 手動加載驅動模塊, 識別出 /dev/video0 (ADV7180)和/dev/video1(OV5640)
-----------------
root@apalis-t30:~# modprobe videobuf2-memops
root@apalis-t30:~# modprobe videobuf2-dma-nvmap
root@apalis-t30:~# modprobe adv7180
root@apalis-t30:~# modprobe ov5640
root@apalis-t30:~# modprobe tegra_v4l2_camera
-----------------
c). 運行下面gstreamer pipeline測試MIPI CSI-2攝像頭
-----------------
/* 640x480分辨率抓取並播放 framerate=90 */
gst-launch -vvv v4l2src device=/dev/video1 ! 'video/x-raw-yuv, width=640, height=480, framerate=90/1' ! deinterlace tff=1 method=4 ! nv_omx_videomixer ! nv_gl_eglimagesink
/* 1296x972分辨率抓取並播放 framerate=60 */
gst-launch -vvv v4l2src device=/dev/video1 ! 'video/x-raw-yuv, width=1296, height=972, framerate=60/1' ! deinterlace tff=1 method=4 ! nv_omx_videomixer ! nv_gl_eglimagesink
/* 1920x1088分辨率抓取並播放 framerate=15 */
gst-launch -vvv v4l2src device=/dev/video1 ! 'video/x-raw-yuv, width=1920, height=1088, framerate=15/1' ! deinterlace tff=1 method=4 ! nv_omx_videomixer ! nv_gl_eglimagesink
-----------------
d). 分別對應的CPU占用率如下
-----------------
//640x480
CPU1 - 85%
CPU2 - 0%
CPU3 - 0%
CPU4 - 0%
//720P
CPU1 - 90%
CPU2 - 70%
CPU3 - 0%
CPU4 - 0%
//1080P
CPU1 - 100%
CPU2 - 60%
CPU3 - 0%
CPU4 - 0%
-----------------
5). 總結隨著ARM處理器性能越來越強大,高質量的攝像頭解決方案的需求在嵌入式工業領域也會越來越廣泛,MIPI CSI無疑是目前最好的方案之一,相信會有廣闊的前景。