7.6. i.MX 影片捕獲驅動

7.6.1. 簡介

Freescale i.MX5/6 包含一個影像處理單元 (IPU),該單元處理影像幀與捕獲裝置和顯示裝置之間的流動。

對於影像捕獲,IPU 包含以下內部子單元

  • 影像 DMA 控制器 (IDMAC)

  • 攝像頭序列介面 (CSI)

  • 影像轉換器 (IC)

  • 感測器多 FIFO 控制器 (SMFC)

  • 影像旋轉器 (IRT)

  • 影片去隔行或組合塊 (VDIC)

IDMAC 是用於將影像幀傳輸到記憶體和從記憶體傳輸的 DMA 控制器。 存在各種專用的 DMA 通道用於影片捕獲和顯示路徑。 在傳輸過程中,IDMAC 還能夠進行垂直影像翻轉、8x8 塊傳輸(參見 IRT 描述)、在相同顏色空間內進行畫素分量重新排序(例如 UYVY 到 YUYV),以及打包 <--> 平面轉換。 IDMAC 還可以透過在傳輸期間交織偶數行和奇數行來執行簡單的去隔行(無需運動補償,這需要 VDIC)。

CSI 是後端捕獲單元,透過並行、BT.656/1120 和 MIPI CSI-2 匯流排直接與攝像頭感測器連線。

IC 處理顏色空間轉換、大小調整(縮小和放大)、水平翻轉以及 90/270 度旋轉操作。

IC 中有三個獨立的“任務”,可以同時進行轉換:預處理編碼、預處理取景器和後處理。 在每個任務中,轉換分為三個部分:縮小部分、主要部分(放大、翻轉、顏色空間轉換和圖形平面組合)和旋轉部分。

IPU 時間共享 IC 任務操作。 時間片粒度是縮小部分中八個畫素的突發、主要處理部分中一行影像、旋轉部分中一幀影像。

SMFC 由四個獨立的 FIFO 組成,每個 FIFO 都可以透過四個 IDMAC 通道同時將捕獲的幀從感測器直接傳輸到記憶體。

IRT 執行 90 和 270 度影像旋轉操作。 旋轉操作一次在 8x8 畫素塊上進行。 此操作由 IDMAC 支援,IDMAC 與垂直翻轉協調處理 8x8 塊傳輸以及塊重新排序。

VDIC 處理隔行掃描影片到逐行掃描的轉換,支援不同的運動補償模式(低、中和高運動)。 來自 VDIC 的去隔行輸出幀可以傳送到 IC 預處理取景器任務以進行進一步轉換。 VDIC 還包含一個組合器,該組合器將兩個影像平面與 alpha 混合和顏色鍵組合在一起。

除了 IPU 內部子單元外,還有兩個 IPU 外部的單元也參與 i.MX 上的影片捕獲

  • 用於具有 MIPI CSI-2 匯流排介面的攝像頭感測器的 MIPI CSI-2 接收器。 這是一個 Synopsys DesignWare 核心。

  • 兩個影片多路複用器,用於選擇多個感測器輸入以傳送到 CSI。

有關更多資訊,請參閱最新版本的 i.MX5/6 參考手冊 [1][2]

7.6.2. 特點

此驅動程式的一些特點包括

  • 可以透過媒體控制器 API 配置許多不同的流水線,這些流水線對應於 i.MX 中支援的硬體影片捕獲流水線。

  • 支援並行、BT.565 和 MIPI CSI-2 介面。

  • 透過配置流水線到使用獨立實體的多個影片捕獲介面,實現併發獨立流。

  • 透過 IC 任務子裝置實現縮放、顏色空間轉換、水平和垂直翻轉以及影像旋轉。

  • 支援多種畫素格式(RGB、打包和平面 YUV、部分平面 YUV)。

  • VDIC 子裝置支援運動補償去隔行,具有三種運動補償模式:低、中和高運動。 定義了允許將幀直接從 CSI 傳送到 VDIC 子裝置的流水線。 將來還支援透過輸出/mem2mem 裝置將幀從記憶體緩衝區傳送到 VDIC。

  • 包括一個幀間隔監視器 (FIM),它可以糾正 ADV718x 影片解碼器的垂直同步問題。

