OTP调试笔记

2021-02-24  本文已影响0人  窝窝蜗牛
  1. OTP数据的获取方式
    可参数模组厂提供的OTPguide

  2. OTP数据的存储位置
    1)otp数据如果不大,为了节省成本,可以存储在sensor内部寄存器中。不过由于one time program,可能烧写出错,所以会有两到三组数据。
    2)数据量大的情况存储在外挂eeprom中,所以该器件有独立的iic地址,并且eeprom和sensor的寄存器并不是统一编址。
    在sensor端读取数据时有个读取规则,可能是需要配置sensor的当前工作模式什么的,eeprom没这么复杂,直接上电就可以读数据。

  3. OTP数据的正确性验证
    第一步 看kernel层打印


    image.png

    该日志打印位置,eeprom_parse_memory_map。读出来的值是烧录的原始otp数据,可以验证厂家烧录的值是否正确
    第二步 查看vendor打印
    vendor打印打印一般看驱动的打印就够了,format_calibration_data中会对读取到的otp解析计算,比如分解出模组厂商信息,模组生产日期,awb计算出R/G,B/G的值,最后才用这些数据做校准。


    image.png
  4. OTP的校准方式
    1)sensor端校准
    如果在sensor端校准,一般校准函数为NULL。
    2)平台端校准
    调用平台自带的校准函数分别对awb,lsc,af和pdaf做校准。

  5. 代码结构
    文件:module_sensor.c eeprom.c msm_eeprom.c
    OTP初始化步骤:
    入口函数:module_sensor_init_eeprom
    内核空间:
    (1)设备驱动匹配,跑msm_eeprom_platform_probe
    (2)解析设备树数据,保存
    (3)注册v4l2子设备
    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);

上一篇 下一篇

猜你喜欢

热点阅读