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