Camera EEPROM bringup

lethe1203發表於2024-03-29
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的角度控制屬性和三路電的控制(也不絕對)

相關文章