7.6.3. 拓撲

以下顯示了 i.MX6Q SabreSD 和 i.MX6Q SabreAuto 的媒體拓撲。 請參閱下一節中實體描述中的這些圖。

i.MX5/6 拓撲可能與 IPUv3 CSI 影片多路複用器的上游不同,但其下游的內部 IPUv3 拓撲對於所有 i.MX5/6 平臺都是通用的。 例如,SabreSD 使用 MIPI CSI-2 OV5640 感測器,需要 i.MX6 MIPI CSI-2 接收器。 但是 SabreAuto 只有並行 bt.656 總線上的 ADV7180 解碼器,因此不需要 MIPI CSI-2 接收器,因此其圖中缺少該接收器。

Diagram of the i.MX6Q SabreSD media pipeline topology

i.MX6Q SabreSD 上的媒體流水線圖

Diagram of the i.MX6Q SabreAuto media pipeline topology

i.MX6Q SabreAuto 上的媒體流水線圖

7.6.4. 實體

7.6.5. imx6-mipi-csi2

這是 MIPI CSI-2 接收器實體。 它有一個接收 MIPI CSI-2 流的接收器埠(通常來自 MIPI CSI-2 攝像頭感測器)。 它有四個源埠,對應於四個 MIPI CSI-2 解複用的虛擬通道輸出。 可以啟用多個源埠以從多個虛擬通道獨立流式傳輸。

此實體實際上由兩個子塊組成。 一個是 MIPI CSI-2 核心。 這是一個 Synopsys Designware MIPI CSI-2 核心。 另一個子塊是“CSI-2 到 IPU 墊片”。 該墊片充當四個虛擬通道流的解複用器,提供四個單獨的並行匯流排,其中包含每個虛擬通道,這些通道路由到 CSI 或影片多路複用器,如下所述。

在 i.MX6 solo/dual-lite 上,所有四個虛擬通道匯流排都路由到兩個影片多路複用器。 CSI0 和 CSI1 都可以接收任何虛擬通道,由影片多路複用器選擇。

在 i.MX6 Quad 上,虛擬通道 0 路由到 IPU1-CSI0(在由影片 mux 選擇後),虛擬通道 1 和 2 分別硬連線到 IPU1-CSI1 和 IPU2-CSI0,虛擬通道 3 路由到 IPU2-CSI1(再次由影片 mux 選擇)。

7.6.6. ipuX_csiY_mux

這些是影片多路複用器。 它們有兩個或多個接收器埠,可以從具有並行介面的攝像頭感測器或來自 imx6-mipi-csi2 實體的 MIPI CSI-2 虛擬通道中進行選擇。 它們有一個源埠,該埠路由到 CSI(ipuX_csiY 實體)。

在 i.MX6 solo/dual-lite 上,有兩個影片 mux 實體。 一個位於 IPU1-CSI0 前面,用於在並行感測器和四個 MIPI CSI-2 虛擬通道中的任何一個之間進行選擇(總共五個接收器埠)。 另一個 mux 位於 IPU1-CSI1 前面,同樣有五個接收器埠,用於在並行感測器和四個 MIPI CSI-2 虛擬通道中的任何一個之間進行選擇。

在 i.MX6 Quad 上,有兩個影片 mux 實體。 一個位於 IPU1-CSI0 前面,用於在並行感測器和 MIPI CSI-2 虛擬通道 0 之間進行選擇(兩個接收器埠)。 另一個 mux 位於 IPU2-CSI1 前面,用於在並行感測器和 MIPI CSI-2 虛擬通道 3 之間進行選擇(兩個接收器埠)。

7.6.7. ipuX_csiY

這些是 CSI 實體。 它們有一個接收器埠,接收來自影片 mux 或來自 MIPI CSI-2 虛擬通道(如上所述)的訊號。

