Camera EEPROM bringup

OTP(One Time Programmable)是一种存储器类型,意思是一次性可编程:程序烧入之后,将不可再次更改和清除。
OTP的作用:sensor OTP是用来保证每个sensor一致性的一些校准数据。比如模组厂生产了一批模组,由于外部因素导致这些模组或多或少存在一些差异。模组厂就会挑选出最接近一批中间值的模组,称之为golden,然后将其他模组的相关参数校准到和golden一致。
OTP一般用来储存lens shading Calibration信息,AWB参数,AF参数、OIS参数、PDAF参数和模组的相关信息(模组的生产年月,模组ID)等。
OTP常用的两种方法:
1.OTP数据烧录在sensor本身的芯片中。该方法不需要额外的储存器件,但是储存空间较小,不适合较大数据。
2.OTP数据放在EEPROM中:
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片
该方法需要专门的EEPROM驱动程序。
 

如下为EEPROM的xml部分配置信息:

1.OTP数据烧录在sensor本身的芯片中。该方法不需要额外的储存器件,但是储存空间较小,不适合较大数据。
2.OTP数据放在EEPROM中:
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片
该方法需要专门的EEPROM驱动程序。

如下为EEPROM的xml部分配置信息:
 <EEPROMDriverData
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="../../../api/sensor/camxeepromdriver.xsd">
   <module_version major_revision="1" minor_revision="0" incr_revision="0"/>

   <!--EEPROM slave information
        element for EEPROMName
        element for slaveAddress
        elemet for regAddrType
        element for regDataType
        element for I2CFrequencyMode
        element for power up sequence
        element for power down sequence  -->
   <slaveInfo description="EEPROM Slave Information">
     <!--Name of the EEPROM device -->
     <EEPROMName>sunny_gt24c64</EEPROMName>
     <!--8-bit or 10-bit I2C slave Write address -->
     <slaveAddress>0xa0</slaveAddress>
     <!--Register address / data size in bytes -->
     <regAddrType range="[1,4]">2</regAddrType>
     <!--Register address / data size in bytes -->
     <regDataType range="[1,4]">1</regDataType>
     <!--I2C frequency mode of slave
         Supported modes are: STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz), CUSTOM (Custom frequency in DTSI) -->
     <i2cFrequencyMode>FAST</i2cFrequencyMode>
     ... ...
包含四个部分:
slaveInfo    // 设备的硬件信息,如设备地址,上下电
memoryMap    // eeprom存储的数据信息
formatInfo    // 按一定的格式解析数据信息
customInfo    // 软件自定义key-value格式信息
 

slaveInfo部分:

参数名
说明
EEPROM
eeprom类型的名字
slaveAddress
i2c address
regAddrType
地址类型
regDataType
数据类型
i2cFrequencyMode
i2c操作频率,STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz)
powerUpsequence
/powerUpsequence
powerDownsequence
/powerDownsequence
上下电,跟sensor一样,没有MCLK和reset
 

MemoryMap部分:

参数名
说明
slaveAddr
i2c地址
registerAddr
寄存器地址,0x0表示开始读的地址
regAddrData
读出长度,单位字节,比如0x20000
regAddrType
地址类型,2即代表2byte
regDataType
数据类型,1即代表1byte
operation
READ读操作
delayUs
延迟微妙
平台会先从eeprom里面的数据全部读取出来,存在一个buffer里面,根据format里面数据进行解析
 

formatInfo部分:

