summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch')
-rw-r--r--target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch367
1 files changed, 0 insertions, 367 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch b/target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch
deleted file mode 100644
index 3362217bcc..0000000000
--- a/target/linux/brcm2708/patches-3.10/0173-V4L2-Initial-pass-at-scene-modes.patch
+++ /dev/null
@@ -1,367 +0,0 @@
-From 1073798a92010ecd467fba0cc720752992fd7a2a Mon Sep 17 00:00:00 2001
-From: Dave Stevenson <dsteve@broadcom.com>
-Date: Fri, 14 Feb 2014 17:12:08 +0000
-Subject: [PATCH 173/196] V4L2: Initial pass at scene modes.
-
-Only supports exposure mode and metering modes.
-
-Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
----
- drivers/media/platform/bcm2835/bcm2835-camera.h | 10 +-
- drivers/media/platform/bcm2835/controls.c | 225 ++++++++++++++++++++----
- 2 files changed, 199 insertions(+), 36 deletions(-)
-
-diff --git a/drivers/media/platform/bcm2835/bcm2835-camera.h b/drivers/media/platform/bcm2835/bcm2835-camera.h
-index 8822a1a..f389bea 100644
---- a/drivers/media/platform/bcm2835/bcm2835-camera.h
-+++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
-@@ -15,7 +15,7 @@
- * core driver device
- */
-
--#define V4L2_CTRL_COUNT 24 /* number of v4l controls */
-+#define V4L2_CTRL_COUNT 25 /* number of v4l controls */
-
- enum {
- MMAL_COMPONENT_CAMERA = 0,
-@@ -45,11 +45,15 @@ struct bm2835_mmal_dev {
- /* controls */
- struct v4l2_ctrl_handler ctrl_handler;
- struct v4l2_ctrl *ctrls[V4L2_CTRL_COUNT];
-+ enum v4l2_scene_mode scene_mode;
- struct mmal_colourfx colourfx;
- int hflip;
- int vflip;
-- enum mmal_parameter_exposuremode exposure_mode;
-- enum v4l2_exposure_auto_type exposure_mode_v4l2;
-+ enum mmal_parameter_exposuremode exposure_mode_user;
-+ enum v4l2_exposure_auto_type exposure_mode_v4l2_user;
-+ /* active exposure mode may differ if selected via a scene mode */
-+ enum mmal_parameter_exposuremode exposure_mode_active;
-+ enum mmal_parameter_exposuremeteringmode metering_mode;
- unsigned int manual_shutter_speed;
- bool exp_auto_priority;
-
-diff --git a/drivers/media/platform/bcm2835/controls.c b/drivers/media/platform/bcm2835/controls.c
-index 45cf790..b7a7e88 100644
---- a/drivers/media/platform/bcm2835/controls.c
-+++ b/drivers/media/platform/bcm2835/controls.c
-@@ -145,6 +145,25 @@ static const struct v4l2_to_mmal_effects_setting
- 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
- };
-
-+struct v4l2_mmal_scene_config {
-+ enum v4l2_scene_mode v4l2_scene;
-+ enum mmal_parameter_exposuremode exposure_mode;
-+ enum mmal_parameter_exposuremeteringmode metering_mode;
-+};
-+
-+static const struct v4l2_mmal_scene_config scene_configs[] = {
-+ /* V4L2_SCENE_MODE_NONE automatically added */
-+ {
-+ V4L2_SCENE_MODE_NIGHT,
-+ MMAL_PARAM_EXPOSUREMODE_NIGHT,
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
-+ },
-+ {
-+ V4L2_SCENE_MODE_SPORTS,
-+ MMAL_PARAM_EXPOSUREMODE_SPORTS,
-+ MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
-+ },
-+};
-
- /* control handlers*/
-
-@@ -296,7 +315,7 @@ static int ctrl_set_exposure(struct bm2835_mmal_dev *dev,
- struct v4l2_ctrl *ctrl,
- const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
- {
-- enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode;
-+ enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode_user;
- u32 shutter_speed = 0;
- struct vchiq_mmal_port *control;
- int ret = 0;
-@@ -317,31 +336,32 @@ static int ctrl_set_exposure(struct bm2835_mmal_dev *dev,
- case V4L2_EXPOSURE_MANUAL:
- exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
- break;
--
-- case V4L2_EXPOSURE_SHUTTER_PRIORITY:
-- exp_mode = MMAL_PARAM_EXPOSUREMODE_SPORTS;
-- break;
--
-- case V4L2_EXPOSURE_APERTURE_PRIORITY:
-- exp_mode = MMAL_PARAM_EXPOSUREMODE_NIGHT;
-- break;
--
- }
-- dev->exposure_mode = exp_mode;
-- dev->exposure_mode_v4l2 = ctrl->val;
-+ dev->exposure_mode_user = exp_mode;
-+ dev->exposure_mode_v4l2_user = ctrl->val;
- } else if (mmal_ctrl->id == V4L2_CID_EXPOSURE_AUTO_PRIORITY) {
- dev->exp_auto_priority = ctrl->val;
- }
-
-- if (dev->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
-- shutter_speed = dev->manual_shutter_speed;
-+ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
-+ if (exp_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
-+ shutter_speed = dev->manual_shutter_speed;
-
-- ret = vchiq_mmal_port_parameter_set(dev->instance, control,
-- MMAL_PARAMETER_SHUTTER_SPEED,
-- &shutter_speed, sizeof(shutter_speed));
-- ret += vchiq_mmal_port_parameter_set(dev->instance, control,
-- MMAL_PARAMETER_EXPOSURE_MODE,
-- &exp_mode, sizeof(u32));
-+ ret = vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_SHUTTER_SPEED,
-+ &shutter_speed,
-+ sizeof(shutter_speed));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ &exp_mode,
-+ sizeof(u32));
-+ dev->exposure_mode_active = exp_mode;
-+ }
-+ /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
-+ * always apply irrespective of scene mode.
-+ */
- ret += set_framerate_params(dev);
-
- return ret;
-@@ -351,35 +371,38 @@ static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
- struct v4l2_ctrl *ctrl,
- const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
- {
-- u32 u32_value;
-- struct vchiq_mmal_port *control;
--
-- control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
--
- switch (ctrl->val) {
- case V4L2_EXPOSURE_METERING_AVERAGE:
-- u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
-+ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE;
- break;
-
- case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED:
-- u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
-+ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT;
- break;
-
- case V4L2_EXPOSURE_METERING_SPOT:
-- u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
-+ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT;
- break;
-
- /* todo matrix weighting not added to Linux API till 3.9
- case V4L2_EXPOSURE_METERING_MATRIX:
-- u32_value = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
-+ dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
- break;
- */
-
- }
-
-- return vchiq_mmal_port_parameter_set(dev->instance, control,
-+ if (dev->scene_mode == V4L2_SCENE_MODE_NONE) {
-+ struct vchiq_mmal_port *control;
-+ u32 u32_value = dev->metering_mode;
-+
-+ control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
-+
-+ return vchiq_mmal_port_parameter_set(dev->instance, control,
- mmal_ctrl->mmal_id,
- &u32_value, sizeof(u32_value));
-+ } else
-+ return 0;
- }
-
- static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev *dev,
-@@ -738,6 +761,113 @@ static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev *dev,
- return ret;
- }
-
-+static int ctrl_set_scene_mode(struct bm2835_mmal_dev *dev,
-+ struct v4l2_ctrl *ctrl,
-+ const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
-+{
-+ int ret = 0;
-+ int shutter_speed;
-+ struct vchiq_mmal_port *control;
-+
-+ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "scene mode selected %d, was %d\n", ctrl->val,
-+ dev->scene_mode);
-+ control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
-+
-+ if (ctrl->val == dev->scene_mode)
-+ return 0;
-+
-+ if (ctrl->val == V4L2_SCENE_MODE_NONE) {
-+ /* Restore all user selections */
-+ dev->scene_mode = V4L2_SCENE_MODE_NONE;
-+
-+ if (dev->exposure_mode_user == MMAL_PARAM_EXPOSUREMODE_OFF)
-+ shutter_speed = dev->manual_shutter_speed;
-+ else
-+ shutter_speed = 0;
-+
-+ v4l2_dbg(0, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
-+ __func__, shutter_speed, dev->exposure_mode_user,
-+ dev->metering_mode);
-+ ret = vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_SHUTTER_SPEED,
-+ &shutter_speed,
-+ sizeof(shutter_speed));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ &dev->exposure_mode_user,
-+ sizeof(u32));
-+ dev->exposure_mode_active = dev->exposure_mode_user;
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_EXP_METERING_MODE,
-+ &dev->metering_mode,
-+ sizeof(u32));
-+ ret += set_framerate_params(dev);
-+ } else {
-+ /* Set up scene mode */
-+ int i;
-+ const struct v4l2_mmal_scene_config *scene = NULL;
-+ int shutter_speed;
-+ enum mmal_parameter_exposuremode exposure_mode;
-+ enum mmal_parameter_exposuremeteringmode metering_mode;
-+
-+ for (i = 0; i < ARRAY_SIZE(scene_configs); i++) {
-+ if (scene_configs[i].v4l2_scene ==
-+ ctrl->val) {
-+ scene = &scene_configs[i];
-+ break;
-+ }
-+ }
-+ if (i >= ARRAY_SIZE(scene_configs))
-+ return -EINVAL;
-+
-+ /* Set all the values */
-+ dev->scene_mode = ctrl->val;
-+
-+ if (scene->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
-+ shutter_speed = dev->manual_shutter_speed;
-+ else
-+ shutter_speed = 0;
-+ exposure_mode = scene->exposure_mode;
-+ metering_mode = scene->metering_mode;
-+
-+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
-+ __func__, shutter_speed, exposure_mode, metering_mode);
-+
-+ ret = vchiq_mmal_port_parameter_set(dev->instance, control,
-+ MMAL_PARAMETER_SHUTTER_SPEED,
-+ &shutter_speed,
-+ sizeof(shutter_speed));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance,
-+ control,
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ &exposure_mode,
-+ sizeof(u32));
-+ dev->exposure_mode_active = exposure_mode;
-+ ret += vchiq_mmal_port_parameter_set(dev->instance, control,
-+ MMAL_PARAMETER_EXPOSURE_MODE,
-+ &exposure_mode,
-+ sizeof(u32));
-+ ret += vchiq_mmal_port_parameter_set(dev->instance, control,
-+ MMAL_PARAMETER_EXP_METERING_MODE,
-+ &metering_mode,
-+ sizeof(u32));
-+ ret += set_framerate_params(dev);
-+ }
-+ if (ret) {
-+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
-+ "%s: Setting scene to %d, ret=%d\n",
-+ __func__, ctrl->val, ret);
-+ ret = -EINVAL;
-+ }
-+ return 0;
-+}
-+
- static int bm2835_mmal_s_ctrl(struct v4l2_ctrl *ctrl)
- {
- struct bm2835_mmal_dev *dev =
-@@ -973,6 +1103,15 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
- &ctrl_set_video_encode_profile_level,
- false
- },
-+ {
-+ V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
-+ -1, /* Min is computed at runtime */
-+ V4L2_SCENE_MODE_TEXT,
-+ V4L2_SCENE_MODE_NONE, 1, NULL,
-+ MMAL_PARAMETER_PROFILE,
-+ &ctrl_set_scene_mode,
-+ false
-+ },
- };
-
- int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev *dev)
-@@ -1000,8 +1139,7 @@ int set_framerate_params(struct bm2835_mmal_dev *dev)
- struct mmal_parameter_fps_range fps_range;
- int ret;
-
-- if ((dev->exposure_mode_v4l2 == V4L2_EXPOSURE_AUTO ||
-- dev->exposure_mode_v4l2 == V4L2_EXPOSURE_APERTURE_PRIORITY) &&
-+ if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) &&
- (dev->exp_auto_priority)) {
- /* Variable FPS. Define min FPS as 1fps.
- * Max as max defined FPS.
-@@ -1049,6 +1187,7 @@ int set_framerate_params(struct bm2835_mmal_dev *dev)
- return ret;
-
- }
-+
- int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
- struct v4l2_ctrl_handler *hdl)
- {
-@@ -1068,10 +1207,30 @@ int bm2835_mmal_init_controls(struct bm2835_mmal_dev *dev,
- break;
-
- case MMAL_CONTROL_TYPE_STD_MENU:
-+ {
-+ int mask = ctrl->min;
-+
-+ if (ctrl->id == V4L2_CID_SCENE_MODE) {
-+ /* Special handling to work out the mask
-+ * value based on the scene_configs array
-+ * at runtime. Reduces the chance of
-+ * mismatches.
-+ */
-+ int i;
-+ mask = 1<<V4L2_SCENE_MODE_NONE;
-+ for (i = 0;
-+ i < ARRAY_SIZE(scene_configs);
-+ i++) {
-+ mask |= 1<<scene_configs[i].v4l2_scene;
-+ }
-+ mask = ~mask;
-+ }
-+
- dev->ctrls[c] = v4l2_ctrl_new_std_menu(hdl,
- &bm2835_mmal_ctrl_ops, ctrl->id,
-- ctrl->max, ctrl->min, ctrl->def);
-+ ctrl->max, mask, ctrl->def);
- break;
-+ }
-
- case MMAL_CONTROL_TYPE_INT_MENU:
- dev->ctrls[c] = v4l2_ctrl_new_int_menu(hdl,
---
-1.9.1
-