此實體有兩個源埠。 第一個源埠可以直接連結到 ipuX_vdic 實體或 ipuX_ic_prp 實體,使用不需要 IDMAC 記憶體緩衝區傳輸的硬體連結。

當直接源埠路由到 ipuX_ic_prp 實體時,CSI 的幀可以由一個或兩個 IC 預處理任務處理。

當直接源埠路由到 ipuX_vdic 實體時,VDIC 將使用“高運動”模式執行運動補償去隔行(請參閱 ipuX_vdic 實體的描述)。

第二個源埠透過 SMFC 和 IDMAC 通道將影片幀直接傳送到記憶體緩衝區,繞過 IC 預處理。 此源埠路由到捕獲裝置節點,節點名稱的格式為“ipuX_csiY capture”。

請注意,由於 IDMAC 源埠使用 IDMAC 通道,因此 IDMAC 通道可以在同一顏色空間內進行畫素重新排序。 例如,如果 CSI 接收器埠接收 UYVY 順序,則連結到 IDMAC 源埠的捕獲裝置可以按 YUYV 順序捕獲。 此外,如果 CSI 接收器埠接收打包的 YUV 格式,則捕獲裝置可以捕獲平面 YUV 格式,例如 YUV420。

IDMAC 源埠處的 IDMAC 通道還支援簡單的交織而無需運動補償,如果在源埠的欄位型別是順序頂部到底部或底部到頂部,並且請求的捕獲介面欄位型別設定為交織(t-b、b-t 或不合格的交織)時,該功能將被啟用。 捕獲介面將強制執行與源埠欄位順序相同的欄位順序(如果源埠是 seq-bt,則為 interlaced-bt,如果源埠是 seq-tb,則為 interlaced-tb)。

有關 ipuX_csiY 生成的事件,請參閱 ref:imx_api_ipuX_csiY

7.6.8. ipuX_csiY 中的裁剪

CSI 支援裁剪傳入的原始感測器幀。 這在 ipuX_csiY 實體的接收器埠中實現,使用裁剪選擇子裝置 API。

CSI 還支援獨立地在寬度和高度上進行固定的除以二的縮小。 這在 ipuX_csiY 實體的接收器埠中實現,使用合成選擇子裝置 API。

ipuX_csiY 源埠處的輸出矩形與接收器埠處的合成矩形相同。 因此,無法協商源埠矩形,必須使用接收器埠處的合成選擇 API 進行設定(如果需要 /2 縮小,否則源埠矩形等於傳入矩形)。

為了給出裁剪和 /2 縮小的示例,這將把 1280x960 輸入幀裁剪為 640x480,然後在兩個維度上都 /2 縮小到 320x240(假設 ipu1_csi0 連結到 ipu1_csi0_mux)

media-ctl -V "'ipu1_csi0_mux':2[fmt:UYVY2X8/1280x960]"
media-ctl -V "'ipu1_csi0':0[crop:(0,0)/640x480]"
media-ctl -V "'ipu1_csi0':0[compose:(0,0)/320x240]"

7.6.9. ipuX_csiY 中的幀跳過

CSI 支援透過幀跳過進行幀速率抽取。 透過設定接收器和源埠處的幀間隔來指定幀速率抽取。 然後 ipuX_csiY 實體將最佳幀跳過設定應用於 CSI,以在源埠處實現所需的幀速率。

以下示例將假定的傳入 60 Hz 幀速率在 IDMAC 輸出源埠處降低一半

media-ctl -V "'ipu1_csi0':0[fmt:UYVY2X8/640x480@1/60]"
media-ctl -V "'ipu1_csi0':2[fmt:UYVY2X8/640x480@1/30]"

7.6.10. ipuX_csiY 中的幀間隔監視器

請參閱 ref:imx_api_FIM

7.6.11. ipuX_vdic

VDIC 執行運動補償去隔行,具有三種運動補償模式:低、中和高運動。 該模式由選單控制 V4L2_CID_DEINTERLACING_MODE 指定。 VDIC 有兩個接收器埠和一個源埠。

直接接收器埠接收來自 ipuX_csiY 直接埠的訊號。 透過此連結,VDIC 只能在高運動模式下執行。

當啟用 IDMAC 接收器埠時,它會接收來自輸出或 mem2mem 裝置節點的訊號。 透過此流水線,VDIC 還可以以低和中等模式執行,因為這些模式需要從記憶體緩衝區接收幀。 請注意,尚未實現輸出或 mem2mem 裝置,因此此接收器埠當前沒有連結。

源埠路由到 IC 預處理實體 ipuX_ic_prp。

7.6.12. ipuX_ic_prp

這是 IC 預處理實體。 它充當路由器,將其接收器埠的資料路由到一個或兩個源埠。

此實體有一個接收器埠。 接收器埠可以接收來自 ipuX_csiY 直接埠或來自 ipuX_vdic 的訊號。

此實體有兩個源埠。 一個源埠路由到預處理編碼任務實體 (ipuX_ic_prpenc),另一個源埠路由到預處理取景器任務實體 (ipuX_ic_prpvf)。 如果接收器埠接收來自 ipuX_csiY 的訊號,則可以同時啟用兩個源埠。 如果接收器埠接收來自 ipuX_vdic 的訊號,則只能啟用到預處理取景器任務實體的源埠(來自 VDIC 的幀只能由預處理取景器任務處理)。

7.6.13. ipuX_ic_prpenc

這是 IC 預處理編碼實體。 它有一個來自 ipuX_ic_prp 的接收器埠和一個源埠。 源埠路由到捕獲裝置節點,節點名稱的格式為“ipuX_ic_prpenc capture”。

此實體執行 IC 預處理編碼任務操作:顏色空間轉換、大小調整(縮小和放大)、水平和垂直翻轉以及 90/270 度旋轉。 透過標準 V4L2 控制元件提供翻轉和旋轉。

與 ipuX_csiY IDMAC 源一樣,此實體還支援簡單的去隔行(無需運動補償)和畫素重新排序。

7.6.14. ipuX_ic_prpvf

這是 IC 預處理取景器實體。 它有一個來自 ipuX_ic_prp 的接收器埠和一個源埠。 源埠路由到捕獲裝置節點,節點名稱的格式為“ipuX_ic_prpvf capture”。

此實體在操作上與 ipuX_ic_prpenc 相同,具有相同的大小調整和 CSC 操作以及翻轉/旋轉控制元件。 如果 ipuX_ic_prp 接收來自 ipuX_vdic 的訊號,它將接收並處理來自 ipuX_vdic 的去隔行幀。

與 ipuX_csiY IDMAC 源一樣,此實體支援簡單的交織而無需運動補償。 但是,請注意,如果流水線中包含 ipuX_vdic(ipuX_ic_prp 接收來自 ipuX_vdic 的訊號),則無法在 ipuX_ic_prpvf 中使用交織,因為 ipuX_vdic 已經執行了去隔行(具有運動補償),因此來自 ipuX_vdic 的欄位型別輸出只能為 none(逐行掃描)。

7.6.15. 捕獲流水線

以下描述了流水線支援的各種用例。

顯示的連結不包括後端感測器、影片 mux 或 mipi csi-2 接收器連結。 這取決於感測器介面的型別(並行或 mipi csi-2)。 因此,這些流水線以以下內容開頭

sensor -> ipuX_csiY_mux -> ...

對於並行感測器,或者

sensor -> imx6-mipi-csi2 -> (ipuX_csiY_mux) -> ...

對於 mipi csi-2 感測器。 imx6-mipi-csi2 接收器可能需要先路由到影片 mux (ipuX_csiY_mux),然後再發送到 CSI,具體取決於 mipi csi-2 虛擬通道,因此 ipuX_csiY_mux 顯示在括號中。

7.6.16. 未處理的影片捕獲:

透過 ipuX_csiY IDMAC 源埠直接將幀從感測器傳送到攝像頭裝置介面節點,無需轉換

-> ipuX_csiY:2 -> ipuX_csiY capture

7.6.17. IC 直接轉換:

