1. 程式人生 > >展訊平臺 camera驅動分析(sensor部分)

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

展訊平臺其既用於功能機也用於智慧機。其65和66系列的平臺主要用於功能機,例如6530、6531、6500、6610、6620、6600L;68和88系列的平臺主要用於智慧機,例如SC6810、SC6820、SC6800、SC8820、SC8810。目前我們使用的樣機為SC8825,搭配GC2235。

         在進行平臺下載時需要像高通平臺一樣進入fastboot mode才能進行下載燒錄。燒錄步驟:

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_gcxxxx.c

sensor_gcxxxx_raw_param.c

sensor_gcxxxx_mipi_raw.c

sensor_gcxxxx_mipi_raw_param.c

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

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

其中sensor_gcxxxx.c、sensor_gc2235_raw_param.c是DVP介面的驅動,sensor_gcxxxx_mipi_raw.c、sensor_gcxxxx_mipi_raw_param.c是Mipi介面的驅動。關於sensor控制的函式、暫存器值的寫入主要在sensor_gcxxxx.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

//初始化引數(這些引數是app層的選項引數)   包括whitebalance、picture-size、preview-size、exposure等 .解析了一段,發現與kernel交叉太多,解不動了。待續

一、詳解

         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 {

                                       uint8_t  *i2c_data;//指標,指向要寫入的資料頭

                                       uint16_ti2c_count;//要寫入資料的個數

                                       uint16_tslave_addr;//i2c讀寫地址

} 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_T_PTRsensor_reg_tab_ptr;//要初始化的暫存器(指標,指向連結串列、陣列首地址)

         uint32_treg_count;//暫存器數目

         uint16_twidth;//出圖的寬度

         uint16_theight;//出圖的高度

         uint32_txclk_to_sensor;//Mclk

         SENSOR_IMAGE_FORMATimage_format;//輸出影象格式

} 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 {

         uint16_ttrim_start_x; //座標x

         uint16_ttrim_start_y;//座標Y

         uint16_ttrim_width;//寬

         uint16_ttrim_height;//高

         uint32_tline_time;//重要, Line Time =Period Pixel ÷ Pclk

         uint32_tpclk;//很明顯了,但是和用表格算的不一樣

} 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 {

         /*1:Internal IOCTL function */    //

         uint32_t(*reset)(uint32_t param);//復位

         uint32_t(*power)(uint32_t param);//上電

         uint32_t(*enter_sleep) (uint32_t param);//睡眠模式?

         uint32_t(*identify)(uint32_t param);//識別sensor id

         uint32_t(*write_reg)(uint32_t param);//寫暫存器

         uint32_t(*read_reg)(uint32_t param);//讀暫存器

         /*Customfunction */

         uint32_t(*cus_func_1) (uint32_t param);//

         uint32_t(*get_trim) (uint32_t param);//這個函式入口在gc2235中是函式_gc2235_mipi_GetResolutionTrimTab的入口,該函式完成了gc2235的line_time、Pclk等也就是在結構體SENSOR_TRIM_T_PTR中定義的引數的寫入。

         /*ExternalIOCTL function *//   這些模組與BLK中的相應模組對應,通過函式控制功能的實現,在GC2235中沒有用到,它的ISP引數集中在sensor_gc2235_mipi_raw_param.c中,但在GC0309中一下函式入口均有與之對應的函式實現。具體功能不在分析。

         uint32_t(*ae_enable) (uint32_t param);//AEC使能?

         uint32_t(*hmirror_enable) (uint32_t param);//

         uint32_t(*vmirror_enable) (uint32_t param);//

         uint32_t(*set_brightness)(uint32_t param);//

         uint32_t(*set_contrast)(uint32_t param);//

         uint32_t(*set_sharpness)(uint32_t param);//

         uint32_t(*set_saturation)(uint32_t param);//

         uint32_t(*set_preview_mode)(uint32_t param);//設定預覽格式

         uint32_t(*set_image_effect)(uint32_t param);//

         //low16bits is resolution table index,hight 16bits is cap mode containing normal andHDR.

         uint32_t(*before_snapshort)(uint32_t param);//拍照前設定,更改模式等資訊,跟蹤程式碼發現這是拍照的入口程式,進入以後通過驅動的CMR模組(搞什麼的我還弄明白)與上層app互動(發message),到圖5所示的地方,就不明白他在幹啥了,可能與kernel的某些執行緒相關。總之就是拍照前可以在該函式中進行設定

                                                                            圖5

         uint32_t(*after_snapshort)(uint32_t param);//拍照後,將模式改回預覽。不懂的是gc2235的這個函式中又將fa寫00,難道是拍照過程中分頻了嗎?待續

         uint32_t(*flash)(uint32_t param);//

         uint32_t(*read_ae_value)(uint32_t param);//

         uint32_t(*write_ae_value)(uint32_t param);//

         uint32_t(*read_gain_value)(uint32_t param);//讀gain

         uint32_t(*write_gain_value)(uint32_t param);//

         uint32_t(*read_gain_scale)(uint32_t param);//

         uint32_t(*set_frame_rate)(uint32_t param);//

         uint32_t(*af_enable)(uint32_t param);//

         uint32_t(*af_get_status)(uint32_t param);//

         uint32_t(*set_wb_mode)(uint32_t param);//

         uint32_t(*get_skip_frame)(uint32_t param);//

         uint32_t(*set_iso)(uint32_t param);//

         uint32_t(*set_exposure_compensation)(uint32_t param);//

         uint32_t(*check_image_format_support)(uint32_t param);//

         uint32_t(*change_image_format)(uint32_t param);//

         uint32_t(*set_zoom)(uint32_t param);//

         /*CUSTOMERFUNCTION */

         uint32_t(*get_exif)(uint32_t param);//

         uint32_t(*set_focus)(uint32_t param);//

         uint32_t(*set_anti_banding_flicker)(uint32_t param);//

         uint32_t(*set_video_mode)(uint32_t param);//

         uint32_t(*pick_jpeg_stream)(uint32_t param);//

         uint32_t(*set_meter_mode)(uint32_t param);//

         uint32_t(*get_status)(uint32_t param);//

         uint32_t(*stream_on)(uint32_t param);// 主要控制MIPI的埠的使能,開mipi_en

         uint32_t(*stream_off)(uint32_t param);//主要控制MIPI的埠的使能,關mipi_en

} SENSOR_IOCTL_FUNC_TAB_T,*SENSOR_IOCTL_FUNC_TAB_T_PTR;

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

