OTP/EEPROM 讀取與處理

Camera OTP/EEPROM 讀取與處理


這也不能算得上是指南吧,只是讀取OTP和EEPROM中的一些操作,希望可以給到大家可以學到一些有用的skills。【因爲一些問題,所以就不分享圖了,本文的主要目的是去了解GC系列的sensor otp讀取方式】

1. OTP概念

1.1 基本概念

Camera Module一般會採取兩種方式來記錄該Sensor的一些信息,一種是OTP(One Time Programmable),另外一種是EEPROM (Electrically Erasable Programmable Read - Only Memory)。

OTP:是一次性可編程,程序或者數據燒入存儲器後,將不可再次更改和清除。

1.2 OTP存儲類型

目前主流的有2種:① OTP數據燒錄在sensor的寄存器中。 這種方案省錢,不需要額外的存儲器件,但是存儲空間小,如果需要燒錄的數據量過大,就不適用。
② OTP數據燒錄在EEPROM中:EEPROM是指帶電可擦可編程只讀存儲器,是一種掉電後數據不丟失的存儲芯片。 該方案優勢是存儲空間大,如果數據量過多,就需要這種方案,缺點是多一個獨立的EEPROM存儲器件。

1.3 OTP燒錄信息類型

OTP燒錄的數據類型 一般包括:

  • AF:自動對焦校準數據
  • AWB:白平衡校準數據
  • LSC:鏡頭陰影校準 (Lens Shading Calibration)
  • Moudle Info:模組信息,包含模組的生產年月日,模組ID等
1.4 OTP 作用

OTP是用來給camera sensor做calibration(校準)用的。 因爲模組生產出來會有很大的差異性,爲了保證效果一致性, 模組廠會挑選一部分模組作爲golden,然後將其他模組的相應參數校準到和這些golden一樣, (golden不是最好的模組,也不是最差的模組,而是各方面最平均的模組)。

2. 配置準備

2.1 基本認識

如果是高通平臺,首先需要讀文檔:
Camera Sensor Driver Bring-up Guide 80-P9301-97 Rev. F.pdf
看bring up的文檔時可以參考一個camera sensor去看一下其對應的sensor xml和eeprom xml。

2.2 OTP/EEPROM配置
  • kernel/msm-4.14/arch/arm64/boot/dts/qcom/sm6150-camera-sensor-***.dtsi 中配置eeprom對應的dtsi
  • vendor/qcom/proprietary/chi-cdk/vendor/eeprom/.xml 配置eeprom對應的xml
  • 確認vendor/qcom/proprietary/chi-cdk/cdk/tools/buildbins_***.yaml中的sensormodule一致【目的是爲了生成.bin和.so文件】
  • 如果需要,配置軟件驅動
    在eeprom//文件夾中添加.cpp
vendor/qcom/proprietary/chi-cdk/vendor/eeprom/****_eeprom.cpp
vendor/qcom/proprietary/chi-cdk/vendor/eeprom/Android.mk

這一部分修改會涉及到很多細節的地方。需要格外仔細!

  • 確認…/chi-cdk/vendor/eeprom/eepromname/default/android.mk內名稱和路徑一致
  • 確認…/chi-cdk/vendor/android.mk 中eeprom的名稱和路徑一致
  • 注意: 一般情況下各個sensor、eeprom、actuator等文件下的xml中的name一般和文件夾的名字一致,這樣一般不會出現編譯錯誤和其他麻煩。

3. OTP/EEPROM datasheet理解 以及 讀取方式

3.1 data sheet 內容

通常查看需要配置的OTP 的data sheet,查看字節存儲起始地址和需要讀取的字節數。例如imx582的起始地址爲0x0000,讀取的字節長度0x1FFF。
查看eeprom寫入了哪些內容以及對應的地址,這些信息會在xml中formatInfo中使用地址和內容。

3.2 一般OTP/EEPROM(eg.imx系列)的讀取方式

通過data sheet 查看eeprom的讀取方式,eeprom_XML中的slave-addr以及上下電的配置要根據硬件圖來設置。通常eeprom讀取是在memeorymap中設置讀取地址和讀取的字節長度,camxeepromdata.cpp中會根據地址和偏移量將eeprom中的燒錄內容直接放到buffer中。
在imx***_eeprom.xml中,通過memorymap的設置如下:

<memoryMap>
    <regSetting>
      <slaveAddr>0xA0</slaveAddr>
      <!--Register address that is accessed -->
      <registerAddr>0x00</registerAddr>
      <!--If operation is WRITE, registerData is the data value to be written into the specified register address
          If operation is READ, registerData is the number of bytes to be read from the specified register address -->
      <registerData>0x1FFF</registerData>
      <!--Register address / data size in bytes -->
      <regAddrType range="[1,4]">2</regAddrType>
      <!--Register address / data size in bytes -->
      <regDataType range="[1,4]">1</regDataType>
      <!--Type of the operation
          Valid values are: WRITE, READ, POLL -->
      <operation>READ</operation>
      <!--Delay in micro seconds. Delay is 0 if not explicitly provided -->
      <delayUs>0</delayUs>
    </regSetting>
  </memoryMap>
3.3 GC系列 OTP 讀取方式

但是GC這類OTP的讀取方式與其他OTP的讀取方式不同,查看GC***的data sheet,GC***每次只讀取一個地址的內容。
並且讀取之前需要進行sensor system的初始化設置和otp初始話設置注意: 這部分初始化相當重要,如果沒有設置sensor system初始化的話,讀取出來的數據會都是0。所以一般如果可以讀取數據,那麼最好及時聯繫sensor的FAE去取得sensor OTP默認操作流程文件,來排查讀取失敗的原因。 】,每個讀取的地址要進行寄存器設置。所以設置gc***_eeprom.xml時,memorymap中所有需要讀取的地址都需要設置一遍,然後再通過0x6c得到一個地址內容。

4. Kernel dtsi配置

在kernel層要配置camera的soc,其路徑是:
kernel/msm-4.14/arch/arm64/boot/dts/qcom/sm6150-camera-sensor-***.dtsi
如果是配置sensor otp對應的eeprom dtsi,可以直接拿sensor的信息來用sensor的dtsi配置。

如果是單獨從EEPROM中讀取信息,那麼根據規格書硬件圖來配eeprom部分的信息。

5. 總結

在GC**** OTP讀取過程中,最大的問題是從CAMX中camxeepromdata.cpp到Kernel中cam_eeprom_core.c讀取數據都是零。如果通過各個模塊的檢查發現讀取到的數據不正確,這時候要及時聯繫FAE確保讀取過程中沒有操作步驟和配置的失誤。
另外,要了解camx中eeprom的處理流程,這樣可以快速的排除問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章