此流水線使用預處理編碼實體將幀直接從 CSI 路由到 IC,以執行縮放到 1024x1024 解析度、CSC、翻轉和影像旋轉

-> ipuX_csiY:1 -> 0:ipuX_ic_prp:1 -> 0:ipuX_ic_prpenc:1 -> ipuX_ic_prpenc capture

7.6.18. 運動補償去隔行:

此流水線將幀從 CSI 直接埠路由到 VDIC 實體,以支援運動補償去隔行(僅限高運動模式)、縮放到 1024x1024、CSC、翻轉和旋轉

-> ipuX_csiY:1 -> 0:ipuX_vdic:2 -> 0:ipuX_ic_prp:2 -> 0:ipuX_ic_prpvf:1 -> ipuX_ic_prpvf capture

7.6.19. 使用說明

為了幫助配置以及與僅從影片裝置節點訪問控制元件的 V4L2 應用程式向後相容,捕獲裝置介面從當前流水線中的活動實體繼承控制元件,因此可以直接從子裝置或從活動捕獲裝置介面訪問控制元件。 例如,FIM 控制元件可以從 ipuX_csiY 子裝置或從活動捕獲裝置訪問。

以下是 Sabre* 參考板的特定使用說明

7.6.20. 帶有 OV5642 和 OV5640 的 i.MX6Q SabreLite

此平臺需要帶有並行攝像頭介面的 OmniVision OV5642 模組和帶有 MIPI CSI-2 介面的 OV5640 模組。 這兩個模組都可以從 Boundary Devices 獲得

請注意,如果只有一個攝像頭模組可用,則可以在裝置樹中停用另一個感測器節點。

OV5642 模組連線到 i.MX 內部影片 mux 到 IPU1 CSI0 上的並行匯流排輸入。 它的 i2c 匯流排連線到 i2c 匯流排 2。

MIPI CSI-2 OV5640 模組連線到 i.MX 內部 MIPI CSI-2 接收器,並且來自接收器的四個虛擬通道輸出的路由方式如下:vc0 到 IPU1 CSI0 mux,vc1 直接到 IPU1 CSI1,vc2 直接到 IPU2 CSI0,vc3 到 IPU2 CSI1 mux。 OV5640 還連線到 SabreLite 上的 i2c 匯流排 2,因此 OV5642 和 OV5640 不得共享相同的 i2c 從裝置地址。

以下基本示例配置了兩個感測器的未處理影片捕獲流水線。 OV5642 路由到 ipu1_csi0,OV5640(在 MIPI CSI-2 虛擬通道 1 上傳輸,它是 imx6-mipi-csi2 埠 2)路由到 ipu1_csi1。 兩個感測器都配置為輸出 640x480,OV5642 輸出 YUYV2X8,OV5640 輸出 UYVY2X8

# Setup links for OV5642
media-ctl -l "'ov5642 1-0042':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Setup links for OV5640
media-ctl -l "'ov5640 1-0040':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':2 -> 'ipu1_csi1':0[1]"
media-ctl -l "'ipu1_csi1':2 -> 'ipu1_csi1 capture':0[1]"
# Configure pads for OV5642 pipeline
media-ctl -V "'ov5642 1-0042':0 [fmt:YUYV2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:YUYV2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/640x480 field:none]"
# Configure pads for OV5640 pipeline
media-ctl -V "'ov5640 1-0040':0 [fmt:UYVY2X8/640x480 field:none]"
media-ctl -V "'imx6-mipi-csi2':2 [fmt:UYVY2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi1':2 [fmt:AYUV32/640x480 field:none]"

然後可以在捕獲裝置節點“ipu1_csi0 capture”和“ipu1_csi1 capture”上獨立開始流式傳輸。 v4l2-ctl 工具可用於在捕獲裝置節點上選擇任何支援的 YUV 畫素格式,包括平面。

7.6.21. 帶有 ADV7180 解碼器的 i.MX6Q SabreAuto

在 i.MX6Q SabreAuto 上,板載 ADV7180 SD 解碼器連線到內部影片 mux 到 IPU1 CSI0 上的並行匯流排輸入。