相關推薦

平臺 camera驅動分析sensor部分

展訊平臺其既用於功能機也用於智慧機。其65和66系列的平臺主要用於功能機,例如6530、6531、6500、6610、6620、6600L;68和88系列的平臺主要用於智慧機,例如SC6810、SC6820、SC6800、SC8820、SC8810。目前我們使用的樣機為SC

Unity Steam_VR 開發工具外掛 VRTK自帶案例分析第二部分

轉載至https://www.cnblogs.com/zerotoinfinity/p/6485556.html   DEMO 025_Controls_Overview 互動控制器: 真實版 UI 元素。所有型別的控制器都繼承自VRTK_Contro

Unity Steam_VR 開發工具外掛 VRTK自帶案例分析第一部分

轉至https://www.cnblogs.com/zerotoinfinity/p/6474840.html VRTK這個工具包提供了很多在Unity3d做VR開發中通用的VR功能,主要包括 1)具有別名的控制器按鈕事件 2)控制世界指標(鐳射指標) 3)玩家瞬間轉移 4)使用

PASCAL VOC資料集分析分類部分

VOC2007資料集共包含:訓練集(5011幅),測試集(4952幅),共計9963幅圖,共包含20個種類。 資料集的組成架構如下: Annotations —目標真值區域ImageSets —-類別標籤JPEGImages —–影象SegmentationClassSegmentationObje

ORBSLAM2學習:DBoW2原始碼分析OrbVocabulary部分

{(w1,weight1),(w2,weight2),...,(wn,weightn)}的形式,就對應著這裡的BowVector。BowVector派生自public std::map<WordId, WordValue>,實際上就是public std::map<int, double&g

PASCAL VOC資料集分析檢測部分

Pascal VOC 資料集介紹介紹Pascal VOC資料集:Challenge and tasks, 只介紹Detection與Segmentation相關內容。資料格式  Dataset衡量方式  Evaluationvoc2007, voc2012Challenge

Redis 原始碼分析zmalloc部分

