|
|
|
@ -203,27 +203,6 @@ static int ov8865_apply_exposure(CameraState *s, int gain, int integ_lines, int |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int imx179_s5k3p8sp_apply_exposure(CameraState *s, int gain, int integ_lines, int frame_length) { |
|
|
|
|
//printf("driver camera: %d %d %d\n", gain, integ_lines, frame_length);
|
|
|
|
|
struct msm_camera_i2c_reg_array reg_array[] = { |
|
|
|
|
{0x104,0x1,0}, |
|
|
|
|
|
|
|
|
|
// FRM_LENGTH
|
|
|
|
|
{0x340, (uint16_t)(frame_length >> 8), 0}, {0x341, (uint16_t)(frame_length & 0xff), 0}, |
|
|
|
|
// coarse_int_time
|
|
|
|
|
{0x202, (uint16_t)(integ_lines >> 8), 0}, {0x203, (uint16_t)(integ_lines & 0xff),0}, |
|
|
|
|
// global_gain
|
|
|
|
|
{0x204, (uint16_t)(gain >> 8), 0}, {0x205, (uint16_t)(gain & 0xff),0}, |
|
|
|
|
|
|
|
|
|
{0x104,0x0,0}, |
|
|
|
|
}; |
|
|
|
|
int err = sensor_write_regs(s, reg_array, ARRAYSIZE(reg_array), MSM_CAMERA_I2C_BYTE_DATA); |
|
|
|
|
if (err != 0) { |
|
|
|
|
LOGE("apply_exposure err %d", err); |
|
|
|
|
} |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cl_program build_conv_program(cl_device_id device_id, cl_context context, int image_w, int image_h, int filter_size) { |
|
|
|
|
char args[4096]; |
|
|
|
|
snprintf(args, sizeof(args), |
|
|
|
@ -238,28 +217,12 @@ cl_program build_conv_program(cl_device_id device_id, cl_context context, int im |
|
|
|
|
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) { |
|
|
|
|
char project_name[1024] = {0}; |
|
|
|
|
property_get("ro.boot.project_name", project_name, ""); |
|
|
|
|
assert(strlen(project_name) == 0); |
|
|
|
|
|
|
|
|
|
char product_name[1024] = {0}; |
|
|
|
|
property_get("ro.product.name", product_name, ""); |
|
|
|
|
|
|
|
|
|
if (strlen(project_name) == 0) { |
|
|
|
|
LOGD("LePro 3 op system detected"); |
|
|
|
|
s->device = DEVICE_LP3; |
|
|
|
|
|
|
|
|
|
// sensor is flipped in LP3
|
|
|
|
|
// IMAGE_ORIENT = 3
|
|
|
|
|
init_array_imx298[0].reg_data = 3; |
|
|
|
|
cameras_supported[CAMERA_ID_IMX298].bayer_flip = 3; |
|
|
|
|
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") != 0) { |
|
|
|
|
// no more OP3 support
|
|
|
|
|
s->device = DEVICE_OP3; |
|
|
|
|
assert(false); |
|
|
|
|
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") == 0) { |
|
|
|
|
// only OP3T support
|
|
|
|
|
s->device = DEVICE_OP3T; |
|
|
|
|
} else { |
|
|
|
|
assert(false); |
|
|
|
|
} |
|
|
|
|
// sensor is flipped in LP3
|
|
|
|
|
// IMAGE_ORIENT = 3
|
|
|
|
|
init_array_imx298[0].reg_data = 3; |
|
|
|
|
cameras_supported[CAMERA_ID_IMX298].bayer_flip = 3; |
|
|
|
|
|
|
|
|
|
// 0 = ISO 100
|
|
|
|
|
// 256 = ISO 200
|
|
|
|
@ -283,28 +246,11 @@ void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_i |
|
|
|
|
VISION_STREAM_RGB_BACK, VISION_STREAM_YUV_BACK); |
|
|
|
|
s->road_cam.apply_exposure = imx298_apply_exposure; |
|
|
|
|
|
|
|
|
|
if (s->device == DEVICE_OP3T) { |
|
|
|
|
camera_init(v, &s->driver_cam, CAMERA_ID_S5K3P8SP, 1, |
|
|
|
|
/*pixel_clock=*/560000000, /*line_length_pclk=*/5120, |
|
|
|
|
/*max_gain=*/510, 10, device_id, ctx, |
|
|
|
|
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT); |
|
|
|
|
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure; |
|
|
|
|
} else if (s->device == DEVICE_LP3) { |
|
|
|
|
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1, |
|
|
|
|
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602, |
|
|
|
|
/*max_gain=*/510, 10, device_id, ctx, |
|
|
|
|
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT); |
|
|
|
|
s->driver_cam.apply_exposure = ov8865_apply_exposure; |
|
|
|
|
} else { |
|
|
|
|
camera_init(v, &s->driver_cam, CAMERA_ID_IMX179, 1, |
|
|
|
|
/*pixel_clock=*/251200000, /*line_length_pclk=*/3440, |
|
|
|
|
/*max_gain=*/224, 20, device_id, ctx, |
|
|
|
|
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT); |
|
|
|
|
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
s->road_cam.device = s->device; |
|
|
|
|
s->driver_cam.device = s->device; |
|
|
|
|
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1, |
|
|
|
|
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602, |
|
|
|
|
/*max_gain=*/510, 10, device_id, ctx, |
|
|
|
|
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT); |
|
|
|
|
s->driver_cam.apply_exposure = ov8865_apply_exposure; |
|
|
|
|
|
|
|
|
|
s->sm = new SubMaster({"driverState"}); |
|
|
|
|
s->pm = new PubMaster({"roadCameraState", "driverCameraState", "thumbnail"}); |
|
|
|
@ -452,158 +398,52 @@ static uint8_t* get_eeprom(int eeprom_fd, size_t *out_len) { |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void imx298_ois_calibration(int ois_fd, uint8_t* eeprom) { |
|
|
|
|
const int ois_registers[][2] = { |
|
|
|
|
// == SET_FADJ_PARAM() == (factory adjustment)
|
|
|
|
|
|
|
|
|
|
// Set Hall Current DAC
|
|
|
|
|
{0x8230, *(uint16_t*)(eeprom+0x102)}, //_P_30_ADC_CH0 (CURDAT)
|
|
|
|
|
|
|
|
|
|
// Set Hall PreAmp Offset
|
|
|
|
|
{0x8231, *(uint16_t*)(eeprom+0x104)}, //_P_31_ADC_CH1 (HALOFS_X)
|
|
|
|
|
{0x8232, *(uint16_t*)(eeprom+0x106)}, //_P_32_ADC_CH2 (HALOFS_Y)
|
|
|
|
|
|
|
|
|
|
// Set Hall-X/Y PostAmp Offset
|
|
|
|
|
{0x841e, *(uint16_t*)(eeprom+0x108)}, //_M_X_H_ofs
|
|
|
|
|
{0x849e, *(uint16_t*)(eeprom+0x10a)}, //_M_Y_H_ofs
|
|
|
|
|
|
|
|
|
|
// Set Residual Offset
|
|
|
|
|
{0x8239, *(uint16_t*)(eeprom+0x10c)}, //_P_39_Ch3_VAL_1 (PSTXOF)
|
|
|
|
|
{0x823b, *(uint16_t*)(eeprom+0x10e)}, //_P_3B_Ch3_VAL_3 (PSTYOF)
|
|
|
|
|
|
|
|
|
|
// DIGITAL GYRO OFFSET
|
|
|
|
|
{0x8406, *(uint16_t*)(eeprom+0x110)}, //_M_Kgx00
|
|
|
|
|
{0x8486, *(uint16_t*)(eeprom+0x112)}, //_M_Kgy00
|
|
|
|
|
{0x846a, *(uint16_t*)(eeprom+0x120)}, //_M_TMP_X_
|
|
|
|
|
{0x846b, *(uint16_t*)(eeprom+0x122)}, //_M_TMP_Y_
|
|
|
|
|
|
|
|
|
|
// HALLSENSE
|
|
|
|
|
// Set Hall Gain
|
|
|
|
|
{0x8446, *(uint16_t*)(eeprom+0x114)}, //_M_KgxHG
|
|
|
|
|
{0x84c6, *(uint16_t*)(eeprom+0x116)}, //_M_KgyHG
|
|
|
|
|
// Set Cross Talk Canceller
|
|
|
|
|
{0x8470, *(uint16_t*)(eeprom+0x124)}, //_M_KgxH0
|
|
|
|
|
{0x8472, *(uint16_t*)(eeprom+0x126)}, //_M_KgyH0
|
|
|
|
|
|
|
|
|
|
// LOOPGAIN
|
|
|
|
|
{0x840f, *(uint16_t*)(eeprom+0x118)}, //_M_KgxG
|
|
|
|
|
{0x848f, *(uint16_t*)(eeprom+0x11a)}, //_M_KgyG
|
|
|
|
|
|
|
|
|
|
// Position Servo ON ( OIS OFF )
|
|
|
|
|
{0x847f, 0x0c0c}, //_M_EQCTL
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct msm_camera_i2c_seq_reg_array ois_reg_settings[ARRAYSIZE(ois_registers)] = {{0}}; |
|
|
|
|
for (int i=0; i<ARRAYSIZE(ois_registers); i++) { |
|
|
|
|
ois_reg_settings[i].reg_addr = ois_registers[i][0]; |
|
|
|
|
ois_reg_settings[i].reg_data[0] = ois_registers[i][1] & 0xff; |
|
|
|
|
ois_reg_settings[i].reg_data[1] = (ois_registers[i][1] >> 8) & 0xff; |
|
|
|
|
ois_reg_settings[i].reg_data_size = 2; |
|
|
|
|
} |
|
|
|
|
struct msm_camera_i2c_seq_reg_setting ois_reg_setting = { |
|
|
|
|
.reg_setting = &ois_reg_settings[0], |
|
|
|
|
.size = ARRAYSIZE(ois_reg_settings), |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.delay = 0, |
|
|
|
|
}; |
|
|
|
|
msm_ois_cfg_data cfg = {.cfgtype = CFG_OIS_I2C_WRITE_SEQ_TABLE, .cfg.settings = &ois_reg_setting}; |
|
|
|
|
int err = ioctl(ois_fd, VIDIOC_MSM_OIS_CFG, &cfg); |
|
|
|
|
LOG("ois reg calibration: %d", err); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void sensors_init(MultiCameraState *s) { |
|
|
|
|
int err; |
|
|
|
|
|
|
|
|
|
unique_fd sensorinit_fd; |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK); |
|
|
|
|
} else { |
|
|
|
|
sensorinit_fd = open("/dev/v4l-subdev12", O_RDWR | O_NONBLOCK); |
|
|
|
|
} |
|
|
|
|
sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(sensorinit_fd >= 0); |
|
|
|
|
|
|
|
|
|
// init road camera sensor
|
|
|
|
|
|
|
|
|
|
struct msm_camera_sensor_slave_info slave_info = {0}; |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
slave_info = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "imx298", |
|
|
|
|
.eeprom_name = "sony_imx298", |
|
|
|
|
.actuator_name = "dw9800w", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.flash_name = "pmic", |
|
|
|
|
.camera_id = CAMERA_0, |
|
|
|
|
.slave_addr = 32, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10}, |
|
|
|
|
}, |
|
|
|
|
.size = 7, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 5}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.size_down = 6, |
|
|
|
|
slave_info = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "imx298", |
|
|
|
|
.eeprom_name = "sony_imx298", |
|
|
|
|
.actuator_name = "dw9800w", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.flash_name = "pmic", |
|
|
|
|
.camera_id = CAMERA_0, |
|
|
|
|
.slave_addr = 32, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10}, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
} else { |
|
|
|
|
slave_info = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "imx298", |
|
|
|
|
.eeprom_name = "sony_imx298", |
|
|
|
|
.actuator_name = "rohm_bu63165gwl", |
|
|
|
|
.ois_name = "rohm_bu63165gwl", |
|
|
|
|
.camera_id = CAMERA_0, |
|
|
|
|
.slave_addr = 52, |
|
|
|
|
.i2c_freq_mode = I2C_CUSTOM_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 6, .config_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 4, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 2}, |
|
|
|
|
}, |
|
|
|
|
.size = 9, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 10}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 4}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 6}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
}, |
|
|
|
|
.size_down = 8, |
|
|
|
|
.size = 7, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .seq_val = 5}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 360}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
.size_down = 6, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
slave_info.power_setting_array.power_setting = &slave_info.power_setting_array.power_setting_a[0]; |
|
|
|
|
slave_info.power_setting_array.power_down_setting = &slave_info.power_setting_array.power_down_setting_a[0]; |
|
|
|
|
sensor_init_cfg_data sensor_init_cfg = {.cfgtype = CFG_SINIT_PROBE, .cfg.setting = &slave_info}; |
|
|
|
@ -612,111 +452,40 @@ static void sensors_init(MultiCameraState *s) { |
|
|
|
|
assert(err >= 0); |
|
|
|
|
|
|
|
|
|
struct msm_camera_sensor_slave_info slave_info2 = {0}; |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
slave_info2 = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "ov8865_sunny", |
|
|
|
|
.eeprom_name = "ov8865_plus", |
|
|
|
|
.actuator_name = "", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.flash_name = "", |
|
|
|
|
.camera_id = CAMERA_2, |
|
|
|
|
.slave_addr = 108, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.size = 6, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.size_down = 5, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
} else if (s->driver_cam.camera_id == CAMERA_ID_S5K3P8SP) { |
|
|
|
|
// init driver camera
|
|
|
|
|
slave_info2 = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "s5k3p8sp", |
|
|
|
|
.eeprom_name = "s5k3p8sp_m24c64s", |
|
|
|
|
.actuator_name = "", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.camera_id = CAMERA_1, |
|
|
|
|
.slave_addr = 32, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id = 12552}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.size = 6, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.size_down = 5, |
|
|
|
|
slave_info2 = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "ov8865_sunny", |
|
|
|
|
.eeprom_name = "ov8865_plus", |
|
|
|
|
.actuator_name = "", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.flash_name = "", |
|
|
|
|
.camera_id = CAMERA_2, |
|
|
|
|
.slave_addr = 108, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
} else { |
|
|
|
|
// init driver camera
|
|
|
|
|
slave_info2 = (struct msm_camera_sensor_slave_info){ |
|
|
|
|
.sensor_name = "imx179", |
|
|
|
|
.eeprom_name = "sony_imx179", |
|
|
|
|
.actuator_name = "", |
|
|
|
|
.ois_name = "", |
|
|
|
|
.camera_id = CAMERA_1, |
|
|
|
|
.slave_addr = 32, |
|
|
|
|
.i2c_freq_mode = I2C_FAST_MODE, |
|
|
|
|
.addr_type = MSM_CAMERA_I2C_WORD_ADDR, |
|
|
|
|
.sensor_id_info = {.sensor_id_reg_addr = 2, .sensor_id = 377, .sensor_id_mask = 4095}, |
|
|
|
|
.power_setting_array = { |
|
|
|
|
.power_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .config_val = 2}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .config_val = 24000000}, |
|
|
|
|
}, |
|
|
|
|
.size = 5, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_CLK}, |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .delay = 2}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2}, |
|
|
|
|
}, |
|
|
|
|
.size_down = 5, |
|
|
|
|
.size = 6, |
|
|
|
|
.power_down_setting_a = { |
|
|
|
|
{.seq_type = SENSOR_GPIO, .delay = 5}, |
|
|
|
|
{.seq_type = SENSOR_CLK, .delay = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 1}, |
|
|
|
|
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1}, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
.size_down = 5, |
|
|
|
|
}, |
|
|
|
|
.is_init_params_valid = 0, |
|
|
|
|
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270}, |
|
|
|
|
.output_format = MSM_SENSOR_BAYER, |
|
|
|
|
}; |
|
|
|
|
slave_info2.power_setting_array.power_setting = &slave_info2.power_setting_array.power_setting_a[0]; |
|
|
|
|
slave_info2.power_setting_array.power_down_setting = &slave_info2.power_setting_array.power_down_setting_a[0]; |
|
|
|
|
sensor_init_cfg.cfgtype = CFG_SINIT_PROBE; |
|
|
|
@ -733,7 +502,6 @@ static void camera_open(CameraState *s, bool is_road_cam) { |
|
|
|
|
struct v4l2_event_subscription sub = {}; |
|
|
|
|
|
|
|
|
|
struct msm_actuator_cfg_data actuator_cfg_data = {}; |
|
|
|
|
struct msm_ois_cfg_data ois_cfg_data = {}; |
|
|
|
|
|
|
|
|
|
// open devices
|
|
|
|
|
const char *sensor_dev; |
|
|
|
@ -742,42 +510,21 @@ static void camera_open(CameraState *s, bool is_road_cam) { |
|
|
|
|
assert(s->csid_fd >= 0); |
|
|
|
|
s->csiphy_fd = open("/dev/v4l-subdev0", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->csiphy_fd >= 0); |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
sensor_dev = "/dev/v4l-subdev17"; |
|
|
|
|
} else { |
|
|
|
|
sensor_dev = "/dev/v4l-subdev18"; |
|
|
|
|
} |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK); |
|
|
|
|
} else { |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK); |
|
|
|
|
} |
|
|
|
|
sensor_dev = "/dev/v4l-subdev17"; |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->isp_fd >= 0); |
|
|
|
|
s->eeprom_fd = open("/dev/v4l-subdev8", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->eeprom_fd >= 0); |
|
|
|
|
|
|
|
|
|
s->actuator_fd = open("/dev/v4l-subdev7", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->actuator_fd >= 0); |
|
|
|
|
|
|
|
|
|
if (s->device != DEVICE_LP3) { |
|
|
|
|
s->ois_fd = open("/dev/v4l-subdev10", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->ois_fd >= 0); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
s->csid_fd = open("/dev/v4l-subdev5", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->csid_fd >= 0); |
|
|
|
|
s->csiphy_fd = open("/dev/v4l-subdev2", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->csiphy_fd >= 0); |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
sensor_dev = "/dev/v4l-subdev18"; |
|
|
|
|
} else { |
|
|
|
|
sensor_dev = "/dev/v4l-subdev19"; |
|
|
|
|
} |
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK); |
|
|
|
|
} else { |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK); |
|
|
|
|
} |
|
|
|
|
sensor_dev = "/dev/v4l-subdev18"; |
|
|
|
|
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->isp_fd >= 0); |
|
|
|
|
s->eeprom_fd = open("/dev/v4l-subdev9", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->eeprom_fd >= 0); |
|
|
|
@ -812,13 +559,6 @@ static void camera_open(CameraState *s, bool is_road_cam) { |
|
|
|
|
err = ioctl(s->sensor_fd, VIDIOC_MSM_SENSOR_CFG, &sensorb_cfg_data); |
|
|
|
|
LOG("sensor power down: %d", err); |
|
|
|
|
|
|
|
|
|
if (is_road_cam && s->device != DEVICE_LP3) { |
|
|
|
|
// ois powerdown
|
|
|
|
|
ois_cfg_data.cfgtype = CFG_OIS_POWERDOWN; |
|
|
|
|
err = ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data); |
|
|
|
|
LOG("ois powerdown: %d", err); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// actuator powerdown
|
|
|
|
|
actuator_cfg_data.cfgtype = CFG_ACTUATOR_POWERDOWN; |
|
|
|
|
err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); |
|
|
|
@ -911,143 +651,61 @@ static void camera_open(CameraState *s, bool is_road_cam) { |
|
|
|
|
err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); |
|
|
|
|
LOG("actuator init: %d", err); |
|
|
|
|
|
|
|
|
|
// leeco actuator (DW9800W H-Bridge Driver IC)
|
|
|
|
|
// from sniff
|
|
|
|
|
s->infinity_dac = 364; |
|
|
|
|
|
|
|
|
|
struct msm_actuator_reg_params_t actuator_reg_params[] = { |
|
|
|
|
{ |
|
|
|
|
.reg_write_type = MSM_ACTUATOR_WRITE_DAC, |
|
|
|
|
// MSB here at address 3
|
|
|
|
|
.reg_addr = 3, |
|
|
|
|
.data_type = 9, |
|
|
|
|
.addr_type = 4, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// no OIS in LP3
|
|
|
|
|
if (s->device != DEVICE_LP3) { |
|
|
|
|
// see sony_imx298_eeprom_format_afdata in libmmcamera_sony_imx298_eeprom.so
|
|
|
|
|
const float far_margin = -0.28; |
|
|
|
|
uint16_t macro_dac = *(uint16_t*)(s->eeprom + 0x24); |
|
|
|
|
s->infinity_dac = *(uint16_t*)(s->eeprom + 0x26); |
|
|
|
|
LOG("macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac); |
|
|
|
|
|
|
|
|
|
int dac_range = macro_dac - s->infinity_dac; |
|
|
|
|
s->infinity_dac += far_margin * dac_range; |
|
|
|
|
|
|
|
|
|
LOG(" -> macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac); |
|
|
|
|
|
|
|
|
|
struct msm_actuator_reg_params_t actuator_reg_params[] = { |
|
|
|
|
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 240, .data_type = 10, .addr_type = 4}, |
|
|
|
|
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 241, .data_type = 10, .addr_type = 4}, |
|
|
|
|
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 242, .data_type = 10, .addr_type = 4}, |
|
|
|
|
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 243, .data_type = 10, .addr_type = 4}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//...
|
|
|
|
|
struct reg_settings_t actuator_init_settings[1] = {0}; |
|
|
|
|
|
|
|
|
|
struct region_params_t region_params[] = { |
|
|
|
|
{.step_bound = {512, 0,}, .code_per_step = 118, .qvalue = 128} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO; |
|
|
|
|
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){ |
|
|
|
|
.actuator_params = { |
|
|
|
|
.act_type = ACTUATOR_VCM, |
|
|
|
|
.reg_tbl_size = 4, |
|
|
|
|
.data_size = 10, |
|
|
|
|
.init_setting_size = 0, |
|
|
|
|
.i2c_freq_mode = I2C_CUSTOM_MODE, |
|
|
|
|
.i2c_addr = 28, |
|
|
|
|
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR, |
|
|
|
|
.i2c_data_type = MSM_ACTUATOR_BYTE_DATA, |
|
|
|
|
.reg_tbl_params = &actuator_reg_params[0], |
|
|
|
|
.init_settings = &actuator_init_settings[0], |
|
|
|
|
.park_lens = { |
|
|
|
|
.damping_step = 1023, |
|
|
|
|
.damping_delay = 15000, |
|
|
|
|
.hw_params = 58404, |
|
|
|
|
.max_step = 20, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
.af_tuning_params = { |
|
|
|
|
.initial_code = (int16_t)s->infinity_dac, |
|
|
|
|
.pwd_step = 0, |
|
|
|
|
.region_size = 1, |
|
|
|
|
.total_steps = 512, |
|
|
|
|
.region_params = ®ion_params[0], |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); |
|
|
|
|
LOG("actuator set info: %d", err); |
|
|
|
|
|
|
|
|
|
// power up ois
|
|
|
|
|
ois_cfg_data.cfgtype = CFG_OIS_POWERUP; |
|
|
|
|
err = ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data); |
|
|
|
|
LOG("ois powerup: %d", err); |
|
|
|
|
|
|
|
|
|
ois_cfg_data.cfgtype = CFG_OIS_INIT; |
|
|
|
|
err = ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data); |
|
|
|
|
LOG("ois init: %d", err); |
|
|
|
|
|
|
|
|
|
ois_cfg_data.cfgtype = CFG_OIS_CONTROL; |
|
|
|
|
ois_cfg_data.cfg.set_info.ois_params = (struct msm_ois_params_t){ |
|
|
|
|
// .data_size = 26312,
|
|
|
|
|
.setting_size = 120, |
|
|
|
|
.i2c_addr = 28, |
|
|
|
|
.i2c_freq_mode = I2C_CUSTOM_MODE, |
|
|
|
|
// .i2c_addr_type = wtf
|
|
|
|
|
// .i2c_data_type = wtf
|
|
|
|
|
.settings = &ois_init_settings[0], |
|
|
|
|
}; |
|
|
|
|
err = ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data); |
|
|
|
|
LOG("ois init settings: %d", err); |
|
|
|
|
} else { |
|
|
|
|
// leeco actuator (DW9800W H-Bridge Driver IC)
|
|
|
|
|
// from sniff
|
|
|
|
|
s->infinity_dac = 364; |
|
|
|
|
|
|
|
|
|
struct msm_actuator_reg_params_t actuator_reg_params[] = { |
|
|
|
|
{ |
|
|
|
|
.reg_write_type = MSM_ACTUATOR_WRITE_DAC, |
|
|
|
|
// MSB here at address 3
|
|
|
|
|
.reg_addr = 3, |
|
|
|
|
.data_type = 9, |
|
|
|
|
.addr_type = 4, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct reg_settings_t actuator_init_settings[] = { |
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
|
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
|
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
|
|
|
|
|
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
|
|
|
|
|
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, |
|
|
|
|
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
|
|
|
|
|
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
|
|
|
|
|
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
|
|
|
|
|
}; |
|
|
|
|
struct reg_settings_t actuator_init_settings[] = { |
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
|
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
|
|
|
|
|
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
|
|
|
|
|
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
|
|
|
|
|
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, |
|
|
|
|
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
|
|
|
|
|
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
|
|
|
|
|
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct region_params_t region_params[] = { |
|
|
|
|
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128} |
|
|
|
|
}; |
|
|
|
|
struct region_params_t region_params[] = { |
|
|
|
|
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO; |
|
|
|
|
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){ |
|
|
|
|
.actuator_params = { |
|
|
|
|
.act_type = ACTUATOR_BIVCM, |
|
|
|
|
.reg_tbl_size = 1, |
|
|
|
|
.data_size = 10, |
|
|
|
|
.init_setting_size = 5, |
|
|
|
|
.i2c_freq_mode = I2C_STANDARD_MODE, |
|
|
|
|
.i2c_addr = 24, |
|
|
|
|
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR, |
|
|
|
|
.i2c_data_type = MSM_ACTUATOR_WORD_DATA, |
|
|
|
|
.reg_tbl_params = &actuator_reg_params[0], |
|
|
|
|
.init_settings = &actuator_init_settings[0], |
|
|
|
|
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20}, |
|
|
|
|
}, |
|
|
|
|
.af_tuning_params = { |
|
|
|
|
.initial_code = (int16_t)s->infinity_dac, |
|
|
|
|
.pwd_step = 0, |
|
|
|
|
.region_size = 1, |
|
|
|
|
.total_steps = 238, |
|
|
|
|
.region_params = ®ion_params[0], |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO; |
|
|
|
|
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){ |
|
|
|
|
.actuator_params = { |
|
|
|
|
.act_type = ACTUATOR_BIVCM, |
|
|
|
|
.reg_tbl_size = 1, |
|
|
|
|
.data_size = 10, |
|
|
|
|
.init_setting_size = 5, |
|
|
|
|
.i2c_freq_mode = I2C_STANDARD_MODE, |
|
|
|
|
.i2c_addr = 24, |
|
|
|
|
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR, |
|
|
|
|
.i2c_data_type = MSM_ACTUATOR_WORD_DATA, |
|
|
|
|
.reg_tbl_params = &actuator_reg_params[0], |
|
|
|
|
.init_settings = &actuator_init_settings[0], |
|
|
|
|
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20}, |
|
|
|
|
}, |
|
|
|
|
.af_tuning_params = { |
|
|
|
|
.initial_code = (int16_t)s->infinity_dac, |
|
|
|
|
.pwd_step = 0, |
|
|
|
|
.region_size = 1, |
|
|
|
|
.total_steps = 238, |
|
|
|
|
.region_params = ®ion_params[0], |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); |
|
|
|
|
LOG("actuator set info: %d", err); |
|
|
|
|
} |
|
|
|
|
err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); |
|
|
|
|
LOG("actuator set info: %d", err); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->camera_id == CAMERA_ID_IMX298) { |
|
|
|
@ -1218,30 +876,21 @@ static void road_camera_start(CameraState *s) { |
|
|
|
|
// focus on infinity assuming phone is perpendicular
|
|
|
|
|
int inf_step; |
|
|
|
|
|
|
|
|
|
if (s->device != DEVICE_LP3) { |
|
|
|
|
imx298_ois_calibration(s->ois_fd, s->eeprom); |
|
|
|
|
inf_step = 332 - s->infinity_dac; |
|
|
|
|
actuator_ringing_params.damping_step = 1023; |
|
|
|
|
actuator_ringing_params.damping_delay = 20000; |
|
|
|
|
actuator_ringing_params.hw_params = 13; |
|
|
|
|
|
|
|
|
|
// initial guess
|
|
|
|
|
s->lens_true_pos = 300; |
|
|
|
|
} else { |
|
|
|
|
// default is OP3, this is for LeEco
|
|
|
|
|
actuator_ringing_params.damping_step = 1023; |
|
|
|
|
actuator_ringing_params.damping_delay = 20000; |
|
|
|
|
actuator_ringing_params.hw_params = 13; |
|
|
|
|
|
|
|
|
|
inf_step = 512 - s->infinity_dac; |
|
|
|
|
inf_step = 512 - s->infinity_dac; |
|
|
|
|
|
|
|
|
|
// initial guess
|
|
|
|
|
s->lens_true_pos = 400; |
|
|
|
|
} |
|
|
|
|
// initial guess
|
|
|
|
|
s->lens_true_pos = 400; |
|
|
|
|
|
|
|
|
|
// reset lens position
|
|
|
|
|
memset(&actuator_cfg_data, 0, sizeof(actuator_cfg_data)); |
|
|
|
|
actuator_cfg_data.cfgtype = CFG_SET_POSITION; |
|
|
|
|
actuator_cfg_data.cfg.setpos = (struct msm_actuator_set_position_t){ |
|
|
|
|
.number_of_steps = 1, |
|
|
|
|
.hw_params = (uint32_t)((s->device != DEVICE_LP3) ? 0x0000e424 : 7), |
|
|
|
|
.hw_params = (uint32_t)7, |
|
|
|
|
.pos = {s->infinity_dac, 0}, |
|
|
|
|
.delay = {0,} |
|
|
|
|
}; |
|
|
|
@ -1272,11 +921,8 @@ static void road_camera_start(CameraState *s) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void actuator_move(CameraState *s, uint16_t target) { |
|
|
|
|
int step = target - s->cur_lens_pos; |
|
|
|
|
// LP3 moves only on even positions. TODO: use proper sensor params
|
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
step /= 2; |
|
|
|
|
} |
|
|
|
|
int step = (target - s->cur_lens_pos) / 2; |
|
|
|
|
|
|
|
|
|
int dest_step_pos = s->cur_step_pos + step; |
|
|
|
|
dest_step_pos = std::clamp(dest_step_pos, 0, 255); |
|
|
|
@ -1363,8 +1009,8 @@ static std::optional<float> get_accel_z(SubMaster *sm) { |
|
|
|
|
|
|
|
|
|
static void do_autofocus(CameraState *s, SubMaster *sm) { |
|
|
|
|
// params for focus PI controller
|
|
|
|
|
const int dac_up = s->device == DEVICE_LP3? LP3_AF_DAC_UP:OP3T_AF_DAC_UP; |
|
|
|
|
const int dac_down = s->device == DEVICE_LP3? LP3_AF_DAC_DOWN:OP3T_AF_DAC_DOWN; |
|
|
|
|
const int dac_up = LP3_AF_DAC_UP; |
|
|
|
|
const int dac_down = LP3_AF_DAC_DOWN; |
|
|
|
|
|
|
|
|
|
float lens_true_pos = s->lens_true_pos.load(); |
|
|
|
|
if (!isnan(s->focus_err)) { |
|
|
|
@ -1434,11 +1080,7 @@ void cameras_open(MultiCameraState *s) { |
|
|
|
|
s->v4l_fd = open("/dev/video0", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->v4l_fd >= 0); |
|
|
|
|
|
|
|
|
|
if (s->device == DEVICE_LP3) { |
|
|
|
|
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK); |
|
|
|
|
} else { |
|
|
|
|
s->ispif_fd = open("/dev/v4l-subdev16", O_RDWR | O_NONBLOCK); |
|
|
|
|
} |
|
|
|
|
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK); |
|
|
|
|
assert(s->ispif_fd >= 0); |
|
|
|
|
|
|
|
|
|
// ISPIF: stop
|
|
|
|
@ -1615,10 +1257,10 @@ static void update_lapmap(MultiCameraState *s, const CameraBuf *b, const int cnt |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void setup_self_recover(CameraState *c, const uint16_t *lapres, size_t lapres_size) { |
|
|
|
|
const int dac_down = c->device == DEVICE_LP3 ? LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN; |
|
|
|
|
const int dac_up = c->device == DEVICE_LP3 ? LP3_AF_DAC_UP : OP3T_AF_DAC_UP; |
|
|
|
|
const int dac_m = c->device == DEVICE_LP3 ? LP3_AF_DAC_M : OP3T_AF_DAC_M; |
|
|
|
|
const int dac_3sig = c->device == DEVICE_LP3 ? LP3_AF_DAC_3SIG : OP3T_AF_DAC_3SIG; |
|
|
|
|
const int dac_down = LP3_AF_DAC_DOWN; |
|
|
|
|
const int dac_up = LP3_AF_DAC_UP; |
|
|
|
|
const int dac_m = LP3_AF_DAC_M; |
|
|
|
|
const int dac_3sig = LP3_AF_DAC_3SIG; |
|
|
|
|
|
|
|
|
|
const float lens_true_pos = c->lens_true_pos.load(); |
|
|
|
|
int self_recover = c->self_recover.load(); |
|
|
|
|