Linux MIPI 偵錯中常見的問題

2023-11-30 15:00:20

一、概述

做嵌入式工作的小夥伴知道,有時候程式編寫沒有偵錯過程中費時,之間筆記裡有 MIPI 攝像頭驅動開發的過程,有需要的小夥伴可以參考:Linux RN6752 驅動編寫
而我也是第一次琢磨 MIPI 協定,其中有很多不明白的地方,在偵錯的時候折騰了很久,特此將我遇到的問題記錄下來,希望多其他小夥伴有用。

二、測試環境

開發板:RV1126
ARM Linux 版本:4.19.111
MIPI 裝置:RN6752V1
攝像頭:AHD 攝像頭

三、偵錯中的問題

在偵錯需要先確定攝像頭驅動是否已經正常載入,可以使用命令 media-ctl -p -d /dev/mediaX 進行檢視,如下圖所示:

其次明白怎麼獲取自己的圖片,如果直接編寫應用程式進行測試的,那無意增加了偵錯的難度,所以在測試之前需要只要抓圖的命令,如果多抓圖和鏈路關係還不瞭解的小夥伴,可以看我之前的筆記:Linux Media 子系統鏈路分析

注意: 這裡我使用的測試模組是 RN6752V1,它從米皮出來的資料已經是 YUV422 格式的影象,所以我抓取的節點可以有不一樣的地方。

1. 抓圖時出現 select timeout 錯誤

現象:出現這樣錯誤的可能原因是因為,MIPI 裝置沒有正常工作,錯誤如下圖所示

解決辦法:

  • 比如在驅動用沒有正常呼叫留控制函,並通過 I2C 對裝置進行設定
  • 確定晶片的睡眠引腳電平是否正常
  • 可以使用示波器觀察 MIPI 通道時候存在資料,如下圖所示

    注意 如果將影象縮小,可以看到每幀資料之間有一定的間隔時間,如果晶片正常工作後,便可以抓取到影象。

2. 幀錯誤

現象:抓圖中會出現 rockchip-mipi-csi2: ERR1: error matching frame start with frame end, reg: 0x10,cnt:2 提示。
解決辦法:這一般都是硬體不穩定導致的,需要檢查硬體上的問題

3. 幀格式錯誤

現象:抓圖時,有時能正常抓取成功,但是偶爾會提現是 rkcif_mipi_lvds: ERROR: csi bandwidth lack, intstat:0x80002!! 錯誤,出現此錯誤後,變無法獲取影象。

解決辦法:出現這個問題多數情況是幀格式不匹配導致的,比如我在驅動中使用的是 MEDIA_BUS_FMT_UYVY8_2X8,而抓圖是卻用的 NV12,也有人說是瑞芯微中使用 NV12 的問題,只需改為 NV16 即可,這類我抓圖時更改為 uyvy422 就沒有這個錯誤了。

4. 干擾錯誤

現象:當資料通道被幹擾後,會提示 rockchip-mipi-csi2: ERR1: crc errors, reg: 0x1000000, cnt:1 錯誤

解決辦法:這個是有硬體不穩定導致的,不過一般出現這個錯誤也是能正常抓取圖片的。

5. 瑞芯微 VI 模組使用

現象:由於 RN9752V1 模組接入 MIPI 同到的訊號是 YUV422 格式的影象,所以不需要經過 ISP 模組,只需要在 CIF 節點獲取即可,但是使用 VI 模組從 video0 節點獲取影象是失敗。

解決辦法:失敗的原因是因為 VI 模組預設從 DMA 中獲取資料,而 CIF 是從記憶體中轉存的,所以需要將 VI 模組的資料來源改為從記憶體中獲取,如下圖所示:

6. 影象分屏問題

現象:當 MIPI 通道受到干擾時,便會出現分屏問題,復現也很簡單,只需要對 MIPI 通道的傳輸線或時鐘線進行干擾即可分屏,並且每次分屏的位置都不同,如下圖所示

解決辦法:這裡存在兩種情況

  • 啟動時分屏,當裝置啟動時分屏,這樣的情況是因為獲取圖片之前沒有對裝置進行復位(可能軟復位和硬復位都要執行),RN6725V1 的復位如下圖所示:

  • 執行時分屏,當影象正常執行後,收到硬體部分的干擾也會導致分屏,這樣的現象只需要增加 CIF 通道的異常檢測功能即可,新增方法如下圖所示,具體的操作見VICAP 異常復位部分的分析,

注意: 以上是我遇到的一些錯誤,更多的問題處理見 Rockchip Linux4.4 Camera Trouble Shooting 檔案,路徑在RV1126參考資料\Linux\Camera 目錄下

四、VICAP 異常復位

瑞芯微已經在驅動中增加了異常復位功能,只需要開啟異常檢測功能即可,需要注意的是,不同板子的開啟方式不同,比如 RK3588 是在設定資訊中開啟,在 drivers\media\platform\rockchip\cif 目錄下的Kconfig檔案中定義相應的資訊,如下圖所示:

由於我使用的是 RV1126 開發板,所以這裡重點介紹 RV1126 中的設定,而 RV1126/RV1109 都是通過裝置樹進行設定的,設定資訊如下所示:

