android otp接口,Android-高通平台调试camera的OTP参数

来源:http://blog.csdn.net/m0_37256698/article/details/70139272

需要修改的文件如下(以hi546为例):

./kernel/arch/arm/boot/dts/qcom/msm8909-camera-sensor-skua.dtsi

添加eeprom到设备树

f6f9d01ea9aeb29c3d18086c707c0d8c.png

添加eeprom信息

88c2feabc2b85f1057a60785b9d2b20d.png

./kernel/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c

根据板子的camera name进行OTP校准

7014f6efe022de14f234266b6032ca17.png

custom_hynix_hi546_otp_read函数如下:

static int custom_hynix_hi546_otp_read(struct msm_eeprom_ctrl_t *e_ctrl,

struct msm_eeprom_memory_map_t *emap, uint8_t *memptr) {

int m = 0;

int k = 0;

uint32_t addr = 0;

int rc =0;

// add for compatible code form the camera lens id --qiaodeli

int flag = 0;

#define HI546_MODULE_INFO_GROUP_SIZE        17

#define HI546_MODULE_INFO_OFFSET            1

#define HI546_MODULE_INFO_LEN_OFFSET        6

int group_size = HI546_MODULE_INFO_GROUP_SIZE;

int module_offset = HI546_MODULE_INFO_OFFSET;

int len_offset = HI546_MODULE_INFO_LEN_OFFSET;

// add end

pr_err("%s: hi546 otp read init  -- qiaodeli\n", __func__);

//initial  sensor

for (m = 0; m < sizeof(init_hi546_reg_array0) / (sizeof(init_hi546_reg_array0[0])); m++){

rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client),

init_hi546_reg_array0[m].reg_addr, init_hi546_reg_array0[m].reg_data, MSM_CAMERA_I2C_WORD_DATA);

if (rc < 0) {

pr_err("%s: hi546 init  failed\n", __func__);

return rc;

}

}

mdelay(100);

// set to otp mode

for (m = 0; m < sizeof(init_hi546_otp_array) / sizeof(init_hi546_otp_array[0]); m++){

rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client),

init_hi546_otp_array[m].reg_addr, init_hi546_otp_array[m].reg_data, MSM_CAMERA_I2C_BYTE_DATA);

mdelay(init_hi546_otp_array[m].delay);

if (rc < 0) {

pr_err("%s: hi546 to otp mode  failed\n", __func__);

return rc;

}

}

for (addr = emap->mem.addr, k = 0; k < (emap->mem.valid_size); addr++, k++) {

rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client), 0x10A, (addr>>8)&0xff, MSM_CAMERA_I2C_BYTE_DATA);

rc |= e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client), 0x10B, addr & 0xff, MSM_CAMERA_I2C_BYTE_DATA);

rc |= e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client), 0x102, 1, MSM_CAMERA_I2C_BYTE_DATA);

rc |= e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_DATA;

rc |= e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client), 0xF12, 1, MSM_CAMERA_I2C_BYTE_DATA);

rc |= e_ctrl->i2c_client.i2c_func_tbl->i2c_read_seq(&(e_ctrl->i2c_client), 0x108, memptr, 1);

rc |= e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client), 0xF12, 0, MSM_CAMERA_I2C_BYTE_DATA);

//pr_err("hi546 custom:addr:[0x%04x] value: (0x%x)\n", addr, *memptr);

memptr++;  // must

if (rc < 0) {

pr_err("%s: hi546 read failed\n", __func__);

return rc;

}

}

// add for compatible code form the camera lens id --qiaodeli

flag = e_ctrl->cal_data.mapdata[module_offset - 1];

if (flag== 0x01)

group = 1;

else if (flag == 0x13)

group = 2;

else if (flag == 0x37)

group = 3;

else {

pr_err("%s:%d invalid group=%d", __func__, __LINE__, group);

}

pr_err("dongyunfei: group=%d\n", group);

module_len_id = *((unsigned char *)e_ctrl->cal_data.mapdata + module_offset +

(group-1)*group_size + len_offset);

pr_err("dongyunfei: module_len_id=%d\n", module_len_id);

// add end

//set  to normol mode

for (m = 0; m < sizeof(hi546_otp_to_norm_mode_array)/sizeof(hi546_otp_to_norm_mode_array[0]); m++){

rc = e_ctrl->i2c_client.i2c_func_tbl->i2c_write(&(e_ctrl->i2c_client),

hi546_otp_to_norm_mode_array[m].reg_addr, hi546_otp_to_norm_mode_array[m].reg_data, 1);

if (rc < 0) {

pr_err("%s: to normal  failed\n", __func__);

return rc;

}

}

return rc;

}

以上三个数组在新添加的hi546.h文件里

./kernel/drivers/media/platform/msm/camera_v2/sensor/eeprom/hi546.h

这个文件是需要添加的,可以找模组厂商要,也可以自己看datesheet写,最好找模组厂商要,自己写不一定能写全,以上kenel部分就已经结束了,下面是vendor部分。

./vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/eeprom_libs/

需要在这个文件夹里添加一个hi546_sunrise文件夹,文件夹内容如下:

95bbef09ac4d54c3fd4c488e2738c9fa.png

Android.mk是用来编译生成hi546_sunrise_sunrise.so库的,而hi546_sunrise_sunrise.c文件里是用来校验checkSum和调整rgb_gain的

./vendor/qcom/proprietary/common/config/device-vendor.mk

最后在这个文件里添加一个目标库就可以了

551e60e397a00b830607b152dcbf2c7b.png

以上一个完整的OTP校准就已经全部完成了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值