[COMMON] fimc-is2: modify initial AE code for commonize
authormourui <mourui@meizu.com>
Wed, 7 Mar 2018 09:26:04 +0000 (17:26 +0800)
committerhskang <hs1218.kang@samsung.com>
Tue, 14 Aug 2018 01:19:10 +0000 (21:19 -0400)
 -  apply last AE value to next initial value

 PR JIRA ID: CPR-134

Change-Id: I86edcd79044df658e7b1c28b036224628919fb65
Signed-off-by: Wooyeon Kim <wooy88.kim@samsung.com>
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis.c
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/cis/fimc-is-cis.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c [changed mode: 0644->0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-interface-sensor.c [changed mode: 0644->0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-interface-sensor.h [changed mode: 0644->0755]
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/modules/fimc-is-device-module-base.c

index cbfa2b17bbcc700085f07cab714e7b42f9903178..18daa8452edf5c8e32582681db952ee27d70a1a5 100644 (file)
@@ -517,3 +517,25 @@ int sensor_cis_wait_streamon(struct v4l2_subdev *subdev)
 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;
+}
index 8361d2f270106802cc1b435be3cc3e6be0b5d8b2..105b383f3e1e1157a6431492f6fc61a2349de7a8 100644 (file)
@@ -75,4 +75,6 @@ u32 sensor_cis_do_div64(u64 num, u32 den);
 int sensor_cis_wait_streamoff(struct v4l2_subdev *subdev);
 int sensor_cis_wait_streamon(struct v4l2_subdev *subdev);
 
+int sensor_cis_set_initial_exposure(struct v4l2_subdev *subdev);
+
 #endif
old mode 100644 (file)
new mode 100755 (executable)
index cdaad22..7035c58
@@ -1567,7 +1567,7 @@ int fimc_is_sensor_peri_s_stream(struct fimc_is_device_sensor *device,
 #endif
 
                /* stream on sequence */
-               if (cis->need_mode_change == false) {
+               if (cis->need_mode_change == false && cis->use_initial_ae == false) {
                        /* only first time after camera on */
 #ifdef CAMERA_REAR2
                        fimc_is_sensor_setting_mode_change(sensor_peri);
index 0695275033faf0635d980faa8f0665dc37940840..78fbb93ec6416fdcad1a248351e252578302de89 100644 (file)
@@ -85,6 +85,11 @@ struct fimc_is_cis {
        u32                             ctrl_delay;
        u32                             ae_exposure;
        u32                             ae_deltaev;
+
+       /* settings for initial AE */
+       bool                            use_initial_ae;
+       ae_setting                      init_ae_setting;
+       ae_setting                      last_ae_setting;
 };
 
 struct fimc_is_actuator_data {
old mode 100644 (file)
new mode 100755 (executable)
index 5cbb96e..e1f098f
@@ -843,6 +843,7 @@ int request_exposure(struct fimc_is_sensor_interface *itf,
        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);
@@ -871,6 +872,17 @@ int request_exposure(struct fimc_is_sensor_interface *itf,
                }
        }
 
+       /* 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;
 }
@@ -996,6 +1008,7 @@ int request_gain(struct fimc_is_sensor_interface *itf,
        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);
@@ -1040,6 +1053,19 @@ int request_gain(struct fimc_is_sensor_interface *itf,
                }
        }
 
+       /* 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;
 }
@@ -1988,6 +2014,53 @@ int set_sensor_3a_mode(struct fimc_is_sensor_interface *itf,
        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;
@@ -3240,6 +3313,7 @@ int init_sensor_interface(struct fimc_is_sensor_interface *itf)
        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 */
old mode 100644 (file)
new mode 100755 (executable)
index 03e721f..2c1761d
@@ -336,6 +336,7 @@ struct fimc_is_cis_ops {
 #ifdef CAMERA_REAR2_SENSOR_SHIFT_CROP
        int (*cis_update_pdaf_tail_size)(struct v4l2_subdev *subdev, struct fimc_is_sensor_cfg *select);
 #endif
+       int (*cis_set_initial_exposure)(struct v4l2_subdev *subdev);
 };
 
 struct fimc_is_sensor_ctl
@@ -732,6 +733,13 @@ struct fimc_is_cis_interface_ops {
        /* Set sensor 3a mode - OTF/M2M */
        int (*set_sensor_3a_mode)(struct fimc_is_sensor_interface *itf,
                                        u32 mode);
+       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_cis_ext_interface_ops {
index 1d02984831fba3f59476b772e76c2fd242197368..3d13e2539280bdefff59b1098f1aea249974d4f4 100644 (file)
@@ -183,6 +183,13 @@ int sensor_module_init(struct v4l2_subdev *subdev, u32 val)
                goto p_err;
        }
 
+       /* set initial ae setting if initial_ae feature is supported */
+       ret = CALL_CISOPS(&sensor_peri->cis, cis_set_initial_exposure, subdev_cis);
+       if (ret) {
+               err("v4l2_subdev_call(set_initial_exposure) is fail(%d)", ret);
+               goto p_err;
+       }
+
        subdev_flash = sensor_peri->subdev_flash;
        if (subdev_flash != NULL) {
                ret = v4l2_subdev_call(subdev_flash, core, init, 0);