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
或者簡單點的方式:
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 裡面的資料資訊:
sunny_ov12d2q_wide_eeprom_autofocus_OTP.txt 裡面儲存的是AF 相關的資訊:
sunny_ov12d2q_wide_eeprom_lsc_OTP.txt這個儲存的是LSC 相關的資訊:
每個都是17x13的矩陣
LSC資料的分佈:圓心最大,往兩邊逐漸減小。原因為sensor中心位置畸變最大,需要補償的最大
sunny_ov12d2q_wide_eeprom_pdaf_OTP.txt 這個檔案dump的是PDAF相關的資訊:
sunny_ov12d2q_wide_eeprom_wb_OTP.txt這個dump的是AWB 相關的資訊
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的角度控制屬性和三路電的控制(也不絕對)