1. 程式人生 > >在高通平臺新增或者移植一個完整的camera

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

OV8865

1、kernel部分:

A、kernel_driver:

把驅動檔案ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/camera_v2/sensor/目錄下

B、kernel_dtsi: 把如下板級資訊加到 kernel/arch/arm/boot/dts/msm8610-qrd-camera-sensor.dtsi檔案中 actuator1: qcom,[email protected] {        cell-index = <4>;        reg = <0x18>;        compatible = “qcom,actuator”;        qcom,cci-master = <0>; }; eeprom0:qom,
[email protected]
{        cell-index = <0>;        reg = <0x2b 0x0>; … …        }; qcom,[email protected] {        compatible = “qcom,ov8865_qtech”;        reg = <0x7f>;        qcom,slave-id = <0x6c 0x300b 0x8865>;        qcom,csid-sd-index = <0>;        qcom,actuator-src = <&actuator1>;        qcom,eeprom-src = <&eeprom0>; qcom,led-flash-src = <&led_flash0>;        qcom,mount-angle = <90>;        qcom,sensor-name = “ov8865_qtech”; cam_vdig-supply = <&pm8110_l7>; cam_vana-supply = <&pm8110_l19>; cam_vio-supply = <&pm8110_l14>; qcom,cam-vreg-name = “cam_vdig”, “cam_vio”, “cam_vana”; qcom,cam-vreg-type = <0 0 0>; qcom,cam-vreg-min-voltage = <1500000 1800000 2850000>; qcom,cam-vreg-max-voltage = <1500000 1800000 2850000>; qcom,cam-vreg-op-mode = <200000 200000 100000>; qcom,gpio-no-mux = <0>; gpios = <&msmgpio 13 0>, <&msmgpio 21 0>, <&msmgpio 20 0>,                         <&pm8110_gpios 2 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; qcom,gpio-vdig = <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_VDIG”; qcom,csi-lane-assign = <0xe4>; qcom,csi-lane-mask = <0x3>; qcom,sensor-position = <0>; qcom,sensor-mode = <1>; qcom,cci-master = <0>;

};

C、kernel-clock:

這部分主要是針對 B 的,增加一些I2C地址

如下程式碼斷:

— a/arch/arm/mach-msm/clock-8610.c

+++ b/arch/arm/mach-msm/clock-8610.c

@@ -3033,6 +3033,7 @@ static struct clk_lookup msm_clocks_8610[] = {

  CLK_LOOKUP(“cam_src_clk”, mclk0_clk_src.c, “6-0020”),

  CLK_LOOKUP(“cam_src_clk”, mclk0_clk_src.c, “6-006a”),

  CLK_LOOKUP(“cam_src_clk”, mclk1_clk_src.c, “6-0048”),

+ CLK_LOOKUP(“cam_src_clk”, mclk0_clk_src.c, “6-006c”),  //front camera is mclk1_clk_src.c     back camera is mclk0_clk_src.c

  CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-006f”),

  CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-0034”),

  CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-007d”),

@@ -3042,6 +3043,7 @@ static struct clk_lookup msm_clocks_8610[] = {

  CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-0020”),

  CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-006a”),

  CLK_LOOKUP(“cam_clk”, mclk1_clk.c, “6-0048”),

+ CLK_LOOKUP(“cam_clk”, mclk0_clk.c, “6-006c”),

D、把C檔案加到Makefile

— a/drivers/media/platform/msm/camera_v2/sensor/Makefile

+++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile

@@ -22,3 +22,4 @@ obj-y += gc2035.o

 #obj-$(CONFIG_SP1628) += sp1628.o

 obj-$(CONFIG_GC0339) += gc0339.o

 obj-$(CONFIG_HM1090) += HM1090.o

+obj-y +=ov8865_qtech_f8865ac.o

kernel部分就這麼多了,此時可以先編譯一個bootimage看看能不能編譯過。

2、vendor部分

這一部分主要包括:效果(chromatix)、馬達AF驅動(actuators)、庫檔案(sensor_libs)

A、效果(chromatix):把chromatix_ov8865_qtech_f8865ac整個資料夾放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0301/libchromatix/下

B、馬達AF驅動(actuators) :把af_main_cam_camcorder_6.h、af_main_cam_camera_6.h  AF標頭檔案放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/0301/目錄下。

同時做如下工作:

