media: add video control handlers using V4L2 control framework
This patch registers four standard control handlers using the corresponding V4L2 framework. Signed-off-by: Florian Echtler <floe@butterbrot.org> [hans.verkuil@cisco.com: lower-cased 0x0F and 0xF0] Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
bbc0c4eb6b
commit
cee1e3e2ef
|
@ -38,6 +38,7 @@
|
||||||
#include <media/v4l2-device.h>
|
#include <media/v4l2-device.h>
|
||||||
#include <media/v4l2-dev.h>
|
#include <media/v4l2-dev.h>
|
||||||
#include <media/v4l2-ioctl.h>
|
#include <media/v4l2-ioctl.h>
|
||||||
|
#include <media/v4l2-ctrls.h>
|
||||||
#include <media/videobuf2-v4l2.h>
|
#include <media/videobuf2-v4l2.h>
|
||||||
#include <media/videobuf2-dma-sg.h>
|
#include <media/videobuf2-dma-sg.h>
|
||||||
|
|
||||||
|
@ -215,6 +216,7 @@ struct sur40_state {
|
||||||
struct video_device vdev;
|
struct video_device vdev;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct v4l2_pix_format pix_fmt;
|
struct v4l2_pix_format pix_fmt;
|
||||||
|
struct v4l2_ctrl_handler hdl;
|
||||||
|
|
||||||
struct vb2_queue queue;
|
struct vb2_queue queue;
|
||||||
struct list_head buf_list;
|
struct list_head buf_list;
|
||||||
|
@ -224,6 +226,7 @@ struct sur40_state {
|
||||||
struct sur40_data *bulk_in_buffer;
|
struct sur40_data *bulk_in_buffer;
|
||||||
size_t bulk_in_size;
|
size_t bulk_in_size;
|
||||||
u8 bulk_in_epaddr;
|
u8 bulk_in_epaddr;
|
||||||
|
u8 vsvideo;
|
||||||
|
|
||||||
char phys[64];
|
char phys[64];
|
||||||
};
|
};
|
||||||
|
@ -237,6 +240,11 @@ struct sur40_buffer {
|
||||||
static const struct video_device sur40_video_device;
|
static const struct video_device sur40_video_device;
|
||||||
static const struct vb2_queue sur40_queue;
|
static const struct vb2_queue sur40_queue;
|
||||||
static void sur40_process_video(struct sur40_state *sur40);
|
static void sur40_process_video(struct sur40_state *sur40);
|
||||||
|
static int sur40_s_ctrl(struct v4l2_ctrl *ctrl);
|
||||||
|
|
||||||
|
static const struct v4l2_ctrl_ops sur40_ctrl_ops = {
|
||||||
|
.s_ctrl = sur40_s_ctrl,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: an earlier, non-public version of this driver used USB_RECIP_ENDPOINT
|
* Note: an earlier, non-public version of this driver used USB_RECIP_ENDPOINT
|
||||||
|
@ -743,6 +751,36 @@ static int sur40_probe(struct usb_interface *interface,
|
||||||
sur40->vdev.queue = &sur40->queue;
|
sur40->vdev.queue = &sur40->queue;
|
||||||
video_set_drvdata(&sur40->vdev, sur40);
|
video_set_drvdata(&sur40->vdev, sur40);
|
||||||
|
|
||||||
|
/* initialize the control handler for 4 controls */
|
||||||
|
v4l2_ctrl_handler_init(&sur40->hdl, 4);
|
||||||
|
sur40->v4l2.ctrl_handler = &sur40->hdl;
|
||||||
|
sur40->vsvideo = (SUR40_CONTRAST_DEF << 4) | SUR40_GAIN_DEF;
|
||||||
|
|
||||||
|
v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_BRIGHTNESS,
|
||||||
|
SUR40_BRIGHTNESS_MIN, SUR40_BRIGHTNESS_MAX, 1, clamp(brightness,
|
||||||
|
(uint)SUR40_BRIGHTNESS_MIN, (uint)SUR40_BRIGHTNESS_MAX));
|
||||||
|
|
||||||
|
v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_CONTRAST,
|
||||||
|
SUR40_CONTRAST_MIN, SUR40_CONTRAST_MAX, 1, clamp(contrast,
|
||||||
|
(uint)SUR40_CONTRAST_MIN, (uint)SUR40_CONTRAST_MAX));
|
||||||
|
|
||||||
|
v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_GAIN,
|
||||||
|
SUR40_GAIN_MIN, SUR40_GAIN_MAX, 1, clamp(gain,
|
||||||
|
(uint)SUR40_GAIN_MIN, (uint)SUR40_GAIN_MAX));
|
||||||
|
|
||||||
|
v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops,
|
||||||
|
V4L2_CID_BACKLIGHT_COMPENSATION, SUR40_BACKLIGHT_MIN,
|
||||||
|
SUR40_BACKLIGHT_MAX, 1, SUR40_BACKLIGHT_DEF);
|
||||||
|
|
||||||
|
v4l2_ctrl_handler_setup(&sur40->hdl);
|
||||||
|
|
||||||
|
if (sur40->hdl.error) {
|
||||||
|
dev_err(&interface->dev,
|
||||||
|
"Unable to register video controls.");
|
||||||
|
v4l2_ctrl_handler_free(&sur40->hdl);
|
||||||
|
goto err_unreg_v4l2;
|
||||||
|
}
|
||||||
|
|
||||||
error = video_register_device(&sur40->vdev, VFL_TYPE_TOUCH, -1);
|
error = video_register_device(&sur40->vdev, VFL_TYPE_TOUCH, -1);
|
||||||
if (error) {
|
if (error) {
|
||||||
dev_err(&interface->dev,
|
dev_err(&interface->dev,
|
||||||
|
@ -775,6 +813,7 @@ static void sur40_disconnect(struct usb_interface *interface)
|
||||||
{
|
{
|
||||||
struct sur40_state *sur40 = usb_get_intfdata(interface);
|
struct sur40_state *sur40 = usb_get_intfdata(interface);
|
||||||
|
|
||||||
|
v4l2_ctrl_handler_free(&sur40->hdl);
|
||||||
video_unregister_device(&sur40->vdev);
|
video_unregister_device(&sur40->vdev);
|
||||||
v4l2_device_unregister(&sur40->v4l2);
|
v4l2_device_unregister(&sur40->v4l2);
|
||||||
|
|
||||||
|
@ -968,6 +1007,31 @@ static int sur40_vidioc_g_fmt(struct file *file, void *priv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sur40_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
|
{
|
||||||
|
struct sur40_state *sur40 = container_of(ctrl->handler,
|
||||||
|
struct sur40_state, hdl);
|
||||||
|
u8 value = sur40->vsvideo;
|
||||||
|
|
||||||
|
switch (ctrl->id) {
|
||||||
|
case V4L2_CID_BRIGHTNESS:
|
||||||
|
sur40_set_irlevel(sur40, ctrl->val);
|
||||||
|
break;
|
||||||
|
case V4L2_CID_CONTRAST:
|
||||||
|
value = (value & 0x0f) | (ctrl->val << 4);
|
||||||
|
sur40_set_vsvideo(sur40, value);
|
||||||
|
break;
|
||||||
|
case V4L2_CID_GAIN:
|
||||||
|
value = (value & 0xf0) | (ctrl->val);
|
||||||
|
sur40_set_vsvideo(sur40, value);
|
||||||
|
break;
|
||||||
|
case V4L2_CID_BACKLIGHT_COMPENSATION:
|
||||||
|
sur40_set_preprocessor(sur40, ctrl->val);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int sur40_ioctl_parm(struct file *file, void *priv,
|
static int sur40_ioctl_parm(struct file *file, void *priv,
|
||||||
struct v4l2_streamparm *p)
|
struct v4l2_streamparm *p)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue