在嵌入式系統(tǒng),如手機等平臺上使用的Camera sensor通常是由類似I2C這樣的總線進行寄存器控制,由CPU端的Controller提供所需的驅(qū)動時序,通常支持YUV和RGB等數(shù)據(jù)格式。有的Sensor需要由CPU進行圖像處理工作,有的Sensor自己會集成圖像處理芯片,完成一些基礎(chǔ)的圖像處理工作,還有些高像素的Sensor甚至自己完成JPEG的編碼工作。因為硬件的多樣性,我所遇到的問題可能和你的原因現(xiàn)象都不盡相同,分析內(nèi)容僅供參考。Sensor端I2C總線沒有響應(yīng)。
癥狀
所有輸入電壓和時鐘信號都正常,往I2C總線上寫入讀取寄存器數(shù)據(jù)的命令后,sensor沒有響應(yīng),沒有數(shù)據(jù)從I2C總線上輸出。
分析
因為測量發(fā)現(xiàn)一切輸出信號都正常,所以往往都會懷疑Sensor硬件存在問題,不過99%的情況,實際的原因總是因為I2C總線的ID值沒有設(shè)置對,導(dǎo)致設(shè)備不響應(yīng)命令。據(jù)我的觀察,每次一個新的工程師在調(diào)試Sensor的時候幾乎都會遇上這個問題。
之所以這么容易設(shè)置錯誤的原因,是因為通常Camera Sensor的Spec上所寫的I2C ID號,還包含了最后一位讀寫方向位。而這一位在I2C總線的定義中,嚴格來說,不屬于ID的一部分,所以Linux I2C的驅(qū)動API中的調(diào)用參數(shù)里的ID號,通常是不考慮這一位的,讀寫方向位會在具體的讀寫操作中,在寄存器中進行設(shè)置。
解決
例如Spec上會寫 讀寫寄存器操作 I2C ID 分別為 064和065,實際調(diào)用API時應(yīng)該使用032作為該設(shè)備的I2C ID
癥狀
與熒光燈的頻閃造成的大面積的滾動水平條紋不同,表現(xiàn)出來的是一個像素高的水平條紋狀躁點,位置不固定,數(shù)量比較多,而且隨光線強弱有一定的變化
因為設(shè)置某些sensor寄存器的時候,會影響到這些水平條紋的顏色,所以基本上排除是在數(shù)據(jù)傳輸過程中板子對數(shù)據(jù)造成的干擾,也排除接觸不良的可能性,應(yīng)該是數(shù)據(jù)在sensor內(nèi)部已經(jīng)存在這些水平條紋。
此外相同的初始化序列,相同的sensor,在廠商的demo版上也沒有發(fā)生這種情況,所以也基本排除軟件的問題。
最后,發(fā)現(xiàn)原先為了節(jié)省硬件成本,將sensor的兩個電壓相同的模擬電和數(shù)字電由同一芯片輸出供給,導(dǎo)致兩者之間互相干擾,影響了sensor的正常工作
解決
將模擬電和數(shù)字電分離單獨供電;
圖像上有固定的鋸齒狀垂直條紋
癥狀
圖像上有明顯的垂直條紋,全屏分布,非常細密,好像百葉窗一樣。
分析
仔細看可以發(fā)覺該垂直條紋實際上是由于圖像上相鄰的兩兩像素互相錯位造成的鋸齒狀條紋
仔細分析spec可以看到,由于sensor是按字節(jié)送出圖像數(shù)據(jù),在RGB565模式下,兩個字節(jié)表示一個像素。而在我所使用的CPU的Camera控制器中,數(shù)據(jù)是按4個字節(jié)也就是一個字為單位處理的,由于CPU這端是按LSB方式處理數(shù)據(jù)的,所以在一個字內(nèi)部,未經(jīng)調(diào)整的話,兩個像素的順序是顛倒過來的。也就是最終由DMA將數(shù)據(jù)送到內(nèi)存的連續(xù)buffer中時,像素的順序是:像素2,像素1,像素4,像素3。。。
解決
用程序調(diào)整像素順序,為了減少附加計算對CPU的負擔(dān),可以將這一步操作合并在其它類似顏色轉(zhuǎn)換或PACK模式轉(zhuǎn)Planer模式等操作中。! z( q% q( x" C4 ^% P0 T
大尺寸時容易出現(xiàn)圖像錯位
癥狀
當sensor工作在最大分辨率的情況下時,圖像容易出現(xiàn)上下錯位的現(xiàn)象。
分析
跟蹤程序可以看到這時候CPU的Camera控制器的FIFO緩存發(fā)生了溢出現(xiàn)象,也就是說DMA來不及將FIFO中的數(shù)據(jù)傳送到內(nèi)存中,該例中sensor在最大分辨率的情況下,輸出數(shù)據(jù)的時鐘工作在24MHZ,理論上說,DMA應(yīng)該是來得急傳送數(shù)據(jù)的,但是可能因為內(nèi)存帶寬還會被其它設(shè)備如CPU占用,導(dǎo)致來不及寫入內(nèi)存,使得DMA沒有最大負荷的工作,所以來不及將FIFO中的數(shù)據(jù)讀出,導(dǎo)致部分數(shù)據(jù)丟失,圖像錯位。4 j; q* g T C/ k9 D6 O- s
解決
某些情況下,改變DMA傳輸?shù)膯雨I值可以解決該問題,但是有些情況是無效的
考慮到最高分辨率僅在拍照的時候使用,預(yù)覽的時候并不使用該分辨率,所以,在不影響預(yù)覽楨數(shù)的情況下,可以在拍照的一瞬間改變分辨率的同時,修改sensor的時鐘頻率,降低到一個不會導(dǎo)致FIFO溢出的頻率
另外,在截獲最高分辨率的圖像的同時,盡量不執(zhí)行其它的內(nèi)存相關(guān)操作。截獲完圖像馬上切換回預(yù)覽用的分辨率。通過這些辦法,減少發(fā)生FIFO溢出的可能性。
讀取到的數(shù)據(jù)顯示出來的時候是花屏
癥狀
讀取到的數(shù)據(jù)顯示出來的時候是花屏,但是明顯是隨著所拍攝的對象的變化而變化的。
分析
具體來說,常見的情況包括:
顯示的數(shù)據(jù)是完全的花屏,或者可以看出物體大致輪廓,但顏色完全不對,例如一片綠色。這種情況往往是因為圖像數(shù)據(jù)格式不匹配,例如沒有處理YUV2RGB,YUV的各個分量采樣順序與軟件計算的取值順序不匹配等。
如果花屏的具體表現(xiàn)是圖像不斷變換,沒有規(guī)律,通常有可能是數(shù)據(jù)接收的觸發(fā)邊沿有誤,導(dǎo)致沒有正確的接收數(shù)據(jù)。8 Q v* t0 P* R
另外有一次,花屏的時候,仔細觀察花屏的圖案,發(fā)現(xiàn)有部分錯位重復(fù)的圖案的跡象。因此分析可能是Sensor的物理layout,其長寬比例與LCD剛好相反,仔細查看Spec得到確認。
解決2
具體情況具體處理了。