Redis 2.8.24 Redis在這個版本使用三種選擇作為allocator, a) tcmalloc:一種比glibc 2.3更快的malloc實現,由google用於優化C++多執行緒應用而開發。Redis 需要1.6以上的版本。 b) jemalloc:第一次用

android平臺 重啟案例分析

./0000.log  watchdog重啟 01-02 02:01:02.458   551  1010 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.android.s

MTK平臺camera驅動架構分析

MTK6580 AndroidO(android8.1)版本camera 驅動分析 CAMERA驅動整個框架分為:三個部分hal部分邏輯呼叫,kernel層的通用驅動sensorlist.c 和具體IC的驅動xxxx_mipi_raw.c 這裡主要介紹kernel部分和HAL層部分。

平臺tp和lcd驅動除錯筆記

這些天在除錯展訊平臺上的tp和lcd驅動,這是一些小的總結。 螢幕出現豎條紋,(在視覺上給人的感覺是螢幕出現輕微的閃爍),這個可以調節vcom電壓,來調節這個電壓值,可以修復豎條紋. 但是無論怎麼修改都沒怎麼改善屏閃現象,可修改畫素點的翻轉方式,一般螢幕預設的翻轉方式是列

平臺 kernel重啟分析套路總結

一.初步定為分析 在ylog的phone.info中搜索關鍵詞 bootmode 例如: [ro.bootmode]: [panic] 可以確定是kenel panic導致的手機重啟  二.Kernel Panic的產生的原因 panic 是英文中是驚慌的

[SPRD]平臺 LCDMipi移植步驟及問題歸納

PortingGuide Backlight 背光的硬體設計有兩種情況: 1. 內建並聯背光 2. 外接串聯背光 對於 1 的情況,步驟如下: 1.移植對應的 lcd 驅動。 2.設定u-boot\drivers\video\sprdfb\sp

apigw鑒權分析1-4新浪微博開放平臺 - 鑒權分析

取消 spa 控制 server 信息 des 包含 flash poi 一、訪問入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博開放接口的

camera驅動分析

1. 核心的 camera 控制器驅動 和 sensor 驅動是基於 v4l2 驅動架構編寫的,應用程式可以使用 cimutils 進行測試   CIM 控制器驅動,基於 V4L2 架構,並採用 videobuf2。便於上層開發 drivers/media/platform

adb命令啟動平臺工廠模式

adb命令啟動展訊工廠模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity   其它系統應用啟動命令: 其他的一些應用啟動命令,如下所示: cale

微信公眾號平臺的現狀及發展前景的分析十八

一、基本資訊  標題:微信公眾號平臺的現狀及發展前景的分析  時間:2018  出版源:傳媒論壇  檔案分類:文獻筆記 二、研究背景   隨著移動網際網路科技的飛速發展和日趨成熟,新媒體越來越受到人們的關注。新媒體是相對於報刊、廣播、電視等傳統媒體而言發展起來的新的媒體形態,包括網路媒體、手機媒體

校園二手交易平臺的簡要分析純文件

校園二手交易平臺的簡要分析 摘要:校園二手市場就是建立在校園裡的提供學生們進行二手物品交易的場所。二手交易在大學校園裡面比較常見,一方面,大學生熱衷潮流,消費需求較旺盛,但也容易因為衝動購物而產生較多的閒置物品;另一方面,大部分大學生經濟未獨立,資金來源主要是依靠父母,

高通Camera驅動分析【轉】

1、Sensor slave配置 結構體msm_camera_sensor_slave_info定義在media/msm_cam_sensor.h中: struct msm_camera_sensor_slave_info { char sensor_name[32];

Android Alarm驅動原始碼分析Alarm.c

  前言: Android在Linux Kernel的基礎上增加了很多的驅動程式,Alarm驅動是其中最簡單的一個,整個檔案只有500多行。作為驅動程式碼分析的一系列文章的開始,我試圖仔細的分析此驅動的幾乎所有函式程式碼,希望籍此作為溫習Android驅動原始碼一個良好的開

[px3][Android7.1]除錯筆記RK LCD顯示驅動分析fb和screen 部分程式

平臺 核心版本 安卓版本 px3 Linux3.0 Android7.1 檢視裝置: ls /sys/devices/platform