|
|
|
|
@@ -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,
|
|
|
|
|
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 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,
|
|
|
|
|
.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,
|
|
|
|
|
};
|
|
|
|
|
} 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,
|
|
|
|
|
},
|
|
|
|
|
.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;
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
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,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int dac_range = macro_dac - s->infinity_dac;
|
|
|
|
|
s->infinity_dac += far_margin * dac_range;
|
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
LOG(" -> macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac);
|
|
|
|
|
struct region_params_t region_params[] = {
|
|
|
|
|
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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},
|
|
|
|
|
};
|
|
|
|
|
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],
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//...
|
|
|
|
|
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 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],
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|