qualcomm platform camera porting

來源:互聯網
上載者:User

標籤:

轉載自http://www.cnblogs.com/thjfk/p/4086001.html

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使用。

qualcomm platform camera porting

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.