camera: distinguish sensor version

distinguish sensor version by read sensor version address,
and apply extra setting when sensor version is 0x02.

Change-Id: I9d0fc6eee906e345d4ee3a67ed26c8ed3517f8e7
Signed-off-by: liuwang2 <liuwang2@lenovo.com>
Reviewed-on: https://gerrit.mot.com/2282942
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Shuo Wang <wangsh18@motorola.com>
Reviewed-by: <huqian4@motorola.com>
Reviewed-by: Long Cheng <chengl1@motorola.com>
Reviewed-by: Zhichao Chen <chenzc2@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
liuwang2 2022-05-28 15:21:07 +08:00 • committed by zhaoji1
commit e7b5115b4d

View file

@ -6,6 +6,27 @@
#include "cam_sensor_io.h"
#include "cam_sensor_i2c.h"
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
#define SPECIAL_SENSOR_ID 0x5041
#define SPECIAL_SENSOR_ADDR_ID 0x300B
#define SPECIAL_SENSOR_ADDR_VERSION 0x900E
#define SPECIAL_SENSOR_IIC_ADDR 0x10
static uint32_t s_r900e_val = 0;
struct cam_sensor_i2c_reg_array special_on_write_settings = {0x0100, 0x01, 0x05, 0xFF};
struct cam_sensor_i2c_reg_array special_off_write_settings = {0x0100, 0x00, 0x00, 0xFF};
struct cam_sensor_i2c_reg_array special_streamon_write_settings[] =
{
{0x7278, 0x00, 0x00, 0xFF},
{0x727a, 0x01, 0x00, 0xFF},
{0x7280, 0x07, 0x00, 0xFF},
{0x0100, 0x01, 0x00, 0xFF}
};
#endif
int32_t camera_io_dev_poll(struct camera_io_master *io_master_info,
uint32_t addr, uint16_t data, uint32_t data_mask,
enum camera_sensor_i2c_type addr_type,
@ -68,14 +89,25 @@ int32_t camera_io_dev_read(struct camera_io_master *io_master_info,
enum camera_sensor_i2c_type addr_type,
enum camera_sensor_i2c_type data_type)
{
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
int32_t retval = 0;
uint32_t r900e = 0;
struct cam_sensor_i2c_reg_setting write_setting = {0};
#endif
if (!io_master_info) {
CAM_ERR(CAM_SENSOR, "Invalid Args");
return -EINVAL;
}
if (io_master_info->master_type == CCI_MASTER) {
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
retval = cam_cci_i2c_read(io_master_info->cci_client,
addr, data, addr_type, data_type);
#else
return cam_cci_i2c_read(io_master_info->cci_client,
addr, data, addr_type, data_type);
#endif
} else if (io_master_info->master_type == I2C_MASTER) {
return cam_qup_i2c_read(io_master_info->client,
addr, data, addr_type, data_type);
@ -87,7 +119,50 @@ int32_t camera_io_dev_read(struct camera_io_master *io_master_info,
io_master_info->master_type);
return -EINVAL;
}
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
if (retval == 0 &&
data != NULL &&
*data == SPECIAL_SENSOR_ID &&
addr == SPECIAL_SENSOR_ADDR_ID &&
io_master_info->cci_client != NULL &&
io_master_info->cci_client->cci_i2c_master == 0 &&
io_master_info->cci_client->sid == SPECIAL_SENSOR_IIC_ADDR)
{
write_setting.size = 1;
write_setting.addr_type = CAMERA_SENSOR_I2C_TYPE_WORD;
write_setting.data_type = CAMERA_SENSOR_I2C_TYPE_BYTE;
write_setting.delay = 21;
write_setting.read_buff = NULL;
write_setting.read_buff_len = 0;
write_setting.reg_setting = &special_on_write_settings;
retval = cam_cci_i2c_write_table(io_master_info, &write_setting);
retval = cam_cci_i2c_read(io_master_info->cci_client,
SPECIAL_SENSOR_ADDR_VERSION,
&r900e,
CAMERA_SENSOR_I2C_TYPE_WORD,
CAMERA_SENSOR_I2C_TYPE_BYTE);
CAM_INFO(CAM_SENSOR, "retval = %d, r900e = %d", retval, r900e);
if(retval == 0)
s_r900e_val = r900e;
write_setting.size = 1;
write_setting.addr_type = CAMERA_SENSOR_I2C_TYPE_WORD;
write_setting.data_type = CAMERA_SENSOR_I2C_TYPE_BYTE;
write_setting.delay = 0;
write_setting.read_buff = NULL;
write_setting.read_buff_len = 0;
write_setting.reg_setting = &special_off_write_settings;
retval = cam_cci_i2c_write_table(io_master_info, &write_setting);
}
return retval;
#else
return 0;
#endif
}
int32_t camera_io_dev_read_seq(struct camera_io_master *io_master_info,
@ -143,6 +218,10 @@ int32_t camera_io_dev_ois_read_seq(struct camera_io_master *io_master_info,
int32_t camera_io_dev_write(struct camera_io_master *io_master_info,
struct cam_sensor_i2c_reg_setting *write_setting)
{
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
int32_t retval = 0;
#endif
if (!write_setting || !io_master_info) {
CAM_ERR(CAM_SENSOR,
"Input parameters not valid ws: %pK ioinfo: %pK",
@ -155,6 +234,44 @@ int32_t camera_io_dev_write(struct camera_io_master *io_master_info,
return -EINVAL;
}
#ifdef CONFIG_CAM_DISTINGUISH_SENSOR_VERSION
if (io_master_info->cci_client != NULL &&
io_master_info->cci_client->sid== SPECIAL_SENSOR_IIC_ADDR &&
io_master_info->cci_client->cci_device == 1 &&
io_master_info->cci_client->cci_i2c_master == 0 &&
write_setting->reg_setting->reg_addr == 0x0100 &&
write_setting->reg_setting->reg_data == 0x01)
{
CAM_INFO(CAM_SENSOR, "Detect stream on setting, r900e = %d", s_r900e_val);
if (s_r900e_val == 0x02)
{
write_setting->reg_setting->reg_addr = special_streamon_write_settings[0].reg_addr;
write_setting->reg_setting->reg_data = special_streamon_write_settings[0].reg_data;
write_setting->reg_setting->delay = special_streamon_write_settings[0].delay;
write_setting->reg_setting->data_mask = special_streamon_write_settings[0].data_mask;
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
write_setting->reg_setting->reg_addr = special_streamon_write_settings[1].reg_addr;
write_setting->reg_setting->reg_data = special_streamon_write_settings[1].reg_data;
write_setting->reg_setting->delay = special_streamon_write_settings[1].delay;
write_setting->reg_setting->data_mask = special_streamon_write_settings[1].data_mask;
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
write_setting->reg_setting->reg_addr = special_streamon_write_settings[2].reg_addr;
write_setting->reg_setting->reg_data = special_streamon_write_settings[2].reg_data;
write_setting->reg_setting->delay = special_streamon_write_settings[2].delay;
write_setting->reg_setting->data_mask = special_streamon_write_settings[2].data_mask;
retval = cam_cci_i2c_write_table(io_master_info, write_setting);
write_setting->reg_setting->reg_addr = special_streamon_write_settings[3].reg_addr;
write_setting->reg_setting->reg_data = special_streamon_write_settings[3].reg_data;
write_setting->reg_setting->delay = special_streamon_write_settings[3].delay;
write_setting->reg_setting->data_mask = special_streamon_write_settings[3].data_mask;
}
}
#endif
if (io_master_info->master_type == CCI_MASTER) {
return cam_cci_i2c_write_table(io_master_info,
write_setting);