本文介绍如何在高通平台kernel端获取gc5035类型的方式。
硬件camera typc介绍如下所示:
实际需求:由于gc5035的cob的物料没有了, 需要导入csp类型作为二供,由于没有烧入otp功能无法获取otp的module id,需要通过获取camera type类型区分不同的gc5035。从上硬件图可知cob类型对应的是寄存器状态值为0x01, CSP对应的寄存器状态值为0X08.
软件实现如下所示:
代码路径:android/kernel/msm-4.19/drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c
void get_gc5053_camera_type(const char *sensor_name ,struct msm_camera_i2c_client *sensor_i2c_client, char *type)
{
uint16_t packet = 0x0000;
if((!strcmp(sensor_name, "gc5035"))||(!strcmp(sensor_name, "gc5035_cob"))){
//config reg for gc5034
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfc, 0x01, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf4, 0x40, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf5, 0xe9, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf6, 0x14, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf8, 0x49, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf9, 0x82, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfa, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfc, 0x81, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x36, 0x01, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xd3, 0x87, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x36, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x33, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x03, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x01, 0xe7, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf7, 0x01, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfc, 0x8f, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfc, 0x8f, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfc, 0x8e, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xee, 0x30, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x87, 0x18, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x01, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x8c, 0x90, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfa, 0x10, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf5, 0xe9, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x02, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x67, 0xc0, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x59, 0x3f, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x55, 0x84, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x65, 0x80, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x66, 0x03, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x00, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xfe, 0x02, MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x69, ((packet >>8) & 0x1f), MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x6a, (packet & 0xff), MSM_CAMERA_I2C_BYTE_DATA);
sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0xf3, 0x20, MSM_CAMERA_I2C_BYTE_DATA);
// read module id from 0x6c
sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x6c, packet , MSM_CAMERA_I2C_BYTE_DATA);
if((packet & 0x0f)==0x08)
type='csp';
else if((packet &0x0f)==0x04)
type='tplcc';
else if((packet &0x0f)==0x02)
type='com';
else if((packet &0x0f)==0x01)
type='cob';
else
type='unknow';
}
return type
}
根据sensor_name和type返回值,判定msm_sensor_match_id是否成功,若成功返回rc,若失败返回-EINVAL;