Android平台硬體除錯之Camera篇

2021-08-25 13:12:51 字數 2926 閱讀 6029

之前一段時間有幸在高通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的硬體除錯可以算作完成了,後續的其他功能也可以慢慢完善了。

note:v同步即幀同步訊號,代表一幀資料的開始,vfe會根據該訊號來讀取一幀資料。

h同步即行同步訊號,代表一行資料的開始,vfe會根據該訊號來讀取一行資料。h訊號一定是包在v同步中的。

高通Android平台硬體除錯之Camera篇

之前一段時間有幸在高通android平台上除錯2款camera sensor,一款是ov的5m yuv sensor,支援jpeg out,同時也支援af,除錯比較比較簡單,因為別的專案已經在使用了,只是把相關的驅動移植過來就好 另一款是samsung的一款比較新的3m yuv ff sensor,...

高通Android平台硬體除錯之Camera篇

之前一段時間有幸在高通android平台上除錯2款camera sensor,一款是ov的5m yuv sensor,支援jpeg out,同時也支援af,除錯比較比較簡單,因為別的專案已經在使用了,只是把相關的驅動移植過來就好 另一款是samsung的一款比較新的3m yuv ff sensor,...

android平台除錯

1.gdbserver 位置 ndk dir prebuilt android arm gdbserver 2.gdb 位置 ndk dir toolchains arm linux androideabi 4.8 prebuilt windows x86 64 bin arm linux andr...