brcm2708: update 3.10 patches with raspberrypi/rpi-3.10.y of 27 Apr. 2014
[openwrt/svn-archive/archive.git] / target / linux / brcm2708 / patches-3.10 / 0131-V4L2-Fix-EV-values.-Add-manual-shutter-speed-control.patch
1 From 6519115a0742befaa2e5864a496398367aab97b0 Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Mon, 9 Dec 2013 10:58:01 +0000
4 Subject: [PATCH 131/196] V4L2: Fix EV values. Add manual shutter speed control
5
6 V4L2 EV values should be in units of 1/1000. Corrected.
7 Add support for V4L2_CID_EXPOSURE_ABSOLUTE which should
8 give manual shutter control. Requires manual exposure mode
9 to be selected first.
10
11 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
12 ---
13 drivers/media/platform/bcm2835/bcm2835-camera.h | 4 +-
14 drivers/media/platform/bcm2835/controls.c | 94 ++++++++++++++++++------
15 drivers/media/platform/bcm2835/mmal-parameters.h | 1 +
16 3 files changed, 76 insertions(+), 23 deletions(-)
17
18 diff --git a/drivers/media/platform/bcm2835/bcm2835-camera.h b/drivers/media/platform/bcm2835/bcm2835-camera.h
19 index 883eab7..5640492 100644
20 --- a/drivers/media/platform/bcm2835/bcm2835-camera.h
21 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
22 @@ -15,7 +15,7 @@
23 * core driver device
24 */
25
26 -#define V4L2_CTRL_COUNT 18 /* number of v4l controls */
27 +#define V4L2_CTRL_COUNT 19 /* number of v4l controls */
28
29 enum {
30 MMAL_COMPONENT_CAMERA = 0,
31 @@ -51,6 +51,8 @@ struct bm2835_mmal_dev {
32 struct mmal_colourfx colourfx;
33 int hflip;
34 int vflip;
35 + enum mmal_parameter_exposuremode exposure_mode;
36 + unsigned int manual_shutter_speed;
37
38 /* allocated mmal instance and components */
39 struct vchiq_mmal_instance *instance;
40 diff --git a/drivers/media/platform/bcm2835/controls.c b/drivers/media/platform/bcm2835/controls.c
41 index d1408e5..481d1f6 100644
42 --- a/drivers/media/platform/bcm2835/controls.c
43 +++ b/drivers/media/platform/bcm2835/controls.c
44 @@ -30,11 +30,23 @@
45 #include "mmal-parameters.h"
46 #include "bcm2835-camera.h"
47
48 -/* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -24 to +24.
49 - * These are in 1/6th increments so the effective range is -4.0EV to +4.0EV.
50 +/* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0.
51 + * MMAL values are in 1/6th increments so the MMAL range is -24 to +24.
52 + * V4L2 docs say value "is expressed in terms of EV, drivers should interpret
53 + * the values as 0.001 EV units, where the value 1000 stands for +1 EV."
54 + * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from
55 + * -4 to +4
56 */
57 static const s64 ev_bias_qmenu[] = {
58 - -24, -21, -18, -15, -12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 18, 21, 24
59 + -4000, -3667, -3333,
60 + -3000, -2667, -2333,
61 + -2000, -1667, -1333,
62 + -1000, -667, -333,
63 + 0, 333, 667,
64 + 1000, 1333, 1667,
65 + 2000, 2333, 2667,
66 + 3000, 3333, 3667,
67 + 4000
68 };
69
70 /* Supported ISO values
71 @@ -166,6 +178,22 @@ static int ctrl_set_value(struct bm2835_mmal_dev *dev,
72 &u32_value, sizeof(u32_value));
73 }
74
75 +static int ctrl_set_value_ev(struct bm2835_mmal_dev *dev,
76 + struct v4l2_ctrl *ctrl,
77 + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
78 +{
79 + s32 s32_value;
80 + struct vchiq_mmal_port *control;
81 +
82 + control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
83 +
84 + s32_value = (ctrl->val-12)*2; /* Convert from index to 1/6ths */
85 +
86 + return vchiq_mmal_port_parameter_set(dev->instance, control,
87 + mmal_ctrl->mmal_id,
88 + &s32_value, sizeof(s32_value));
89 +}
90 +
91 static int ctrl_set_rotate(struct bm2835_mmal_dev *dev,
92 struct v4l2_ctrl *ctrl,
93 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
94 @@ -245,34 +273,50 @@ static int ctrl_set_exposure(struct bm2835_mmal_dev *dev,
95 struct v4l2_ctrl *ctrl,
96 const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl)
97 {
98 - u32 u32_value;
99 + enum mmal_parameter_exposuremode exp_mode = dev->exposure_mode;
100 + u32 shutter_speed = 0;
101 struct vchiq_mmal_port *control;
102 + int ret = 0;
103
104 control = &dev->component[MMAL_COMPONENT_CAMERA]->control;
105
106 - switch (ctrl->val) {
107 - case V4L2_EXPOSURE_AUTO:
108 - u32_value = MMAL_PARAM_EXPOSUREMODE_AUTO;
109 - break;
110 + if (mmal_ctrl->mmal_id == MMAL_PARAMETER_SHUTTER_SPEED) {
111 + /* V4L2 is in 100usec increments.
112 + * MMAL is 1usec.
113 + */
114 + dev->manual_shutter_speed = ctrl->val * 100;
115 + } else if (mmal_ctrl->mmal_id == MMAL_PARAMETER_EXPOSURE_MODE) {
116 + switch (ctrl->val) {
117 + case V4L2_EXPOSURE_AUTO:
118 + exp_mode = MMAL_PARAM_EXPOSUREMODE_AUTO;
119 + break;
120
121 - case V4L2_EXPOSURE_MANUAL:
122 - u32_value = MMAL_PARAM_EXPOSUREMODE_OFF;
123 - break;
124 + case V4L2_EXPOSURE_MANUAL:
125 + exp_mode = MMAL_PARAM_EXPOSUREMODE_OFF;
126 + break;
127
128 - case V4L2_EXPOSURE_SHUTTER_PRIORITY:
129 - u32_value = MMAL_PARAM_EXPOSUREMODE_SPORTS;
130 - break;
131 + case V4L2_EXPOSURE_SHUTTER_PRIORITY:
132 + exp_mode = MMAL_PARAM_EXPOSUREMODE_SPORTS;
133 + break;
134
135 - case V4L2_EXPOSURE_APERTURE_PRIORITY:
136 - u32_value = MMAL_PARAM_EXPOSUREMODE_NIGHT;
137 - break;
138 + case V4L2_EXPOSURE_APERTURE_PRIORITY:
139 + exp_mode = MMAL_PARAM_EXPOSUREMODE_NIGHT;
140 + break;
141
142 + }
143 + dev->exposure_mode = exp_mode;
144 }
145
146 - /* todo: what about the other ten modes there are MMAL parameters for */
147 - return vchiq_mmal_port_parameter_set(dev->instance, control,
148 - mmal_ctrl->mmal_id,
149 - &u32_value, sizeof(u32_value));
150 + if (dev->exposure_mode == MMAL_PARAM_EXPOSUREMODE_OFF)
151 + shutter_speed = dev->manual_shutter_speed;
152 +
153 + ret = vchiq_mmal_port_parameter_set(dev->instance, control,
154 + MMAL_PARAMETER_SHUTTER_SPEED,
155 + &shutter_speed, sizeof(shutter_speed));
156 + ret += vchiq_mmal_port_parameter_set(dev->instance, control,
157 + MMAL_PARAMETER_EXPOSURE_MODE,
158 + &exp_mode, sizeof(u32));
159 + return ret;
160 }
161
162 static int ctrl_set_metering_mode(struct bm2835_mmal_dev *dev,
163 @@ -578,10 +622,16 @@ static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls[V4L2_CTRL_COUNT] = {
164 },
165 */
166 {
167 + V4L2_CID_EXPOSURE_ABSOLUTE, MMAL_CONTROL_TYPE_STD,
168 + /* Units of 100usecs */
169 + 1, 1*1000*10, 100*10, 1, NULL,
170 + MMAL_PARAMETER_SHUTTER_SPEED, &ctrl_set_exposure
171 + },
172 + {
173 V4L2_CID_AUTO_EXPOSURE_BIAS, MMAL_CONTROL_TYPE_INT_MENU,
174 0, ARRAY_SIZE(ev_bias_qmenu) - 1,
175 (ARRAY_SIZE(ev_bias_qmenu)+1)/2 - 1, 0, ev_bias_qmenu,
176 - MMAL_PARAMETER_EXPOSURE_COMP, &ctrl_set_value
177 + MMAL_PARAMETER_EXPOSURE_COMP, &ctrl_set_value_ev
178 },
179 {
180 V4L2_CID_EXPOSURE_METERING,
181 diff --git a/drivers/media/platform/bcm2835/mmal-parameters.h b/drivers/media/platform/bcm2835/mmal-parameters.h
182 index c611b58..d8aace5 100644
183 --- a/drivers/media/platform/bcm2835/mmal-parameters.h
184 +++ b/drivers/media/platform/bcm2835/mmal-parameters.h
185 @@ -161,6 +161,7 @@ enum mmal_parameter_camera_type {
186 MMAL_PARAMETER_SW_SHARPEN_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
187 MMAL_PARAMETER_FLASH_REQUIRED, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
188 MMAL_PARAMETER_SW_SATURATION_DISABLE, /**< @ref MMAL_PARAMETER_BOOLEAN_T */
189 + MMAL_PARAMETER_SHUTTER_SPEED /**< Takes a @ref MMAL_PARAMETER_UINT32_T */
190 };
191
192 enum mmal_parameter_camera_config_timestamp_mode {
193 --
194 1.9.1
195