[HACK][COMMON] fimc-is2: implement init_AWB feature
authorWooyeon Kim <wooy88.kim@samsung.com>
Thu, 26 Jul 2018 09:41:05 +0000 (18:41 +0900)
committerhskang <hs1218.kang@samsung.com>
Mon, 1 Oct 2018 01:10:20 +0000 (10:10 +0900)
 - store WB gain(color.gains[4]) value and use camera operating

 PR JIRA ID: CPR-167

Change-Id: Ic6d62fb20571b3bda6279ec12ad0c166e1cbd2ec
Signed-off-by: Wooyeon Kim <wooy88.kim@samsung.com>
drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor.h
drivers/media/platform/exynos/fimc-is2/fimc-is-device-sensor_v2.c
drivers/media/platform/exynos/fimc-is2/fimc-is-groupmgr.c

index 9143e6f348ea96bb79359bc175dd9bf0daa16d52..5b3909ccd5ddeb262188d273984963ae5412c7e7 100644 (file)
@@ -426,6 +426,14 @@ struct fimc_is_device_sensor {
        u32                                             sstream;
        u32                                             num_buffers;
        u32                                             ex_mode;
+
+#ifdef ENABLE_INIT_AWB
+       /* backup AWB gains for use initial gain */
+       float                                   init_wb[WB_GAIN_COUNT];
+       float                                   last_wb[WB_GAIN_COUNT];
+       float                                   chk_wb[WB_GAIN_COUNT];
+       u32                                     init_wb_cnt;
+#endif
 };
 
 int fimc_is_sensor_open(struct fimc_is_device_sensor *device,
index d73901246513a7d4e5aad1e9e29865d14239ea52..21cedc30d79e8cdb68928866c2cd4124e688831e 100644 (file)
@@ -1434,6 +1434,11 @@ static int __init fimc_is_sensor_probe(struct platform_device *pdev)
        device->groupmgr = &core->groupmgr;
        device->devicemgr = &core->devicemgr;
        device->dtp_del_flag = false;
+#ifdef ENABLE_INIT_AWB
+       memset(device->init_wb, 0, sizeof(float) * WB_GAIN_COUNT);
+       memset(device->last_wb, 0, sizeof(float) * WB_GAIN_COUNT);
+       memset(device->chk_wb, 0, sizeof(float) * WB_GAIN_COUNT);
+#endif
 
        platform_set_drvdata(pdev, device);
        init_waitqueue_head(&device->instant_wait);
@@ -1655,6 +1660,11 @@ int fimc_is_sensor_open(struct fimc_is_device_sensor *device,
        memset(&device->lens_ctl, 0, sizeof(struct camera2_lens_ctl));
        memset(&device->flash_ctl, 0, sizeof(struct camera2_flash_ctl));
 
+#ifdef ENABLE_INIT_AWB
+       /* copy last awb gain value to init awb value */
+       memcpy(device->init_wb, device->last_wb, sizeof(float) * WB_GAIN_COUNT);
+#endif
+
        groupmgr = device->groupmgr;
        group = &device->group_sensor;
        group_id = GROUP_ID_SS0 + GET_SSX_ID(GET_VIDEO(vctx));
@@ -2088,6 +2098,23 @@ int fimc_is_sensor_s_input(struct fimc_is_device_sensor *device,
        }
 #endif
 
+#ifdef ENABLE_INIT_AWB
+       switch (input) {
+       case SENSOR_POSITION_REAR:
+       case SENSOR_POSITION_REAR2:
+       case SENSOR_POSITION_REAR3:
+               device->init_wb_cnt = INIT_AWB_COUNT_REAR;
+               break;
+       case SENSOR_POSITION_FRONT:
+       case SENSOR_POSITION_FRONT2:
+               device->init_wb_cnt = INIT_AWB_COUNT_FRONT;
+               break;
+       default:
+               device->init_wb_cnt = 0; /* not operated */
+               break;
+       }
+#endif
+
        if (device->subdev_module) {
                mwarn("subdev_module is already registered", device);
                v4l2_device_unregister_subdev(device->subdev_module);
@@ -3699,6 +3726,24 @@ static int fimc_is_sensor_shot(struct fimc_is_device_ischain *ischain,
                goto p_err;
        }
 
+#ifdef ENABLE_INIT_AWB
+       if ((frame->shot->ctl.aa.awbMode == AA_AWBMODE_WB_AUTO)
+               && (frame->fcount <= sensor->init_wb_cnt)
+               && memcmp(sensor->init_wb, sensor->chk_wb, sizeof(float) * WB_GAIN_COUNT)) {
+
+               /* for applying init AWB feature,
+                * 1. awbMode is AA_AWB_MODE_WB_AUTO
+                * 2. it is applied at only initial count frame num
+                * 3. set only last_ae value exist
+                */
+               memcpy(frame->shot->ctl.color.gains, sensor->init_wb, sizeof(float) * WB_GAIN_COUNT);
+               frame->shot->ctl.aa.awbMode = AA_AWBMODE_OFF;
+
+               mgrdbgs(1, "init AWB(applied cnt:%d)", group->device, group, frame, sensor->init_wb_cnt);
+       }
+#endif
+
+
        PROGRAM_COUNT(8);
 
        /*
index bfb933b17fedfbc0ca8a68e524770eb5b4832cf7..e5e35d4e9bf1278ab10b4856a857938b7de80c9b 100644 (file)
@@ -3344,6 +3344,13 @@ int fimc_is_group_done(struct fimc_is_groupmgr *groupmgr,
                                frame->shot->udm.ni.nextNextFrameNoiseIndex;
                }
 
+#ifdef ENABLE_INIT_AWB
+               /* wb gain backup for initial AWB */
+               if (device->sensor && ((child == &device->group_isp) || (child->subdev[ENTRY_ISP])))
+                       memcpy(device->sensor->last_wb, frame->shot->dm.color.gains,
+                               sizeof(float) * WB_GAIN_COUNT);
+#endif
+
 #if !defined(FAST_FDAE)
                if ((child == &device->group_vra) || (child->subdev[ENTRY_VRA])) {
 #ifdef ENABLE_FD_SW