以下示例配置了一條流水線以從 ADV7180 影片解碼器捕獲,假設 NTSC 720x480 輸入訊號,使用簡單的交織(未經轉換且沒有運動補償)。 adv7180 必須輸出順序或交替欄位(對於 NTSC,欄位型別為“seq-bt”,或者為“alternate”)

# Setup links
media-ctl -l "'adv7180 3-0021':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 3-0021':0 [fmt:UYVY2X8/720x480 field:seq-bt]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/720x480]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/720x480]"
# Configure "ipu1_csi0 capture" interface (assumed at /dev/video4)
v4l2-ctl -d4 --set-fmt-video=field=interlaced_bt

然後可以在 /dev/video4 上開始流式傳輸。 v4l2-ctl 工具還可以用於在 /dev/video4 上選擇任何支援的 YUV 畫素格式。

此示例配置了一條流水線以從 ADV7180 影片解碼器捕獲,假設 PAL 720x576 輸入訊號,並具有運動補償去隔行。 adv7180 必須輸出順序或交替欄位(對於 PAL,欄位型別為“seq-tb”,或者為“alternate”)。

# Setup links
media-ctl -l "'adv7180 3-0021':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_vdic':0[1]"
media-ctl -l "'ipu1_vdic':2 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':2 -> 'ipu1_ic_prpvf':0[1]"
media-ctl -l "'ipu1_ic_prpvf':1 -> 'ipu1_ic_prpvf capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 3-0021':0 [fmt:UYVY2X8/720x576 field:seq-tb]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/720x576]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
v4l2-ctl -d2 --set-fmt-video=field=none

然後可以在 /dev/video2 上開始流式傳輸。 v4l2-ctl 工具還可以用於在 /dev/video2 上選擇任何支援的 YUV 畫素格式。

此平臺接受到 Ain1(聯結器 J42)上 ADV7180 的複合影片模擬輸入。

7.6.22. 帶有 ADV7180 解碼器的 i.MX6DL SabreAuto

在 i.MX6DL SabreAuto 上,板載 ADV7180 SD 解碼器連線到內部影片 mux 到 IPU1 CSI0 上的並行匯流排輸入。

以下示例配置了一條流水線以從 ADV7180 影片解碼器捕獲,假設 NTSC 720x480 輸入訊號,使用簡單的交織(未經轉換且沒有運動補償)。 adv7180 必須輸出順序或交替欄位(對於 NTSC,欄位型別為“seq-bt”,或者為“alternate”)

# Setup links
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x480 field:seq-bt]"
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x480]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/720x480]"
# Configure "ipu1_csi0 capture" interface (assumed at /dev/video0)
v4l2-ctl -d0 --set-fmt-video=field=interlaced_bt

然後可以在 /dev/video0 上開始流式傳輸。 v4l2-ctl 工具還可以用於在 /dev/video0 上選擇任何支援的 YUV 畫素格式。

此示例配置了一條流水線以從 ADV7180 影片解碼器捕獲,假設 PAL 720x576 輸入訊號,並具有運動補償去隔行。 adv7180 必須輸出順序或交替欄位(對於 PAL,欄位型別為“seq-tb”,或者為“alternate”)。

# Setup links
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_vdic':0[1]"
media-ctl -l "'ipu1_vdic':2 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':2 -> 'ipu1_ic_prpvf':0[1]"
media-ctl -l "'ipu1_ic_prpvf':1 -> 'ipu1_ic_prpvf capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x576 field:seq-tb]"
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x576]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
v4l2-ctl -d2 --set-fmt-video=field=none

然後可以在 /dev/video2 上開始流式傳輸。 v4l2-ctl 工具還可以用於在 /dev/video2 上選擇任何支援的 YUV 畫素格式。

此平臺接受到 Ain1(聯結器 J42)上 ADV7180 的複合影片模擬輸入。

7.6.23. 帶有 MIPI CSI-2 OV5640 的 i.MX6Q SabreSD

