1. 程式人生 > >基於qualcomm平臺的Camera Bring up

基於qualcomm平臺的Camera Bring up

前言:

趁手頭有塊820板子(MSM8096)和一個攝像頭(信利16021),就自己嘗試bring up一下camera了,之前也沒弄過攝像頭方面的東西額,純粹是操作一步記錄一步的方式額,不喜勿噴,僅當參考。先百度下camera原理:外部光線穿過lens後,經過color filter濾波後照射到sensor面上,sensor將從lens上傳到過來的光線轉換成電訊號,再通過內部的AD轉換為數字訊號,如果sensor沒有整合DSP,則通過DVP的方式傳輸到baseband,此時的資料格式是RAW DATA。必須通過平臺的isp來處理。如果集成了DSP,這RAW DATA資料經過AWB,color matrix,lens shading,gamma,sharpness,AE和de-noise處理後輸出YUV或者RGB格式的資料。最後會由CPU送到framebuffer中進行顯示。

一、前期準備:

在硬體上:

(1)首先對照模組是否和手中sensor的module相匹配。

(2)對照原理圖和camera datasheet,檢查camera module 的pin腳連線是否正確。


(3)供電確認,用萬用表測量Camera的電源管腳,檢視Camera的供電是否正常,模組端所需電壓和board所供電壓是否一致



AVDD類比電路電源:2.7V,正常情況下,需要單獨供電減少其他干擾(電源紋波不大於30mv);

DOVDD、VIF:1.8V

DVDD數位電路供電電源 :1.1V

(4)用示波器量Camera的MCLK管腳,看是否正確,如果MCLK正常,通常情況下PCLK也應該有波形;


MCLK 為camera提供時鐘,給模組內部的pll使用。qualcomm平臺一般是24MHZ。

(5)檢視Camera的Spec文件,檢查PWDN和RESET的管腳觸發是否正常;檢查程式碼中camera power up時序是否與datasheet的一致。

RESET/XSHUTDOWN/XCLR:用來reset sensor;RESET一般是低有效,當脈衝為低時,reset sensor,而正常工作時,應該為高。注意reset的時間要求

(6)在Camera的Datasheet中找出該裝置的I2C地址,檢查I2C配置是否正確;檢視I2C通訊是否正常,是否能正常進行讀寫,用示波器量出

I2CSCLSDA的波形是否正常,未通訊時都為高電平,通訊時SCL為I2C時鐘訊號,SDA為I2C資料通路訊號;


(7)假如自己對camera暫存器列表配置不明確,可以讓Sensor FAE檢查Camera的暫存器列表的配置是否正確,其實我之前配置的時候一直在琢磨著修改相應的dtsi檔案(如:msm8996-camera-sensor-adp.dtsi),後面聽同事說不需要改這些了,說msm8996的已經配置好了的,有時間再研究研究,下面就copy一下別人是怎麼配置的以及跟蹤一下這個dts的實際配置情況吧,讓大家更直觀的看到吧。

(先寫到這裡,待會晚上有時間載新增kernel中修改的檔案以及vendor中需要配置的檔案咯)

二、kernel部分
(1) vim kernel/driver/media/platform/msm/camera_v2/sensor
新增sensor驅動檔案-可參考其他
修改Makefile

(2) kernel/arch/arm/configs
新增CONFIG_定義

(3)kernel/driver/media/platform/msm/camera_v2/kconfig
新增選項

(4) 裝置樹檔案kernel/arch/arm/boot/dts/qcom/_camera*.dtsi
新增新的條目
gpio set
clk set
power set
i2c slave

三、vendor部分
(1) mm-camera2/media-controller/modules/sensors/sensor_libs/
新增lib檔案

(2)vendor/qcom/proprietary/common/config/device-vendor.mk
加入新的條目

(3)
a、sensor init parameter
2D/3D、前/後置、安裝角度
b、sensor output
bayer/yuv、mipi/並口、位數
c、output size
static struct sensor_lib_out_info_t sensor_out_info[] = {
{
.x_output = 4208,
.y_output = 3120,
.line_length_pclk = 4572,
.frame_length_lines = 3142,
.vt_pixel_clk = 360000000,
12/26例如
.op_pixel_clk = 360000000,
.binning_factor = 1,
.max_fps = 24.01,
.min_fps = 7.5,
.mode = SENSOR_DEFAULT_MODE,
},
x_output –
sensor 輸出有效寬度
y_output – sensor 輸出有效高度
line_length_pclk –包含 blanking 的寬度值
frame_length_lines –包含 blanking 的高度值
vt_pixel_clk(video timing clk value) –該虛擬時鐘值用於曝光時間計算,用於 AEC演算法
的 banding artifacts 糾正,vt_pixel_clk 的計算如下:
vt_pixel_clk = line_length_pclk * frame_length_lines * framerate
op_pixel_clk – VFE 時鐘,表示每秒 VFE 處理的資料量(in pixel)。
op_pixel_clk = (sensor 輸出實際位元率)/bits-per-pixel

比如,如果 MIPI DDR時鐘值(sensor MIPI 的時鐘 lane 頻率) 為 300Mhz, 同時sensor 使用 4 個 lane (一組差分訊號屬於一個lane)傳輸資料, 每一個 lane 的資料率是 300*2 =600Mhz. 因此, 總資料率為 600*4= 2400Mhz. 對於 10bit 的 bayer sensor, op_pixel_clk 值可設定為2400/10 =240Mhz.這些值可以從 sensor 的暫存器設定中計算出來。
d、chromatix
e、register addr
f、mipi receiver
g、regiseter setting