1. 程式人生 > >*高通camera基本程式碼架構

*高通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、首先對照原理圖,檢查camera module的pin腳連線是否正確。

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

      (1)MCLK 為camera提供時鐘,給模組內部的pll使用。qualcomm平臺是24MHZ。broadcom平臺是26MHZ。

3、用萬用表測量Camera的電源管腳,檢視Camera的供電是否正常;     

    (2)AVDD 類比電路電源 2.8V ,正常情況下,AVDD需要單獨供電,電源紋波<=30mV.

          IOVDD/DOVDD/VIF:  Power support for IO circuits   1.8V

          DVDD 數位電路供電電源 1.2V,如果IOVDD是1.8V的話,推薦使用sensor internal DVDD.硬體上就不要做external DVDD,否則將會導致豎條紋問題的出現。

如果IOVDD是使用2.8V的話,則使用external DVDD,上電時序將改變。

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

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

  (4)PWDN/standby:power down引腳,切斷供電。即powerdown 有效時,camera 為不工作模式。PWDN一般是高有效,當脈衝為高時,進入省電模式,而正常工作時為低。、powe rdown 有效極性。pwdn高有效就是說pwdn為高電平的時候進入power down模式,所以在進入預覽介面的時候就要把pwdn拉低。這樣camera才能進入正常工作狀態

 (5) XCLR is reset input signal and power OFF of internal  core, camera become standby situation.(Low active)

      XCLR=”H”:Usually situation    XCLR=”L”:Reset situation   

(6) XSHUTDOWN:reset and power down(active low with internal pull down resistor) hardware reset

(7) sony sensor has the build in power on reset function.It automatically initializes the internal circuit by itself  when XCLR pin is open and the power supplies are brought up.In addition,if XCLR pin is set to low and the power supplies are bring up.The sensor will skip executing the power on reset function.

4、在Camera的Datasheet中找出該裝置的I2C地址,檢查I2C配置是否正確;通常Camera Sensor的Spec上所寫的I2C ID號,還包含了最後一位讀寫方向位。而這一位在I2C匯流排的定義中,嚴格來說,不屬於ID的一部分,所以Linux I2C的驅動API中的呼叫引數裡的ID號,通常是不考慮這一位的,讀寫方向位會在具體的讀寫操作中,在暫存器中進行設定。

5、檢視I2C通訊是否正常,是否能正常進行讀寫,用示波器量出I2C的SCL和SDA的波形是否正常,未通訊時都為高電平,通訊時SCL為I2C時鐘訊號,SDA為I2C資料通路訊號; 

6、讓Sensor FAE檢查Camera的暫存器列表的配置是否正確。

    高通平臺對於camera的程式碼組織,大體上還是遵循Android的框架:即上層應用和HAL層互動,高通平臺在HAL層裡面實現自己的一套管理策略;在kernel中實現sensor的底層驅動。對於最核心的sensor端的底層設定、ISP效果相關等程式碼則是單獨進行了抽離,放在了一個daemon程序中進行管理。

圖1 kernel層camera主要程式碼簡圖

如上圖,camera在kernel層的主檔案為msm.c,負責裝置的具體註冊及相關方法的填充;在msm_sensor.c檔案中,主要維護高通自己的一個sensor相關結構體—msm_sensor_ctrl_t,同時把dts檔案中的配置資訊讀取出來;kernel層對於不同的sensor對應自己的一個驅動檔案— xxsensor.c,主要是把power setting的設定填充到msm_sensor_ctrl_t中。    

    在vendor目錄下,高通把各個sensor實質性的程式碼放置在此。一部分程式碼是高通自己實現的daemon程序和kernel層及HAL層進行通訊的框架程式碼;另一部分則是和sensor相關的chromatix效果程式碼和sensor lib部分程式碼(init setting、lens info、output info)。

圖2 vendor下主要camera程式碼簡圖

如上圖,高通平臺通過一個函式指標陣列sub_module_init來管理sensor相關的元件;其中重要的是sensor_sub_module_init和chromatix_sub_module_init模組,對於sensor模組需要對應填充sensor_lib_t下的介面,對於chromatix模組則是通過高通的chromatix工具生成。

    從更高的層次來看,sensor部分的程式碼只是camera子系統的一部分。開啟高通vendor下面關於camera的原始碼也可以看到,/mm-camera2/media-controller/modules目錄下面,sensors只是modules檔案下面其中的一個子目錄。

