-
OTP数据的获取方式
可参数模组厂提供的OTPguide -
OTP数据的存储位置
1)otp数据如果不大,为了节省成本,可以存储在sensor内部寄存器中。不过由于one time program,可能烧写出错,所以会有两到三组数据。
2)数据量大的情况存储在外挂eeprom中,所以该器件有独立的iic地址,并且eeprom和sensor的寄存器并不是统一编址。
在sensor端读取数据时有个读取规则,可能是需要配置sensor的当前工作模式什么的,eeprom没这么复杂,直接上电就可以读数据。 -
OTP数据的正确性验证
第一步 看kernel层打印
image.png
该日志打印位置,eeprom_parse_memory_map。读出来的值是烧录的原始otp数据,可以验证厂家烧录的值是否正确
第二步 查看vendor打印
vendor打印打印一般看驱动的打印就够了,format_calibration_data中会对读取到的otp解析计算,比如分解出模组厂商信息,模组生产日期,awb计算出R/G,B/G的值,最后才用这些数据做校准。
image.png -
OTP的校准方式
1)sensor端校准
如果在sensor端校准,一般校准函数为NULL。
2)平台端校准
调用平台自带的校准函数分别对awb,lsc,af和pdaf做校准。 -
代码结构
文件: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);
网友评论