RK平臺模組Sensor移植心得體會
最近在RK平臺上做PMD Sensor的移植,踩了不少坑,終於移植完了,在這裡分享下經驗。
首先對於模組sensor的移植來說,大致分為這麼幾步:
1.熟悉平臺階段;
2.閱讀模組sensor datasheet 以及硬體原理圖;
3.在已有的sensor驅動模板基礎上修改,編寫對應的驅動函式及相關檔案;
4.除錯I2C,配置暫存器初始化序列,讀取chip ID;
5.配置mipi,出流檢測。
看起來很簡單,其實也蠻複雜的,因為可能很多地方都存在問題,需要一一去排查。
首先,平臺的熟悉,在我看來,分為三部分:應用程式、HAL層(RK平臺,其他平臺可能叫別的名字)和驅動層。首先要看懂一個demo的執行流程,尤其是與sensor有關的部分,例如:應用程式關於sensor的配置,驅動層的sensor設定函式,暫存器初始化過程,編譯檔案等等。在我進行移植的過程中,就出現了幾次因為應用程式的sensor出圖格式的問題導致後續ISP處理,sensor的啟動無法正常進行的問題,當然由於RK提供給我的是一個大型的程式(行車記錄儀錄程式),所以有很多地方會導致sensor啟動不了,所以如果有比較小的demo,最好是使用小型的demo去移植,這樣會減少應用層的設定,而這些設定往往不是移植的關鍵點,但會浪費很多時間。
其次,閱讀datasheet和硬體原理圖。這個真的至關重要好嗎。閱讀datasheet主要是去了解這個Sensor的啟動流程,上電、復位等序列,因為有些平臺也許已經為其他型別的sensor已經移植好了,所以對應的這些序列也是針對與那些sensor的,也許你要移植的Sensor序列就是跟這些不一樣,所以你要看下。當然和部分看起來可能有些複雜,最好用示波器去測量對應的管腳先去驗證,覺得真的有問題再去看程式碼,這樣比較直觀。但是也不是一定會不一樣,比如我在移植過程中也曾懷疑過是不是OV系列的模組的啟動序列和PMD的不一樣導致的sensor啟動失敗,但其實問題並不在這裡(順便吐槽一下PMD的datasheet,寫的真的有點噁心,根本沒有OV系列的datasheet寫的直觀)。
至於硬體原理圖,主要看三個引腳:時鐘引腳,reset引腳,power down引腳。這三個引腳最重要,比如說時鐘引腳,雖說一般不會考慮這個引腳,但我這次真真正正遇上了這個問題,硬體小哥哥在做轉接板的時候多焊了個電阻,沒給sensor供電!所以我壓根讀取不到chip id,I2C的讀寫也一直NACK有木有!然後調了一整天有木有!要不是這個小哥哥發現,我估計我是想不起來的。reset引腳主要就是剛剛說的復位序列的問題了,可能有些snsor在除了硬復位之外,還需要進行一次軟復位(比如需要先設定某一個暫存器才能再設定其他的暫存器)。power down引腳有些sensor用不到,所以硬體原理圖也不會接,但是如果接了就要注意了,在打算出流的時候是不是這個引腳有問題,或者這個在某個序列中這個引腳沒設定對。
之後就是參照模板去編寫對應的sensor驅動了,這部分反倒比較好寫,因為大部分的函式在移植的過程中並不需要完成,少數幾個比如開流、關流、讀取chip id的按照模板呼叫對應的函式介面,改改暫存器就可以了。然後就是I2C地址要配對,配不對當然也就不可能正確的設定暫存器了。至於暫存器的初始化序列,可以通過FAE獲取,或者把之前其他平臺已經配置好的暫存器配置拿過來用。但是要注意一點,那就是I2C讀寫的問題,要注意平臺提供的I2C讀寫介面引數是否符合要移植的sensor的引數格式,比如暫存器地址(一般16位)、寫入的資料(有8位,有16位的),如果不適用,則很有可能沒有寫進去,或者沒有讀對(更可恨的是,可能即使沒寫對讀對,但也不會報錯,最好自己加列印,看下是不是自己想要的值)。最後,是mipi的配置,其實只要對照datasheet,按照當前出流解析度對應的mipi配置就可以了,一般包括mipi的LANE數、通道、速率、資料格式這幾個選項。
按照上面的幾點,至少出圖是可以了,最多隻是在顯示屏上顯示的不對,但這就是應用層的問題了。