[9610] fimc-is2: OIS HEA test SW change
authorsyoo <syoo@motorola.com>
Wed, 26 Jun 2019 20:25:57 +0000 (15:25 -0500)
committerKim Gunho <gunho.kim@samsung.com>
Wed, 7 Aug 2019 13:00:39 +0000 (22:00 +0900)
- actual measured values are stored separately
- calibration mode procedure is changed

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

old mode 100755 (executable)
new mode 100644 (file)
index 7f9a417..bfb1a65
@@ -659,6 +659,15 @@ struct fimc_is_long_term_expo_mode {
 };
 
 /* OIS */
+#ifdef CONFIG_OIS_BU24218_FACTORY_TEST
+struct fimc_is_ois_hea_parameters {
+    uint32_t x_max;
+    uint32_t x_min;
+    uint32_t y_max;
+    uint32_t y_min;
+};
+#endif
+
 struct fimc_is_ois_ops {
        int (*ois_init)(struct v4l2_subdev *subdev);
 #if defined (CONFIG_OIS_USE_RUMBA_S6) || defined (CONFIG_CAMERA_USE_MCU)
@@ -706,7 +715,7 @@ struct fimc_is_ois_ops {
        u8 (*ois_read_mode)(struct v4l2_subdev *subdev);
 #ifdef CONFIG_OIS_BU24218_FACTORY_TEST
        int (*ois_factory_fw_ver)(struct v4l2_subdev *subdev, u32* result);
-       int (*ois_factory_hea)(struct v4l2_subdev *subdev, u32* result);
+       int (*ois_factory_hea)(struct v4l2_subdev  *subdev, struct fimc_is_ois_hea_parameters *result);
 #endif
 };
 
index 5df91cea5aafed9a277de99aa411563c0af302c9..e6b11e87bf3ac7bc92b6d0e1c03248f70c61244f 100644 (file)
@@ -665,15 +665,6 @@ int sensor_module_g_ctrl(struct v4l2_subdev *subdev, struct v4l2_control *ctrl)
                        goto p_err;
                }
                break;
-       case V4L2_CID_IS_FACTORY_OIS_HEA:
-               ret = CALL_OISOPS(sensor_peri->ois, ois_factory_hea,
-                        sensor_peri->subdev_ois, &ctrl->value);
-               if (ret < 0) {
-                       err("err!!! ret(%d)", ret);
-                       ret = -EINVAL;
-                       goto p_err;
-               }
-               break;
 #endif
        default:
                err("err!!! Unknown CID(%#x)", ctrl->id);
@@ -946,6 +937,30 @@ int sensor_module_s_ext_ctrls(struct v4l2_subdev *subdev, struct v4l2_ext_contro
                        break;
                }
 
+#ifdef CONFIG_OIS_BU24218_FACTORY_TEST
+               case V4L2_CID_IS_FACTORY_OIS_HEA: {
+                       struct fimc_is_ois_hea_parameters ois_hea_params = {0,0,0,0};
+
+                       ret = CALL_OISOPS(sensor_peri->ois, ois_factory_hea,
+                                       sensor_peri->subdev_ois, &ois_hea_params);
+                       if (ret < 0) {
+                               err("err!!! ois_factory_hea ret(%d)", ret);
+                               ret = -EINVAL;
+                               goto p_err;
+                       }
+                       info("%s: ois_hea_params (%d %d %d %d)", __func__,
+                               ois_hea_params.x_max,ois_hea_params.x_min,ois_hea_params.y_max,ois_hea_params.y_min);
+
+                       ret = copy_to_user(ext_ctrl->ptr, &ois_hea_params, sizeof(ois_hea_params));
+                       if (ret) {
+                               err("failed copying %d bytes of data\n", ret);
+                               ret = -EINVAL;
+                               goto p_err;
+                       }
+                       break;
+               }
+#endif
+
                default:
                        ctrl.id = ext_ctrl->id;
                        ctrl.value = ext_ctrl->value;
index 54000d86f23f61899661dac0739e2155cfd94e55..7a712ba1bb9b4782c2a52e188c1cc486e419feff 100644 (file)
@@ -28,7 +28,7 @@ int fimc_is_factory_ois_get_fw_rev(struct v4l2_subdev *subdev, uint32_t *result)
 \r
        ois = (struct fimc_is_ois *)v4l2_get_subdevdata(subdev);\r
        if(!ois) {\r
-               err("%s, ois subdev is NULL", __func__);\r
+               err("%s: ois subdev is NULL", __func__);\r
                ret = -EINVAL;\r
                return ret;\r
        }\r