— a/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c +++ b/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c @@ -13,7 +14,7 @@ -static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = { +static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][7] = { @@ -21,6 +22,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {    #include “af_main_cam_camera_2.h”    #include “af_main_cam_camera_3.h”    #include “af_main_cam_camera_4.h”    #include “af_main_cam_camera_5.h” +  #include “af_main_cam_camera_6.h” @@ -29,6 +31,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {    #include “af_main_cam_camcorder_2.h”    #include “af_main_cam_camcorder_3.h”    #include “af_main_cam_camcorder_4.h”    #include “af_main_cam_camcorder_5.h” +  #include “af_main_cam_camcorder_6.h”  }  };

在af_main_cam_camcorder_6.h中會有af_header_info_t:

如下:

    /* af_header_info_t */

    {

      /* header_version */

      0x301,

      /* cam_name */

      ACTUATOR_MAIN_CAM_6,

      /* module_name */

      “ov8865”,

      /* actuator_name */

      “BU64243GWZ”,

    }, /* af_header_info_t */

其中ACTUATOR_MAIN_CAM_6這個需要在kernel中定義,在kernel/include/media/msm_cam_sensor.h檔案中新增ACTUATOR_MAIN_CAM_6

enum af_camera_name { ACTUATOR_MAIN_CAM_0, ACTUATOR_MAIN_CAM_1, ACTUATOR_MAIN_CAM_2, ACTUATOR_MAIN_CAM_3, ACTUATOR_MAIN_CAM_4, ACTUATOR_MAIN_CAM_5, ACTUATOR_MAIN_CAM_6 ACTUATOR_WEB_CAM_0, ACTUATOR_WEB_CAM_1, ACTUATOR_WEB_CAM_2, };

C、庫檔案(sensor_libs) :把ov8865_qtech_f8865ac整個資料夾放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/目錄下

D、把相關檔案新增到config中,如下:

— a/common/config/device-vendor.mk

+++ b/common/config/device-vendor.mk

@@ -526,6 +526,7 @@ MM_CAMERA += libmmcamera_s5k3l1yx

 +MM_CAMERA += libmmcamera_ov8865_qtech                                                                     //庫檔案

 MM_CAMERA += libmmcamera_SKUAA_ST_gc0339

@@ -617,6 +618,10 @@ MM_CAMERA += libchromatix_ov8825_7853f_snapshot

 MM_CAMERA += libchromatix_ov8825_7853f_zsl

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_snapshot                                      //效果檔案

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_preview

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_common

+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_default_video

 MM_CAMERA += libchromatix_SKUAA_ST_gc0339_common

 @@ -640,6 +645,7 @@ MM_CAMERA += libchromatix_skuf_ov5648_p5v23c_preview

  MM_CAMERA += libmmcamera_truly_cm7700_eeprom

+MM_CAMERA += libmmcamera_qtech_f8865ac_eeprom                                                          //e2prom檔案

 MM_CAMERA += libmmcamera_sunny_p12v01m_eeprom

編systemimage.img驗證

1  camera基本程式碼架構       高通平臺對於camera的程式碼組織,大體上還是遵循Android的框架:即上層應用和HAL層互動,高通平臺在HAL層裡面實現自己的一套管理策略; 在kernel中實現sensor的底層驅動。但是,對於最核心的sensor端的底層設定、ISP效果相關等程式碼則是單獨進行了抽離,放在了一個 daemon程序中進行管理:       由於高通把大部分具體的設定及引數放到了daemon程序中,所以在kernel部分只是進行了V4L2的設備註冊、IIC設備註冊等簡單的動作:       如上圖,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)。       如上圖,高通平臺通過一個函式指標陣列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層程式碼移植    對於kernel層的程式碼移植,實際上對dts檔案的移植。因為kernel層驅動程式碼基本已經被高通的框架以及vendor下程式碼架空,只剩下一個上電的列表。具體步驟為: 1.  在目錄kernel/arch/arm/boot/dts/下的對應dtsi檔案中新增camera節點,主要關注節點中的IIC地址、sensro的ID資訊、電壓設定資訊: 2.在目錄kernel/drivers/media/platform/msm /camera_v2/sensor/目錄新增xxsensor.c檔案,主要填充msm_sensor_power_setting結構 體:sensor上電的包含的引腳設定和電壓設定,具體格式可以參考同目錄下的其他檔案。 3.  kernel下面的相關mk檔案: 其他:如果sensor中帶有eeprom,需要在dts檔案中增加eeprom的節點資訊;同樣,sensor帶有對焦功能,需要在dts檔案中增加actuator節點資訊;對於帶eeprom的sensor,還需要配置eeprom的時鐘控制程式碼(有待研究)。 2.2  vendor下程式碼移植     Vendor下面的程式碼主要是兩部分,一個是sensor_libs目錄下的sensor具體設定、配置檔案,另一個是chromatix下面的ISP效果檔案。具體為: 1. sensor_libs目錄下檔案:包括一個android.mk檔案和一個.c檔案。其中Android.mk檔案參考同目錄下其他.mk檔案修改和對應sensor有關設定即可;.c檔案中需要填充的為一個sensor_lib_t型別的結構體: 2.  chromatix目錄下相關檔案,在對應sensor目錄下包含4個目錄和一個Android檔案,總共13個檔案,這些檔案都會由chromatix除錯工具生成。下面為IMX179檔案例項: 3. vendor下還有eeprom檔案,模組自帶的eeprom資料處理相關;AF相關檔案,除錯工具生成的關於AF的效果檔案;配置檔案,把需要編譯的模組填進配置檔案中。