diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-10 18:09:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-10 18:09:54 -0400 |
commit | 7ae0dea900b027cd90e8a3e14deca9a19e17638b (patch) | |
tree | 428cbe411bba90f6580ae21338276c949e91f23a /Documentation | |
parent | 6c74700fdb8e3bc34c31790384a8ec16c4fefd97 (diff) | |
parent | 560afa7d85bdfb294506afd3032c315e6827824f (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (94 commits)
V4L/DVB: tvp7002: fix write to H-PLL Feedback Divider LSB register
V4L/DVB: dvb: siano: free spinlock before schedule()
V4L/DVB: media: video: pvrusb2: remove custom hex_to_bin()
V4L/DVB: drivers: usbvideo: remove custom implementation of hex_to_bin()
V4L/DVB: Report supported QAM modes on bt8xx
V4L/DVB: media: ir-keytable: null dereference in debug code
V4L/DVB: ivtv: convert to the new control framework
V4L/DVB: ivtv: convert gpio subdev to new control framework
V4L/DVB: wm8739: convert to the new control framework
V4L/DVB: cs53l32a: convert to new control framework
V4L/DVB: wm8775: convert to the new control framework
V4L/DVB: cx2341x: convert to the control framework
V4L/DVB: cx25840: convert to the new control framework
V4L/DVB: cx25840/ivtv: replace ugly priv control with s_config
V4L/DVB: saa717x: convert to the new control framework
V4L/DVB: msp3400: convert to the new control framework
V4L/DVB: saa7115: convert to the new control framework
V4L/DVB: v4l2: hook up the new control framework into the core framework
V4L/DVB: Documentation: add v4l2-controls.txt documenting the new controls API
V4L/DVB: v4l2-ctrls: Whitespace cleanups
...
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/DocBook/v4l/lirc_device_interface.xml | 16 | ||||
-rw-r--r-- | Documentation/DocBook/v4l/pixfmt-packed-rgb.xml | 78 | ||||
-rw-r--r-- | Documentation/video4linux/v4l2-controls.txt | 648 |
3 files changed, 742 insertions, 0 deletions
diff --git a/Documentation/DocBook/v4l/lirc_device_interface.xml b/Documentation/DocBook/v4l/lirc_device_interface.xml index 0413234023d4..68134c0ab4d1 100644 --- a/Documentation/DocBook/v4l/lirc_device_interface.xml +++ b/Documentation/DocBook/v4l/lirc_device_interface.xml | |||
@@ -229,6 +229,22 @@ on working with the default settings initially.</para> | |||
229 | and LIRC_SETUP_END. Drivers can also choose to ignore these ioctls.</para> | 229 | and LIRC_SETUP_END. Drivers can also choose to ignore these ioctls.</para> |
230 | </listitem> | 230 | </listitem> |
231 | </varlistentry> | 231 | </varlistentry> |
232 | <varlistentry> | ||
233 | <term>LIRC_SET_WIDEBAND_RECEIVER</term> | ||
234 | <listitem> | ||
235 | <para>Some receivers are equipped with special wide band receiver which is intended | ||
236 | to be used to learn output of existing remote. | ||
237 | Calling that ioctl with (1) will enable it, and with (0) disable it. | ||
238 | This might be useful of receivers that have otherwise narrow band receiver | ||
239 | that prevents them to be used with some remotes. | ||
240 | Wide band receiver might also be more precise | ||
241 | On the other hand its disadvantage it usually reduced range of reception. | ||
242 | Note: wide band receiver might be implictly enabled if you enable | ||
243 | carrier reports. In that case it will be disabled as soon as you disable | ||
244 | carrier reports. Trying to disable wide band receiver while carrier | ||
245 | reports are active will do nothing.</para> | ||
246 | </listitem> | ||
247 | </varlistentry> | ||
232 | </variablelist> | 248 | </variablelist> |
233 | 249 | ||
234 | </section> | 250 | </section> |
diff --git a/Documentation/DocBook/v4l/pixfmt-packed-rgb.xml b/Documentation/DocBook/v4l/pixfmt-packed-rgb.xml index d2dd697a81d8..26e879231088 100644 --- a/Documentation/DocBook/v4l/pixfmt-packed-rgb.xml +++ b/Documentation/DocBook/v4l/pixfmt-packed-rgb.xml | |||
@@ -240,6 +240,45 @@ colorspace <constant>V4L2_COLORSPACE_SRGB</constant>.</para> | |||
240 | <entry>r<subscript>1</subscript></entry> | 240 | <entry>r<subscript>1</subscript></entry> |
241 | <entry>r<subscript>0</subscript></entry> | 241 | <entry>r<subscript>0</subscript></entry> |
242 | </row> | 242 | </row> |
243 | <row id="V4L2-PIX-FMT-BGR666"> | ||
244 | <entry><constant>V4L2_PIX_FMT_BGR666</constant></entry> | ||
245 | <entry>'BGRH'</entry> | ||
246 | <entry></entry> | ||
247 | <entry>b<subscript>5</subscript></entry> | ||
248 | <entry>b<subscript>4</subscript></entry> | ||
249 | <entry>b<subscript>3</subscript></entry> | ||
250 | <entry>b<subscript>2</subscript></entry> | ||
251 | <entry>b<subscript>1</subscript></entry> | ||
252 | <entry>b<subscript>0</subscript></entry> | ||
253 | <entry>g<subscript>5</subscript></entry> | ||
254 | <entry>g<subscript>4</subscript></entry> | ||
255 | <entry></entry> | ||
256 | <entry>g<subscript>3</subscript></entry> | ||
257 | <entry>g<subscript>2</subscript></entry> | ||
258 | <entry>g<subscript>1</subscript></entry> | ||
259 | <entry>g<subscript>0</subscript></entry> | ||
260 | <entry>r<subscript>5</subscript></entry> | ||
261 | <entry>r<subscript>4</subscript></entry> | ||
262 | <entry>r<subscript>3</subscript></entry> | ||
263 | <entry>r<subscript>2</subscript></entry> | ||
264 | <entry></entry> | ||
265 | <entry>r<subscript>1</subscript></entry> | ||
266 | <entry>r<subscript>0</subscript></entry> | ||
267 | <entry></entry> | ||
268 | <entry></entry> | ||
269 | <entry></entry> | ||
270 | <entry></entry> | ||
271 | <entry></entry> | ||
272 | <entry></entry> | ||
273 | <entry></entry> | ||
274 | <entry></entry> | ||
275 | <entry></entry> | ||
276 | <entry></entry> | ||
277 | <entry></entry> | ||
278 | <entry></entry> | ||
279 | <entry></entry> | ||
280 | <entry></entry> | ||
281 | </row> | ||
243 | <row id="V4L2-PIX-FMT-BGR24"> | 282 | <row id="V4L2-PIX-FMT-BGR24"> |
244 | <entry><constant>V4L2_PIX_FMT_BGR24</constant></entry> | 283 | <entry><constant>V4L2_PIX_FMT_BGR24</constant></entry> |
245 | <entry>'BGR3'</entry> | 284 | <entry>'BGR3'</entry> |
@@ -700,6 +739,45 @@ defined in error. Drivers may interpret them as in <xref | |||
700 | <entry>b<subscript>1</subscript></entry> | 739 | <entry>b<subscript>1</subscript></entry> |
701 | <entry>b<subscript>0</subscript></entry> | 740 | <entry>b<subscript>0</subscript></entry> |
702 | </row> | 741 | </row> |
742 | <row id="V4L2-PIX-FMT-BGR666"> | ||
743 | <entry><constant>V4L2_PIX_FMT_BGR666</constant></entry> | ||
744 | <entry>'BGRH'</entry> | ||
745 | <entry></entry> | ||
746 | <entry>b<subscript>5</subscript></entry> | ||
747 | <entry>b<subscript>4</subscript></entry> | ||
748 | <entry>b<subscript>3</subscript></entry> | ||
749 | <entry>b<subscript>2</subscript></entry> | ||
750 | <entry>b<subscript>1</subscript></entry> | ||
751 | <entry>b<subscript>0</subscript></entry> | ||
752 | <entry>g<subscript>5</subscript></entry> | ||
753 | <entry>g<subscript>4</subscript></entry> | ||
754 | <entry></entry> | ||
755 | <entry>g<subscript>3</subscript></entry> | ||
756 | <entry>g<subscript>2</subscript></entry> | ||
757 | <entry>g<subscript>1</subscript></entry> | ||
758 | <entry>g<subscript>0</subscript></entry> | ||
759 | <entry>r<subscript>5</subscript></entry> | ||
760 | <entry>r<subscript>4</subscript></entry> | ||
761 | <entry>r<subscript>3</subscript></entry> | ||
762 | <entry>r<subscript>2</subscript></entry> | ||
763 | <entry></entry> | ||
764 | <entry>r<subscript>1</subscript></entry> | ||
765 | <entry>r<subscript>0</subscript></entry> | ||
766 | <entry></entry> | ||
767 | <entry></entry> | ||
768 | <entry></entry> | ||
769 | <entry></entry> | ||
770 | <entry></entry> | ||
771 | <entry></entry> | ||
772 | <entry></entry> | ||
773 | <entry></entry> | ||
774 | <entry></entry> | ||
775 | <entry></entry> | ||
776 | <entry></entry> | ||
777 | <entry></entry> | ||
778 | <entry></entry> | ||
779 | <entry></entry> | ||
780 | </row> | ||
703 | <row><!-- id="V4L2-PIX-FMT-BGR24" --> | 781 | <row><!-- id="V4L2-PIX-FMT-BGR24" --> |
704 | <entry><constant>V4L2_PIX_FMT_BGR24</constant></entry> | 782 | <entry><constant>V4L2_PIX_FMT_BGR24</constant></entry> |
705 | <entry>'BGR3'</entry> | 783 | <entry>'BGR3'</entry> |
diff --git a/Documentation/video4linux/v4l2-controls.txt b/Documentation/video4linux/v4l2-controls.txt new file mode 100644 index 000000000000..8773778d23fc --- /dev/null +++ b/Documentation/video4linux/v4l2-controls.txt | |||
@@ -0,0 +1,648 @@ | |||
1 | Introduction | ||
2 | ============ | ||
3 | |||
4 | The V4L2 control API seems simple enough, but quickly becomes very hard to | ||
5 | implement correctly in drivers. But much of the code needed to handle controls | ||
6 | is actually not driver specific and can be moved to the V4L core framework. | ||
7 | |||
8 | After all, the only part that a driver developer is interested in is: | ||
9 | |||
10 | 1) How do I add a control? | ||
11 | 2) How do I set the control's value? (i.e. s_ctrl) | ||
12 | |||
13 | And occasionally: | ||
14 | |||
15 | 3) How do I get the control's value? (i.e. g_volatile_ctrl) | ||
16 | 4) How do I validate the user's proposed control value? (i.e. try_ctrl) | ||
17 | |||
18 | All the rest is something that can be done centrally. | ||
19 | |||
20 | The control framework was created in order to implement all the rules of the | ||
21 | V4L2 specification with respect to controls in a central place. And to make | ||
22 | life as easy as possible for the driver developer. | ||
23 | |||
24 | Note that the control framework relies on the presence of a struct v4l2_device | ||
25 | for V4L2 drivers and struct v4l2_subdev for sub-device drivers. | ||
26 | |||
27 | |||
28 | Objects in the framework | ||
29 | ======================== | ||
30 | |||
31 | There are two main objects: | ||
32 | |||
33 | The v4l2_ctrl object describes the control properties and keeps track of the | ||
34 | control's value (both the current value and the proposed new value). | ||
35 | |||
36 | v4l2_ctrl_handler is the object that keeps track of controls. It maintains a | ||
37 | list of v4l2_ctrl objects that it owns and another list of references to | ||
38 | controls, possibly to controls owned by other handlers. | ||
39 | |||
40 | |||
41 | Basic usage for V4L2 and sub-device drivers | ||
42 | =========================================== | ||
43 | |||
44 | 1) Prepare the driver: | ||
45 | |||
46 | 1.1) Add the handler to your driver's top-level struct: | ||
47 | |||
48 | struct foo_dev { | ||
49 | ... | ||
50 | struct v4l2_ctrl_handler ctrl_handler; | ||
51 | ... | ||
52 | }; | ||
53 | |||
54 | struct foo_dev *foo; | ||
55 | |||
56 | 1.2) Initialize the handler: | ||
57 | |||
58 | v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls); | ||
59 | |||
60 | The second argument is a hint telling the function how many controls this | ||
61 | handler is expected to handle. It will allocate a hashtable based on this | ||
62 | information. It is a hint only. | ||
63 | |||
64 | 1.3) Hook the control handler into the driver: | ||
65 | |||
66 | 1.3.1) For V4L2 drivers do this: | ||
67 | |||
68 | struct foo_dev { | ||
69 | ... | ||
70 | struct v4l2_device v4l2_dev; | ||
71 | ... | ||
72 | struct v4l2_ctrl_handler ctrl_handler; | ||
73 | ... | ||
74 | }; | ||
75 | |||
76 | foo->v4l2_dev.ctrl_handler = &foo->ctrl_handler; | ||
77 | |||
78 | Where foo->v4l2_dev is of type struct v4l2_device. | ||
79 | |||
80 | Finally, remove all control functions from your v4l2_ioctl_ops: | ||
81 | vidioc_queryctrl, vidioc_querymenu, vidioc_g_ctrl, vidioc_s_ctrl, | ||
82 | vidioc_g_ext_ctrls, vidioc_try_ext_ctrls and vidioc_s_ext_ctrls. | ||
83 | Those are now no longer needed. | ||
84 | |||
85 | 1.3.2) For sub-device drivers do this: | ||
86 | |||
87 | struct foo_dev { | ||
88 | ... | ||
89 | struct v4l2_subdev sd; | ||
90 | ... | ||
91 | struct v4l2_ctrl_handler ctrl_handler; | ||
92 | ... | ||
93 | }; | ||
94 | |||
95 | foo->sd.ctrl_handler = &foo->ctrl_handler; | ||
96 | |||
97 | Where foo->sd is of type struct v4l2_subdev. | ||
98 | |||
99 | And set all core control ops in your struct v4l2_subdev_core_ops to these | ||
100 | helpers: | ||
101 | |||
102 | .queryctrl = v4l2_subdev_queryctrl, | ||
103 | .querymenu = v4l2_subdev_querymenu, | ||
104 | .g_ctrl = v4l2_subdev_g_ctrl, | ||
105 | .s_ctrl = v4l2_subdev_s_ctrl, | ||
106 | .g_ext_ctrls = v4l2_subdev_g_ext_ctrls, | ||
107 | .try_ext_ctrls = v4l2_subdev_try_ext_ctrls, | ||
108 | .s_ext_ctrls = v4l2_subdev_s_ext_ctrls, | ||
109 | |||
110 | Note: this is a temporary solution only. Once all V4L2 drivers that depend | ||
111 | on subdev drivers are converted to the control framework these helpers will | ||
112 | no longer be needed. | ||
113 | |||
114 | 1.4) Clean up the handler at the end: | ||
115 | |||
116 | v4l2_ctrl_handler_free(&foo->ctrl_handler); | ||
117 | |||
118 | |||
119 | 2) Add controls: | ||
120 | |||
121 | You add non-menu controls by calling v4l2_ctrl_new_std: | ||
122 | |||
123 | struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl, | ||
124 | const struct v4l2_ctrl_ops *ops, | ||
125 | u32 id, s32 min, s32 max, u32 step, s32 def); | ||
126 | |||
127 | Menu controls are added by calling v4l2_ctrl_new_std_menu: | ||
128 | |||
129 | struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl, | ||
130 | const struct v4l2_ctrl_ops *ops, | ||
131 | u32 id, s32 max, s32 skip_mask, s32 def); | ||
132 | |||
133 | These functions are typically called right after the v4l2_ctrl_handler_init: | ||
134 | |||
135 | v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls); | ||
136 | v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops, | ||
137 | V4L2_CID_BRIGHTNESS, 0, 255, 1, 128); | ||
138 | v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops, | ||
139 | V4L2_CID_CONTRAST, 0, 255, 1, 128); | ||
140 | v4l2_ctrl_new_std_menu(&foo->ctrl_handler, &foo_ctrl_ops, | ||
141 | V4L2_CID_POWER_LINE_FREQUENCY, | ||
142 | V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0, | ||
143 | V4L2_CID_POWER_LINE_FREQUENCY_DISABLED); | ||
144 | ... | ||
145 | if (foo->ctrl_handler.error) { | ||
146 | int err = foo->ctrl_handler.error; | ||
147 | |||
148 | v4l2_ctrl_handler_free(&foo->ctrl_handler); | ||
149 | return err; | ||
150 | } | ||
151 | |||
152 | The v4l2_ctrl_new_std function returns the v4l2_ctrl pointer to the new | ||
153 | control, but if you do not need to access the pointer outside the control ops, | ||
154 | then there is no need to store it. | ||
155 | |||
156 | The v4l2_ctrl_new_std function will fill in most fields based on the control | ||
157 | ID except for the min, max, step and default values. These are passed in the | ||
158 | last four arguments. These values are driver specific while control attributes | ||
159 | like type, name, flags are all global. The control's current value will be set | ||
160 | to the default value. | ||
161 | |||
162 | The v4l2_ctrl_new_std_menu function is very similar but it is used for menu | ||
163 | controls. There is no min argument since that is always 0 for menu controls, | ||
164 | and instead of a step there is a skip_mask argument: if bit X is 1, then menu | ||
165 | item X is skipped. | ||
166 | |||
167 | Note that if something fails, the function will return NULL or an error and | ||
168 | set ctrl_handler->error to the error code. If ctrl_handler->error was already | ||
169 | set, then it will just return and do nothing. This is also true for | ||
170 | v4l2_ctrl_handler_init if it cannot allocate the internal data structure. | ||
171 | |||
172 | This makes it easy to init the handler and just add all controls and only check | ||
173 | the error code at the end. Saves a lot of repetitive error checking. | ||
174 | |||
175 | It is recommended to add controls in ascending control ID order: it will be | ||
176 | a bit faster that way. | ||
177 | |||
178 | 3) Optionally force initial control setup: | ||
179 | |||
180 | v4l2_ctrl_handler_setup(&foo->ctrl_handler); | ||
181 | |||
182 | This will call s_ctrl for all controls unconditionally. Effectively this | ||
183 | initializes the hardware to the default control values. It is recommended | ||
184 | that you do this as this ensures that both the internal data structures and | ||
185 | the hardware are in sync. | ||
186 | |||
187 | 4) Finally: implement the v4l2_ctrl_ops | ||
188 | |||
189 | static const struct v4l2_ctrl_ops foo_ctrl_ops = { | ||
190 | .s_ctrl = foo_s_ctrl, | ||
191 | }; | ||
192 | |||
193 | Usually all you need is s_ctrl: | ||
194 | |||
195 | static int foo_s_ctrl(struct v4l2_ctrl *ctrl) | ||
196 | { | ||
197 | struct foo *state = container_of(ctrl->handler, struct foo, ctrl_handler); | ||
198 | |||
199 | switch (ctrl->id) { | ||
200 | case V4L2_CID_BRIGHTNESS: | ||
201 | write_reg(0x123, ctrl->val); | ||
202 | break; | ||
203 | case V4L2_CID_CONTRAST: | ||
204 | write_reg(0x456, ctrl->val); | ||
205 | break; | ||
206 | } | ||
207 | return 0; | ||
208 | } | ||
209 | |||
210 | The control ops are called with the v4l2_ctrl pointer as argument. | ||
211 | The new control value has already been validated, so all you need to do is | ||
212 | to actually update the hardware registers. | ||
213 | |||
214 | You're done! And this is sufficient for most of the drivers we have. No need | ||
215 | to do any validation of control values, or implement QUERYCTRL/QUERYMENU. And | ||
216 | G/S_CTRL as well as G/TRY/S_EXT_CTRLS are automatically supported. | ||
217 | |||
218 | |||
219 | ============================================================================== | ||
220 | |||
221 | The remainder of this document deals with more advanced topics and scenarios. | ||
222 | In practice the basic usage as described above is sufficient for most drivers. | ||
223 | |||
224 | =============================================================================== | ||
225 | |||
226 | |||
227 | Inheriting Controls | ||
228 | =================== | ||
229 | |||
230 | When a sub-device is registered with a V4L2 driver by calling | ||
231 | v4l2_device_register_subdev() and the ctrl_handler fields of both v4l2_subdev | ||
232 | and v4l2_device are set, then the controls of the subdev will become | ||
233 | automatically available in the V4L2 driver as well. If the subdev driver | ||
234 | contains controls that already exist in the V4L2 driver, then those will be | ||
235 | skipped (so a V4L2 driver can always override a subdev control). | ||
236 | |||
237 | What happens here is that v4l2_device_register_subdev() calls | ||
238 | v4l2_ctrl_add_handler() adding the controls of the subdev to the controls | ||
239 | of v4l2_device. | ||
240 | |||
241 | |||
242 | Accessing Control Values | ||
243 | ======================== | ||
244 | |||
245 | The v4l2_ctrl struct contains these two unions: | ||
246 | |||
247 | /* The current control value. */ | ||
248 | union { | ||
249 | s32 val; | ||
250 | s64 val64; | ||
251 | char *string; | ||
252 | } cur; | ||
253 | |||
254 | /* The new control value. */ | ||
255 | union { | ||
256 | s32 val; | ||
257 | s64 val64; | ||
258 | char *string; | ||
259 | }; | ||
260 | |||
261 | Within the control ops you can freely use these. The val and val64 speak for | ||
262 | themselves. The string pointers point to character buffers of length | ||
263 | ctrl->maximum + 1, and are always 0-terminated. | ||
264 | |||
265 | In most cases 'cur' contains the current cached control value. When you create | ||
266 | a new control this value is made identical to the default value. After calling | ||
267 | v4l2_ctrl_handler_setup() this value is passed to the hardware. It is generally | ||
268 | a good idea to call this function. | ||
269 | |||
270 | Whenever a new value is set that new value is automatically cached. This means | ||
271 | that most drivers do not need to implement the g_volatile_ctrl() op. The | ||
272 | exception is for controls that return a volatile register such as a signal | ||
273 | strength read-out that changes continuously. In that case you will need to | ||
274 | implement g_volatile_ctrl like this: | ||
275 | |||
276 | static int foo_g_volatile_ctrl(struct v4l2_ctrl *ctrl) | ||
277 | { | ||
278 | switch (ctrl->id) { | ||
279 | case V4L2_CID_BRIGHTNESS: | ||
280 | ctrl->cur.val = read_reg(0x123); | ||
281 | break; | ||
282 | } | ||
283 | } | ||
284 | |||
285 | The 'new value' union is not used in g_volatile_ctrl. In general controls | ||
286 | that need to implement g_volatile_ctrl are read-only controls. | ||
287 | |||
288 | To mark a control as volatile you have to set the is_volatile flag: | ||
289 | |||
290 | ctrl = v4l2_ctrl_new_std(&sd->ctrl_handler, ...); | ||
291 | if (ctrl) | ||
292 | ctrl->is_volatile = 1; | ||
293 | |||
294 | For try/s_ctrl the new values (i.e. as passed by the user) are filled in and | ||
295 | you can modify them in try_ctrl or set them in s_ctrl. The 'cur' union | ||
296 | contains the current value, which you can use (but not change!) as well. | ||
297 | |||
298 | If s_ctrl returns 0 (OK), then the control framework will copy the new final | ||
299 | values to the 'cur' union. | ||
300 | |||
301 | While in g_volatile/s/try_ctrl you can access the value of all controls owned | ||
302 | by the same handler since the handler's lock is held. If you need to access | ||
303 | the value of controls owned by other handlers, then you have to be very careful | ||
304 | not to introduce deadlocks. | ||
305 | |||
306 | Outside of the control ops you have to go through to helper functions to get | ||
307 | or set a single control value safely in your driver: | ||
308 | |||
309 | s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl); | ||
310 | int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val); | ||
311 | |||
312 | These functions go through the control framework just as VIDIOC_G/S_CTRL ioctls | ||
313 | do. Don't use these inside the control ops g_volatile/s/try_ctrl, though, that | ||
314 | will result in a deadlock since these helpers lock the handler as well. | ||
315 | |||
316 | You can also take the handler lock yourself: | ||
317 | |||
318 | mutex_lock(&state->ctrl_handler.lock); | ||
319 | printk(KERN_INFO "String value is '%s'\n", ctrl1->cur.string); | ||
320 | printk(KERN_INFO "Integer value is '%s'\n", ctrl2->cur.val); | ||
321 | mutex_unlock(&state->ctrl_handler.lock); | ||
322 | |||
323 | |||
324 | Menu Controls | ||
325 | ============= | ||
326 | |||
327 | The v4l2_ctrl struct contains this union: | ||
328 | |||
329 | union { | ||
330 | u32 step; | ||
331 | u32 menu_skip_mask; | ||
332 | }; | ||
333 | |||
334 | For menu controls menu_skip_mask is used. What it does is that it allows you | ||
335 | to easily exclude certain menu items. This is used in the VIDIOC_QUERYMENU | ||
336 | implementation where you can return -EINVAL if a certain menu item is not | ||
337 | present. Note that VIDIOC_QUERYCTRL always returns a step value of 1 for | ||
338 | menu controls. | ||
339 | |||
340 | A good example is the MPEG Audio Layer II Bitrate menu control where the | ||
341 | menu is a list of standardized possible bitrates. But in practice hardware | ||
342 | implementations will only support a subset of those. By setting the skip | ||
343 | mask you can tell the framework which menu items should be skipped. Setting | ||
344 | it to 0 means that all menu items are supported. | ||
345 | |||
346 | You set this mask either through the v4l2_ctrl_config struct for a custom | ||
347 | control, or by calling v4l2_ctrl_new_std_menu(). | ||
348 | |||
349 | |||
350 | Custom Controls | ||
351 | =============== | ||
352 | |||
353 | Driver specific controls can be created using v4l2_ctrl_new_custom(): | ||
354 | |||
355 | static const struct v4l2_ctrl_config ctrl_filter = { | ||
356 | .ops = &ctrl_custom_ops, | ||
357 | .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER, | ||
358 | .name = "Spatial Filter", | ||
359 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
360 | .flags = V4L2_CTRL_FLAG_SLIDER, | ||
361 | .max = 15, | ||
362 | .step = 1, | ||
363 | }; | ||
364 | |||
365 | ctrl = v4l2_ctrl_new_custom(&foo->ctrl_handler, &ctrl_filter, NULL); | ||
366 | |||
367 | The last argument is the priv pointer which can be set to driver-specific | ||
368 | private data. | ||
369 | |||
370 | The v4l2_ctrl_config struct also has fields to set the is_private and is_volatile | ||
371 | flags. | ||
372 | |||
373 | If the name field is not set, then the framework will assume this is a standard | ||
374 | control and will fill in the name, type and flags fields accordingly. | ||
375 | |||
376 | |||
377 | Active and Grabbed Controls | ||
378 | =========================== | ||
379 | |||
380 | If you get more complex relationships between controls, then you may have to | ||
381 | activate and deactivate controls. For example, if the Chroma AGC control is | ||
382 | on, then the Chroma Gain control is inactive. That is, you may set it, but | ||
383 | the value will not be used by the hardware as long as the automatic gain | ||
384 | control is on. Typically user interfaces can disable such input fields. | ||
385 | |||
386 | You can set the 'active' status using v4l2_ctrl_activate(). By default all | ||
387 | controls are active. Note that the framework does not check for this flag. | ||
388 | It is meant purely for GUIs. The function is typically called from within | ||
389 | s_ctrl. | ||
390 | |||
391 | The other flag is the 'grabbed' flag. A grabbed control means that you cannot | ||
392 | change it because it is in use by some resource. Typical examples are MPEG | ||
393 | bitrate controls that cannot be changed while capturing is in progress. | ||
394 | |||
395 | If a control is set to 'grabbed' using v4l2_ctrl_grab(), then the framework | ||
396 | will return -EBUSY if an attempt is made to set this control. The | ||
397 | v4l2_ctrl_grab() function is typically called from the driver when it | ||
398 | starts or stops streaming. | ||
399 | |||
400 | |||
401 | Control Clusters | ||
402 | ================ | ||
403 | |||
404 | By default all controls are independent from the others. But in more | ||
405 | complex scenarios you can get dependencies from one control to another. | ||
406 | In that case you need to 'cluster' them: | ||
407 | |||
408 | struct foo { | ||
409 | struct v4l2_ctrl_handler ctrl_handler; | ||
410 | #define AUDIO_CL_VOLUME (0) | ||
411 | #define AUDIO_CL_MUTE (1) | ||
412 | struct v4l2_ctrl *audio_cluster[2]; | ||
413 | ... | ||
414 | }; | ||
415 | |||
416 | state->audio_cluster[AUDIO_CL_VOLUME] = | ||
417 | v4l2_ctrl_new_std(&state->ctrl_handler, ...); | ||
418 | state->audio_cluster[AUDIO_CL_MUTE] = | ||
419 | v4l2_ctrl_new_std(&state->ctrl_handler, ...); | ||
420 | v4l2_ctrl_cluster(ARRAY_SIZE(state->audio_cluster), state->audio_cluster); | ||
421 | |||
422 | From now on whenever one or more of the controls belonging to the same | ||
423 | cluster is set (or 'gotten', or 'tried'), only the control ops of the first | ||
424 | control ('volume' in this example) is called. You effectively create a new | ||
425 | composite control. Similar to how a 'struct' works in C. | ||
426 | |||
427 | So when s_ctrl is called with V4L2_CID_AUDIO_VOLUME as argument, you should set | ||
428 | all two controls belonging to the audio_cluster: | ||
429 | |||
430 | static int foo_s_ctrl(struct v4l2_ctrl *ctrl) | ||
431 | { | ||
432 | struct foo *state = container_of(ctrl->handler, struct foo, ctrl_handler); | ||
433 | |||
434 | switch (ctrl->id) { | ||
435 | case V4L2_CID_AUDIO_VOLUME: { | ||
436 | struct v4l2_ctrl *mute = ctrl->cluster[AUDIO_CL_MUTE]; | ||
437 | |||
438 | write_reg(0x123, mute->val ? 0 : ctrl->val); | ||
439 | break; | ||
440 | } | ||
441 | case V4L2_CID_CONTRAST: | ||
442 | write_reg(0x456, ctrl->val); | ||
443 | break; | ||
444 | } | ||
445 | return 0; | ||
446 | } | ||
447 | |||
448 | In the example above the following are equivalent for the VOLUME case: | ||
449 | |||
450 | ctrl == ctrl->cluster[AUDIO_CL_VOLUME] == state->audio_cluster[AUDIO_CL_VOLUME] | ||
451 | ctrl->cluster[AUDIO_CL_MUTE] == state->audio_cluster[AUDIO_CL_MUTE] | ||
452 | |||
453 | Note that controls in a cluster may be NULL. For example, if for some | ||
454 | reason mute was never added (because the hardware doesn't support that | ||
455 | particular feature), then mute will be NULL. So in that case we have a | ||
456 | cluster of 2 controls, of which only 1 is actually instantiated. The | ||
457 | only restriction is that the first control of the cluster must always be | ||
458 | present, since that is the 'master' control of the cluster. The master | ||
459 | control is the one that identifies the cluster and that provides the | ||
460 | pointer to the v4l2_ctrl_ops struct that is used for that cluster. | ||
461 | |||
462 | Obviously, all controls in the cluster array must be initialized to either | ||
463 | a valid control or to NULL. | ||
464 | |||
465 | |||
466 | VIDIOC_LOG_STATUS Support | ||
467 | ========================= | ||
468 | |||
469 | This ioctl allow you to dump the current status of a driver to the kernel log. | ||
470 | The v4l2_ctrl_handler_log_status(ctrl_handler, prefix) can be used to dump the | ||
471 | value of the controls owned by the given handler to the log. You can supply a | ||
472 | prefix as well. If the prefix didn't end with a space, then ': ' will be added | ||
473 | for you. | ||
474 | |||
475 | |||
476 | Different Handlers for Different Video Nodes | ||
477 | ============================================ | ||
478 | |||
479 | Usually the V4L2 driver has just one control handler that is global for | ||
480 | all video nodes. But you can also specify different control handlers for | ||
481 | different video nodes. You can do that by manually setting the ctrl_handler | ||
482 | field of struct video_device. | ||
483 | |||
484 | That is no problem if there are no subdevs involved but if there are, then | ||
485 | you need to block the automatic merging of subdev controls to the global | ||
486 | control handler. You do that by simply setting the ctrl_handler field in | ||
487 | struct v4l2_device to NULL. Now v4l2_device_register_subdev() will no longer | ||
488 | merge subdev controls. | ||
489 | |||
490 | After each subdev was added, you will then have to call v4l2_ctrl_add_handler | ||
491 | manually to add the subdev's control handler (sd->ctrl_handler) to the desired | ||
492 | control handler. This control handler may be specific to the video_device or | ||
493 | for a subset of video_device's. For example: the radio device nodes only have | ||
494 | audio controls, while the video and vbi device nodes share the same control | ||
495 | handler for the audio and video controls. | ||
496 | |||
497 | If you want to have one handler (e.g. for a radio device node) have a subset | ||
498 | of another handler (e.g. for a video device node), then you should first add | ||
499 | the controls to the first handler, add the other controls to the second | ||
500 | handler and finally add the first handler to the second. For example: | ||
501 | |||
502 | v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_VOLUME, ...); | ||
503 | v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...); | ||
504 | v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_BRIGHTNESS, ...); | ||
505 | v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_CONTRAST, ...); | ||
506 | v4l2_ctrl_add_handler(&video_ctrl_handler, &radio_ctrl_handler); | ||
507 | |||
508 | Or you can add specific controls to a handler: | ||
509 | |||
510 | volume = v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_AUDIO_VOLUME, ...); | ||
511 | v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_BRIGHTNESS, ...); | ||
512 | v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_CONTRAST, ...); | ||
513 | v4l2_ctrl_add_ctrl(&radio_ctrl_handler, volume); | ||
514 | |||
515 | What you should not do is make two identical controls for two handlers. | ||
516 | For example: | ||
517 | |||
518 | v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...); | ||
519 | v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_AUDIO_MUTE, ...); | ||
520 | |||
521 | This would be bad since muting the radio would not change the video mute | ||
522 | control. The rule is to have one control for each hardware 'knob' that you | ||
523 | can twiddle. | ||
524 | |||
525 | |||
526 | Finding Controls | ||
527 | ================ | ||
528 | |||
529 | Normally you have created the controls yourself and you can store the struct | ||
530 | v4l2_ctrl pointer into your own struct. | ||
531 | |||
532 | But sometimes you need to find a control from another handler that you do | ||
533 | not own. For example, if you have to find a volume control from a subdev. | ||
534 | |||
535 | You can do that by calling v4l2_ctrl_find: | ||
536 | |||
537 | struct v4l2_ctrl *volume; | ||
538 | |||
539 | volume = v4l2_ctrl_find(sd->ctrl_handler, V4L2_CID_AUDIO_VOLUME); | ||
540 | |||
541 | Since v4l2_ctrl_find will lock the handler you have to be careful where you | ||
542 | use it. For example, this is not a good idea: | ||
543 | |||
544 | struct v4l2_ctrl_handler ctrl_handler; | ||
545 | |||
546 | v4l2_ctrl_new_std(&ctrl_handler, &video_ops, V4L2_CID_BRIGHTNESS, ...); | ||
547 | v4l2_ctrl_new_std(&ctrl_handler, &video_ops, V4L2_CID_CONTRAST, ...); | ||
548 | |||
549 | ...and in video_ops.s_ctrl: | ||
550 | |||
551 | case V4L2_CID_BRIGHTNESS: | ||
552 | contrast = v4l2_find_ctrl(&ctrl_handler, V4L2_CID_CONTRAST); | ||
553 | ... | ||
554 | |||
555 | When s_ctrl is called by the framework the ctrl_handler.lock is already taken, so | ||
556 | attempting to find another control from the same handler will deadlock. | ||
557 | |||
558 | It is recommended not to use this function from inside the control ops. | ||
559 | |||
560 | |||
561 | Inheriting Controls | ||
562 | =================== | ||
563 | |||
564 | When one control handler is added to another using v4l2_ctrl_add_handler, then | ||
565 | by default all controls from one are merged to the other. But a subdev might | ||
566 | have low-level controls that make sense for some advanced embedded system, but | ||
567 | not when it is used in consumer-level hardware. In that case you want to keep | ||
568 | those low-level controls local to the subdev. You can do this by simply | ||
569 | setting the 'is_private' flag of the control to 1: | ||
570 | |||
571 | static const struct v4l2_ctrl_config ctrl_private = { | ||
572 | .ops = &ctrl_custom_ops, | ||
573 | .id = V4L2_CID_..., | ||
574 | .name = "Some Private Control", | ||
575 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
576 | .max = 15, | ||
577 | .step = 1, | ||
578 | .is_private = 1, | ||
579 | }; | ||
580 | |||
581 | ctrl = v4l2_ctrl_new_custom(&foo->ctrl_handler, &ctrl_private, NULL); | ||
582 | |||
583 | These controls will now be skipped when v4l2_ctrl_add_handler is called. | ||
584 | |||
585 | |||
586 | V4L2_CTRL_TYPE_CTRL_CLASS Controls | ||
587 | ================================== | ||
588 | |||
589 | Controls of this type can be used by GUIs to get the name of the control class. | ||
590 | A fully featured GUI can make a dialog with multiple tabs with each tab | ||
591 | containing the controls belonging to a particular control class. The name of | ||
592 | each tab can be found by querying a special control with ID <control class | 1>. | ||
593 | |||
594 | Drivers do not have to care about this. The framework will automatically add | ||
595 | a control of this type whenever the first control belonging to a new control | ||
596 | class is added. | ||
597 | |||
598 | |||
599 | Differences from the Spec | ||
600 | ========================= | ||
601 | |||
602 | There are a few places where the framework acts slightly differently from the | ||
603 | V4L2 Specification. Those differences are described in this section. We will | ||
604 | have to see whether we need to adjust the spec or not. | ||
605 | |||
606 | 1) It is no longer required to have all controls contained in a | ||
607 | v4l2_ext_control array be from the same control class. The framework will be | ||
608 | able to handle any type of control in the array. You need to set ctrl_class | ||
609 | to 0 in order to enable this. If ctrl_class is non-zero, then it will still | ||
610 | check that all controls belong to that control class. | ||
611 | |||
612 | If you set ctrl_class to 0 and count to 0, then it will only return an error | ||
613 | if there are no controls at all. | ||
614 | |||
615 | 2) Clarified the way error_idx works. For get and set it will be equal to | ||
616 | count if nothing was done yet. If it is less than count then only the controls | ||
617 | up to error_idx-1 were successfully applied. | ||
618 | |||
619 | 3) When attempting to read a button control the framework will return -EACCES | ||
620 | instead of -EINVAL as stated in the spec. It seems to make more sense since | ||
621 | button controls are write-only controls. | ||
622 | |||
623 | 4) Attempting to write to a read-only control will return -EACCES instead of | ||
624 | -EINVAL as the spec says. | ||
625 | |||
626 | 5) The spec does not mention what should happen when you try to set/get a | ||
627 | control class controls. ivtv currently returns -EINVAL (indicating that the | ||
628 | control ID does not exist) while the framework will return -EACCES, which | ||
629 | makes more sense. | ||
630 | |||
631 | |||
632 | Proposals for Extensions | ||
633 | ======================== | ||
634 | |||
635 | Some ideas for future extensions to the spec: | ||
636 | |||
637 | 1) Add a V4L2_CTRL_FLAG_HEX to have values shown as hexadecimal instead of | ||
638 | decimal. Useful for e.g. video_mute_yuv. | ||
639 | |||
640 | 2) It is possible to mark in the controls array which controls have been | ||
641 | successfully written and which failed by for example adding a bit to the | ||
642 | control ID. Not sure if it is worth the effort, though. | ||
643 | |||
644 | 3) Trying to set volatile inactive controls should result in -EACCESS. | ||
645 | |||
646 | 4) Add a new flag to mark volatile controls. Any application that wants | ||
647 | to store the state of the controls can then skip volatile inactive controls. | ||
648 | Currently it is not possible to detect such controls. | ||