@@ -47,7 +47,7 @@ int fimc_is_factory_ois_get_fw_rev(struct v4l2_subdev *subdev, uint32_t *result)
        ret = fimc_is_ois_read(ois->client, MOT_BU24218_REG_FW_VERSION + 3, &version[3]);\r
        check_result(ret);\r
 \r
-       info("%s: fw version:%d, %d, %d, %d",  __func__, version[0], version[1], version[2], version[3]);\r
+       info("%s: version %d %d %d %d",  __func__, version[0], version[1], version[2], version[3]);\r
        *result = version[0] | (version[1] << 8) | (version[2] << 16) | (version[3] << 24);\r
 \r
        return 0;\r
@@ -57,10 +57,10 @@ ERROR:
 }\r
 \r
 \r
-int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, uint32_t *result)\r
+int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, struct fimc_is_ois_hea_parameters *result)\r
 {\r
        int ret = 0;\r
-       char data[4] = {0, 0, 0, 0};\r
+       uint32_t data[4] = {0, 0, 0, 0};\r
        struct fimc_is_ois *ois = NULL;\r
 \r
        FIMC_BUG(!subdev);\r
@@ -69,7 +69,7 @@ int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, uint32_t *result)
 \r
        ois = (struct fimc_is_ois *)v4l2_get_subdevdata(subdev);\r
        if(!ois) {\r
-               err("%s, ois subdev is NULL", __func__);\r
+               err("%s: ois subdev is NULL", __func__);\r
                ret = -EINVAL;\r
                return ret;\r
        }\r
@@ -77,59 +77,56 @@ int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, uint32_t *result)
        WARN_ON(!ois);\r
 \r
        // 1. change to calibration mode\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       ret = fimc_is_factory_ois_calibration_mode(ois->client);\r
        check_result(ret);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_MODE, 0x01);\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       usleep_range(500,500);\r
+       \r
+       // 2. set to zero position\r
+       ret = fimc_is_factory_ois_set_zero_pos(ois->client);\r
        check_result(ret);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_MODE, 0x00);\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       usleep_range(20000,20000);\r
+       \r
+       // 3. set x max position and read ADC\r
+       ret = fimc_is_factory_ois_set_x_pos(ois->client, MOT_BU24218_VCM_DRV_MAX_HI, MOT_BU24218_VCM_DRV_MAX_LO);\r
        check_result(ret);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_MODE, 0x04);\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       usleep_range(20000,20000);\r
+       ret = fimc_is_factory_ois_get_x_adc(ois->client,&data[0]);\r
        check_result(ret);\r
-       usleep_range(500, 500);\r
-\r
-       // 2. set max postion\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_XCH,     (uint8_t) MOT_BU24218_VCM_DRV_MAX_HI);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_XCH + 1, (uint8_t) MOT_BU24218_VCM_DRV_MAX_LO);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_YCH,     (uint8_t) MOT_BU24218_VCM_DRV_MAX_HI);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_YCH + 1, (uint8_t) MOT_BU24218_VCM_DRV_MAX_LO);\r
-       usleep_range(200, 200);\r
-\r
-       // 3. check status reg\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       \r
+       // 4. set x min position and read ADC\r
+       ret = fimc_is_factory_ois_set_x_pos(ois->client, MOT_BU24218_VCM_DRV_MIN_HI, MOT_BU24218_VCM_DRV_MIN_LO);\r
        check_result(ret);\r
-\r
-       // 4. read lens position\r
-       ret = fimc_is_ois_read(ois->client, MOT_BU24218_REG_LENS_XCH, &data[0]);\r
+       usleep_range(20000,20000);\r
+       ret = fimc_is_factory_ois_get_x_adc(ois->client,&data[1]);\r
        check_result(ret);\r
-       ret = fimc_is_ois_read(ois->client, MOT_BU24218_REG_LENS_YCH, &data[1]);\r
+       \r
+       // 5. set to zero position\r
+       ret = fimc_is_factory_ois_set_zero_pos(ois->client);\r
        check_result(ret);\r
-\r
-       // 5. set min postion\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_XCH,     (uint8_t) MOT_BU24218_VCM_DRV_MIN_HI);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_XCH + 1, (uint8_t) MOT_BU24218_VCM_DRV_MIN_LO);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_YCH,     (uint8_t) MOT_BU24218_VCM_DRV_MIN_HI);\r
-       fimc_is_ois_write(ois->client, MOT_BU24218_REG_POS_YCH + 1, (uint8_t) MOT_BU24218_VCM_DRV_MIN_LO);\r
-       usleep_range(200, 200);\r
-\r
-       // 6. check status reg\r
-       ret = fimc_is_factory_ois_poll(ois->client, MOT_BU24218_REG_STATUS, 0x01);\r
+       usleep_range(20000,20000);\r
+       \r
+       // 6. set y max position and read ADC\r
+       ret = fimc_is_factory_ois_set_y_pos(ois->client, MOT_BU24218_VCM_DRV_MAX_HI, MOT_BU24218_VCM_DRV_MAX_LO);\r
        check_result(ret);\r
-\r
-       usleep_range(200, 200);\r
-       // 7. read lens position\r
-       ret = fimc_is_ois_read(ois->client, MOT_BU24218_REG_LENS_XCH, &data[2]);\r
+       usleep_range(20000,20000);\r
+       ret = fimc_is_factory_ois_get_y_adc(ois->client,&data[2]);\r
        check_result(ret);\r
-       ret = fimc_is_ois_read(ois->client, MOT_BU24218_REG_LENS_YCH, &data[3]);\r
+       \r
+       // 7. set y min position and read ADC\r
+       ret = fimc_is_factory_ois_set_y_pos(ois->client, MOT_BU24218_VCM_DRV_MIN_HI, MOT_BU24218_VCM_DRV_MIN_LO);\r
        check_result(ret);\r
+       usleep_range(20000,20000);\r
+       ret = fimc_is_factory_ois_get_y_adc(ois->client,&data[3]);\r
+       check_result(ret);\r
+       \r
+       result->x_max = data[0];\r
+       result->x_min = data[1];\r
+       result->y_max = data[2];\r
+       result->y_min = data[3];\r
 \r
-       info("%s: actual pos:(%d, %d, %d, %d)", __func__,\r
-               data[0], data[2], data[1], data[3]);\r
-       // follow the format, Xmax, Xmin, Ymax, Ymin\r
-       *result = data[0] | (data[2] << 8) | (data[1] << 16) | (data[3] << 24);\r
-\r
+       info("%s: result %d %d %d %d", __func__,\r
+               result->x_max, result->x_min, result->y_max, result->y_min);\r
+       \r
        return 0;\r
 \r
 ERROR:\r
@@ -158,3 +155,131 @@ ERROR:
        err("%s: Failed with %d", __func__, ret);\r
        return -1;\r
 }\r
+\r
+\r
+int fimc_is_factory_ois_calibration_mode(struct i2c_client *client)\r
+{\r
+       int ret = 0;\r
+       \r
+       fimc_is_ois_write(client, MOT_BU24218_REG_MODE, 0x01);\r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at calib 01");\r
+               return ret;\r
+       }\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_LINEARITY, 0x00);\r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_LINEARITY, 0x00);\r
+       if (ret < 0) {\r
+               err("fail at linearity");\r
+               return ret;\r
+       }\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_GYRO_ACCESS, 0x02);\r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at gyro access");\r
+               return ret;\r
+       }\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_MODE, 0x00);\r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at calib 00");\r
+               return ret;\r
+       }\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_MODE, 0x04);\r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at calib 04");\r
+               return ret;\r
+       }\r
+       \r
+       return ret;\r
+}\r
+\r
+int fimc_is_factory_ois_set_zero_pos(struct i2c_client *client)\r
+{\r
+       int ret = 0;\r
+       fimc_is_factory_ois_set_x_pos(client, MOT_BU24218_VCM_DRV_ZERO_HI, MOT_BU24218_VCM_DRV_ZERO_LO);\r
+       fimc_is_factory_ois_set_y_pos(client, MOT_BU24218_VCM_DRV_ZERO_HI, MOT_BU24218_VCM_DRV_ZERO_LO);\r
+       \r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at set to zero");\r
+       }\r
+    return ret;\r
+}\r
+\r
+int fimc_is_factory_ois_set_x_pos(struct i2c_client *client, uint8_t hi, uint8_t lo)\r
+{\r
+       int ret = 0;\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_POS_XCH,     hi);\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_POS_XCH + 1, lo);     \r
+       \r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+       }\r
+    return ret;\r
+}\r
+\r
+int fimc_is_factory_ois_set_y_pos(struct i2c_client *client, uint8_t hi, uint8_t lo)\r
+{\r
+       int ret = 0;\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_POS_YCH,     hi);\r
+       fimc_is_ois_write(client, MOT_BU24218_REG_POS_YCH + 1, lo);     \r
+       \r
+       ret = fimc_is_factory_ois_poll(client, MOT_BU24218_REG_STATUS, 0x01);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+       }\r
+    return ret;\r
+}\r
+\r
+int fimc_is_factory_ois_get_x_adc(struct i2c_client *client, uint32_t* data)\r
+{\r
+       int ret = 0;\r
+       uint8_t raw_adc_hi = 0, raw_adc_lo = 0;\r
+\r
+    fimc_is_ois_write(client, MOT_BU24218_REG_ADC_LATCH, MOT_BU24218_ADC_LATCH_X);\r
+       usleep_range(11000,11000);\r
+\r
+    ret = fimc_is_ois_read(client, MOT_BU24218_REG_ADC_VAL, &raw_adc_hi);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+               return ret;\r
+       }\r
+       usleep_range(500,500);\r
+    ret = fimc_is_ois_read(client, MOT_BU24218_REG_ADC_VAL+1, &raw_adc_lo);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+               return ret;\r
+       }\r
+       usleep_range(500,500);\r
+\r
+       *data = (uint32_t)(raw_adc_hi << 8) + raw_adc_lo;\r
+       return ret;\r
+}\r
+\r
+int fimc_is_factory_ois_get_y_adc(struct i2c_client *client, uint32_t* data)\r
+{\r
+       int ret = 0;\r
+       uint8_t raw_adc_hi = 0, raw_adc_lo = 0;\r
+\r
+    fimc_is_ois_write(client, MOT_BU24218_REG_ADC_LATCH, MOT_BU24218_ADC_LATCH_Y);\r
+       usleep_range(11000,11000);\r
+\r
+    ret = fimc_is_ois_read(client, MOT_BU24218_REG_ADC_VAL, &raw_adc_hi);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+               return ret;\r
+       }\r
+       usleep_range(500,500);\r
+    ret = fimc_is_ois_read(client, MOT_BU24218_REG_ADC_VAL+1, &raw_adc_lo);\r
+       if (ret < 0) {\r
+               err("fail at %s",__func__);\r
+               return ret;\r
+       }\r
+       usleep_range(500,500);\r
+\r
+       *data = (uint32_t)(raw_adc_hi << 8) + raw_adc_lo;\r
+    return ret;\r
+}\r
index 9f74cfa4da79871a67ced7bb6eccc4485c1e88ab..d4dba7a143b4c876f01972e66e349920207230cc 100644 (file)
@@ -25,6 +25,7 @@
 #define  MOT_BU24218_REG_FW_VERSION             0x6010\r
 #define  MOT_BU24218_REG_GYRO_SELF_TEST         0x6104\r
 #define  MOT_BU24218_REG_GYRO_RESULT            0x6105\r