参数名
说明
AF
AF节点首
autoFocusData
autoFocusData节点首
isAvailable
为true表示有AF数据,进行解析
endianness
BIG/LITTLE大小端
/autoFocusData
autoFocusData节点尾
macro
节点首,近焦点,烧录的一般就是dac值,就是指电流的大小
offset
偏移地址,比如0x002f
mask
掩码
/macro
macro节点尾
infinity-/infinity
远焦点
hall-/hall
不解析offset和mask就填0
hallBis-/hallBis
不解析offset和mask就填0
verticalMacro-/verticalMacro
垂直方向近焦,不解析offset和mask就填0
verticalInfinity-/verticalInfinity
垂直方向远焦,不解析offset和mask就填0
horizontalMacro-/horizontalMacro
水平方向近焦,不解析offset和mask就填0
horizontalInfinity-/horizontalInfinity
水平方向远焦,不解析offset和mask就填0
macroMargin
tunning决定
infinityMargin
tunning决定
lensSagCalMac
近焦姿势差补偿
lensSagCalInf
远焦姿势差补偿
otpGravityOfs0to90-/otpGravityOfs0to90
face up
otpGravityOfs90to180-/otpGravityOfs90to180
face down
AF
AF节点尾
WB
WB节点首
WBData
WBData节点首
isAvialable
为true表示有AWB数据,进行解析
endianness
BIG/LITTLE大小端
/WBData
WBData节点尾
datatype
数据格式RATIO比例值,INDIVIDUAL
LightInfo
LightInfo节点首
illuminantType
色温
rValue-/rValue
r分量,INDIVIDUAL才填
grValue-/grValue
gr分量,INDIVIDUAL才填
bValue-/bValue
b分量,INDIVIDUAL才填
gbValue-/gbValue
gb分量,INDIVIDUAL才填
rOverGvalue-/rOverGvalue
r/g比例分量
bOverGvalue-/bOverGvalue
b/g比例分量
grOverGBValue-/grOverGBValue
gr/gb比例分量
mirror-/mirror
左右镜像,没有就填0
filp-/filp
上下镜像,没有就填0
qVaule
固定值1024,QCOM自定义,ratio就有小数值,这里乘以1024,平台会处理
isInvertGROverGB
是否需要取倒
/WB
WB节点首
LSC
LSC节点首
LSCData
LSCData节点首
isAvailable
为true表示有LSC数据,进行解析
endianness
BIG/LITTLE大小端
LightInfo
LightInfo节点首
illuminantType
色温,比如D65
rGainMSB-/rGainMSB
rGainMSB,r通道高8位
rGainLSB-/rGainLSB
rGainLSB,r通道低8位
grGainMSB-/grGainMSB
grGainMSB,gr通道高8位
grGainLSB-/grGainLSB
grGainLSB,gr通道低8位
gbGainMSB-/gbGainMSB
gbGainMSB,gb通道高8位
gbGainLSB-/gbGainLSB
gbGainLSB,gb通道低8位
bGainMSB-/bGainMSB
bGainMSB,b通道高8位
bGainLSB-/bGainLSB
bGainLSB,b通道低8位
meshHWRollOffSize
高通烧录标准,17x13 = 221块
rIncrement
相同通道地址间隔
grIncrement
相同通道地址间隔
gbIncrement
相同通道地址间隔
bIncrement
相同通道地址间隔
/LSC
LSC节点尾
  • 近焦点(Near Focus):指透镜或镜头能够将光线聚焦到的最近距离。对于相机镜头来说,近焦点就是能够拍摄清晰图像的最近距离。通常用毫米或厘米来表示。近焦点越小,表示该镜头能够拍摄更近距离的物体。一般定义为10cm
  • 远焦点(Far Focus):指透镜或镜头能够将光线聚焦到的最远距离。对于相机镜头来说,远焦点就是能够拍摄清晰图像的最远距禿。同样通常用毫米或厘米来表示。远焦点越大,表示该镜头能够拍摄更远距离的物体。一般定义为10m
 

验证EEPROM bringup成功方式:

需要dump EEPROM 的数据,在camx/src/settings/common/camxsettings.xml  中设置  dumpSensorEEPROMData=TRUE
0
或者简单点的方式:
adb root && adb remount adb shell mkdir /vendor/etc/camera/ adb shell "echo dumpSensorEEPROMData=1 >> /vendor/etc/camera/camxoverridesettings.txt" 重启之后查看 ls -l data/vendor/camera
成功如下:

sunny_ov12d2q_wide_eeprom_kbuffer_OTP.txt 整个EEPROM 里面的数据信息:
0
sunny_ov12d2q_wide_eeprom_autofocus_OTP.txt 里面存储的是AF 相关的信息:
0
sunny_ov12d2q_wide_eeprom_lsc_OTP.txt这个存储的是LSC 相关的信息:
每个都是17x13的矩阵
LSC数据的分布:圆心最大,往两边逐渐减小。原因为sensor中心位置畸变最大,需要补偿的最大
0
sunny_ov12d2q_wide_eeprom_pdaf_OTP.txt 这个文件dump的是PDAF相关的信息:
0
sunny_ov12d2q_wide_eeprom_wb_OTP.txt这个dump的是AWB 相关的信息
0
 
EEPORM的设备树节点:
 eeprom_rear: qcom,eeprom0 {
         cell-index = <0>;
         compatible = "qcom,eeprom";
         cam_vio-supply = <&pm8009_l7>;
         cam_vana-supply = <&pm8009_l5>;
         cam_vdig-supply = <&pm8009_l1>;
         cam_clk-supply = <&titan_top_gdsc>;
         cam_vaf-supply = <&pm8150a_l7>;
         regulator-names = "cam_vio", "cam_vana", "cam_vdig",
                 "cam_clk", "cam_vaf";
         rgltr-cntrl-support;
         rgltr-min-voltage = <1800000 2800000 1104000 0 2856000>;
         rgltr-max-voltage = <1800000 3000000 1104000 0 3104000>;
         rgltr-load-current = <120000 80000 1200000 0 100000>;
         gpio-no-mux = <0>;
         pinctrl-names = "cam_default", "cam_suspend";
         pinctrl-0 = <&cam_sensor_mclk0_active
                         &cam_sensor_active_rear>;
         pinctrl-1 = <&cam_sensor_mclk0_suspend
                         &cam_sensor_suspend_rear>;
         gpios = <&tlmm 94 0>,
                 <&tlmm 93 0>;
         gpio-reset = <1>;
         gpio-req-tbl-num = <0 1>;
         gpio-req-tbl-flags = <1 0>;
         gpio-req-tbl-label = "CAMIF_MCLK0",
                                 "CAM_RESET0";
         sensor-position = <0>;
         sensor-mode = <0>;
         cci-master = <0>;
         status = "disabled";
         clocks = <&clock_camcc CAM_CC_MCLK0_CLK>;
         clock-names = "cam_clk";
         clock-cntl-level = "turbo";
         clock-rates = <24000000>;
 };
eeporm的节点跟sensor节点大致相同,没有sensor的角度控制属性和三路电的控制(也不绝对)
posted @ 2024-03-29 00:21  lethe1203  阅读(304)  评论(0编辑  收藏  举报