與 i.MX6Q SabreLite 類似,i.MX6Q SabreSD 在 IPU1 CSI0 上支援並行介面 OV5642 模組,以及 MIPI CSI-2 OV5640 模組。OV5642 連線到 i2c 匯流排 1,OV5640 連線到 i2c 匯流排 2。

SabreSD 的裝置樹包含了並行 OV5642 和 MIPI CSI-2 OV5640 的 OF 圖,但截至本文撰寫之時,僅 MIPI CSI-2 OV5640 經過測試,因此 OV5642 節點當前被停用。OV5640 模組連線到 MIPI 聯結器 J5。連線到 SabreSD 板的 OV5640 模組的 NXP 部件號為 H120729。

以下示例配置了一個未處理的影片捕獲管道,從 OV5640 捕獲資料,並透過 MIPI CSI-2 虛擬通道 0 傳輸。

# Setup links
media-ctl -l "'ov5640 1-003c':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':1 -> 'ipu1_csi0_mux':0[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'ov5640 1-003c':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'imx6-mipi-csi2':1 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0_mux':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0':0 [fmt:AYUV32/640x480]"

然後可以在“ipu1_csi0 capture”節點上開始流傳輸。可以使用 v4l2-ctl 工具在捕獲裝置節點上選擇任何支援的畫素格式。

要確定與“ipu1_csi0 capture”對應的 /dev/video 節點是什麼,請執行以下操作:

media-ctl -e "ipu1_csi0 capture"
/dev/video0

/dev/video0 在本例中是流傳輸元素。

透過 v4l2-ctl 啟動流傳輸:

v4l2-ctl --stream-mmap -d /dev/video0

透過 Gstreamer 啟動流傳輸並將內容傳送到顯示器:

gst-launch-1.0 v4l2src device=/dev/video0 ! kmssink

以下示例配置了一個直接轉換管道,從 OV5640 捕獲資料,並透過 MIPI CSI-2 虛擬通道 0 傳輸。它還顯示了 IC 輸出的色彩空間轉換和縮放。

# Setup links
media-ctl -l "'ov5640 1-003c':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':1 -> 'ipu1_csi0_mux':0[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':1 -> 'ipu1_ic_prpenc':0[1]"
media-ctl -l "'ipu1_ic_prpenc':1 -> 'ipu1_ic_prpenc capture':0[1]"
# Configure pads
media-ctl -V "'ov5640 1-003c':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'imx6-mipi-csi2':1 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/640x480]"
media-ctl -V "'ipu1_ic_prp':1 [fmt:AYUV32/640x480]"
media-ctl -V "'ipu1_ic_prpenc':1 [fmt:ARGB8888_1X32/800x600]"
# Set a format at the capture interface
v4l2-ctl -d /dev/video1 --set-fmt-video=pixelformat=RGB3

然後可以在“ipu1_ic_prpenc capture”節點上開始流傳輸。

要確定與“ipu1_ic_prpenc capture”對應的 /dev/video 節點是什麼,請執行以下操作:

media-ctl -e "ipu1_ic_prpenc capture"
/dev/video1

/dev/video1 在本例中是流傳輸元素。

透過 v4l2-ctl 啟動流傳輸:

v4l2-ctl --stream-mmap -d /dev/video1

透過 Gstreamer 啟動流傳輸並將內容傳送到顯示器:

gst-launch-1.0 v4l2src device=/dev/video1 ! kmssink

7.6.24. 已知問題

  1. 當在接近 IC 調整器限制 1024x1024 的捕獲解析度下使用 90 或 270 度旋轉控制,並結合平面畫素格式(YUV420、YUV422p)時,幀捕獲通常會失敗,IDMAC 通道不會產生幀結束中斷。為了解決這個問題,當需要 90 或 270 度旋轉時,請使用較低的解析度和/或打包格式(YUYV、RGB3 等)。

7.6.25. 檔案列表

drivers/staging/media/imx/ include/media/imx.h include/linux/imx-media.h

7.6.26. 參考文獻

7.6.27. 作者

Copyright (C) 2012-2017 Mentor Graphics Inc.