blob: 166f62406789864f051aeffe12439a62dcd8e22f [file] [log] [blame]
Hans Verkuil09965172010-08-01 14:32:42 -03001/*
2 V4L2 controls support header.
3
4 Copyright (C) 2010 Hans Verkuil <hverkuil@xs4all.nl>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#ifndef _V4L2_CTRLS_H
22#define _V4L2_CTRLS_H
23
24#include <linux/list.h>
Flemmard0a7467c2013-05-20 14:23:09 -070025#include <linux/device.h>
Laurent Pinchart01c40c02010-11-19 11:20:06 -030026#include <linux/videodev2.h>
Hans Verkuil09965172010-08-01 14:32:42 -030027
Hans Verkuil09965172010-08-01 14:32:42 -030028struct v4l2_ctrl_handler;
29struct v4l2_ctrl;
30struct video_device;
31struct v4l2_subdev;
32
Hans Verkuil09965172010-08-01 14:32:42 -030033struct v4l2_ctrl_ops {
34 int (*g_volatile_ctrl)(struct v4l2_ctrl *ctrl);
35 int (*try_ctrl)(struct v4l2_ctrl *ctrl);
36 int (*s_ctrl)(struct v4l2_ctrl *ctrl);
37};
38
Hans Verkuil09965172010-08-01 14:32:42 -030039struct v4l2_ctrl {
Flemmard0a7467c2013-05-20 14:23:09 -070040
Hans Verkuil09965172010-08-01 14:32:42 -030041 struct list_head node;
42 struct v4l2_ctrl_handler *handler;
43 struct v4l2_ctrl **cluster;
44 unsigned ncontrols;
Hans Verkuil09965172010-08-01 14:32:42 -030045 unsigned int done:1;
46
Hans Verkuil2a863792011-01-11 14:45:03 -030047 unsigned int is_new:1;
Hans Verkuil09965172010-08-01 14:32:42 -030048 unsigned int is_private:1;
Flemmard0a7467c2013-05-20 14:23:09 -070049 unsigned int is_volatile:1;
Hans Verkuil09965172010-08-01 14:32:42 -030050
51 const struct v4l2_ctrl_ops *ops;
52 u32 id;
53 const char *name;
54 enum v4l2_ctrl_type type;
55 s32 minimum, maximum, default_value;
56 union {
57 u32 step;
58 u32 menu_skip_mask;
59 };
Hans Verkuil513521e2010-12-29 14:25:52 -030060 const char * const *qmenu;
Hans Verkuil09965172010-08-01 14:32:42 -030061 unsigned long flags;
62 union {
63 s32 val;
64 s64 val64;
65 char *string;
66 } cur;
67 union {
68 s32 val;
69 s64 val64;
70 char *string;
71 };
72 void *priv;
73};
74
Hans Verkuil09965172010-08-01 14:32:42 -030075struct v4l2_ctrl_ref {
76 struct list_head node;
77 struct v4l2_ctrl_ref *next;
78 struct v4l2_ctrl *ctrl;
79};
80
Hans Verkuil09965172010-08-01 14:32:42 -030081struct v4l2_ctrl_handler {
82 struct mutex lock;
83 struct list_head ctrls;
84 struct list_head ctrl_refs;
85 struct v4l2_ctrl_ref *cached;
86 struct v4l2_ctrl_ref **buckets;
87 u16 nr_of_buckets;
88 int error;
89};
90
Hans Verkuil09965172010-08-01 14:32:42 -030091struct v4l2_ctrl_config {
92 const struct v4l2_ctrl_ops *ops;
93 u32 id;
94 const char *name;
95 enum v4l2_ctrl_type type;
96 s32 min;
97 s32 max;
98 u32 step;
99 s32 def;
100 u32 flags;
101 u32 menu_skip_mask;
Hans Verkuil513521e2010-12-29 14:25:52 -0300102 const char * const *qmenu;
Hans Verkuil09965172010-08-01 14:32:42 -0300103 unsigned int is_private:1;
Flemmard0a7467c2013-05-20 14:23:09 -0700104 unsigned int is_volatile:1;
Hans Verkuil09965172010-08-01 14:32:42 -0300105};
106
Hans Verkuil09965172010-08-01 14:32:42 -0300107void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
108 s32 *min, s32 *max, s32 *step, s32 *def, u32 *flags);
109
110
Hans Verkuil09965172010-08-01 14:32:42 -0300111int v4l2_ctrl_handler_init(struct v4l2_ctrl_handler *hdl,
112 unsigned nr_of_controls_hint);
113
Hans Verkuil09965172010-08-01 14:32:42 -0300114void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl);
115
Hans Verkuil09965172010-08-01 14:32:42 -0300116int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl);
117
Hans Verkuil09965172010-08-01 14:32:42 -0300118void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl,
119 const char *prefix);
120
Hans Verkuil09965172010-08-01 14:32:42 -0300121struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl,
122 const struct v4l2_ctrl_config *cfg, void *priv);
123
Hans Verkuil09965172010-08-01 14:32:42 -0300124struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
125 const struct v4l2_ctrl_ops *ops,
126 u32 id, s32 min, s32 max, u32 step, s32 def);
127
Hans Verkuil09965172010-08-01 14:32:42 -0300128struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
129 const struct v4l2_ctrl_ops *ops,
130 u32 id, s32 max, s32 mask, s32 def);
131
Hans Verkuil09965172010-08-01 14:32:42 -0300132struct v4l2_ctrl *v4l2_ctrl_add_ctrl(struct v4l2_ctrl_handler *hdl,
133 struct v4l2_ctrl *ctrl);
134
Hans Verkuil09965172010-08-01 14:32:42 -0300135int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl,
136 struct v4l2_ctrl_handler *add);
137
138
Hans Verkuil09965172010-08-01 14:32:42 -0300139void v4l2_ctrl_cluster(unsigned ncontrols, struct v4l2_ctrl **controls);
140
141
Hans Verkuil09965172010-08-01 14:32:42 -0300142struct v4l2_ctrl *v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id);
143
Hans Verkuil09965172010-08-01 14:32:42 -0300144void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
145
Hans Verkuil09965172010-08-01 14:32:42 -0300146void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
147
Hans Verkuil09965172010-08-01 14:32:42 -0300148static inline void v4l2_ctrl_lock(struct v4l2_ctrl *ctrl)
149{
150 mutex_lock(&ctrl->handler->lock);
151}
152
Hans Verkuil09965172010-08-01 14:32:42 -0300153static inline void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)
154{
155 mutex_unlock(&ctrl->handler->lock);
156}
157
Hans Verkuil09965172010-08-01 14:32:42 -0300158s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
159
Hans Verkuil09965172010-08-01 14:32:42 -0300160int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
161
Hans Verkuil6e239392011-06-07 11:13:44 -0300162
Hans Verkuil09965172010-08-01 14:32:42 -0300163int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
164int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);
165int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl);
Flemmard0a7467c2013-05-20 14:23:09 -0700166int v4l2_s_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl);
Hans Verkuil09965172010-08-01 14:32:42 -0300167int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c);
168int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c);
Flemmard0a7467c2013-05-20 14:23:09 -0700169int v4l2_s_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct v4l2_ext_controls *c);
Hans Verkuil09965172010-08-01 14:32:42 -0300170
Hans Verkuil09965172010-08-01 14:32:42 -0300171int v4l2_subdev_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
172int v4l2_subdev_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
173int v4l2_subdev_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
174int v4l2_subdev_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
175int v4l2_subdev_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *cs);
176int v4l2_subdev_g_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
177int v4l2_subdev_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
178
179#endif