[ERD][RAMEN9610-13615] fimc-is2: Enable a change to sensor fps use by sysfs
authordan huh <dan.huh@samsung.com>
Fri, 14 Sep 2018 03:21:44 +0000 (12:21 +0900)
committerCosmin Tanislav <demonsingur@gmail.com>
Mon, 22 Apr 2024 17:23:21 +0000 (20:23 +0300)
Change-Id: I302e4e6ee6c81d668066488d7c2d712a8f5ffd2c
Signed-off-by: dan huh <dan.huh@samsung.com>
drivers/media/platform/exynos/fimc-is2/fimc-is-core.c
drivers/media/platform/exynos/fimc-is2/fimc-is-core.h
drivers/media/platform/exynos/fimc-is2/include/fimc-is-common-config.h
drivers/media/platform/exynos/fimc-is2/sensor/module_framework/fimc-is-device-sensor-peri.c

index 0adb9d760c6bb7b5779c48015f9739076c67e4bd..31c8b9a8259be72ad960e031e2cfab5e312a6ef8 100644 (file)
@@ -921,6 +921,71 @@ static ssize_t store_fixed_sensor_val(struct device *dev,
 
 }
 
+static ssize_t show_fixed_sensor_fps(struct device *dev, struct device_attribute *attr,
+                                 char *buf)
+{
+       return snprintf(buf, PAGE_SIZE, "current_fps(%d), max_fps(%d)\n",
+                       sysfs_sensor.frame_duration,
+                       sysfs_sensor.max_fps);
+}
+
+static ssize_t store_fixed_sensor_fps(struct device *dev,
+                                struct device_attribute *attr,
+                                const char *buf, size_t count)
+{
+       int ret;
+       int input_val;
+
+       ret = kstrtoint(buf, 0, &input_val);
+       if (ret) {
+               err("Fail to conversion on success(%d)\n", ret);
+               return ret;
+       }
+
+       if (sysfs_sensor.is_fps_en) {
+               if (input_val > sysfs_sensor.max_fps) {
+                       warn("Over max fps(%d), setting current fps to max(%d -> %d)\n",
+                                       FIXED_MAX_FPS_VALUE, input_val, FIXED_MAX_FPS_VALUE);
+
+                       sysfs_sensor.set_fps = input_val;
+                       input_val = sysfs_sensor.max_fps;
+               } else if (input_val < FIXED_MIN_FPS_VALUE) {
+                       warn("Lower than enable to sensor fps setting, setting to (%d -> %d)\n",
+                                       input_val, FIXED_MIN_FPS_VALUE);
+
+                       input_val = FIXED_MIN_FPS_VALUE;
+               }
+
+               sysfs_sensor.frame_duration = input_val;
+       } else
+               warn("Not enable a is_fps_en, has to first setting is_fps_en\n");
+
+       return count;
+}
+
+static ssize_t show_en_fixed_sensor_fps(struct device *dev, struct device_attribute *attr,
+                                 char *buf)
+{
+       if (sysfs_sensor.is_fps_en)
+               return snprintf(buf, PAGE_SIZE, "%s\n", "enabled");
+       else
+               return snprintf(buf, PAGE_SIZE, "%s\n", "disabled");
+}
+
+static ssize_t store_en_fixed_sensor_fps(struct device *dev,
+                                struct device_attribute *attr,
+                                const char *buf, size_t count)
+{
+       if (buf[0] == '1')
+               sysfs_sensor.is_fps_en = true;
+       else {
+               sysfs_sensor.is_fps_en = false;
+               sysfs_sensor.frame_duration = FIXED_MAX_FPS_VALUE;
+       }
+
+       return count;
+}
+
 static ssize_t show_en_fixed_sensor(struct device *dev, struct device_attribute *attr,
                                  char *buf)
 {
@@ -965,6 +1030,8 @@ static DEVICE_ATTR(fixed_position, 0644, show_actuator_fixed_position, store_act
 
 #ifdef FIXED_SENSOR_DEBUG
 static DEVICE_ATTR(fixed_sensor_val, 0644, show_fixed_sensor_val, store_fixed_sensor_val);
+static DEVICE_ATTR(fixed_sensor_fps, 0644, show_fixed_sensor_fps, store_fixed_sensor_fps);
+static DEVICE_ATTR(en_fixed_sensor_fps, 0644, show_en_fixed_sensor_fps, store_en_fixed_sensor_fps);
 static DEVICE_ATTR(en_fixed_sensor, 0644, show_en_fixed_sensor, store_en_fixed_sensor);
 #endif
 #endif
@@ -988,6 +1055,8 @@ static struct attribute *fimc_is_debug_entries[] = {
        &dev_attr_fixed_position.attr,
 #ifdef FIXED_SENSOR_DEBUG
        &dev_attr_fixed_sensor_val.attr,
+       &dev_attr_fixed_sensor_fps.attr,
+       &dev_attr_en_fixed_sensor_fps.attr,
        &dev_attr_en_fixed_sensor.attr,
 #endif
 #endif
@@ -1360,7 +1429,10 @@ static int __init fimc_is_probe(struct platform_device *pdev)
        }
 #ifdef FIXED_SENSOR_DEBUG
        sysfs_sensor.is_en = false;
-       sysfs_sensor.frame_duration = FIXED_FPS_VALUE;
+       sysfs_sensor.is_fps_en = false;
+       sysfs_sensor.frame_duration = FIXED_MAX_FPS_VALUE;
+       sysfs_sensor.max_fps = FIXED_MAX_FPS_VALUE;
+       sysfs_sensor.set_fps = FIXED_MAX_FPS_VALUE;
        sysfs_sensor.long_exposure_time = FIXED_EXPOSURE_VALUE;
        sysfs_sensor.short_exposure_time = FIXED_EXPOSURE_VALUE;
        sysfs_sensor.long_analog_gain = FIXED_AGAIN_VALUE;
index 5bcfc713d6ffcd5618e0a3f9c39d93e5ae828a6e..19284e8be5aea49eefa5cf8863ce667dc8e6b115 100644 (file)
@@ -251,6 +251,7 @@ struct fimc_is_dual_info {
 #ifdef FIXED_SENSOR_DEBUG
 struct fimc_is_sysfs_sensor {
        bool            is_en;
+       bool            is_fps_en;
        unsigned int    frame_duration;
        unsigned int    long_exposure_time;
        unsigned int    short_exposure_time;
@@ -258,6 +259,8 @@ struct fimc_is_sysfs_sensor {
        unsigned int    short_analog_gain;
        unsigned int    long_digital_gain;
        unsigned int    short_digital_gain;
+       unsigned int    set_fps;
+       int             max_fps;
 };
 #endif
 
index a5e1b607aeb2d30e57ed7cbc6a46d15a642d0b16..1339b62b34f82d768cba69c126d9c6aefb6dc80f 100644 (file)
@@ -115,8 +115,9 @@ extern int debug_sensor;
 /* #define FIXED_FPS_DEBUG */
 /* #define FIXED_TDNR_NOISE_INDEX */
 
-/* 5fps */
-#define FIXED_FPS_VALUE (30 / 6)
+/* 30fps */
+#define FIXED_MAX_FPS_VALUE (30)
+#define FIXED_MIN_FPS_VALUE (1)
 #define FIXED_EXPOSURE_VALUE (200000) /* 33.333 * 6 */
 #define FIXED_AGAIN_VALUE (150 * 6)
 #define FIXED_DGAIN_VALUE (150 * 6)
index 7035c58afc8360d8b840239816b9afc8a5af3942..ca6d4c3b86e41bf3feef3ca10ff9f9a78633cf9a 100755 (executable)
@@ -1719,10 +1719,19 @@ int fimc_is_sensor_peri_s_frame_duration(struct fimc_is_device_sensor *device,
        sensor_peri = (struct fimc_is_device_sensor_peri *)module->private_data;
 
 #ifdef FIXED_SENSOR_DEBUG
-       if (unlikely(sysfs_sensor.is_en == true)) {
+       sysfs_sensor.max_fps = sensor_peri->cis.cis_data->max_fps;
+
+       if (unlikely(sysfs_sensor.is_en == true) || unlikely(sysfs_sensor.is_fps_en == true)) {
+               if (sysfs_sensor.set_fps < sysfs_sensor.max_fps) {
+                       sysfs_sensor.frame_duration = sysfs_sensor.set_fps;
+               } else if (sysfs_sensor.frame_duration > sysfs_sensor.max_fps) {
+                       sysfs_sensor.frame_duration = sysfs_sensor.max_fps;
+               }
+
                frame_duration = FPS_TO_DURATION_US(sysfs_sensor.frame_duration);
                dbg_sensor(1, "sysfs_sensor.frame_duration = %d\n", sysfs_sensor.frame_duration);
-       }
+       } else
+               sysfs_sensor.frame_duration = FPS_TO_DURATION_US(frame_duration);
 #endif
 
        ret = CALL_CISOPS(&sensor_peri->cis, cis_set_frame_duration, sensor_peri->subdev_cis, frame_duration);