2  主要移植步驟

2.1  kernel層程式碼移植

1.  在./kernel/arch/arm/boot/dts/msm8226-camera-sensor-qrd.dtsi中新增camera節點,重點關注節點中的IIC地址、sensro的ID資訊、電壓設定資訊:

qcom,[email protected] { //21 is the I2C slave Id of the imx214 

  compatible = "qcom,imx214"; //same as the sensor name used in the project

  reg = <0x21>;
  qcom,slave-id = <0x20 0x0016 0x0214>; //sensor id
  qcom,csiphy-sd-index = <0>;
  qcom,csid-sd-index = <0>;
  qcom,actuator-src = <&actuator1>;
  qcom,led-flash-src = <&led_flash0>;
  qcom,eeprom-src = <&eeprom4>;
  qcom,mount-angle = <90>; // 90 for rear camera and 270 for front camera
  qcom,sensor-name = "imx214";//
 unique sensor name to differentiate from other sensor

  cam_vdig-supply = <&pm8226_l5>;// defined in ./kernel/arch/arm/boot/dts/msm8226-regulator.dtsi
  cam_vana-supply = <&pm8226_l15>;
  cam_vio-supply = <&pm8226_lvs1>;
  cam_vaf-supply = <&pm8226_l18>;
  qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana","cam_vaf";
  qcom,cam-vreg-type = <0 1 0 0>; // 0 for LDO and 1 for LVS
  qcom,cam-vreg-min-voltage = <1100000 1800000 2800000 2950000>;
  qcom,cam-vreg-max-voltage = <1100000 1800000 2800000 2950000>;
  qcom,cam-vreg-op-mode = <120000 0 200000 600000>;
  qcom,gpio-no-mux = <0>;
  gpios = <&msmgpio 26 0>,
      <&msmgpio 37 0>,
      <&msmgpio 36 0>,
      <&msmgpio 15 0>;
  qcom,gpio-reset = <1>;
  qcom,gpio-standby = <2>;
  qcom,gpio-af-pwdm = <3>;
  qcom,gpio-req-tbl-num = <0 1 2 3>;
  qcom,gpio-req-tbl-flags = <1 0 0 0>;
  qcom,gpio-req-tbl-label = "CAMIF_MCLK",
                "CAM_RESET1",
                "CAM_STANDBY",
                "CAM_AF_PWDM";
  qcom,csi-lane-assign = <0x4320>;
  qcom,csi-lane-mask = <0x1f>;
  qcom,sensor-position = <0>; // 0 for rear camea and 1 for front camera
  qcom,sensor-mode = <0>; // 0 for bayer format and 1 for yuv format
  qcom,cci-master = <0>;
  status = "ok";
  }; 

詳細的文件請參考 ./kernel/Documentation/devicetree/bindings/media/video/目錄。

2.增加以下檔案./kernel/drivers/media/platform/msm/camera_v2/sensor/imx214.c

+static struct msm_sensor_power_setting imx214_power_setting[] = {
+ {
+ .seq_type = SENSOR_VREG,
+ .seq_val = CAM_VIO,
+ .config_val = 0,
+ .delay = 1,
+ },
+ {
+ .seq_type = SENSOR_VREG,
+ .seq_val = CAM_VANA,
+ .config_val = 0,
+ .delay = 1,
+ },
+ {
+ .seq_type = SENSOR_VREG,
+ .seq_val = CAM_VDIG,
+ .config_val = 0,
+ .delay = 1,
+ },
+ {
+ .seq_type = SENSOR_VREG,
+ .seq_val = CAM_VAF,
+ .config_val = 0,
+ .delay = 5,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_STANDBY,
+ .config_val = GPIO_OUT_LOW,
+ .delay = 1,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_RESET,
+ .config_val = GPIO_OUT_LOW,
+ .delay = 5,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_AF_PWDM,
+ .config_val = GPIO_OUT_LOW,
+ .delay = 5,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_STANDBY,
+ .config_val = GPIO_OUT_HIGH,
+ .delay = 5,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_RESET,
+ .config_val = GPIO_OUT_HIGH,
+ .delay = 10,
+ },
+ {
+ .seq_type = SENSOR_GPIO,
+ .seq_val = SENSOR_GPIO_AF_PWDM,
+ .config_val = GPIO_OUT_HIGH,
+ .delay = 5,
+ },
+ {
+ .seq_type = SENSOR_CLK,
+ .seq_val = SENSOR_CAM_MCLK,
+ .config_val = 24000000,
+ .delay = 10,
+ },
+ {
+ .seq_type = SENSOR_I2C_MUX,
+ .seq_val = 0,
+ .config_val = 0,
+ .delay = 0,
+ },
+};

