Linux Media 子系統鏈路分析

2023-11-09 21:00:39

一、概述

Media 子系統是一個用於處理多媒體裝置的框架,它提供了一組 API 和驅動程式,用於管理和控制視訊、音訊和其他多媒體裝置。而 V4L2 是 media 子系統的一部分,用於處理視訊相關的功能。

瞭解 MIPI 攝像頭後,發現 linux 系統下的串流媒體驅動很複雜,而 MIPI 攝像頭主要分為感光模組和 ISP 處理器,其中感光模組是用於生成 Bayer 資料(拜耳陣列),ISP 用於處理感光模組產生的資料(功能比較複雜這裡就不介紹了)。對於 MIPI 攝像頭而言,ISP 可以在攝像頭前端或整合在SOC中,對於這兩種情況,所需的驅動程式是不一樣的。

Media 子系統剛好解決了這個問題,採用了分層式架構,可以粗暴的理解成為產線上的工位,每個工位處理的工作不一樣,而每個工位之間通過傳送帶連線,只需要改變傳送帶的連線方式,即可實現不同的功能,接下來我們對 Media 的鏈路進行分析,目前我只用過 RV1126 開發板,不知道其他廠商的實現是方式是否一樣

二、測試環境

  1. 開發板:RV1126
  2. ARM Linux 版本:4.19.111

三、Media 裝置

  1. Media 裝置節點在 /dev 目錄下,如下圖所示

  2. Media 裝置之間的連線方式如下圖所示

  3. Media 裝置資訊

    • entity:抽象的硬體裝置模組(類比電路板上面的某個元器件)
    • pad: 抽象的硬體裝置埠(類比某個元器件的管腳)
    • link: 抽象的硬體裝置的連線(類比元器件管腳之間的連線)

四、節點關係

  1. 檢視節點之間的拓撲關係,如下圖所示

    media-ctl -p -d /dev/mediaX
    

    注意:

    • Source和符號「->」表示輸出
    • Sink和符號「<-」就表示輸入
    • link表示連線,或者表示鏈路
  2. 根據上面關係很容易畫出拓撲圖,如下所示

五、RV1126 鏈路關係

通過檢視裝置樹資訊,可以得出開發板的鏈路關係,如下圖所示

注意:從上面可以看出 RV1126 開發板中,imx415 攝像頭的資料流向,只需要知道每個模組對應的節點,即可抓出我們想要的視屏資料

六、media 和 video 節點對應關係

  1. 查詢 video 節點和 ISP/ISPP 節點的對應關係

    grep "" /sys/class/video4linux/*/name
    
  2. 名稱相同的 ISP 節點,可能屬於不同的 media 裝置下

    media-ctl -d /dev/media3 -e "rkispp_scale1"
    media-ctl -d /dev/media4 -e "rkispp_scale1"
    
  3. 篩選

    media-ctl -p -d /dev/media4 | grep rkispp_scale0
    
  4. 檢視對應 video 節點支援的格式

    v4l2-ctl --list-formats-ext --device /dev/videoX
    

七、抓圖測試

v4l2-ctl 抓圖命令

v4l2-ctl -d /dev/video30 \
--set-fmt-video=width=3840,height=2160,\
pixelformat=NV12 \ 
--stream-mmap=3 \ 
--stream-skip=3 \ 
--stream-to=/tmp/bypass0.raw \ 
--stream-count=1 \ 
--stream-poll 

# -d:指定攝像頭的裝置節點
# --set-fmt-video:指定了寬高及pxielformat(用FourCC表示)。NV12即用FourCC表示的pixelformat;
# --Pixelformat:指定檔案格式,NV12;
# --stream-mmap:指定 buffer 的型別為 mmap;
# --stream-skip:指定丟棄(不儲存到檔案)前3幀;
# --stream-to:指定幀數儲存的檔案路徑;
# --stream-count:指定抓取的幀數,不包括--stream-skip丟棄的數量;
# --stream-poll:v4l2-ctl 採用非同步 IO。
  1. 使用 v4l2-ctl 從 rkispp_m_bypass 抓 YUV 圖

    # 檢視對應video節點支援的格式
    media-ctl -d /dev/media3 -e "rkispp_m_bypass"
    v4l2-ctl --list-formats-ext --device /dev/video30
    
    # 要開啟ispserver,否則報錯RKISP找不到iq
    ispserver &
    
    # 抓幀(IMX415攝像頭插在MIPI CSI0介面上)
    v4l2-ctl -d /dev/video30 \
    --set-fmt-video=width=2592,height=1944,\
    pixelformat=NV12 \
    --stream-mmap=3 \
    --stream-skip=30 \
    --stream-to=/tmp/bypass0.raw \
    --stream-count=1 \
    --stream-poll
    
    # 通過adb命令把檔案拷貝到Ubuntu下
    adb pull /tmp/bypass0.raw .
    # Ubuntu上檢視
    ffplay -f rawvideo -video_size 2592x1944 -pixel_format nv12 bypass0.raw
    
  2. 從 VICAP 抓 RAW 圖

     # 顯示video0節點所有資訊
     v4l2-ctl -d /dev/video0 --all
     # 檢視對應video0節點支援的格式
     v4l2-ctl --list-formats-ext --device /dev/video0
     # 設定資料以非緊湊型儲存
     echo 0 > /sys/devices/platform/rkcif_mipi_lvds/compact_test
    
     v4l2-ctl -d /dev/video0 \
     --set-fmt-video=width=2592,height=1944,\
     pixelformat=GB10 \
     --stream-mmap=3 \
     --stream-skip=30 \
     --stream-to=/tmp/vicap.raw \
     --stream-count=1 \
     --stream-poll
    
     # 圖片轉換
     ./test vicap.raw vicap_GB10.pgm 2592 1944 65535 1 
     # 圖片顯示
     eog vicap_GB10.pgm
    

八、注意事項

(1)抓取 ISP 影象時需要開啟 ispserver 服務
  1. 檢視 ispserver 服務是否開啟

    ps -aux | grep ispserver
    
  2. 開啟 ispserver 服務

    # 表示不開啟資料庫服務dbserver
    ispserver --no-sync-db &
    # 或者
    ispserver &
    
  3. 關閉 ispserver 服務

    kill -9 PID
    

(2)抓圖是鏈路之間必須是 ENABLED 狀態

  1. 抓圖時 rkisp-bridge-ispp 必須是ENABLED 的(1表示[ENABLED],0表示disable [ ]),設定命令如下

    # 對應MIPI CSI0
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[0]'
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp_selfpath":0[1]'
    media-ctl -d /dev/media1 -l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[1]'
    media-ctl -d /dev/media3 -l '"rkispp_input_image":0->"rkispp-subdev":0[0]'
    
    # 對應MIPI CSI1
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[0]'
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp_selfpath":0[1]'
    media-ctl -d /dev/media2 -l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[1]'
    media-ctl -d /dev/media4 -l '"rkispp_input_image":0->"rkispp-subdev":0[0]'
    

(3)RKMedia 例程測試注意事項

  1. 開啟和關閉 mediaserver

    # 開啟攝像頭應用
    /oem/RkLunch.sh &
    # 關閉攝像頭應用
    /oem/RkLunch-stop.sh &
    

(4)RAW 資料檢視

在抓圖 RAW 資料影象時,可以使用正點原子提供的 raw 轉 pgm 圖工具處理後,進行檢視

參看資料

正點原子 PPT 課件
RV1126 相關手冊