做嵌入式工作的小夥伴知道,有時候程式編寫沒有偵錯過程中費時,之間筆記裡有 MIPI 攝像頭驅動開發的過程,有需要的小夥伴可以參考:Linux RN6752 驅動編寫。
而我也是第一次琢磨 MIPI 協定,其中有很多不明白的地方,在偵錯的時候折騰了很久,特此將我遇到的問題記錄下來,希望多其他小夥伴有用。
開發板:RV1126
ARM Linux 版本:4.19.111
MIPI 裝置:RN6752V1
攝像頭:AHD 攝像頭
在偵錯需要先確定攝像頭驅動是否已經正常載入,可以使用命令 media-ctl -p -d /dev/mediaX
進行檢視,如下圖所示:
其次明白怎麼獲取自己的圖片,如果直接編寫應用程式進行測試的,那無意增加了偵錯的難度,所以在測試之前需要只要抓圖的命令,如果多抓圖和鏈路關係還不瞭解的小夥伴,可以看我之前的筆記:Linux Media 子系統鏈路分析。
注意: 這裡我使用的測試模組是 RN6752V1,它從米皮出來的資料已經是 YUV422 格式的影象,所以我抓取的節點可以有不一樣的地方。
select timeout
錯誤現象:出現這樣錯誤的可能原因是因為,MIPI 裝置沒有正常工作,錯誤如下圖所示
解決辦法:
現象:抓圖中會出現 rockchip-mipi-csi2: ERR1: error matching frame start with frame end, reg: 0x10,cnt:2 提示。
解決辦法:這一般都是硬體不穩定導致的,需要檢查硬體上的問題
現象:抓圖時,有時能正常抓取成功,但是偶爾會提現是 rkcif_mipi_lvds: ERROR: csi bandwidth lack, intstat:0x80002!! 錯誤,出現此錯誤後,變無法獲取影象。
解決辦法:出現這個問題多數情況是幀格式不匹配導致的,比如我在驅動中使用的是 MEDIA_BUS_FMT_UYVY8_2X8,而抓圖是卻用的 NV12,也有人說是瑞芯微中使用 NV12 的問題,只需改為 NV16 即可,這類我抓圖時更改為 uyvy422 就沒有這個錯誤了。
現象:當資料通道被幹擾後,會提示 rockchip-mipi-csi2: ERR1: crc errors, reg: 0x1000000, cnt:1 錯誤
解決辦法:這個是有硬體不穩定導致的,不過一般出現這個錯誤也是能正常抓取圖片的。
現象:由於 RN9752V1 模組接入 MIPI 同到的訊號是 YUV422 格式的影象,所以不需要經過 ISP 模組,只需要在 CIF 節點獲取即可,但是使用 VI 模組從 video0 節點獲取影象是失敗。
解決辦法:失敗的原因是因為 VI 模組預設從 DMA 中獲取資料,而 CIF 是從記憶體中轉存的,所以需要將 VI 模組的資料來源改為從記憶體中獲取,如下圖所示:
現象:當 MIPI 通道受到干擾時,便會出現分屏問題,復現也很簡單,只需要對 MIPI 通道的傳輸線或時鐘線進行干擾即可分屏,並且每次分屏的位置都不同,如下圖所示
解決辦法:這裡存在兩種情況
啟動時分屏,當裝置啟動時分屏,這樣的情況是因為獲取圖片之前沒有對裝置進行復位(可能軟復位和硬復位都要執行),RN6725V1 的復位如下圖所示:
執行時分屏,當影象正常執行後,收到硬體部分的干擾也會導致分屏,這樣的現象只需要增加 CIF 通道的異常檢測功能即可,新增方法如下圖所示,具體的操作見VICAP 異常復位部分的分析,
注意: 以上是我遇到的一些錯誤,更多的問題處理見 Rockchip Linux4.4 Camera Trouble Shooting 檔案,路徑在RV1126參考資料\Linux\Camera 目錄下
瑞芯微已經在驅動中增加了異常復位功能,只需要開啟異常檢測功能即可,需要注意的是,不同板子的開啟方式不同,比如 RK3588 是在設定資訊中開啟,在 drivers\media\platform\rockchip\cif 目錄下的Kconfig檔案中定義相應的資訊,如下圖所示:
由於我使用的是 RV1126 開發板,所以這裡重點介紹 RV1126 中的設定,而 RV1126/RV1109 都是通過裝置樹進行設定的,設定資訊如下所示:
rockchip,cif-monitor = <index0 index1 index2 index3 index4>;
index0
index0 表示的是復位元型樣,目前主要有四種模式
index1
對 continue 或者 hotplug 而言,在採集到 index1 幀資料後,觸發監測定時器
index2
監測定時器的週期,以一幀為單位,監測週期為 index2 幀;
index3
延時復位的時間引數,在發現 vicap csi2 報錯後,在該定義時間內,持續對監測,當檢測到錯誤不再增加,進行復位,超過該定義時間,不管是否還在增加錯誤,都立即進行復位元運算,時間單位ms
index4
用於設定 mipi csi err 的出現次數,在達到該次數後,觸發復位
注意: 在 VICAP 模組中產生復位後,是不能解決分屏的問題,它的主要目的是監測影象是否錯誤,並觸發復位訊號,復位訊號產生後,會在驅動程式的控制函數中產生 RKMODULE_SET_QUICK_STREAM 控制訊號。然後利用這個復位訊號對裝置進行復位便可解決分屏的問題,如下圖所示:
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
cif 模組
在 RV1126/RV1109 中,VICAP存在兩個IP核,其中一個稱之VICAP FULL,一個稱之VICAP LITE,
注意: VICAP FULL dvp介面對應一個rkvicap_dvp節點,VICAP FULL mipi/lvds介面對應一個rkvicap_mipi_lvds節點,VICAP LITE 對應一個rkvicap_lite_mipi_lvds節點。各節點可獨立採集。
YUV 資料雙連結采集問題
從上面資訊可以可知,對於 MIPI 通道中的資料是 RAW 格式的,便可以實現兩個通道同時採集,但是對於 MIPI 通道中的資料是 YUV 格式時,我只實現一個攝像頭的資料採集,分析如下
注意: 因為無法在 ISP 模組之前獲取 MIPI 通道的資料,所以我沒能實現 RV1126 同時採集兩個 RN6752V1 的影象資料,但是理論上應該是可以實現的,但是我沒找到合適的方式,望有知道的大佬指點一下,如果後期我發現解決辦法後,也會補充上的。
本文來自部落格園,作者:澆築菜鳥,轉載請註明原文連結:https://www.cnblogs.com/jzcn/p/17866409.html
如本部落格的內容侵犯了你的權益,請與以下地址聯絡,本人獲知後,馬上刪除。同時本人深表歉意,並致以崇高的謝意! [email protected]