【Android Camera】Camera OTP内置校准方法

Camera OTP内置校准方法
本文章主要HI556进行的内置校准总结整理而来.
约定: 注解及/**/中为对相应操作的注解
概要:添加一个Sensor的OTP驱动主要需要完成Kernel, Vendor层的工作.如下:
一,Kernel部分:
     1,Kernel部分dts文件主要完成,包括OTP的上电,对memory map表的配置,eeprom的指定等.
           2,另根据sensor的OTP读写情况,是否添加读取OTP读取C代码.
二,Vendor部分:
     1,Vendor部分主要完成对从kernel读取到的数据的格式化校准工作.
           2,需要根据模组厂商提供的OTP数据对读到的数据进行格式化校准,从而得到最终需要的数据填入平台端提供的接口,以供平台校准写入Sensor进行内置校准.或写入平台端进行平台校准.
      3,打开Sensor中配置OTP.
具体步骤参考
一 OTP数据的读取.
    在进行OTP数据校准之前,首先需要读取得到模组厂商写入模组内部的OTP数据,这部分工作主要在kernel中进行.需要完成的工作为:
1, dts文件的配置.主要包括memory map 表的配置填写,eeprom上下电的配置,eeprom name的填写以及i2c地址的正确填写.
    A.map表的配置
    map表是反应数据在OTP中的存储及对OTP进行读写操作的直观表现.在内核代码msm_eeprom.c函数msm_eeprom_parse_memory_map中会去获取dts里配置的memory map情况,然后按照获取到的memory情况在函数read_eeprom_memory中去读取eeprom的值并存入buffer中.所以对OTPmap表的配置就直接影响到能否读到OTP数据以及读到的数据是否正确.
          /*指定总共有一个block*/
          qcom,num-blocks = <1>;
           /*配置block0相关的参数*/
           qcom,page0 = <0 0x0100 2 0x01 1 1>;
           qcom,poll0 = <0 0x0 2 0x0 1 0>;
           qcom,mem0 = <0x150C 0x401 2 0x0 1 0>; /*OTP中的数据大小配置,将用于申请对应大小的内存*/
注: 内核说明文档对对dts文件map表的配置做了详细介绍,具体阅读下边文档:
kernel/msm-3.18/Documentation/devicetree/bindings/media/video/msm-eeprom.txt
    B. eeprom上下电的配置.
    eeprom在进行读写前后内核代码中回去进行上下电的操作,而因为eeprom不论是内置在sensor还是外挂的memory都是直接接在sensor上的,与sensor共用I2C总线,共用电源系统,所以只需要原封不动的按照sensor的供电配置就可以.
    主要电源配置:
            cam_vdig-supply = <&pm8916_l2>; /*数字电,根据硬件设置*/
            cam_vio-supply = <&pm8916_l6>; /*IO电,根据硬件设置*/
            cam_vana-supply = <&pm8916_l10>; /*模拟电,根据硬件设置*/
    /*为以上供电电源指定name*/
            qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
            qcom,cam-custom-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
    /*为以上电源指定电压*/
            qcom,cam-vreg-type = <0 0 0>;
            qcom,cam-vreg-min-voltage = <1200000 0 2800000>;
            qcom,cam-vreg-max-voltage = <1200000 0 2850000>;
    /*以下为GPIO控制的硬件设置参数, gpios为的使用情况*/
            gpios = <&msm_gpio 26 0>, /*gpio26为clk*/
                  <&msm_gpio 17 0>,
               <&msm_gpio 34 0>;
            qcom,gpio-reset = <1>; /*gpio17为reset*/    /*clk在此处不许配置*/
            qcom,gpio-standby = <2>; /*gpio34为standby*/
            qcom,gpio-req-tbl-num = <0 1 2>; /*内核代码将根据这个tbl_num来判断有几个gpio*/
            qcom,gpio-req-tbl-flags = <1 0 0>;
            qcom,gpio-req-tbl-label = "CAMIF_MCLK",/*gpio lab,在gpio_request时候使用*/
                 "CAM_RESET1",
                 "CAM_STANDBY";
注:这里的几路电源都是PMIC的LDO供电,不同项目硬件连接不用,可能是外接LOD采用gpio来进行控制,那么就需要在下边gpio这里添加供电情况.
    C. I2C地址及name的指定
    /*0x50为这颗sensor的I2C地址,指定eeprom_name为hi556_DMEGC */
            eeprom1: qcom,eeprom@0x50 {
                  cell-index = <0>;
                  reg = <0x50>;
                  compatible = "qcom,eeprom";
                  qcom,eeprom-name = "hi556_DMEGC";
                  qcom,slave-addr = <0x50>
        
注:内置OTP的I2C地址与sensor的地址相同,如果是外挂的OTP则不同,另外这里指定的name需要与用户空间,也就是vendor下指定的name相同.
    D. 在对应的Camera的dts节点中指定eeprom.
        qcom,eeprom-src = <&eeprom0 &eeprom1>;
注:因为这里同一个sensor存在一供与二供,所以这里兼通一供二供OTP数据在这里有两个,分别为一供和二供.
具体代码提交为:
--- a/arch/arm/boot/dts/qcom/msm8909-camera-sensor-cdp.dtsi
+++ b/arch/arm/boot/dts/qcom/msm8909-camera-sensor-cdp.dtsi
@@ -85,6 +85,57 @@
                qcom,clock-rates = <24000000 0>;
        };
 
+       eeprom1: qcom,eeprom@0x50 {
+               cell-index = <0>;
+               reg = <0x50>;
+               compatible = "qcom,eeprom";
+               qcom,eeprom-name = "hi556_DMEGC";
+               qcom,slave-addr = <0x50>;
+               qcom,cci-master = <0>;
+               qcom,num-blocks = <1>;
+
+               qcom,page0 = <0 0x0100 2 0x01 1 1>;
+               qcom,poll0 = <0 0x0 2 0x0 1 0>;
+               //qcom,mem0 = <0x36 0x401 2 0x0 1 0>;
+               qcom,mem0 = <0x150C 0x401 2 0x0 1 0>;
+
+               cam_vdig-supply = <&pm8916_l2>;
+               cam_vio-supply = <&pm8916_l6>;
+               cam_vana-supply = <&pm8916_l10>;
+               qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
+               qcom,cam-custom-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
+               qcom,cam-vreg-type = <0 0 0>;
+               qcom,cam-vreg-min-voltage = <1200000 0 2800000>;
+               qcom,cam-vreg-max-voltage = <1200000 0 2850000>;
+               qcom,cam-vreg-op-mode = <200000 0 80000>;
+               pinctrl-names = "cam_default", "cam_suspend&

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值