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](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002057624-304447063.png)
或者简单点的方式:
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](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002058106-1567677643.png)
sunny_ov12d2q_wide_eeprom_autofocus_OTP.txt 里面存储的是AF 相关的信息:
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002058724-1209512662.png)
sunny_ov12d2q_wide_eeprom_lsc_OTP.txt这个存储的是LSC 相关的信息:
每个都是17x13的矩阵
LSC数据的分布:圆心最大,往两边逐渐减小。原因为sensor中心位置畸变最大,需要补偿的最大
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002100920-802938830.png)
sunny_ov12d2q_wide_eeprom_pdaf_OTP.txt 这个文件dump的是PDAF相关的信息:
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002059115-56331959.png)
sunny_ov12d2q_wide_eeprom_wb_OTP.txt这个dump的是AWB 相关的信息
![0](https://img2024.cnblogs.com/blog/3261801/202403/3261801-20240329002058254-837927060.png)
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的角度控制属性和三路电的控制(也不绝对)