3.在以下檔案中新增對imx214的支援

 ./kernel/arch/arm/configs/msm8226_defconfig

+CONFIG_IMX214=y

4./kernel/drivers/media/platform/msm/camera_v2/Kconfig

+config IMX214
+ bool "Sensor IMX214 (BAYER 13M)"
+ depends on MSMB_CAMERA
+ ---help---
+ Sony 12 MP Bayer Sensor with auto focus, uses
+ 4 mipi lanes, preview config = 2104 x 1560 at 49 fps,
+ snapshot config = 4208 x 3120 at 24 fps,
+ Video HDR support.

5、./kernel/drivers/media/platform/msm/camera_v2/sensor/Makefile

+obj-$(CONFIG_IMX214) += imx214.o

6、註冊時鐘./kernel/arch/arm/mach-msm/clock-8226.c 

@@ -3421,6 +3421,11 @@ static struct clk_lookup msm_clocks_8226[] = {
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "0.qcom,camera"),
CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "1.qcom,camera"),

+ CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "21.qcom,camera"),
+ CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "21.qcom,camera"),

2.2  vendor下程式碼移植

    Vendor下面的程式碼主要是兩部分,一個是sensor_libs目錄下的sensor具體設定、配置檔案,另一個是chromatix下面的ISP效果檔案。具體為:

1. ./vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/imx214/imx214_lib.c

+/*===========================================================================
+ * FUNCTION - imx214_open_lib -
+ *
+ * DESCRIPTION:
+ *==========================================================================*/
+void *imx214_open_lib(void)
+{
+ return &sensor_lib_ptr;
+}

This lib will be loaded when camera deamon process is started, kernel will find the handle based on the sensor name in dtb(device tree binary file), so please make sure the file name and function name follow the request for your sensor. 

<your_sensor_name>/<your_sensor_name>_lib.c 
void *<your_sensor_name>_open_lib(void)

sensor輸出設定

static struct sensor_lib_out_info_t sensor_out_info[] = { 

/* vt_pixel_clk = .line_length_pclk* frame_length_lines*frame rate */
/* op_pixel_clk = VFE working clk */

....

}

2.  chromatix目錄下相關檔案,在對應sensor目錄下包含4個目錄和一個Android檔案,總共13個檔案,這些檔案都會由chromatix除錯工具生成。

圖8  vendor下chromatix相關檔案示例圖

3. vendor下還有eeprom檔案,模組自帶的eeprom資料處理相關;AF相關檔案,除錯工具生成的關於AF的效果檔案;配置檔案,把需要編譯的模組填進配置檔案中。

Acuator porting 

./kernel/drivers/media/video/msm/actuators/actuator.c

msm_actuator_ctrl_t contains all the information about the actuator setting related to sensors like 
i2c addr, set_info, focal length, etc. All the info is loaded from the chromatix file for the sensor.

In af header file, the driver engineer should take care of the structure of actuator_params_t, which contains the af drive ic address, register patten, etc. It is important for AF working.

3  除錯常見問題

3.1  kernel和vendor下命名匹配

    在參考其他程式碼移植除錯一個新sensor的過程中,要注意在對應的dts檔案中給sensor配置節點資訊的過程中,“qcom,sensor-name”欄位的配置要和vendor下面的sensor lib程式碼中的“xxx_open_lib”函式名以及對應的Android.mk中的“LOCAL_MODULE”名稱匹配,否則相應sensor的vendor下庫檔案無法呼叫,這時開啟camera會出現閃退現象。具體可參考平臺程式碼sensor.c中的sensor_load_library()函式。

圖10  camera name匹配詳圖

