Camera Sensor

 之前一段時間有幸在高通android平臺上調試2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同時也支持AF,調試比較比較簡單,因爲別的項目已經在使用了,只是把相關的驅動移植過來就好;另一款是Samsung的一款比較新的3M YUV FF sensor,在最新項目中要使用的,本文以調試該sensor爲例,從底層驅動的角度分享一下高通android平臺下調試camera的經驗,而對於高通平臺camera部分的架構以及原理不做過多的介紹。
一、準備工作
從項目中看,在硬件(板子)ready前,軟件部分是要準備好的。單獨從底層驅動來看,軟件部分可以分爲2個部分,一個是高通平臺相關的,再一個就是sensor部分的,通常的做法就是把sensor相關的設定移植到高通平臺的框架之中。這樣就需要先拿到sensor的spec以及廠商提供的sensor register setting file。Spec的用途是清楚高通平臺和sensor通訊(讀寫寄存器)的時序以及相關參數設定;而廠商提供的setting file則是在使用camera各個功能(preview、snapshot...)時候需要寫入到sensor中的.
本項目中,高通平臺爲MSM7X27,camera爲Samsung 5CA。從spec中知道,該sensor的I2C ID爲0x78,I2C的通信採用雙字節方式,另外也弄清楚了讀寫sensor寄存器的規則,從調試角度看這些基本上夠用了。另外廠商提供的setting file,其實就是寄存器列表,告訴我們再什麼時候將哪些寄存器寫入什麼值,通常是一個寄存器地址再加上一個寄存器的值,不過Samsung提供的是PC上調試使用的文本,需要自己轉換成c語言中的二維數組。從文件中看,寄存器數據可以分爲幾個部分:初始化、IQ設定(tuning相關)、clk設定、preview設定、snapshot設定,基本上有這幾個就夠了,其他的比如調節亮度啦、設定特殊效果啦、設置白平衡啦等等都可以自己通過spec來完成。
Sensor部分的東西搞定後,接下來就是修改高通camera部分的驅動了,主要有:
Kernal部分:
1、檢查Sensor的電源配置,並修改軟件中的設定。本項目中使用2.8/1.8/1.5共3個電源。
2、檢查並修改sensor reset設置。注意reset的時間設定,務必和spec中一致,否則會導致sensor無法工作。
3、修改I2C驅動,使用雙字節讀寫的接口,並完成讀取sensor ID的接口。這個用來檢驗I2C通訊是否OK
4、導入寄存器設定,分別在初始化、preview、snapshot等幾個部分寫入對應的寄存器值。
注意:reset以及寫寄存器部分一定要按照spec的規定加入一些delay,否則會導致sensor工作異常

User空間部分:
這個部分主要是根據硬件的規格來配置VFE,如sensor輸出數據的格式,接口方式、分辨率大小、同步信號模式等,比較簡單,但一定要檢查仔細,任何一個地方不對都會導致調試失敗。
到這裏爲止,軟件部分的準備已經告一段落了。

二、調試環境準備(板子出來了,但sensor sample還沒到位)
首先,測試點的準備。
調試前就需要想好,如果sensor無法工作,要怎麼去debug,這就需要去測量一些信號,比如power、reset、I2C、M/P CLK、H/V同步信號、數據信號等,要確保這些信號都可以測量到。
其次要選擇軟件的調試環境,這裏選擇在ADB環境中執行高通的mm-qcamera-test程序來調試,相關的trace都可以打印出來。
這樣就萬事俱備,只欠sensor了。

三、調試(sensor終於拿到了)
將sensor接到板子上,開機後,ADB中運行調試程序,preview畫面並沒有出來,失敗,有點小失望,本來覺得可以一氣呵成的,但畢竟這是一個全新的sensor,任何一個地方沒有想到位做到位都會導致失敗。那就找原因吧。
1、首先從trace得知,I2C已經讀到了sensor的ID:0x05CA,這可以說明I2C通訊是沒有問題的
2、接着檢查Sensor的電源配置,測量了供給sensor的3個電源,都是OK的。
3、測量MCLK,這個是提供給sensor使用的,正常(24MHZ)
4、測量PCLK,這個是sensor輸出的,正常(58MHZ,高通上限爲96MHZ),和寄存器中配置的一致。
5、測量H/V同步信號,這個是sensor輸出的,正常。和FPS和分辨率一致。
6、測量數據信號,這個是sensor輸出的,正常。(數據信號,示波器上可以看到)
這樣看來,sensor已經在正常工作了,但爲何preview畫面沒有出來呢?繼續檢查高通這邊的設定。
從trace看,高通的VFE已經reset並且start了,但一直接沒有輸出preview數據,這就奇怪了,sensor明明已經輸出了,爲什麼VFE接收後並沒有把數據吐出來呢,難道這個sensor輸出的數據VFE無法識別?爲了驗證這個問題,我在另一塊板子上測量了OV sensor輸出數據的波形,主要是M/P clk、H/V同步信號,然後再拿來對比,不過並沒有發現異常,只是H/V同步信號有所不同,主要高低的佔空比不太一致,會不會是這樣信號的問題呢?爲了進一步驗證,我同時測量了H/V 信號和數據信號,這時發現OV sensor輸出的數據信號是包在V幀同步信號的低電平中;而Samsung 5CA輸出的數據信號是包在V幀同步信號的高電平中,會不會是因爲V信號極性設置不對導致VFE沒有讀取到sensor輸出的數據呢?重新檢查了一下高通VFE的設定,果然有一個參數是用來設定V信號極性的,這個參數默認是Active Low的,我這邊並沒有去修改它。接着把這個參數修改爲Active High,重新build、download後,開機運行,Ok了,preview畫面可以正常顯示了。到這裏爲止sensor的硬件調試可以算作完成了,後續的其他功能也可以慢慢完善了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章