+#define  MOT_BU24218_REG_LINEARITY              0x614F\r
 \r
 #define  MOT_BU24218_REG_MAX_XCH                0x6100\r
 #define  MOT_BU24218_REG_MIN_XCH                0x6101\r
 #define  MOT_BU24218_REG_POS_YCH                0x6066\r
 #define  MOT_BU24218_REG_LENS_XCH               0x6058\r
 #define  MOT_BU24218_REG_LENS_YCH               0x6059\r
+#define  MOT_BU24218_REG_ADC_VAL                0x6062\r
+#define  MOT_BU24218_REG_ADC_LATCH              0x6060\r
 \r
 #define  MOT_BU24218_VCM_DRV_MAX_HI             0x03\r
 #define  MOT_BU24218_VCM_DRV_MAX_LO             0x00\r
 #define  MOT_BU24218_VCM_DRV_MIN_HI             0x0D\r
 #define  MOT_BU24218_VCM_DRV_MIN_LO             0x00\r
+#define  MOT_BU24218_VCM_DRV_ZERO_HI            0x00\r
+#define  MOT_BU24218_VCM_DRV_ZERO_LO            0x00\r
+\r
+#define  MOT_BU24218_ADC_LATCH_X                0\r
+#define  MOT_BU24218_ADC_LATCH_Y                1\r
+\r
+#define OIS_HEA_NUM_VALUES                      4\r
 \r
 int fimc_is_factory_ois_get_fw_rev(struct v4l2_subdev  *subdev, uint32_t *result);\r
-int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, uint32_t *result);\r
+int fimc_is_factory_ois_get_hea(struct v4l2_subdev  *subdev, struct fimc_is_ois_hea_parameters *result);\r
 int fimc_is_factory_ois_poll(struct i2c_client *client, u16 addr, uint8_t expdata);\r
+\r
+int fimc_is_factory_ois_calibration_mode(struct i2c_client *client);\r
+int fimc_is_factory_ois_set_zero_pos(struct i2c_client *client);\r
+int fimc_is_factory_ois_set_x_pos(struct i2c_client *client, uint8_t hi, uint8_t lo);\r
+int fimc_is_factory_ois_set_y_pos(struct i2c_client *client, uint8_t hi, uint8_t lo);\r
+int fimc_is_factory_ois_get_x_adc(struct i2c_client *client, uint32_t* data);\r
+int fimc_is_factory_ois_get_y_adc(struct i2c_client *client, uint32_t* data);\r
+\r
 #endif\r