3.2  sensor lib中的sensor_lib_out_info_t填充

    一般來說,每個sensor可以配置輸出不同大小的影象。此時,除了進行對應的sensor setting來改變sensor自身的輸出及相關配置外;還需要將相關的輸出大小、幀率等資訊通知平臺端,即填充struct sensor_lib_out_info_t結構體。

圖11 高通平臺獲取sensor資訊框圖

填充的這個sensor_lib_out_info_t中的成員,最終會作為sensor基本資訊的一部分被HAL層獲取到,上圖為高通平臺獲取sensor資訊的一個簡單框圖。

    在除錯過程中,需要注意的是這個結構體的成員max_fps需要填寫至少大於等於30;否則會因為在獲取capability時無法得到有效的previewsize、video size而無法進入預覽。具體可參考平臺程式碼mct_pipeline.c中的mct_pipeline_populate_query_cap_buffer()函式。

3.3  sensorlib中的exposure_table_size填寫

    對於sensor端輸出RAW資料,平臺端進行ISP處理的情形來說,sensor端除了基本的init配置外,另外一個就是根據平臺端AEC計算出來的資料來對應調整sensor的曝光。在高通平臺上將平臺端的AEC和具體的sensor曝光設定聯絡起來的是chromatix檔案中的一個Exposure Table和sensor lib檔案中的exposure對應介面。

    這裡的exposure_table_size對應著sensor lib中sensor_fill_exposure_array()介面寫入的sensor暫存器的個數,平臺程式碼中需要根據這個exposure_table_size來動態分配記憶體大小。如果這個值的填寫和sensor_fill_exposure_array()中實際寫入的值大小不一致,就會造成記憶體方面的crash。具體可參考平臺程式碼sensor.c中的sensor_apply_exposure()函式。

3.4  kernel 層非常規設定

    對於一些sensor來說,對於電壓的設定或是MCLK的設定有非常規要求的時候,可能就需要修改平臺上相關的預設設定。

    對於sensor的幾路工作電壓 (AVDD、DVDD、IOVDD),平臺端一般都是通過PMIC的相應regulator供電,而硬體上regulator的輸出能力一般都有限制,程式碼上也會有體現。如果有sensor需要的電壓超過程式碼上相應regulator的限制值,可以檢視PMIC上的說明,如果程式碼上的限制值並不是硬體的真正極限,可以修改平臺程式碼解決。

    對於MCLK的設定,高通平臺有一些常規的值設定。如果sensor有特殊要求,而這個MCLK不能被平臺識別,這時候可以在平臺的clock相關程式碼中,通過配置平臺的PLL引數來生成特定的MCLK時鐘給sensor使用。

相關推薦

camera基本程式碼架構

Camera原理:外部光線穿過lens後,經過color filter濾波後照射到sensor面上,sensor將從lens上傳到過來的光線轉換成電訊號,再通過內部的AD轉換為數字訊號,如果sensor沒有整合DSP,則通過DVP的方式傳輸到baseband,此時的資料

camera基本程式碼架構

Camera原理:外部光線穿過lens後,經過color filter濾波後照射到sensor面上,sensor將從lens上傳到過來的光線轉換成電訊號,再通過內部的AD轉換為數字訊號,如果sensor沒有整合DSP,則通過DVP的方式傳輸到baseband,此時的資料格

camera架構講解

Camera原理:外部光線穿過lens後,經過color filter濾波後照射到sensor面上,sensor將從lens上傳到過來的光線轉換成電訊號,再通過內部的AD轉換為數字訊號,如果sensor沒有整合DSP,則通過DVP的方式傳輸到baseband,此時的資料格式是RAW DATA。必須通過平

CAMERA 除錯

Camera sensor bring up 2016年08月12日 13:14:19 tamell5555 閱讀數:4083 標籤: android 眾所周知,camera在我們生活中應用十分廣泛,在未來智慧硬體社會,camera就是裝置的眼睛,它的

camera模組驅動指南資料介紹

本資料提供了攝像機感測器和相關模組的驅動程式開發指南,並描述瞭如何在MSM 8909、MSM 8916、MSM 8992、MSM 8994和MSM8x36 Android平臺。 攝像機感測器框架包括以下元件的配置: Sensor CSIPHY CSID Camera Co