rockchip,cif-monitor = <index0 index1 index2 index3 index4>;
  1. index0
    index0 表示的是復位元型樣,目前主要有四種模式

    • 無監測(idle):預設開啟,若無 rockchip,cif-monitor 節點設定時,預設為無檢測模式,VICAP 不進行影象異常監測
    • 連續模式(continue): 用於實時監測 vicap 是否 mipi 出錯及斷流,當發生出錯及斷流時進行 vicap 復位。
      檢測方式是定時器在 index1 設定的幀數達到時,在幀位進行初始化並開始監測,若出現錯誤達到相應的幀數後觸發復位。
      定時器以 index2 設定的週期數進行檢測
    • 觸發模式(trigger):只有在 csi2 協定層出現了錯誤時才會觸發,當 index4 設定的次數達到時,在影象的幀尾初始化觸發器,並在 index2 設定的週期數達到後進行一次 vicap 復位
    • 熱插拔模式(hotplug):主要針對車機轉接晶片,用於解決裝置插拔是影象隔離或斷流的問題,此模式具備「連續模式」的功能,與 continue 的差別在於,在 mipi 不報錯和不斷流的情況下,若是 vicap 所採集的 sensor 通過
      RKMODULE_SET_VICAP_RST_INFO 命令置位復位使能,那麼 vicap 在通過 RKMODULE_GET_VICAP_RST_INFO 獲取到該資訊後會觸發復位元運算。
  2. index1
    對 continue 或者 hotplug 而言,在採集到 index1 幀資料後,觸發監測定時器

  3. index2
    監測定時器的週期,以一幀為單位,監測週期為 index2 幀;

  4. index3
    延時復位的時間引數,在發現 vicap csi2 報錯後,在該定義時間內,持續對監測,當檢測到錯誤不再增加,進行復位,超過該定義時間,不管是否還在增加錯誤,都立即進行復位元運算,時間單位ms

  5. index4
    用於設定 mipi csi err 的出現次數,在達到該次數後,觸發復位

注意: 在 VICAP 模組中產生復位後,是不能解決分屏的問題,它的主要目的是監測影象是否錯誤,並觸發復位訊號,復位訊號產生後,會在驅動程式的控制函數中產生 RKMODULE_SET_QUICK_STREAM 控制訊號。然後利用這個復位訊號對裝置進行復位便可解決分屏的問題,如下圖所示:

五、CSI 資料流模組

  1. CSI 同時採集
    在 RV1126 和 RV1106 中,存在兩個獨立而完備的標準物理mipi csi2 dphy,對應於dts上的csi_dphy0和csi_dphy1,所以我們可以實現兩個攝像頭同步進行影象採集。但是 RV1126 中只有一個 14M 的 ISP 模組,所以想實現兩個同時採集只能通過下面兩條路徑才能實現,但是兩張影象不能超過 14M。

    imx335-----csi_dphy0------csi2----cif----isp0------ispp0
    imx335----csi_dphy1----isp1---ispp1
    

    注意: 在 RV1126 中,ISP只能達到 30fps

  2. cif 模組
    在 RV1126/RV1109 中,VICAP存在兩個IP核,其中一個稱之VICAP FULL,一個稱之VICAP LITE,

    • VICAP FULL:擁有dvp/mipi/lvds三種介面,dvp可與mipi或者lvds介面同時工作,而mipi和lvds則不能同時工作,VICAP LITE 僅擁有lvds介面,可與VICAP FULL的介面同時工作。
    • VICAP LITE: 僅擁有lvds介面,可與VICAP FULL的介面同時工作。

    注意: VICAP FULL dvp介面對應一個rkvicap_dvp節點,VICAP FULL mipi/lvds介面對應一個rkvicap_mipi_lvds節點,VICAP LITE 對應一個rkvicap_lite_mipi_lvds節點。各節點可獨立採集。

  3. YUV 資料雙連結采集問題
    從上面資訊可以可知,對於 MIPI 通道中的資料是 RAW 格式的,便可以實現兩個通道同時採集,但是對於 MIPI 通道中的資料是 YUV 格式時,我只實現一個攝像頭的資料採集,分析如下

    • 因為 CIF 模組和ISP通道之間是通過虛擬連線的,也就是資料是通過記憶體塊進行交換的,所以可以直接通過這個記憶體控制元件直接抓取影象,也就是 vide0 ~ vido3 這幾個節點,但是 CIF 模組只有一個,不能用這樣的思想進行雙連結采集。
    • 想直接從 CSI 模組位置直接獲取資料,但是我嘗試後,無法獲取,如下圖所示:

    注意: 因為無法在 ISP 模組之前獲取 MIPI 通道的資料,所以我沒能實現 RV1126 同時採集兩個 RN6752V1 的影象資料,但是理論上應該是可以實現的,但是我沒找到合適的方式,望有知道的大佬指點一下,如果後期我發現解決辦法後,也會補充上的。

參考資料

  1. 介紹rk平臺針對cif鏈路出現的mipi錯誤以及斷流的復位元運算:https://blog.csdn.net/weixin_42851620/article/details/131194884
  2. camera偵錯:serdes camera偵錯:https://blog.csdn.net/qq_34341546/article/details/129138301
  3. camera偵錯:RK3588 MIPI/DVP camera關鍵設定:https://blog.csdn.net/qq_34341546/article/details/128907000?spm=1001.2014.3001.5502
  4. Rockchip Linux4.4 Camera Trouble Shooting 檔案