1 // SPDX-License-Identifier: GPL-2.0
3 * Broadcom BM2835 V4L2 driver
5 * Copyright © 2013 Raspberry Pi (Trading) Ltd.
7 * Authors: Vincent Sanders <vincent.sanders@collabora.co.uk>
8 * Dave Stevenson <dsteve@broadcom.com>
9 * Simon Mellor <simellor@broadcom.com>
10 * Luke Diamand <luked@broadcom.com>
13 #include <linux/errno.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <media/videobuf2-vmalloc.h>
18 #include <media/v4l2-device.h>
19 #include <media/v4l2-ioctl.h>
20 #include <media/v4l2-ctrls.h>
21 #include <media/v4l2-fh.h>
22 #include <media/v4l2-event.h>
23 #include <media/v4l2-common.h>
25 #include "mmal-common.h"
26 #include "mmal-vchiq.h"
27 #include "mmal-parameters.h"
28 #include "bcm2835-camera.h"
30 /* The supported V4L2_CID_AUTO_EXPOSURE_BIAS values are from -4.0 to +4.0.
31 * MMAL values are in 1/6th increments so the MMAL range is -24 to +24.
32 * V4L2 docs say value "is expressed in terms of EV, drivers should interpret
33 * the values as 0.001 EV units, where the value 1000 stands for +1 EV."
34 * V4L2 is limited to a max of 32 values in a menu, so count in 1/3rds from
37 static const s64 ev_bias_qmenu
[] = {
49 /* Supported ISO values (*1000)
52 static const s64 iso_qmenu
[] = {
53 0, 100000, 200000, 400000, 800000,
55 static const uint32_t iso_values
[] = {
56 0, 100, 200, 400, 800,
59 static const s64 mains_freq_qmenu
[] = {
60 V4L2_CID_POWER_LINE_FREQUENCY_DISABLED
,
61 V4L2_CID_POWER_LINE_FREQUENCY_50HZ
,
62 V4L2_CID_POWER_LINE_FREQUENCY_60HZ
,
63 V4L2_CID_POWER_LINE_FREQUENCY_AUTO
66 /* Supported video encode modes */
67 static const s64 bitrate_mode_qmenu
[] = {
68 (s64
)V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
,
69 (s64
)V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
,
72 enum bm2835_mmal_ctrl_type
{
73 MMAL_CONTROL_TYPE_STD
,
74 MMAL_CONTROL_TYPE_STD_MENU
,
75 MMAL_CONTROL_TYPE_INT_MENU
,
76 MMAL_CONTROL_TYPE_CLUSTER
, /* special cluster entry */
79 struct bm2835_mmal_v4l2_ctrl
;
81 typedef int(bm2835_mmal_v4l2_ctrl_cb
)(
82 struct bm2835_mmal_dev
*dev
,
83 struct v4l2_ctrl
*ctrl
,
84 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
);
86 struct bm2835_mmal_v4l2_ctrl
{
87 u32 id
; /* v4l2 control identifier */
88 enum bm2835_mmal_ctrl_type type
;
89 /* control minimum value or
90 * mask for MMAL_CONTROL_TYPE_STD_MENU
93 s32 max
; /* maximum value of control */
94 s32 def
; /* default value of control */
95 s32 step
; /* step size of the control */
96 const s64
*imenu
; /* integer menu array */
97 u32 mmal_id
; /* mmal parameter id */
98 bm2835_mmal_v4l2_ctrl_cb
*setter
;
102 struct v4l2_to_mmal_effects_setting
{
106 s32 col_fx_fixed_cbcr
;
109 u32 num_effect_params
;
110 u32 effect_params
[MMAL_MAX_IMAGEFX_PARAMETERS
];
113 static const struct v4l2_to_mmal_effects_setting
114 v4l2_to_mmal_effects_values
[] = {
115 { V4L2_COLORFX_NONE
, MMAL_PARAM_IMAGEFX_NONE
,
116 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
117 { V4L2_COLORFX_BW
, MMAL_PARAM_IMAGEFX_NONE
,
118 1, 0, 128, 128, 0, {0, 0, 0, 0, 0} },
119 { V4L2_COLORFX_SEPIA
, MMAL_PARAM_IMAGEFX_NONE
,
120 1, 0, 87, 151, 0, {0, 0, 0, 0, 0} },
121 { V4L2_COLORFX_NEGATIVE
, MMAL_PARAM_IMAGEFX_NEGATIVE
,
122 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
123 { V4L2_COLORFX_EMBOSS
, MMAL_PARAM_IMAGEFX_EMBOSS
,
124 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
125 { V4L2_COLORFX_SKETCH
, MMAL_PARAM_IMAGEFX_SKETCH
,
126 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
127 { V4L2_COLORFX_SKY_BLUE
, MMAL_PARAM_IMAGEFX_PASTEL
,
128 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
129 { V4L2_COLORFX_GRASS_GREEN
, MMAL_PARAM_IMAGEFX_WATERCOLOUR
,
130 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
131 { V4L2_COLORFX_SKIN_WHITEN
, MMAL_PARAM_IMAGEFX_WASHEDOUT
,
132 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
133 { V4L2_COLORFX_VIVID
, MMAL_PARAM_IMAGEFX_SATURATION
,
134 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
135 { V4L2_COLORFX_AQUA
, MMAL_PARAM_IMAGEFX_NONE
,
136 1, 0, 171, 121, 0, {0, 0, 0, 0, 0} },
137 { V4L2_COLORFX_ART_FREEZE
, MMAL_PARAM_IMAGEFX_HATCH
,
138 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
139 { V4L2_COLORFX_SILHOUETTE
, MMAL_PARAM_IMAGEFX_FILM
,
140 0, 0, 0, 0, 0, {0, 0, 0, 0, 0} },
141 { V4L2_COLORFX_SOLARIZATION
, MMAL_PARAM_IMAGEFX_SOLARIZE
,
142 0, 0, 0, 0, 5, {1, 128, 160, 160, 48} },
143 { V4L2_COLORFX_ANTIQUE
, MMAL_PARAM_IMAGEFX_COLOURBALANCE
,
144 0, 0, 0, 0, 3, {108, 274, 238, 0, 0} },
145 { V4L2_COLORFX_SET_CBCR
, MMAL_PARAM_IMAGEFX_NONE
,
146 1, 1, 0, 0, 0, {0, 0, 0, 0, 0} }
149 struct v4l2_mmal_scene_config
{
150 enum v4l2_scene_mode v4l2_scene
;
151 enum mmal_parameter_exposuremode exposure_mode
;
152 enum mmal_parameter_exposuremeteringmode metering_mode
;
155 static const struct v4l2_mmal_scene_config scene_configs
[] = {
156 /* V4L2_SCENE_MODE_NONE automatically added */
158 V4L2_SCENE_MODE_NIGHT
,
159 MMAL_PARAM_EXPOSUREMODE_NIGHT
,
160 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
163 V4L2_SCENE_MODE_SPORTS
,
164 MMAL_PARAM_EXPOSUREMODE_SPORTS
,
165 MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
169 /* control handlers*/
171 static int ctrl_set_rational(struct bm2835_mmal_dev
*dev
,
172 struct v4l2_ctrl
*ctrl
,
173 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
175 struct mmal_parameter_rational rational_value
;
176 struct vchiq_mmal_port
*control
;
178 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
180 rational_value
.num
= ctrl
->val
;
181 rational_value
.den
= 100;
183 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
186 sizeof(rational_value
));
189 static int ctrl_set_value(struct bm2835_mmal_dev
*dev
,
190 struct v4l2_ctrl
*ctrl
,
191 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
194 struct vchiq_mmal_port
*control
;
196 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
198 u32_value
= ctrl
->val
;
200 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
202 &u32_value
, sizeof(u32_value
));
205 static int ctrl_set_iso(struct bm2835_mmal_dev
*dev
,
206 struct v4l2_ctrl
*ctrl
,
207 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
210 struct vchiq_mmal_port
*control
;
212 if (ctrl
->val
> mmal_ctrl
->max
|| ctrl
->val
< mmal_ctrl
->min
)
215 if (ctrl
->id
== V4L2_CID_ISO_SENSITIVITY
)
216 dev
->iso
= iso_values
[ctrl
->val
];
217 else if (ctrl
->id
== V4L2_CID_ISO_SENSITIVITY_AUTO
)
218 dev
->manual_iso_enabled
=
219 (ctrl
->val
== V4L2_ISO_SENSITIVITY_MANUAL
);
221 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
223 if (dev
->manual_iso_enabled
)
224 u32_value
= dev
->iso
;
228 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
230 &u32_value
, sizeof(u32_value
));
233 static int ctrl_set_value_ev(struct bm2835_mmal_dev
*dev
,
234 struct v4l2_ctrl
*ctrl
,
235 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
238 struct vchiq_mmal_port
*control
;
240 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
242 s32_value
= (ctrl
->val
- 12) * 2; /* Convert from index to 1/6ths */
244 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
246 &s32_value
, sizeof(s32_value
));
249 static int ctrl_set_rotate(struct bm2835_mmal_dev
*dev
,
250 struct v4l2_ctrl
*ctrl
,
251 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
255 struct vchiq_mmal_component
*camera
;
257 camera
= dev
->component
[MMAL_COMPONENT_CAMERA
];
259 u32_value
= ((ctrl
->val
% 360) / 90) * 90;
261 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[0],
263 &u32_value
, sizeof(u32_value
));
267 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[1],
269 &u32_value
, sizeof(u32_value
));
273 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[2],
275 &u32_value
, sizeof(u32_value
));
280 static int ctrl_set_flip(struct bm2835_mmal_dev
*dev
,
281 struct v4l2_ctrl
*ctrl
,
282 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
286 struct vchiq_mmal_component
*camera
;
288 if (ctrl
->id
== V4L2_CID_HFLIP
)
289 dev
->hflip
= ctrl
->val
;
291 dev
->vflip
= ctrl
->val
;
293 camera
= dev
->component
[MMAL_COMPONENT_CAMERA
];
295 if (dev
->hflip
&& dev
->vflip
)
296 u32_value
= MMAL_PARAM_MIRROR_BOTH
;
298 u32_value
= MMAL_PARAM_MIRROR_HORIZONTAL
;
300 u32_value
= MMAL_PARAM_MIRROR_VERTICAL
;
302 u32_value
= MMAL_PARAM_MIRROR_NONE
;
304 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[0],
306 &u32_value
, sizeof(u32_value
));
310 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[1],
312 &u32_value
, sizeof(u32_value
));
316 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, &camera
->output
[2],
318 &u32_value
, sizeof(u32_value
));
323 static int ctrl_set_exposure(struct bm2835_mmal_dev
*dev
,
324 struct v4l2_ctrl
*ctrl
,
325 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
327 enum mmal_parameter_exposuremode exp_mode
= dev
->exposure_mode_user
;
328 u32 shutter_speed
= 0;
329 struct vchiq_mmal_port
*control
;
332 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
334 if (mmal_ctrl
->mmal_id
== MMAL_PARAMETER_SHUTTER_SPEED
) {
335 /* V4L2 is in 100usec increments.
338 dev
->manual_shutter_speed
= ctrl
->val
* 100;
339 } else if (mmal_ctrl
->mmal_id
== MMAL_PARAMETER_EXPOSURE_MODE
) {
341 case V4L2_EXPOSURE_AUTO
:
342 exp_mode
= MMAL_PARAM_EXPOSUREMODE_AUTO
;
345 case V4L2_EXPOSURE_MANUAL
:
346 exp_mode
= MMAL_PARAM_EXPOSUREMODE_OFF
;
349 dev
->exposure_mode_user
= exp_mode
;
350 dev
->exposure_mode_v4l2_user
= ctrl
->val
;
351 } else if (mmal_ctrl
->id
== V4L2_CID_EXPOSURE_AUTO_PRIORITY
) {
352 dev
->exp_auto_priority
= ctrl
->val
;
355 if (dev
->scene_mode
== V4L2_SCENE_MODE_NONE
) {
356 if (exp_mode
== MMAL_PARAM_EXPOSUREMODE_OFF
)
357 shutter_speed
= dev
->manual_shutter_speed
;
359 ret
= vchiq_mmal_port_parameter_set(dev
->instance
,
361 MMAL_PARAMETER_SHUTTER_SPEED
,
363 sizeof(shutter_speed
));
364 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
,
366 MMAL_PARAMETER_EXPOSURE_MODE
,
369 dev
->exposure_mode_active
= exp_mode
;
371 /* exposure_dynamic_framerate (V4L2_CID_EXPOSURE_AUTO_PRIORITY) should
372 * always apply irrespective of scene mode.
374 ret
+= set_framerate_params(dev
);
379 static int ctrl_set_metering_mode(struct bm2835_mmal_dev
*dev
,
380 struct v4l2_ctrl
*ctrl
,
381 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
384 case V4L2_EXPOSURE_METERING_AVERAGE
:
385 dev
->metering_mode
= MMAL_PARAM_EXPOSUREMETERINGMODE_AVERAGE
;
388 case V4L2_EXPOSURE_METERING_CENTER_WEIGHTED
:
389 dev
->metering_mode
= MMAL_PARAM_EXPOSUREMETERINGMODE_BACKLIT
;
392 case V4L2_EXPOSURE_METERING_SPOT
:
393 dev
->metering_mode
= MMAL_PARAM_EXPOSUREMETERINGMODE_SPOT
;
396 /* todo matrix weighting not added to Linux API till 3.9
397 * case V4L2_EXPOSURE_METERING_MATRIX:
398 * dev->metering_mode = MMAL_PARAM_EXPOSUREMETERINGMODE_MATRIX;
403 if (dev
->scene_mode
== V4L2_SCENE_MODE_NONE
) {
404 struct vchiq_mmal_port
*control
;
405 u32 u32_value
= dev
->metering_mode
;
407 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
409 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
411 &u32_value
, sizeof(u32_value
));
416 static int ctrl_set_flicker_avoidance(struct bm2835_mmal_dev
*dev
,
417 struct v4l2_ctrl
*ctrl
,
418 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
421 struct vchiq_mmal_port
*control
;
423 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
426 case V4L2_CID_POWER_LINE_FREQUENCY_DISABLED
:
427 u32_value
= MMAL_PARAM_FLICKERAVOID_OFF
;
429 case V4L2_CID_POWER_LINE_FREQUENCY_50HZ
:
430 u32_value
= MMAL_PARAM_FLICKERAVOID_50HZ
;
432 case V4L2_CID_POWER_LINE_FREQUENCY_60HZ
:
433 u32_value
= MMAL_PARAM_FLICKERAVOID_60HZ
;
435 case V4L2_CID_POWER_LINE_FREQUENCY_AUTO
:
436 u32_value
= MMAL_PARAM_FLICKERAVOID_AUTO
;
440 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
442 &u32_value
, sizeof(u32_value
));
445 static int ctrl_set_awb_mode(struct bm2835_mmal_dev
*dev
,
446 struct v4l2_ctrl
*ctrl
,
447 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
450 struct vchiq_mmal_port
*control
;
452 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
455 case V4L2_WHITE_BALANCE_MANUAL
:
456 u32_value
= MMAL_PARAM_AWBMODE_OFF
;
459 case V4L2_WHITE_BALANCE_AUTO
:
460 u32_value
= MMAL_PARAM_AWBMODE_AUTO
;
463 case V4L2_WHITE_BALANCE_INCANDESCENT
:
464 u32_value
= MMAL_PARAM_AWBMODE_INCANDESCENT
;
467 case V4L2_WHITE_BALANCE_FLUORESCENT
:
468 u32_value
= MMAL_PARAM_AWBMODE_FLUORESCENT
;
471 case V4L2_WHITE_BALANCE_FLUORESCENT_H
:
472 u32_value
= MMAL_PARAM_AWBMODE_TUNGSTEN
;
475 case V4L2_WHITE_BALANCE_HORIZON
:
476 u32_value
= MMAL_PARAM_AWBMODE_HORIZON
;
479 case V4L2_WHITE_BALANCE_DAYLIGHT
:
480 u32_value
= MMAL_PARAM_AWBMODE_SUNLIGHT
;
483 case V4L2_WHITE_BALANCE_FLASH
:
484 u32_value
= MMAL_PARAM_AWBMODE_FLASH
;
487 case V4L2_WHITE_BALANCE_CLOUDY
:
488 u32_value
= MMAL_PARAM_AWBMODE_CLOUDY
;
491 case V4L2_WHITE_BALANCE_SHADE
:
492 u32_value
= MMAL_PARAM_AWBMODE_SHADE
;
496 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
498 &u32_value
, sizeof(u32_value
));
501 static int ctrl_set_awb_gains(struct bm2835_mmal_dev
*dev
,
502 struct v4l2_ctrl
*ctrl
,
503 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
505 struct vchiq_mmal_port
*control
;
506 struct mmal_parameter_awbgains gains
;
508 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
510 if (ctrl
->id
== V4L2_CID_RED_BALANCE
)
511 dev
->red_gain
= ctrl
->val
;
512 else if (ctrl
->id
== V4L2_CID_BLUE_BALANCE
)
513 dev
->blue_gain
= ctrl
->val
;
515 gains
.r_gain
.num
= dev
->red_gain
;
516 gains
.b_gain
.num
= dev
->blue_gain
;
517 gains
.r_gain
.den
= gains
.b_gain
.den
= 1000;
519 return vchiq_mmal_port_parameter_set(dev
->instance
, control
,
521 &gains
, sizeof(gains
));
524 static int ctrl_set_image_effect(struct bm2835_mmal_dev
*dev
,
525 struct v4l2_ctrl
*ctrl
,
526 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
530 struct vchiq_mmal_port
*control
;
531 struct mmal_parameter_imagefx_parameters imagefx
;
533 for (i
= 0; i
< ARRAY_SIZE(v4l2_to_mmal_effects_values
); i
++) {
534 if (ctrl
->val
== v4l2_to_mmal_effects_values
[i
].v4l2_effect
) {
536 v4l2_to_mmal_effects_values
[i
].mmal_effect
;
537 imagefx
.num_effect_params
=
538 v4l2_to_mmal_effects_values
[i
].num_effect_params
;
540 if (imagefx
.num_effect_params
> MMAL_MAX_IMAGEFX_PARAMETERS
)
541 imagefx
.num_effect_params
= MMAL_MAX_IMAGEFX_PARAMETERS
;
543 for (j
= 0; j
< imagefx
.num_effect_params
; j
++)
544 imagefx
.effect_parameter
[j
] =
545 v4l2_to_mmal_effects_values
[i
].effect_params
[j
];
547 dev
->colourfx
.enable
=
548 v4l2_to_mmal_effects_values
[i
].col_fx_enable
;
549 if (!v4l2_to_mmal_effects_values
[i
].col_fx_fixed_cbcr
) {
551 v4l2_to_mmal_effects_values
[i
].u
;
553 v4l2_to_mmal_effects_values
[i
].v
;
556 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
558 ret
= vchiq_mmal_port_parameter_set(
559 dev
->instance
, control
,
560 MMAL_PARAMETER_IMAGE_EFFECT_PARAMETERS
,
561 &imagefx
, sizeof(imagefx
));
565 ret
= vchiq_mmal_port_parameter_set(
566 dev
->instance
, control
,
567 MMAL_PARAMETER_COLOUR_EFFECT
,
568 &dev
->colourfx
, sizeof(dev
->colourfx
));
573 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
574 "mmal_ctrl:%p ctrl id:0x%x ctrl val:%d imagefx:0x%x color_effect:%s u:%d v:%d ret %d(%d)\n",
575 mmal_ctrl
, ctrl
->id
, ctrl
->val
, imagefx
.effect
,
576 dev
->colourfx
.enable
? "true" : "false",
577 dev
->colourfx
.u
, dev
->colourfx
.v
,
578 ret
, (ret
== 0 ? 0 : -EINVAL
));
579 return (ret
== 0 ? 0 : EINVAL
);
582 static int ctrl_set_colfx(struct bm2835_mmal_dev
*dev
,
583 struct v4l2_ctrl
*ctrl
,
584 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
587 struct vchiq_mmal_port
*control
;
589 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
591 dev
->colourfx
.enable
= (ctrl
->val
& 0xff00) >> 8;
592 dev
->colourfx
.enable
= ctrl
->val
& 0xff;
594 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, control
,
595 MMAL_PARAMETER_COLOUR_EFFECT
,
597 sizeof(dev
->colourfx
));
599 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
600 "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n",
601 __func__
, mmal_ctrl
, ctrl
->id
, ctrl
->val
, ret
,
602 (ret
== 0 ? 0 : -EINVAL
));
603 return (ret
== 0 ? 0 : EINVAL
);
606 static int ctrl_set_bitrate(struct bm2835_mmal_dev
*dev
,
607 struct v4l2_ctrl
*ctrl
,
608 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
611 struct vchiq_mmal_port
*encoder_out
;
613 dev
->capture
.encode_bitrate
= ctrl
->val
;
615 encoder_out
= &dev
->component
[MMAL_COMPONENT_VIDEO_ENCODE
]->output
[0];
617 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, encoder_out
,
619 &ctrl
->val
, sizeof(ctrl
->val
));
624 static int ctrl_set_bitrate_mode(struct bm2835_mmal_dev
*dev
,
625 struct v4l2_ctrl
*ctrl
,
626 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
629 struct vchiq_mmal_port
*encoder_out
;
631 encoder_out
= &dev
->component
[MMAL_COMPONENT_VIDEO_ENCODE
]->output
[0];
633 dev
->capture
.encode_bitrate_mode
= ctrl
->val
;
636 case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
:
637 bitrate_mode
= MMAL_VIDEO_RATECONTROL_VARIABLE
;
639 case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
:
640 bitrate_mode
= MMAL_VIDEO_RATECONTROL_CONSTANT
;
644 vchiq_mmal_port_parameter_set(dev
->instance
, encoder_out
,
647 sizeof(bitrate_mode
));
651 static int ctrl_set_image_encode_output(struct bm2835_mmal_dev
*dev
,
652 struct v4l2_ctrl
*ctrl
,
653 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
656 struct vchiq_mmal_port
*jpeg_out
;
658 jpeg_out
= &dev
->component
[MMAL_COMPONENT_IMAGE_ENCODE
]->output
[0];
660 u32_value
= ctrl
->val
;
662 return vchiq_mmal_port_parameter_set(dev
->instance
, jpeg_out
,
664 &u32_value
, sizeof(u32_value
));
667 static int ctrl_set_video_encode_param_output(struct bm2835_mmal_dev
*dev
,
668 struct v4l2_ctrl
*ctrl
,
669 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
672 struct vchiq_mmal_port
*vid_enc_ctl
;
674 vid_enc_ctl
= &dev
->component
[MMAL_COMPONENT_VIDEO_ENCODE
]->output
[0];
676 u32_value
= ctrl
->val
;
678 return vchiq_mmal_port_parameter_set(dev
->instance
, vid_enc_ctl
,
680 &u32_value
, sizeof(u32_value
));
683 static int ctrl_set_video_encode_profile_level(struct bm2835_mmal_dev
*dev
,
684 struct v4l2_ctrl
*ctrl
,
685 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
687 struct mmal_parameter_video_profile param
;
690 if (ctrl
->id
== V4L2_CID_MPEG_VIDEO_H264_PROFILE
) {
692 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
:
693 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE
:
694 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
:
695 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
:
696 dev
->capture
.enc_profile
= ctrl
->val
;
702 } else if (ctrl
->id
== V4L2_CID_MPEG_VIDEO_H264_LEVEL
) {
704 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0
:
705 case V4L2_MPEG_VIDEO_H264_LEVEL_1B
:
706 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1
:
707 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2
:
708 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3
:
709 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0
:
710 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1
:
711 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2
:
712 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0
:
713 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1
:
714 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2
:
715 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0
:
716 dev
->capture
.enc_level
= ctrl
->val
;
725 switch (dev
->capture
.enc_profile
) {
726 case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
:
727 param
.profile
= MMAL_VIDEO_PROFILE_H264_BASELINE
;
729 case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE
:
731 MMAL_VIDEO_PROFILE_H264_CONSTRAINED_BASELINE
;
733 case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
:
734 param
.profile
= MMAL_VIDEO_PROFILE_H264_MAIN
;
736 case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
:
737 param
.profile
= MMAL_VIDEO_PROFILE_H264_HIGH
;
740 /* Should never get here */
744 switch (dev
->capture
.enc_level
) {
745 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0
:
746 param
.level
= MMAL_VIDEO_LEVEL_H264_1
;
748 case V4L2_MPEG_VIDEO_H264_LEVEL_1B
:
749 param
.level
= MMAL_VIDEO_LEVEL_H264_1b
;
751 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1
:
752 param
.level
= MMAL_VIDEO_LEVEL_H264_11
;
754 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2
:
755 param
.level
= MMAL_VIDEO_LEVEL_H264_12
;
757 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3
:
758 param
.level
= MMAL_VIDEO_LEVEL_H264_13
;
760 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0
:
761 param
.level
= MMAL_VIDEO_LEVEL_H264_2
;
763 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1
:
764 param
.level
= MMAL_VIDEO_LEVEL_H264_21
;
766 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2
:
767 param
.level
= MMAL_VIDEO_LEVEL_H264_22
;
769 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0
:
770 param
.level
= MMAL_VIDEO_LEVEL_H264_3
;
772 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1
:
773 param
.level
= MMAL_VIDEO_LEVEL_H264_31
;
775 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2
:
776 param
.level
= MMAL_VIDEO_LEVEL_H264_32
;
778 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0
:
779 param
.level
= MMAL_VIDEO_LEVEL_H264_4
;
782 /* Should never get here */
786 ret
= vchiq_mmal_port_parameter_set(dev
->instance
,
787 &dev
->component
[MMAL_COMPONENT_VIDEO_ENCODE
]->output
[0],
789 ¶m
, sizeof(param
));
794 static int ctrl_set_scene_mode(struct bm2835_mmal_dev
*dev
,
795 struct v4l2_ctrl
*ctrl
,
796 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
)
800 struct vchiq_mmal_port
*control
;
802 v4l2_dbg(0, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
803 "scene mode selected %d, was %d\n", ctrl
->val
,
805 control
= &dev
->component
[MMAL_COMPONENT_CAMERA
]->control
;
807 if (ctrl
->val
== dev
->scene_mode
)
810 if (ctrl
->val
== V4L2_SCENE_MODE_NONE
) {
811 /* Restore all user selections */
812 dev
->scene_mode
= V4L2_SCENE_MODE_NONE
;
814 if (dev
->exposure_mode_user
== MMAL_PARAM_EXPOSUREMODE_OFF
)
815 shutter_speed
= dev
->manual_shutter_speed
;
819 v4l2_dbg(0, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
820 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
821 __func__
, shutter_speed
, dev
->exposure_mode_user
,
823 ret
= vchiq_mmal_port_parameter_set(dev
->instance
,
825 MMAL_PARAMETER_SHUTTER_SPEED
,
827 sizeof(shutter_speed
));
828 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
,
830 MMAL_PARAMETER_EXPOSURE_MODE
,
831 &dev
->exposure_mode_user
,
833 dev
->exposure_mode_active
= dev
->exposure_mode_user
;
834 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
,
836 MMAL_PARAMETER_EXP_METERING_MODE
,
839 ret
+= set_framerate_params(dev
);
841 /* Set up scene mode */
843 const struct v4l2_mmal_scene_config
*scene
= NULL
;
845 enum mmal_parameter_exposuremode exposure_mode
;
846 enum mmal_parameter_exposuremeteringmode metering_mode
;
848 for (i
= 0; i
< ARRAY_SIZE(scene_configs
); i
++) {
849 if (scene_configs
[i
].v4l2_scene
==
851 scene
= &scene_configs
[i
];
857 if (i
>= ARRAY_SIZE(scene_configs
))
860 /* Set all the values */
861 dev
->scene_mode
= ctrl
->val
;
863 if (scene
->exposure_mode
== MMAL_PARAM_EXPOSUREMODE_OFF
)
864 shutter_speed
= dev
->manual_shutter_speed
;
867 exposure_mode
= scene
->exposure_mode
;
868 metering_mode
= scene
->metering_mode
;
870 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
871 "%s: scene mode none: shut_speed %d, exp_mode %d, metering %d\n",
872 __func__
, shutter_speed
, exposure_mode
, metering_mode
);
874 ret
= vchiq_mmal_port_parameter_set(dev
->instance
, control
,
875 MMAL_PARAMETER_SHUTTER_SPEED
,
877 sizeof(shutter_speed
));
878 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
, control
,
879 MMAL_PARAMETER_EXPOSURE_MODE
,
882 dev
->exposure_mode_active
= exposure_mode
;
883 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
, control
,
884 MMAL_PARAMETER_EXPOSURE_MODE
,
887 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
, control
,
888 MMAL_PARAMETER_EXP_METERING_MODE
,
891 ret
+= set_framerate_params(dev
);
894 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
895 "%s: Setting scene to %d, ret=%d\n",
896 __func__
, ctrl
->val
, ret
);
902 static int bm2835_mmal_s_ctrl(struct v4l2_ctrl
*ctrl
)
904 struct bm2835_mmal_dev
*dev
=
905 container_of(ctrl
->handler
, struct bm2835_mmal_dev
,
907 const struct bm2835_mmal_v4l2_ctrl
*mmal_ctrl
= ctrl
->priv
;
910 if (!mmal_ctrl
|| mmal_ctrl
->id
!= ctrl
->id
|| !mmal_ctrl
->setter
) {
911 pr_warn("mmal_ctrl:%p ctrl id:%d\n", mmal_ctrl
, ctrl
->id
);
915 ret
= mmal_ctrl
->setter(dev
, ctrl
, mmal_ctrl
);
917 pr_warn("ctrl id:%d/MMAL param %08X- returned ret %d\n",
918 ctrl
->id
, mmal_ctrl
->mmal_id
, ret
);
919 if (mmal_ctrl
->ignore_errors
)
924 static const struct v4l2_ctrl_ops bm2835_mmal_ctrl_ops
= {
925 .s_ctrl
= bm2835_mmal_s_ctrl
,
928 static const struct bm2835_mmal_v4l2_ctrl v4l2_ctrls
[V4L2_CTRL_COUNT
] = {
930 V4L2_CID_SATURATION
, MMAL_CONTROL_TYPE_STD
,
931 -100, 100, 0, 1, NULL
,
932 MMAL_PARAMETER_SATURATION
,
937 V4L2_CID_SHARPNESS
, MMAL_CONTROL_TYPE_STD
,
938 -100, 100, 0, 1, NULL
,
939 MMAL_PARAMETER_SHARPNESS
,
944 V4L2_CID_CONTRAST
, MMAL_CONTROL_TYPE_STD
,
945 -100, 100, 0, 1, NULL
,
946 MMAL_PARAMETER_CONTRAST
,
951 V4L2_CID_BRIGHTNESS
, MMAL_CONTROL_TYPE_STD
,
953 MMAL_PARAMETER_BRIGHTNESS
,
958 V4L2_CID_ISO_SENSITIVITY
, MMAL_CONTROL_TYPE_INT_MENU
,
959 0, ARRAY_SIZE(iso_qmenu
) - 1, 0, 1, iso_qmenu
,
965 V4L2_CID_ISO_SENSITIVITY_AUTO
, MMAL_CONTROL_TYPE_STD_MENU
,
966 0, 1, V4L2_ISO_SENSITIVITY_AUTO
, 1, NULL
,
972 V4L2_CID_IMAGE_STABILIZATION
, MMAL_CONTROL_TYPE_STD
,
974 MMAL_PARAMETER_VIDEO_STABILISATION
,
979 * 0, MMAL_CONTROL_TYPE_CLUSTER, 3, 1, 0, NULL, 0, NULL
983 V4L2_CID_EXPOSURE_AUTO
, MMAL_CONTROL_TYPE_STD_MENU
,
984 ~0x03, 3, V4L2_EXPOSURE_AUTO
, 0, NULL
,
985 MMAL_PARAMETER_EXPOSURE_MODE
,
989 /* todo this needs mixing in with set exposure
991 * V4L2_CID_SCENE_MODE, MMAL_CONTROL_TYPE_STD_MENU,
995 V4L2_CID_EXPOSURE_ABSOLUTE
, MMAL_CONTROL_TYPE_STD
,
996 /* Units of 100usecs */
997 1, 1 * 1000 * 10, 100 * 10, 1, NULL
,
998 MMAL_PARAMETER_SHUTTER_SPEED
,
1003 V4L2_CID_AUTO_EXPOSURE_BIAS
, MMAL_CONTROL_TYPE_INT_MENU
,
1004 0, ARRAY_SIZE(ev_bias_qmenu
) - 1,
1005 (ARRAY_SIZE(ev_bias_qmenu
) + 1) / 2 - 1, 0, ev_bias_qmenu
,
1006 MMAL_PARAMETER_EXPOSURE_COMP
,
1011 V4L2_CID_EXPOSURE_AUTO_PRIORITY
, MMAL_CONTROL_TYPE_STD
,
1014 0, /* Dummy MMAL ID as it gets mapped into FPS range*/
1019 V4L2_CID_EXPOSURE_METERING
,
1020 MMAL_CONTROL_TYPE_STD_MENU
,
1021 ~0x7, 2, V4L2_EXPOSURE_METERING_AVERAGE
, 0, NULL
,
1022 MMAL_PARAMETER_EXP_METERING_MODE
,
1023 &ctrl_set_metering_mode
,
1027 V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE
,
1028 MMAL_CONTROL_TYPE_STD_MENU
,
1029 ~0x3ff, 9, V4L2_WHITE_BALANCE_AUTO
, 0, NULL
,
1030 MMAL_PARAMETER_AWB_MODE
,
1035 V4L2_CID_RED_BALANCE
, MMAL_CONTROL_TYPE_STD
,
1036 1, 7999, 1000, 1, NULL
,
1037 MMAL_PARAMETER_CUSTOM_AWB_GAINS
,
1038 &ctrl_set_awb_gains
,
1042 V4L2_CID_BLUE_BALANCE
, MMAL_CONTROL_TYPE_STD
,
1043 1, 7999, 1000, 1, NULL
,
1044 MMAL_PARAMETER_CUSTOM_AWB_GAINS
,
1045 &ctrl_set_awb_gains
,
1049 V4L2_CID_COLORFX
, MMAL_CONTROL_TYPE_STD_MENU
,
1050 0, 15, V4L2_COLORFX_NONE
, 0, NULL
,
1051 MMAL_PARAMETER_IMAGE_EFFECT
,
1052 &ctrl_set_image_effect
,
1056 V4L2_CID_COLORFX_CBCR
, MMAL_CONTROL_TYPE_STD
,
1057 0, 0xffff, 0x8080, 1, NULL
,
1058 MMAL_PARAMETER_COLOUR_EFFECT
,
1063 V4L2_CID_ROTATE
, MMAL_CONTROL_TYPE_STD
,
1064 0, 360, 0, 90, NULL
,
1065 MMAL_PARAMETER_ROTATION
,
1070 V4L2_CID_HFLIP
, MMAL_CONTROL_TYPE_STD
,
1072 MMAL_PARAMETER_MIRROR
,
1077 V4L2_CID_VFLIP
, MMAL_CONTROL_TYPE_STD
,
1079 MMAL_PARAMETER_MIRROR
,
1084 V4L2_CID_MPEG_VIDEO_BITRATE_MODE
, MMAL_CONTROL_TYPE_STD_MENU
,
1085 0, ARRAY_SIZE(bitrate_mode_qmenu
) - 1,
1086 0, 0, bitrate_mode_qmenu
,
1087 MMAL_PARAMETER_RATECONTROL
,
1088 &ctrl_set_bitrate_mode
,
1092 V4L2_CID_MPEG_VIDEO_BITRATE
, MMAL_CONTROL_TYPE_STD
,
1093 25 * 1000, 25 * 1000 * 1000, 10 * 1000 * 1000, 25 * 1000, NULL
,
1094 MMAL_PARAMETER_VIDEO_BIT_RATE
,
1099 V4L2_CID_JPEG_COMPRESSION_QUALITY
, MMAL_CONTROL_TYPE_STD
,
1102 MMAL_PARAMETER_JPEG_Q_FACTOR
,
1103 &ctrl_set_image_encode_output
,
1107 V4L2_CID_POWER_LINE_FREQUENCY
, MMAL_CONTROL_TYPE_STD_MENU
,
1108 0, ARRAY_SIZE(mains_freq_qmenu
) - 1,
1110 MMAL_PARAMETER_FLICKER_AVOID
,
1111 &ctrl_set_flicker_avoidance
,
1115 V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER
, MMAL_CONTROL_TYPE_STD
,
1118 MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER
,
1119 &ctrl_set_video_encode_param_output
,
1120 true /* Errors ignored as requires latest firmware to work */
1123 V4L2_CID_MPEG_VIDEO_H264_PROFILE
,
1124 MMAL_CONTROL_TYPE_STD_MENU
,
1125 ~((1<<V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE
) |
1126 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE
) |
1127 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_MAIN
) |
1128 (1<<V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
)),
1129 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
,
1130 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH
, 1, NULL
,
1131 MMAL_PARAMETER_PROFILE
,
1132 &ctrl_set_video_encode_profile_level
,
1136 V4L2_CID_MPEG_VIDEO_H264_LEVEL
, MMAL_CONTROL_TYPE_STD_MENU
,
1137 ~((1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_0
) |
1138 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1B
) |
1139 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_1
) |
1140 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_2
) |
1141 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_1_3
) |
1142 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_0
) |
1143 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_1
) |
1144 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_2_2
) |
1145 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_0
) |
1146 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_1
) |
1147 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_3_2
) |
1148 (1<<V4L2_MPEG_VIDEO_H264_LEVEL_4_0
)),
1149 V4L2_MPEG_VIDEO_H264_LEVEL_4_0
,
1150 V4L2_MPEG_VIDEO_H264_LEVEL_4_0
, 1, NULL
,
1151 MMAL_PARAMETER_PROFILE
,
1152 &ctrl_set_video_encode_profile_level
,
1156 V4L2_CID_SCENE_MODE
, MMAL_CONTROL_TYPE_STD_MENU
,
1157 -1, /* Min is computed at runtime */
1158 V4L2_SCENE_MODE_TEXT
,
1159 V4L2_SCENE_MODE_NONE
, 1, NULL
,
1160 MMAL_PARAMETER_PROFILE
,
1161 &ctrl_set_scene_mode
,
1165 V4L2_CID_MPEG_VIDEO_H264_I_PERIOD
, MMAL_CONTROL_TYPE_STD
,
1166 0, 0x7FFFFFFF, 60, 1, NULL
,
1167 MMAL_PARAMETER_INTRAPERIOD
,
1168 &ctrl_set_video_encode_param_output
,
1173 int bm2835_mmal_set_all_camera_controls(struct bm2835_mmal_dev
*dev
)
1178 for (c
= 0; c
< V4L2_CTRL_COUNT
; c
++) {
1179 if ((dev
->ctrls
[c
]) && (v4l2_ctrls
[c
].setter
)) {
1180 ret
= v4l2_ctrls
[c
].setter(dev
, dev
->ctrls
[c
],
1182 if (!v4l2_ctrls
[c
].ignore_errors
&& ret
) {
1183 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
1184 "Failed when setting default values for ctrl %d\n",
1193 int set_framerate_params(struct bm2835_mmal_dev
*dev
)
1195 struct mmal_parameter_fps_range fps_range
;
1198 if ((dev
->exposure_mode_active
!= MMAL_PARAM_EXPOSUREMODE_OFF
) &&
1199 (dev
->exp_auto_priority
)) {
1200 /* Variable FPS. Define min FPS as 1fps.
1201 * Max as max defined FPS.
1203 fps_range
.fps_low
.num
= 1;
1204 fps_range
.fps_low
.den
= 1;
1205 fps_range
.fps_high
.num
= dev
->capture
.timeperframe
.denominator
;
1206 fps_range
.fps_high
.den
= dev
->capture
.timeperframe
.numerator
;
1208 /* Fixed FPS - set min and max to be the same */
1209 fps_range
.fps_low
.num
= fps_range
.fps_high
.num
=
1210 dev
->capture
.timeperframe
.denominator
;
1211 fps_range
.fps_low
.den
= fps_range
.fps_high
.den
=
1212 dev
->capture
.timeperframe
.numerator
;
1215 v4l2_dbg(1, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
1216 "Set fps range to %d/%d to %d/%d\n",
1217 fps_range
.fps_low
.num
,
1218 fps_range
.fps_low
.den
,
1219 fps_range
.fps_high
.num
,
1220 fps_range
.fps_high
.den
);
1222 ret
= vchiq_mmal_port_parameter_set(dev
->instance
,
1223 &dev
->component
[MMAL_COMPONENT_CAMERA
]->
1224 output
[MMAL_CAMERA_PORT_PREVIEW
],
1225 MMAL_PARAMETER_FPS_RANGE
,
1226 &fps_range
, sizeof(fps_range
));
1227 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
,
1228 &dev
->component
[MMAL_COMPONENT_CAMERA
]->
1229 output
[MMAL_CAMERA_PORT_VIDEO
],
1230 MMAL_PARAMETER_FPS_RANGE
,
1231 &fps_range
, sizeof(fps_range
));
1232 ret
+= vchiq_mmal_port_parameter_set(dev
->instance
,
1233 &dev
->component
[MMAL_COMPONENT_CAMERA
]->
1234 output
[MMAL_CAMERA_PORT_CAPTURE
],
1235 MMAL_PARAMETER_FPS_RANGE
,
1236 &fps_range
, sizeof(fps_range
));
1238 v4l2_dbg(0, bcm2835_v4l2_debug
, &dev
->v4l2_dev
,
1239 "Failed to set fps ret %d\n", ret
);
1244 int bm2835_mmal_init_controls(struct bm2835_mmal_dev
*dev
,
1245 struct v4l2_ctrl_handler
*hdl
)
1248 const struct bm2835_mmal_v4l2_ctrl
*ctrl
;
1250 v4l2_ctrl_handler_init(hdl
, V4L2_CTRL_COUNT
);
1252 for (c
= 0; c
< V4L2_CTRL_COUNT
; c
++) {
1253 ctrl
= &v4l2_ctrls
[c
];
1255 switch (ctrl
->type
) {
1256 case MMAL_CONTROL_TYPE_STD
:
1257 dev
->ctrls
[c
] = v4l2_ctrl_new_std(hdl
,
1258 &bm2835_mmal_ctrl_ops
, ctrl
->id
,
1259 ctrl
->min
, ctrl
->max
, ctrl
->step
, ctrl
->def
);
1262 case MMAL_CONTROL_TYPE_STD_MENU
:
1264 int mask
= ctrl
->min
;
1266 if (ctrl
->id
== V4L2_CID_SCENE_MODE
) {
1267 /* Special handling to work out the mask
1268 * value based on the scene_configs array
1269 * at runtime. Reduces the chance of
1274 mask
= 1 << V4L2_SCENE_MODE_NONE
;
1276 i
< ARRAY_SIZE(scene_configs
);
1278 mask
|= 1 << scene_configs
[i
].v4l2_scene
;
1283 dev
->ctrls
[c
] = v4l2_ctrl_new_std_menu(hdl
,
1284 &bm2835_mmal_ctrl_ops
, ctrl
->id
,
1285 ctrl
->max
, mask
, ctrl
->def
);
1289 case MMAL_CONTROL_TYPE_INT_MENU
:
1290 dev
->ctrls
[c
] = v4l2_ctrl_new_int_menu(hdl
,
1291 &bm2835_mmal_ctrl_ops
, ctrl
->id
,
1292 ctrl
->max
, ctrl
->def
, ctrl
->imenu
);
1295 case MMAL_CONTROL_TYPE_CLUSTER
:
1296 /* skip this entry when constructing controls */
1303 dev
->ctrls
[c
]->priv
= (void *)ctrl
;
1307 pr_err("error adding control %d/%d id 0x%x\n", c
,
1308 V4L2_CTRL_COUNT
, ctrl
->id
);
1312 for (c
= 0; c
< V4L2_CTRL_COUNT
; c
++) {
1313 ctrl
= &v4l2_ctrls
[c
];
1315 switch (ctrl
->type
) {
1316 case MMAL_CONTROL_TYPE_CLUSTER
:
1317 v4l2_ctrl_auto_cluster(ctrl
->min
,
1323 case MMAL_CONTROL_TYPE_STD
:
1324 case MMAL_CONTROL_TYPE_STD_MENU
:
1325 case MMAL_CONTROL_TYPE_INT_MENU
: