7.8. Intel Image Processing Unit 3 (IPU3) Imaging Unit (ImgU) 驅動¶
版權所有 © 2018 Intel Corporation
7.8.1. 簡介¶
本文件介紹了位於 drivers/media/pci/intel/ipu3 (CIO2) 以及 drivers/staging/media/ipu3 (ImgU) 下的 Intel IPU3(第三代影像處理單元)成像單元驅動程式。
在某些 Kaby Lake(以及某些 Sky Lake)平臺(U/Y 處理器系列)中發現的 Intel IPU3 由兩部分組成,即成像單元 (ImgU) 和 CIO2 裝置(MIPI CSI2 接收器)。
CIO2 裝置從感測器接收原始 Bayer 資料,並以 IPU3 特定的格式輸出幀(供 IPU3 ImgU 使用)。 CIO2 驅動程式位於 drivers/media/pci/intel/ipu3/ipu3-cio2* 中,並透過 CONFIG_VIDEO_IPU3_CIO2 配置選項啟用。
成像單元 (ImgU) 負責處理由 IPU3 CIO2 裝置捕獲的影像。 ImgU 驅動程式的原始碼可以在 drivers/staging/media/ipu3 目錄下找到。 該驅動程式透過 CONFIG_VIDEO_IPU3_IMGU 配置選項啟用。
這兩個驅動模組分別命名為 ipu3_csi2 和 ipu3_imgu。
該驅動程式已在 Kaby Lake 平臺(U/Y 處理器系列)上進行了測試。
這兩個驅動程式都實現了 V4L2、媒體控制器和 V4L2 子裝置介面。 IPU3 CIO2 驅動程式透過 V4L2 子裝置感測器驅動程式支援連線到 CIO2 MIPI CSI-2 介面的攝像頭感測器。
7.8.2. CIO2¶
CIO2 表示為單個 V4L2 子裝置,它為使用者空間提供 V4L2 子裝置介面。 每個 CSI-2 接收器都有一個影片節點,整個裝置只有一個媒體控制器介面。
CIO2 包含四個獨立的捕獲通道,每個通道都有自己的 MIPI CSI-2 接收器和 DMA 引擎。 每個通道都被建模為一個 V4L2 子裝置,作為 V4L2 子裝置節點暴露給使用者空間,並有兩個 pad
Pad |
方向 |
目的 |
|---|---|---|
0 |
sink |
MIPI CSI-2 輸入,連線到感測器子裝置 |
1 |
source |
原始影片捕獲,連線到 V4L2 影片介面 |
V4L2 影片介面對 DMA 引擎進行建模。 它們作為 V4L2 影片裝置節點暴露給使用者空間。
7.8.2.1. 以原始 Bayer 格式捕獲幀¶
CIO2 MIPI CSI2 接收器用於從連線到 CSI2 埠的原始感測器捕獲幀(以壓縮原始 Bayer 格式)。 捕獲的幀用作 ImgU 驅動程式的輸入。
由於 IPU3 的以下獨特要求和/或功能,使用 IPU3 ImgU 進行影像處理需要 raw2pnm [1] 和 yavta [2] 等工具。
-- IPU3 CSI2 接收器以 IPU3 特定的壓縮原始 Bayer 格式輸出從感測器捕獲的幀。
-- 必須同時執行多個影片節點。
讓我們以連線到 CSI2 埠 0 的 ov5670 感測器為例,進行 2592x1944 影像捕獲。
使用媒體控制器 API,將 ov5670 感測器配置為以壓縮原始 Bayer 格式將幀傳送到 IPU3 CSI2 接收器。
# This example assumes /dev/media0 as the CIO2 media device
export MDEV=/dev/media0
# and that ov5670 sensor is connected to i2c bus 10 with address 0x36
export SDEV=$(media-ctl -d $MDEV -e "ov5670 10-0036")
# Establish the link for the media devices using media-ctl
media-ctl -d $MDEV -l "ov5670:0 -> ipu3-csi2 0:0[1]"
# Set the format for the media devices
media-ctl -d $MDEV -V "ov5670:0 [fmt:SGRBG10/2592x1944]"
media-ctl -d $MDEV -V "ipu3-csi2 0:0 [fmt:SGRBG10/2592x1944]"
media-ctl -d $MDEV -V "ipu3-csi2 0:1 [fmt:SGRBG10/2592x1944]"
配置媒體管道後,可以使用 yavta 工具設定所需的感測器特定設定(例如曝光和增益設定)。
例如
yavta -w 0x009e0903 444 $SDEV
yavta -w 0x009e0913 1024 $SDEV
yavta -w 0x009e0911 2046 $SDEV
設定所需的感測器設定後,可以按如下方式進行幀捕獲。
例如
yavta --data-prefix -u -c10 -n5 -I -s2592x1944 --file=/tmp/frame-#.bin \
-f IPU3_SGRBG10 $(media-ctl -d $MDEV -e "ipu3-cio2 0")
使用上述命令,以 2592x1944 解析度捕獲 10 幀,格式為 sGRBG10,並輸出為 IPU3_SGRBG10 格式。
捕獲的幀可用作 /tmp/frame-#.bin 檔案。
7.8.3. ImgU¶
ImgU 表示為兩個 V4L2 子裝置,每個子裝置都為使用者空間提供 V4L2 子裝置介面。
每個 V4L2 子裝置表示一個管道,最多可以支援 2 個流。 這有助於支援高階攝像頭功能,例如連續取景器 (CVF) 和影片期間快照 (SDV)。
ImgU 包含兩個獨立的管道,每個管道都被建模為一個 V4L2 子裝置,作為 V4L2 子裝置節點暴露給使用者空間。
每個管道都有兩個 sink pad 和三個 source pad,用於以下目的
Pad |
方向 |
目的 |
|---|---|---|
0 |
sink |
輸入原始影片流 |
1 |
sink |
處理引數 |
2 |
source |
輸出處理後的影片流 |
3 |
source |
輸出取景器影片流 |
4 |
source |
3A 統計 |
每個 pad 都連線到相應的 V4L2 影片介面,作為 V4L2 影片裝置節點暴露給使用者空間。
7.8.3.1. 裝置操作¶
使用 ImgU,一旦輸入影片節點(“ipu3-imgu 0/1”:0,格式為 <entity>:<pad-number>)排隊包含緩衝區(以壓縮原始 Bayer 格式),ImgU 就會開始處理緩衝區,並在相應的輸出節點上生成 YUV 格式的影片輸出和統計資訊輸出。 當輸入影片節點排隊包含緩衝區時,驅動程式應準備好所有引數、輸出和統計資訊節點的緩衝區。
至少應啟用所有輸入、主輸出、3A 統計資訊和取景器影片節點,IPU3 才能開始影像處理。
每個 ImgU V4L2 子裝置都具有以下一組影片節點。
7.8.3.2. 輸入、輸出和取景器影片節點¶
由輸入影片節點接收的幀(以 IPU3 特定的壓縮原始 Bayer 格式)由 IPU3 成像單元處理,並輸出到 2 個影片節點,每個影片節點都針對不同的目的(主輸出和取景器輸出)。
有關 IPU3 特定的 Bayer 格式的詳細資訊,請參見 V4L2_PIX_FMT_IPU3_SBGGR10 ('ip3b')、V4L2_PIX_FMT_IPU3_SGBRG10 ('ip3g')、V4L2_PIX_FMT_IPU3_SGRBG10 ('ip3G')、V4L2_PIX_FMT_IPU3_SRGGB10 ('ip3r')。
該驅動程式支援 V4L2 影片捕獲介面,如 介面 中所定義。
僅支援多平面 API。 更多詳細資訊可以在 單平面和多平面 API 中找到。
7.8.3.3. 引數影片節點¶
引數影片節點接收 ImgU 演算法引數,這些引數用於配置 ImgU 演算法如何處理影像。
有關 IPU3 特定的處理引數的詳細資訊,請參見 V4L2_META_FMT_IPU3_PARAMS ('ip3p')、V4L2_META_FMT_IPU3_3A ('ip3s')。
7.8.3.4. 3A 統計影片節點¶
ImgU 驅動程式使用 3A 統計影片節點將 ImgU 正在處理的幀的 3A(自動對焦、自動曝光和自動白平衡)統計資訊輸出到使用者空間應用程式。 使用者空間應用程式可以使用此統計資料來計算 ImgU 的所需演算法引數。
7.8.4. 配置 Intel IPU3¶
可以使用媒體控制器配置 IPU3 ImgU 管道,媒體控制器在 第四部分 - 媒體控制器 API 中定義。
7.8.4.1. 執行模式和韌體二進位制檔案選擇¶
ImgU 基於韌體工作,目前 ImgU 韌體支援使用單個輸入幀資料分時執行 2 個管道。 每個管道都可以在特定模式下執行 - “VIDEO” 或 “STILL”,“VIDEO” 模式通常用於影片幀捕獲,而 “STILL” 用於靜止幀捕獲。 但是,如果您想以更少的系統負載和功耗捕獲影像,您也可以選擇 “VIDEO” 來捕獲靜止幀。 對於 “STILL” 模式,ImgU 將嘗試使用較小的 BDS 因子,並輸出比 “VIDEO” 模式更大的 Bayer 幀,以便進一步進行 YUV 處理,從而獲得高質量的影像。 此外,“STILL” 模式需要 XNR3 來進行降噪,因此 “STILL” 模式將比 “VIDEO” 模式需要更多的功耗和記憶體頻寬。“VIDEO” 模式將啟用 TNR,而 “STILL” 模式將繞過 TNR。 預設情況下,ImgU 以 “VIDEO” 模式執行,使用者可以使用 v4l2 控制 V4L2_CID_INTEL_IPU3_MODE(目前在 drivers/staging/media/ipu3/include/uapi/intel-ipu3.h 中定義)來查詢和設定執行模式。 對於使用者而言,“VIDEO” 和 “STILL” 模式之間的緩衝區排隊沒有區別,應啟用強制性輸入和主輸出節點,並且需要排隊緩衝區,統計資訊和取景器佇列是可選的。
將根據當前執行模式選擇韌體二進位制檔案,如果您啟用 ImgU 動態除錯,則可以觀察到諸如 “using binary if_to_osys_striped “ 或 “using binary if_to_osys_primary_striped” 之類的日誌,二進位制檔案 if_to_osys_striped 被選擇用於 “VIDEO”,而二進位制檔案 “if_to_osys_primary_striped” 被選擇用於 “STILL”。
7.8.4.2. 以原始 Bayer 格式處理影像¶
7.8.4.2.1. 配置 ImgU V4L2 子裝置以進行影像處理¶
必須使用媒體控制器 API 配置 ImgU V4L2 子裝置,以使所有影片節點都正確設定。
讓我們以 “ipu3-imgu 0” 子裝置為例。
media-ctl -d $MDEV -r
media-ctl -d $MDEV -l "ipu3-imgu 0 input":0 -> "ipu3-imgu 0":0[1]
media-ctl -d $MDEV -l "ipu3-imgu 0":2 -> "ipu3-imgu 0 output":0[1]
media-ctl -d $MDEV -l "ipu3-imgu 0":3 -> "ipu3-imgu 0 viewfinder":0[1]
media-ctl -d $MDEV -l "ipu3-imgu 0":4 -> "ipu3-imgu 0 3a stat":0[1]
此外,應透過控制 ID 0x009819a1 將相應 V4L2 子裝置的管道模式設定為所需的模式(例如,影片模式為 0,靜止模式為 1),如下所示。
yavta -w "0x009819A1 1" /dev/v4l-subdev7
ImgU 管道中的某些硬體塊可以透過裁剪或縮放來更改幀解析度,這些硬體塊包括輸入饋送器 (IF)、Bayer 降取樣器 (BDS) 和幾何失真校正 (GDC)。 還有一個可以更改幀解析度的塊 - YUV 縮放器,它僅適用於輔助輸出。
RAW Bayer 幀將透過這些 ImgU 管道硬體塊,最終處理的影像將輸出到 DDR 記憶體。
IPU3 解析度更改硬體塊¶
輸入饋送器
輸入饋送器從感測器獲取 Bayer 幀資料,它可以啟用從幀中裁剪行和列,然後將畫素儲存到裝置的內部畫素緩衝區中,這些畫素緩衝區已準備好被後續塊讀取。
Bayer 降取樣器
Bayer 降取樣器能夠在 Bayer 域中執行影像縮放,可以在每個軸上將降取樣因子配置為從 1X 到 1/4X,配置步長為 0.03125 (1/32)。
幾何失真校正
幾何失真校正用於執行失真校正和影像濾波。 它需要一些額外的濾波器和包絡填充畫素才能工作,因此 GDC 的輸入解析度應大於輸出解析度。
YUV 縮放器
YUV 縮放器與 BDS 類似,但它主要在 YUV 域中進行影像降取樣,它可以支援高達 1/12X 的降取樣,但它不能應用於主輸出。
必須為給定的輸入解析度,使用所有上述硬體塊中支援的解析度來配置 ImgU V4L2 子裝置。 對於輸入幀的給定支援解析度,應使用支援的解析度來配置輸入饋送器、Bayer 降取樣器和 GDC 塊,因為每個硬體塊都有自己的對齊要求。
您必須巧妙地配置硬體塊的輸出解析度,以滿足硬體要求,同時保持最大的視野。 中間解析度可以透過特定工具生成 -
https://github.com/intel/intel-ipu3-pipecfg
此工具可用於生成中間解析度。 可以透過檢視以下 IPU3 ImgU 配置表來獲得更多資訊。
https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master
在 baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss 目錄下,graph_settings_ov5670.xml 可以用作示例。
以下步驟準備 ImgU 管道以進行影像處理。
1. 應使用 VIDIOC_SUBDEV_S_FMT 在 pad 0 上設定 ImgU V4L2 子裝置資料格式,使用上面獲得的 GDC 寬度和高度。
2. 應使用 VIDIOC_SUBDEV_S_SELECTION 在 pad 0 上設定 ImgU V4L2 子裝置裁剪,以 V4L2_SEL_TGT_CROP 作為目標,使用輸入饋送器的高度和寬度。
3. 應使用 VIDIOC_SUBDEV_S_SELECTION 在 pad 0 上設定 ImgU V4L2 子裝置合成,以 V4L2_SEL_TGT_COMPOSE 作為目標,使用 BDS 的高度和寬度。
對於 ov5670 示例,對於解析度為 2592x1944(這是輸入到 ImgU 子裝置 pad 0 的)的輸入幀,輸入饋送器、BDS 和 GDC 的相應解析度分別為 2592x1944、2592x1944 和 2560x1920。
完成此操作後,可以使用開源應用程式 v4l2n [1] 將收到的原始 Bayer 幀輸入到 ImgU V4L2 子裝置中,如下所示。
對於以 2592x1944 [3] 解析度捕獲的影像,所需的輸出解析度為 2560x1920,取景器解析度為 2560x1920,可以使用以下 v4l2n 命令。 這有助於處理原始 Bayer 幀,並在 NV12 格式中生成主輸出影像和取景器輸出的所需結果。
v4l2n --pipe=4 --load=/tmp/frame-#.bin --open=/dev/video4
--fmt=type:VIDEO_OUTPUT_MPLANE,width=2592,height=1944,pixelformat=0X47337069 \
--reqbufs=type:VIDEO_OUTPUT_MPLANE,count:1 --pipe=1 \
--output=/tmp/frames.out --open=/dev/video5 \
--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 \
--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=2 \
--output=/tmp/frames.vf --open=/dev/video6 \
--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 \
--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=3 --open=/dev/video7 \
--output=/tmp/frames.3A --fmt=type:META_CAPTURE,? \
--reqbufs=count:1,type:META_CAPTURE --pipe=1,2,3,4 --stream=5
您還可以使用 yavta [2] 命令來執行與上述相同的操作
yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \
--file=frame-#.out-f NV12 /dev/video5 & \
yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \
--file=frame-#.vf -f NV12 /dev/video6 & \
yavta --data-prefix -Bmeta-capture -c10 -n5 -I \
--file=frame-#.3a /dev/video7 & \
yavta --data-prefix -Boutput-mplane -c10 -n5 -I -s2592x1944 \
--file=/tmp/frame-in.cio2 -f IPU3_SGRBG10 /dev/video4
其中 /dev/video4、/dev/video5、/dev/video6 和 /dev/video7 裝置分別指向輸入、輸出、取景器和 3A 統計資訊影片節點。
7.8.4.3. 將原始 Bayer 影像轉換為 YUV 域¶
經過上述步驟處理後的影像可以如下所示轉換為 YUV 域。
7.8.4.3.1. 主輸出幀¶
raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.out /tmp/frames.out.ppm
其中 2560x1920 是輸出解析度,NV12 是影片格式,後跟輸入幀和輸出 PNM 檔案。
7.8.4.3.2. 取景器輸出幀¶
raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.vf /tmp/frames.vf.ppm
其中 2560x1920 是輸出解析度,NV12 是影片格式,後跟輸入幀和輸出 PNM 檔案。
7.8.5. IPU3 的使用者空間程式碼示例¶
配置和使用 IPU3 的使用者空間程式碼可在此處獲得。
https://chromium.googlesource.com/chromiumos/platform/arc-camera/+/master/
原始碼可以位於 hal/intel 目錄下。
7.8.6. IPU3 管道概述¶
IPU3 管道有許多影像處理階段,每個階段都將一組引數作為輸入。 管道的主要階段如下所示
IPU3 ImgU 管道圖¶
下表介紹了上述演算法。
名稱 |
描述 |
|---|---|
光黑校正 |
光黑校正塊從各個畫素值中減去一個預定義的值,以獲得更好的影像質量。 在 |
線性化 |
此演算法塊使用線性化引數來解決非線性感測器效應。 查詢表在 |
SHD |
鏡頭陰影校正用於校正由於光學校正引起的畫素響應的空間非均勻性。 這是透過為每個畫素應用不同的增益來完成的。 增益、黑電平等在 |
BNR |
Bayer 噪聲降低塊透過應用雙邊濾波器來消除影像噪聲。 有關詳細資訊,請參見 |
ANR |
高階噪聲降低是一種基於塊的演算法,可在 Bayer 域中執行噪聲降低。 卷積矩陣等可以在 |
DM |
去馬賽克將 Bayer 格式的原始感測器資料轉換為 RGB(紅色、綠色、藍色)表示。 然後新增 Y 通道估計的輸出,以便韌體進行後續流處理。 該結構定義為 |
顏色校正 |
顏色校正演算法將感測器特定的顏色空間轉換為標準 “sRGB” 顏色空間。 這是透過應用 |
伽瑪校正 |
伽瑪校正 |
CSC |
顏色空間轉換將每個畫素從 RGB 主要表示轉換為 YUV(Y:亮度,UV:亮度)表示。 這是透過應用 |
CDS |
色度下采樣 在執行CSC後,對於YUV 4:2:0,色度下采樣透過一個4x2可配置濾波器對UV平面進行2倍的下采樣,使用 |
CHNR |
色度噪聲降低 此模組僅處理色度畫素,並透過清除高頻噪聲來執行降噪。請參閱 struct struct ipu3_uapi_yuvp1_chnr_config。 |
TCC |
總顏色校正,如 struct struct ipu3_uapi_yuvp2_tcc_static_config 中定義。 |
XNR3 |
eXtreme Noise Reduction V3 (極限降噪V3)是用於提高影像質量的降噪演算法的第三個版本。它可以消除捕獲影像中的低頻噪聲。定義了兩個相關的結構體, |
TNR |
時域噪聲降低塊比較時間上連續的幀,以消除畫素值中的異常/噪聲。 |
上面表格中未列出的其他常見首字母縮寫詞
- ACC
加速器叢集
- AWB_FR
自動白平衡濾波器響應統計資訊
- BDS
拜耳降取樣器引數
- CCM
顏色校正矩陣係數
- IEFd
影像增強濾波器定向
- Obgrid
光學黑電平補償
- OSYS
輸出系統配置
- ROI
感興趣區域
- YDS
Y 向下取樣
- YTM
Y-色調對映
流水線的一些階段將由在ISP處理器上執行的韌體執行,而許多其他階段將使用一組固定的硬體塊(也稱為加速器叢集(ACC))來處理畫素資料並生成統計資訊。
由 struct ipu3_uapi_acc_param 定義的各個演算法的ACC引數,可以透過嵌入在 struct ipu3_uapi_params 結構體中的 struct struct ipu3_uapi_flags,由使用者空間選擇應用。對於配置為不被使用者空間啟用的引數,驅動程式將忽略相應的結構體,在這種情況下,將保留演算法的現有配置。