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&
【Android Camera】Camera OTP内置校准方法
最新推荐文章于 2022-12-11 22:39:05 发布