Camera驅動分析【轉】

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

Camera 驅動除錯要點(一)

本文主要介紹QCOM camera除錯的重要引數; (1)Lane_assign 和lane_mask    現在攝像頭基本都是mipi介面型別,因為前後攝都對應到平臺這邊不同的mipi介面,相應的資料lane需要一一對應;   lane assign:   lan

camera如何匹配I2C匯流排

1、dts配置 cci: qcom,[email protected] { compatible = "qcom,cci"; ... pinctrl-names = "cci_default

Camera框架--資料流淺談01

    本文重點:stagefrightRecorder.cpp    OMXCodec.cpp   MPEG4Writer.cpp  CameraSource.cpp 之間的呼叫關係 =======================

camera bring up軟體流程

高通camera bring up分為兩種型別:YUV和bayer bring up yuv sensor1、kernel空間1) vim kernel/driver/media/platform/msm/camera_v2/sensor新增sensor驅動檔案-可參考其

linux驅動由淺入深系列:camera驅動之二(基於平臺的V4L2結構及程式碼分析)

在上一篇文章中介紹了camera的基礎知識和相關概念,我們一起來了解一下驅動相關的程式碼結構。本文以高通+android平臺為示例,首先看一下整體框圖:這張圖是從整體上來看的1,圖中最下面的是kernel層的驅動,其中按照V4L2架構實現了camera sensor等驅動,向

Camera安卓原始碼-mm_camera架構剖析

主要涉及三方面: 1. Camera open 2. Camera preview 3. Camera capture 1. Camera Open mm_camera&mm_camera_open() 首先,mm_camera層

ARM Cortex-A7架構210系列-MSM8909

大廠 制作 平板電腦 客戶端 維護 電阻 電腦 .cn 其它 核心板特性 A7架構 4核(4*1.1GHz(A7)) 產品尺寸小,便於客戶集成,減少產品體積; 支持4G LTE超高速上網,單板兼容移動/聯通/電信2G/3G/4G; 支持2+32存儲器,Micro SD支持

程式碼編譯

1 單獨編譯 LK make aboot –j8 生成在 LINUX/android/out/target/product/msm8909/emmc_appsboot.mbn 2 編譯bootimg make bootimage -j8 生成在 LINUX/andr

平臺新增或者移植一個完整的camera

OV8865 1、kernel部分: A、kernel_driver: 把驅動檔案ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/camera_v2/sensor/目錄下 B、kernel_dt

apps程式碼上傳perforce伺服器問題

   專案中高通的linux原始碼上傳perforce伺服器的問題,真是搞慫了,主要問題有以下幾個: PS:perforce伺服器真心不好用。。 1. linux下的perforce  workspace不顯示隱藏檔案,所以上傳的時候,不能將隱藏檔案上傳。      解決

(2)AP10.4開發者指南——WLAN(1.2 WLAN軟體架構

1.2 WLAN軟體架構 WLAN驅動層被封裝成數個部分,每個部分都提供了API,方便使用者定製自己的AP軟體和進行二次開發。 圖1-3 WLAN軟體整體架構說明 1.2.1 硬體抽象層(HAL) 硬體抽象層(HAL)是驅動和硬體晶片之間的連線部

820(msm8996)camera hal原始碼分析

之前閱讀過高通的camera的v4l2的driver,和video codec的driver,還沒有分享出原始碼架構圖。現在首先先分享出camera hal的原始碼架構圖吧,高通的hal可以使用hal1和hal3. 一,在hardware/qcom/camera下是高通的c

linux驅動由淺入深系列:sensor架構例項分析之一

本系列導航: 最初的時候晶片廠家對sensor的處理和對待其它外設一樣都是直接掛在processor上,sensor的驅動也和其他linux或android的驅動一樣,生成對應的裝置節點給上層提供資料(關於此類linux基礎驅動的知識,可以參考本部落格其他博文)

Android 8.0 程式碼預製apk可解除安裝,恢復出廠設定apk可恢復

1:做個指令碼去實現拷貝APK都data/app目錄下面:#!/vendor/bin/shsleep 1cp /system/pre_install/RunUiTest/RunUiTest.apk /data/app/chmod 777 /data/app/RunUiTest