展訊平台 camera驅動分析(sensor部分)

2021-06-16 19:49:20 字數 3253 閱讀 6773

展訊平台其既用於功能機也用於智慧型機。其65和66系列的平台主要用於功能機,例如6530、6531、6500、6610、6620、6600l;68和88系列的平台主要用於智慧型機,例如sc6810、sc6820、sc6800、sc8820、sc8810。目前我們使用的樣機為sc8825,搭配gc2235。

1、 使用shell終端進入工程根目錄,執行指令碼copy.sh將img檔案copy到上層資料夾sp_bin中。

2、 連線usb線,開機狀態下使用adb命令adb reboot‐bootloader,進入fastboot mode。

3、 燒錄boot、system、userdata檔案,指令為:

fastboot flash boot d:\boot.img

fastboot flash system d:\ system.img

fastbootflash userdata d:\ userdata.img

fastboot reboot    紅色為檔案路徑,修改為自己檔案所在路徑

編譯展訊平台的步驟進行簡化,以後編譯驅動和庫檔案只需要在根目錄下執行 .  mk.sh命令就可以進行編譯。其中點(.)和

mk.sh

之間必須有空格,否則不能執行。

展訊平台的sensor

驅動(我們提供的)主要存放於根目錄下:

device/sprd/common/libs/libcamera/sensor/

分別為:

sensor_gc***x.c

sensor_gc***x_raw_param.c

sensor_gc***x_mipi_raw.c

sensor_gc***x_mipi_raw_param.c

而關於驅動中使用變數的定義在檔案是

device/sprd/common/libs/libcamera/isp/inc/sensor_raw.h

其中sensor_gc***x.c、sensor_gc2235_raw_param.c是dvp介面的驅動,sensor_gc***x_mipi_raw.c、sensor_gc***x_mipi_raw_param.c是mipi介面的驅動。關於sensor控制的函式、暫存器值的寫入主要在sensor_gc***x.c中,例如_gc2235_write_gain()函式是寫入平台gain;_gc2235_write_exposure是寫入shutter,陣列gc2235_com_raw是存放sensor初始化暫存器值(如圖1),前邊是位址,後邊的是值。

圖1展訊在出錯的時候不同於mtk以log檔案形式記錄,它在出錯的時候是直接顯示在shell終端視窗上,出錯時如果錯誤過多,將沖掉錯誤資訊的前半部分(shell只記錄有限長度的一段)。同時,在展訊上看手機活動的log的方法如下:

adb devices

adb logcat>d:\ksng     (紅色部分是windows下儲存的log的路徑)

展訊平台中關於sensor的驅動底層部分(平台提供的)位於device\sprd\common\libs\libcamera下的使用的平台資料夾下,例如樣機用的是sc8825,那樣機用的驅動就在sc8825問價夾下。驅動分為兩個部分src(.c)、inc(.h),sensor中所有操作函式均在改這裡實現。函式列表如圖2所示。

圖2追蹤了一下log,檢視了手機呼叫sensor過程中的步驟。

android::hal_camera_device_open(consthw_module_t*, const char*, hw_device_t**)

開啟攝像頭驅動

android::hal_getnumberofcameras()//獲得當前camera數目

initdefaultparameters

一、詳解

1、驅動中資料的認識與還原

1.1關於驅動中使用的資料多使用sensor_i2c_t_ptr、sensor_reg_t_ptr、sensor_reg_bits_t_ptr樣式的結構體,這些結構體一般都是定義響應的暫存器位址、暫存器值、暫存器個數、暫存器位數等資訊。例如sensor_i2c_t_ptr的定義為:

typedef struct sensor_i2c_tag sensor_i2c_t, *sensor_i2c_t_ptr; 

這些結構體的定義均在sensor_druv.h中,需要的時候可以查詢相應位的含義。

1.2其他的一些功能結構體,例如sensor_reg_tab_info_t、sensor_trim_t、sensor_ioctl_func_tab_t、sensor_info_t等結構體。現在逐一對其分析,了解這些結構體,不要這這些掩蓋了資料的真實含義。

typedefstruct sensor_reg_tab_info_tag sensor_reg_tab_info_t,*sensor_reg_tab_info_t_ptr;

圖3例如在gc2235中:這是乙個結構體陣列(如圖3所示),陣列的每乙個元素都是乙個sensor_reg_tab_info_t_ptr結構體(依舊不清楚為何前兩個完全一樣,後邊的全是空的),在第乙個元素中add_and_len_of_array是為了獲得暫存器的頭和個數。具體定義為:#define addr_and_len_of_array(a)        (sensor_reg_t*)a,number_of_array(a),也就是獲得gc2235_mipi_com_raw(圖1所示)中暫存器的個數和首位址;1600為gc2235出圖寬度;1200為高度;24為mclk;sensor_tmage_format_raw出圖格式為raw。

typedef struct sensor_trim_tag sensor_trim_t, *sensor_trim_t_ptr;

圖4在gc2235中(圖4):起始座標(0,0);大小(1600*1200);line_time=36.9us;pclk=48m計算line_time(也就是row_time)的過程:

( win_width/2 + hb + sh_delay + 4)/pclk =

sensor_ioctl_func_tab_t:這個結構體比較負責,它包含了驅動sensor的所有過程,包括上電等一系列的操作。詳細分析:

typedef uint32_t(*sensor_ioctl_func_ptr)(uint32_t param);

typedef struct sensor_ioctl_func_tab_tag sensor_ioctl_func_tab_t,*sensor_ioctl_func_tab_t_ptr;

總體上來說,這個機構體就是提供了給上層呼叫的api介面,我們將所使用到的所有功能函式在這裡宣告,不需要該功能就在相應功能的位置寫pnull。在.c檔案只需要定義我們需要的功能即可。

具體過程參照 :

展訊平台camera驅動移植 FLASH

平台 展訊 系統 安卓10 新增flash驅動程式 一般flash驅動資料夾裡包含三個檔案 c kbuild makefile 由相應廠商提供,配置點亮一般不需要自行修改。直接將該資料夾拷貝過來放入下列路徑 bsp modules camera flash 在k dts檔案裡配置其供電。flash ...

展訊camera驅動除錯

camera驅動目錄 vendor sprd modules libcamera sensor sensor drv classic galaxycore gc030a kernel drivers misc sprd camera sensor csi2 csi sprd r2p0 csi dri...

展訊平台android display驅動分析

本文以展訊tshak平台的display controller為硬體模型,來說明android底層顯示驅動的實現原理。該硬體模型較基礎和簡單,目前大多soc平台的硬體設計都變得越來越複雜,實現功能也越來越全面,但基於此平台的設計更方便理解。下圖的結構即是顯示控制器的模組組成,它內部整合了lcd顯示相...