OTP調(diào)試筆記

  1. OTP數(shù)據(jù)的獲取方式
    可參數(shù)模組廠提供的OTPguide

  2. OTP數(shù)據(jù)的存儲(chǔ)位置
    1)otp數(shù)據(jù)如果不大,為了節(jié)省成本,可以存儲(chǔ)在sensor內(nèi)部寄存器中。不過(guò)由于one time program,可能燒寫(xiě)出錯(cuò),所以會(huì)有兩到三組數(shù)據(jù)。
    2)數(shù)據(jù)量大的情況存儲(chǔ)在外掛eeprom中,所以該器件有獨(dú)立的iic地址,并且eeprom和sensor的寄存器并不是統(tǒng)一編址。
    在sensor端讀取數(shù)據(jù)時(shí)有個(gè)讀取規(guī)則,可能是需要配置sensor的當(dāng)前工作模式什么的,eeprom沒(méi)這么復(fù)雜,直接上電就可以讀數(shù)據(jù)。

  3. OTP數(shù)據(jù)的正確性驗(yàn)證
    第一步 看kernel層打印


    image.png

    該日志打印位置,eeprom_parse_memory_map。讀出來(lái)的值是燒錄的原始o(jì)tp數(shù)據(jù),可以驗(yàn)證廠家燒錄的值是否正確
    第二步 查看vendor打印
    vendor打印打印一般看驅(qū)動(dòng)的打印就夠了,format_calibration_data中會(huì)對(duì)讀取到的otp解析計(jì)算,比如分解出模組廠商信息,模組生產(chǎn)日期,awb計(jì)算出R/G,B/G的值,最后才用這些數(shù)據(jù)做校準(zhǔn)。


    image.png
  4. OTP的校準(zhǔn)方式
    1)sensor端校準(zhǔn)
    如果在sensor端校準(zhǔn),一般校準(zhǔn)函數(shù)為NULL。
    2)平臺(tái)端校準(zhǔn)
    調(diào)用平臺(tái)自帶的校準(zhǔn)函數(shù)分別對(duì)awb,lsc,af和pdaf做校準(zhǔn)。

  5. 代碼結(jié)構(gòu)
    文件:module_sensor.c eeprom.c msm_eeprom.c
    OTP初始化步驟:
    入口函數(shù):module_sensor_init_eeprom
    內(nèi)核空間:
    (1)設(shè)備驅(qū)動(dòng)匹配,跑msm_eeprom_platform_probe
    (2)解析設(shè)備樹(shù)數(shù)據(jù),保存
    (3)注冊(cè)v4l2子設(shè)備
    vendor 用戶空間:
    /* (1) Open the eeprom sub module */
    rc = func_tbl.open((void *)&s_bundle->eeprom_data,
    &s_bundle->subdev_info[SUB_MODULE_EEPROM]);
    /
    (2) Load eeprom library /
    eeprom_load_library(s_bundle->eeprom_data, bin_ctl.ctl.name_data.path);
    /
    (3) Powerup and parse the eeprom /
    func_tbl.process(s_bundle->eeprom_data, EEPROM_INIT, NULL);
    =>eeprom.c eeprom_init
    cfg.cfgtype = CFG_EEPROM_INIT;
    cfg.cfg.eeprom_info = eeprom_info;
    rc = ioctl(ectrl->fd, VIDIOC_MSM_EEPROM_CFG, &cfg);
    msm_eeprom.c :
    eeprom_init_config->
    msm_eeprom_power_up->eeprom_parse_memory_map->msm_camera_power_down
    /
    (4) Read the eeprom data from kernel /
    rc = func_tbl.process(s_bundle->eeprom_data, EEPROM_READ_DATA, NULL);
    /
    (5) Format the cal data /
    rc = func_tbl.process(s_bundle->eeprom_data, EEPROM_SET_FORMAT_DATA, NULL);
    ==> .format_calibration_data
    /
    (6) close the eeprom sub module */
    rc = func_tbl.close(s_bundle->eeprom_data);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容