天天看點

Android Camera sensor…

在手機中,我們常将camera直接稱為sensor,展訊平台的sensor就像lcd一樣,已經十分的成熟了。沿襲前面的模式,先介紹一下硬體的基本知識。

    一、sensor的種類

        其實這個對于驅動來說基本略知就可以了,處于那種說出來要知道是在說sensor的專業名次這種程度就OK了!一般來說,sensor有兩大類,CMOS和CCD。

一般來說,CCD的功耗高,拍攝品質高,造價高,他更适合在數位相機或DV中使用,而我們的手機中,在像素要求本來就不是苛刻,但是對空間和成本有比較高要求的話,一般都會選擇CMOS的攝像頭。它的工作原理很簡單,接收外界光線後轉化為電能,再透過晶片上的模-數轉換器(ADC)将獲得的影像訊号轉變為數字信号輸出

二、sensor的輸出格式

        同樣,sensor的輸出格式也不是單一的,可以分為YUV、JPEG、RGB、RAW,這幾種格式。

        1、YUV

“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度、濃度(Chrominance、Chroma), 一般情況下sensor支援YUV422格式,即資料格式是按Y-U-Y-V次序輸出的。

        2、JPEG

這個不用很介紹,作為一種存儲格式它是非常普遍的,但是作為sensor的輸出格式的話,一般是低分辨率的,其自帶JPEG engine,可以直接輸出壓縮後的jpg格式的資料

     3、RGB

傳統的紅綠藍格式,比如RGB565.通俗點說它的顔色混合方式就好像有紅、綠、藍三盞燈,當它們的光互相疊合的時候,色彩相混,而亮度卻等于兩者亮度之總和,越混合亮度越高,即加法混合。

    4、RAW

圖像感應器将捕捉到的光源信号轉化為數字信号的原始資料。RAW檔案是一種記錄了數位相機傳感器的原始資訊,同時記錄了由相機拍攝所産生的一些原資料(Metadata,如ISO的設定、快門速度、光圈值、白平衡等)的檔案。RAW是未經處理、也未經壓縮的格式,可以把RAW概念化為“原始圖像編碼資料”或更形象的稱為“數字底片”。

好了,介紹完他們的輸出格式之後,我們有樣的疑問,我該選擇哪種格式作為輸出呢?

對于展訊平台,sensor的輸出格式一般都為YUV的,他的流程是:錄影機的原始資料應該是RAW來記錄的,裡面的資料可能會是RAW RGB來表示,然後sensor模組裡面自帶的ISP會将資料轉換成YUV格式的輸出出來,輸出到我們的AP裡面後DSP會将YUV格式轉換成RGB的,然後在輸出到屏上,如果是拍攝出來的就要經過DSP将格式再轉換成為JPEG的存儲下來。

這就讓我們很費解,既然能夠輸出RGB格式的資料,為什麼又幾經周折,轉換來轉換去,費時費力?在這裡我們就要在照片品質和處理速度上做一個權衡。

    首先,如果說資料量最小,那麼莫過于RAW格式,但是,資料傳輸過來要經過一次性大量的計算才能将裡面的資訊提取出來,如果你想用,一般5M以上sensor就隻輸出RAW資料以保證比較快的輸出速度,後端挂一個DSP來處理輸出的資料。其次是JPEG,資料量也很小,但是同樣要求較快的處理速度。

    而RGB和YUV一個像素都是占用了2B的大小,但是RGB卻可以資料讀出來直接刷到屏上,為什麼要卻要選擇YUV的呢?原因在于YUV輸出亮度信号沒有任何損失,而色偏信号人眼并不是特别敏感,RGB565輸出格式是R5G3 G3B5會丢掉很多原始資訊,是以YUV圖像品質和穩定性要比RGB565好的多。

   那麼,雖然在展訊平台上預設的是YUV的,并不是說他是最好的或不可更改的,我們要根據不同的情況選擇時候世事的輸出格式!

說一說架構格式,非常固定,首先在sensor_cfg.c裡面申明并定義一個SENSOR_INFO_T結構指針,然後就可以在具體的sensor_***.c裡面實作你的驅動代碼!

調試sensor常見的問題:

1.讀不到ID:需要确認三個電源,power down 和reset的極性,mclk,I2C是否正常打開。如果這些資訊确認是正确的,還不能讀到ID基本可以确認是sensor的硬體問題。

2.能讀到ID但是點不亮:這是最常見的情況,這個是時候已經能确認上述的硬體信号都是正常的,先要看HS/VS/PCLK的極性是否配置的正确,是否在預覽前丢了1幀以上,sensor的輸出尺寸是否正确。這些通常需要通過sensor的datasheet來檢視寄存器配置的是否正确。

3.拍照當機:要确認是否在拍照的時候設定了set_mode(用來設定拍照時的sensor輸出資料大小的設定),memory是否足夠大? 

DC_MEM = Frame_W*Frame_H*2 *MAX((1 + need_rotation),(1+is_jpg)) + 1M根據這個公式算出來,在dc_product_cfg.c中進行配置。

4.花屏:如果是很多綠線的花屏的話那麼通常是HS/VS/PCLK的極性配置反了或者驅動電流太小被幹擾了,如果是紅藍的顔色反了的那麼是yuv輸出資料反了,在yuv_info中進行配置。

5.分屏:這個是刷屏的時候刷的不是同一幀資料,是LCD的FMARK引腳沒有引出來,或者沒有配置。如果LCD沒有這個腳的話,需要估算一下刷屏的時間,然後将sensor輸出的幀率調的跟它比對。

6.旋轉:預覽的在startpreview裡的rotation設定成需要的角度,拍照的在_DCAMERA_DoSnapshot裡面将rotation設定成需要的角度,VT在傳給底層參數時将screen2sensor_angle設定為DVT_MW_ROTATE_90或其他角度。