p_err:
return ret;
}
+
+int sensor_cis_set_initial_exposure(struct v4l2_subdev *subdev)
+{
+ struct fimc_is_cis *cis;
+
+ cis = (struct fimc_is_cis *)v4l2_get_subdevdata(subdev);
+ if (unlikely(!cis)) {
+ err("cis is NULL");
+ return -EINVAL;
+ }
+
+ if (cis->use_initial_ae) {
+ cis->init_ae_setting = cis->last_ae_setting;
+
+ dbg_sensor(1, "[MOD:D:%d] %s short(exp:%d/again:%d/dgain:%d), long(exp:%d/again:%d/dgain:%d)\n",
+ cis->id, __func__, cis->init_ae_setting.exposure, cis->init_ae_setting.analog_gain,
+ cis->init_ae_setting.digital_gain, cis->init_ae_setting.long_exposure,
+ cis->init_ae_setting.long_analog_gain, cis->init_ae_setting.long_digital_gain);
+ }
+
+ return 0;
+}
int ret = 0;
u32 i = 0;
u32 end_index = 0;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
}
}
+ /* store exposure for use initial AE */
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ if (!sensor_peri) {
+ err("[%s] sensor_peri is NULL", __func__);
+ return -EINVAL;
+ }
+
+ if (sensor_peri->cis.use_initial_ae) {
+ sensor_peri->cis.last_ae_setting.long_exposure = long_exposure;
+ sensor_peri->cis.last_ae_setting.exposure = short_exposure;
+ }
p_err:
return ret;
}
int ret = 0;
u32 i = 0;
u32 end_index = 0;
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
FIMC_BUG(!itf);
FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
}
}
+ /* store gain for use initial AE */
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ if (!sensor_peri) {
+ err("[%s] sensor_peri is NULL", __func__);
+ return -EINVAL;
+ }
+
+ if (sensor_peri->cis.use_initial_ae) {
+ sensor_peri->cis.last_ae_setting.long_analog_gain = long_analog_gain;
+ sensor_peri->cis.last_ae_setting.long_digital_gain = long_digital_gain;
+ sensor_peri->cis.last_ae_setting.analog_gain = short_analog_gain;
+ sensor_peri->cis.last_ae_setting.digital_gain = short_digital_gain;
+ }
p_err:
return ret;
}
return 0;
}
+int get_initial_exposure_gain_of_sensor(struct fimc_is_sensor_interface *itf,
+ u32 *long_expo,
+ u32 *long_again,
+ u32 *long_dgain,
+ u32 *short_expo,
+ u32 *short_again,
+ u32 *short_dgain)
+{
+ struct fimc_is_device_sensor_peri *sensor_peri = NULL;
+
+ if (!itf) {
+ err("[%s] fimc_is_sensor_interface is NULL", __func__);
+ return -EINVAL;
+ }
+
+ FIMC_BUG(itf->magic != SENSOR_INTERFACE_MAGIC);
+
+ sensor_peri = container_of(itf, struct fimc_is_device_sensor_peri, sensor_interface);
+ if (!sensor_peri) {
+ err("[%s] sensor_peri is NULL", __func__);
+ return -EINVAL;
+ }
+
+ if (sensor_peri->cis.use_initial_ae) {
+ *long_expo = sensor_peri->cis.init_ae_setting.long_exposure;
+ *long_again = sensor_peri->cis.init_ae_setting.long_analog_gain;
+ *long_dgain = sensor_peri->cis.init_ae_setting.long_digital_gain;
+ *short_expo = sensor_peri->cis.init_ae_setting.exposure;
+ *short_again = sensor_peri->cis.init_ae_setting.analog_gain;
+ *short_dgain = sensor_peri->cis.init_ae_setting.digital_gain;
+ } else {
+ *long_expo = sensor_peri->cis.cis_data->low_expo_start;
+ *long_again = 1000;
+ *long_dgain = 1000;
+ *short_expo = sensor_peri->cis.cis_data->low_expo_start;
+ *short_again = 1000;
+ *short_dgain = 1000;
+ dbg_sensor(1, "%s: called at not enabled last_ae, use default low exposure setting", __func__);
+ }
+
+ dbg_sensor(1, "%s: sensorid(%d),long(%d-%d-%d), shot(%d-%d-%d)\n", __func__,
+ sensor_peri->module->sensor_id,
+ *long_expo, *long_again, *long_dgain, *short_expo, *short_again, *short_dgain);
+
+ return 0;
+}
+
u32 set_adjust_sync(struct fimc_is_sensor_interface *itf, u32 setsync)
{
u32 ret = 0;
itf->cis_itf_ops.get_module_id = get_module_id;
itf->cis_itf_ops.get_module_position = get_module_position;
itf->cis_itf_ops.set_sensor_3a_mode = set_sensor_3a_mode;
+ itf->cis_itf_ops.get_initial_exposure_gain_of_sensor = get_initial_exposure_gain_of_sensor;
itf->cis_ext_itf_ops.change_cis_mode = change_cis_mode;
/* struct fimc_is_cis_event_ops */