1<refentry id="vidioc-g-ext-ctrls"> 2 <refmeta> 3 <refentrytitle>ioctl VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS, 4VIDIOC_TRY_EXT_CTRLS</refentrytitle> 5 &manvol; 6 </refmeta> 7 8 <refnamediv> 9 <refname>VIDIOC_G_EXT_CTRLS</refname> 10 <refname>VIDIOC_S_EXT_CTRLS</refname> 11 <refname>VIDIOC_TRY_EXT_CTRLS</refname> 12 <refpurpose>Get or set the value of several controls, try control 13values</refpurpose> 14 </refnamediv> 15 16 <refsynopsisdiv> 17 <funcsynopsis> 18 <funcprototype> 19 <funcdef>int <function>ioctl</function></funcdef> 20 <paramdef>int <parameter>fd</parameter></paramdef> 21 <paramdef>int <parameter>request</parameter></paramdef> 22 <paramdef>struct v4l2_ext_controls 23*<parameter>argp</parameter></paramdef> 24 </funcprototype> 25 </funcsynopsis> 26 </refsynopsisdiv> 27 28 <refsect1> 29 <title>Arguments</title> 30 31 <variablelist> 32 <varlistentry> 33 <term><parameter>fd</parameter></term> 34 <listitem> 35 <para>&fd;</para> 36 </listitem> 37 </varlistentry> 38 <varlistentry> 39 <term><parameter>request</parameter></term> 40 <listitem> 41 <para>VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS, 42VIDIOC_TRY_EXT_CTRLS</para> 43 </listitem> 44 </varlistentry> 45 <varlistentry> 46 <term><parameter>argp</parameter></term> 47 <listitem> 48 <para></para> 49 </listitem> 50 </varlistentry> 51 </variablelist> 52 </refsect1> 53 54 <refsect1> 55 <title>Description</title> 56 57 <para>These ioctls allow the caller to get or set multiple 58controls atomically. Control IDs are grouped into control classes (see 59<xref linkend="ctrl-class" />) and all controls in the control array 60must belong to the same control class.</para> 61 62 <para>Applications must always fill in the 63<structfield>count</structfield>, 64<structfield>ctrl_class</structfield>, 65<structfield>controls</structfield> and 66<structfield>reserved</structfield> fields of &v4l2-ext-controls;, and 67initialize the &v4l2-ext-control; array pointed to by the 68<structfield>controls</structfield> fields.</para> 69 70 <para>To get the current value of a set of controls applications 71initialize the <structfield>id</structfield>, 72<structfield>size</structfield> and <structfield>reserved2</structfield> fields 73of each &v4l2-ext-control; and call the 74<constant>VIDIOC_G_EXT_CTRLS</constant> ioctl. String controls controls 75must also set the <structfield>string</structfield> field. Controls 76of compound types (<constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant> is set) 77must set the <structfield>ptr</structfield> field.</para> 78 79 <para>If the <structfield>size</structfield> is too small to 80receive the control result (only relevant for pointer-type controls 81like strings), then the driver will set <structfield>size</structfield> 82to a valid value and return an &ENOSPC;. You should re-allocate the 83memory to this new size and try again. For the string type it is possible that 84the same issue occurs again if the string has grown in the meantime. It is 85recommended to call &VIDIOC-QUERYCTRL; first and use 86<structfield>maximum</structfield>+1 as the new <structfield>size</structfield> 87value. It is guaranteed that that is sufficient memory. 88</para> 89 90 <para>N-dimensional arrays are set and retrieved row-by-row. You cannot set a partial 91array, all elements have to be set or retrieved. The total size is calculated 92as <structfield>elems</structfield> * <structfield>elem_size</structfield>. 93These values can be obtained by calling &VIDIOC-QUERY-EXT-CTRL;.</para> 94 95 <para>To change the value of a set of controls applications 96initialize the <structfield>id</structfield>, <structfield>size</structfield>, 97<structfield>reserved2</structfield> and 98<structfield>value/value64/string/ptr</structfield> fields of each &v4l2-ext-control; and 99call the <constant>VIDIOC_S_EXT_CTRLS</constant> ioctl. The controls 100will only be set if <emphasis>all</emphasis> control values are 101valid.</para> 102 103 <para>To check if a set of controls have correct values applications 104initialize the <structfield>id</structfield>, <structfield>size</structfield>, 105<structfield>reserved2</structfield> and 106<structfield>value/value64/string/ptr</structfield> fields of each &v4l2-ext-control; and 107call the <constant>VIDIOC_TRY_EXT_CTRLS</constant> ioctl. It is up to 108the driver whether wrong values are automatically adjusted to a valid 109value or if an error is returned.</para> 110 111 <para>When the <structfield>id</structfield> or 112<structfield>ctrl_class</structfield> is invalid drivers return an 113&EINVAL;. When the value is out of bounds drivers can choose to take 114the closest valid value or return an &ERANGE;, whatever seems more 115appropriate. In the first case the new value is set in 116&v4l2-ext-control;. If the new control value is inappropriate (e.g. the 117given menu index is not supported by the menu control), then this will 118also result in an &EINVAL; error.</para> 119 120 <para>The driver will only set/get these controls if all control 121values are correct. This prevents the situation where only some of the 122controls were set/get. Only low-level errors (⪚ a failed i2c 123command) can still cause this situation.</para> 124 125 <table pgwide="1" frame="none" id="v4l2-ext-control"> 126 <title>struct <structname>v4l2_ext_control</structname></title> 127 <tgroup cols="4"> 128 &cs-ustr; 129 <tbody valign="top"> 130 <row> 131 <entry>__u32</entry> 132 <entry><structfield>id</structfield></entry> 133 <entry></entry> 134 <entry>Identifies the control, set by the 135application.</entry> 136 </row> 137 <row> 138 <entry>__u32</entry> 139 <entry><structfield>size</structfield></entry> 140 <entry></entry> 141 <entry>The total size in bytes of the payload of this 142control. This is normally 0, but for pointer controls this should be 143set to the size of the memory containing the payload, or that will 144receive the payload. If <constant>VIDIOC_G_EXT_CTRLS</constant> finds 145that this value is less than is required to store 146the payload result, then it is set to a value large enough to store the 147payload result and ENOSPC is returned. Note that for string controls 148this <structfield>size</structfield> field should not be confused with the length of the string. 149This field refers to the size of the memory that contains the string. 150The actual <emphasis>length</emphasis> of the string may well be much smaller. 151</entry> 152 </row> 153 <row> 154 <entry>__u32</entry> 155 <entry><structfield>reserved2</structfield>[1]</entry> 156 <entry></entry> 157 <entry>Reserved for future extensions. Drivers and 158applications must set the array to zero.</entry> 159 </row> 160 <row> 161 <entry>union</entry> 162 <entry>(anonymous)</entry> 163 </row> 164 <row> 165 <entry></entry> 166 <entry>__s32</entry> 167 <entry><structfield>value</structfield></entry> 168 <entry>New value or current value. Valid if this control is not of 169type <constant>V4L2_CTRL_TYPE_INTEGER64</constant> and 170<constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant> is not set.</entry> 171 </row> 172 <row> 173 <entry></entry> 174 <entry>__s64</entry> 175 <entry><structfield>value64</structfield></entry> 176 <entry>New value or current value. Valid if this control is of 177type <constant>V4L2_CTRL_TYPE_INTEGER64</constant> and 178<constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant> is not set.</entry> 179 </row> 180 <row> 181 <entry></entry> 182 <entry>char *</entry> 183 <entry><structfield>string</structfield></entry> 184 <entry>A pointer to a string. Valid if this control is of 185type <constant>V4L2_CTRL_TYPE_STRING</constant>.</entry> 186 </row> 187 <row> 188 <entry></entry> 189 <entry>__u8 *</entry> 190 <entry><structfield>p_u8</structfield></entry> 191 <entry>A pointer to a matrix control of unsigned 8-bit values. 192Valid if this control is of type <constant>V4L2_CTRL_TYPE_U8</constant>.</entry> 193 </row> 194 <row> 195 <entry></entry> 196 <entry>__u16 *</entry> 197 <entry><structfield>p_u16</structfield></entry> 198 <entry>A pointer to a matrix control of unsigned 16-bit values. 199Valid if this control is of type <constant>V4L2_CTRL_TYPE_U16</constant>.</entry> 200 </row> 201 <row> 202 <entry></entry> 203 <entry>void *</entry> 204 <entry><structfield>ptr</structfield></entry> 205 <entry>A pointer to a compound type which can be an N-dimensional array and/or a 206compound type (the control's type is >= <constant>V4L2_CTRL_COMPOUND_TYPES</constant>). 207Valid if <constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant> is set for this control. 208</entry> 209 </row> 210 </tbody> 211 </tgroup> 212 </table> 213 214 <table pgwide="1" frame="none" id="v4l2-ext-controls"> 215 <title>struct <structname>v4l2_ext_controls</structname></title> 216 <tgroup cols="3"> 217 &cs-str; 218 <tbody valign="top"> 219 <row> 220 <entry>__u32</entry> 221 <entry><structfield>ctrl_class</structfield></entry> 222 <entry>The control class to which all controls belong, see 223<xref linkend="ctrl-class" />. Drivers that use a kernel framework for handling 224controls will also accept a value of 0 here, meaning that the controls can 225belong to any control class. Whether drivers support this can be tested by setting 226<structfield>ctrl_class</structfield> to 0 and calling <constant>VIDIOC_TRY_EXT_CTRLS</constant> 227with a <structfield>count</structfield> of 0. If that succeeds, then the driver 228supports this feature.</entry> 229 </row> 230 <row> 231 <entry>__u32</entry> 232 <entry><structfield>count</structfield></entry> 233 <entry>The number of controls in the controls array. May 234also be zero.</entry> 235 </row> 236 <row> 237 <entry>__u32</entry> 238 <entry><structfield>error_idx</structfield></entry> 239 <entry><para>Set by the driver in case of an error. If the error is 240associated with a particular control, then <structfield>error_idx</structfield> 241is set to the index of that control. If the error is not related to a specific 242control, or the validation step failed (see below), then 243<structfield>error_idx</structfield> is set to <structfield>count</structfield>. 244The value is undefined if the ioctl returned 0 (success).</para> 245 246<para>Before controls are read from/written to hardware a validation step 247takes place: this checks if all controls in the list are valid controls, 248if no attempt is made to write to a read-only control or read from a write-only 249control, and any other up-front checks that can be done without accessing the 250hardware. The exact validations done during this step are driver dependent 251since some checks might require hardware access for some devices, thus making 252it impossible to do those checks up-front. However, drivers should make a 253best-effort to do as many up-front checks as possible.</para> 254 255<para>This check is done to avoid leaving the hardware in an inconsistent state due 256to easy-to-avoid problems. But it leads to another problem: the application needs to 257know whether an error came from the validation step (meaning that the hardware 258was not touched) or from an error during the actual reading from/writing to hardware.</para> 259 260<para>The, in hindsight quite poor, solution for that is to set <structfield>error_idx</structfield> 261to <structfield>count</structfield> if the validation failed. This has the 262unfortunate side-effect that it is not possible to see which control failed the 263validation. If the validation was successful and the error happened while 264accessing the hardware, then <structfield>error_idx</structfield> is less than 265<structfield>count</structfield> and only the controls up to 266<structfield>error_idx-1</structfield> were read or written correctly, and the 267state of the remaining controls is undefined.</para> 268 269<para>Since <constant>VIDIOC_TRY_EXT_CTRLS</constant> does not access hardware 270there is also no need to handle the validation step in this special way, 271so <structfield>error_idx</structfield> will just be set to the control that 272failed the validation step instead of to <structfield>count</structfield>. 273This means that if <constant>VIDIOC_S_EXT_CTRLS</constant> fails with 274<structfield>error_idx</structfield> set to <structfield>count</structfield>, 275then you can call <constant>VIDIOC_TRY_EXT_CTRLS</constant> to try to discover 276the actual control that failed the validation step. Unfortunately, there 277is no <constant>TRY</constant> equivalent for <constant>VIDIOC_G_EXT_CTRLS</constant>. 278</para></entry> 279 </row> 280 <row> 281 <entry>__u32</entry> 282 <entry><structfield>reserved</structfield>[2]</entry> 283 <entry>Reserved for future extensions. Drivers and 284applications must set the array to zero.</entry> 285 </row> 286 <row> 287 <entry>&v4l2-ext-control; *</entry> 288 <entry><structfield>controls</structfield></entry> 289 <entry>Pointer to an array of 290<structfield>count</structfield> v4l2_ext_control structures. Ignored 291if <structfield>count</structfield> equals zero.</entry> 292 </row> 293 </tbody> 294 </tgroup> 295 </table> 296 297 <table pgwide="1" frame="none" id="ctrl-class"> 298 <title>Control classes</title> 299 <tgroup cols="3"> 300 &cs-def; 301 <tbody valign="top"> 302 <row> 303 <entry><constant>V4L2_CTRL_CLASS_USER</constant></entry> 304 <entry>0x980000</entry> 305 <entry>The class containing user controls. These controls 306are described in <xref linkend="control" />. All controls that can be set 307using the &VIDIOC-S-CTRL; and &VIDIOC-G-CTRL; ioctl belong to this 308class.</entry> 309 </row> 310 <row> 311 <entry><constant>V4L2_CTRL_CLASS_MPEG</constant></entry> 312 <entry>0x990000</entry> 313 <entry>The class containing MPEG compression controls. 314These controls are described in <xref 315 linkend="mpeg-controls" />.</entry> 316 </row> 317 <row> 318 <entry><constant>V4L2_CTRL_CLASS_CAMERA</constant></entry> 319 <entry>0x9a0000</entry> 320 <entry>The class containing camera controls. 321These controls are described in <xref 322 linkend="camera-controls" />.</entry> 323 </row> 324 <row> 325 <entry><constant>V4L2_CTRL_CLASS_FM_TX</constant></entry> 326 <entry>0x9b0000</entry> 327 <entry>The class containing FM Transmitter (FM TX) controls. 328These controls are described in <xref 329 linkend="fm-tx-controls" />.</entry> 330 </row> 331 <row> 332 <entry><constant>V4L2_CTRL_CLASS_FLASH</constant></entry> 333 <entry>0x9c0000</entry> 334 <entry>The class containing flash device controls. 335These controls are described in <xref 336 linkend="flash-controls" />.</entry> 337 </row> 338 <row> 339 <entry><constant>V4L2_CTRL_CLASS_JPEG</constant></entry> 340 <entry>0x9d0000</entry> 341 <entry>The class containing JPEG compression controls. 342These controls are described in <xref 343 linkend="jpeg-controls" />.</entry> 344 </row> 345 <row> 346 <entry><constant>V4L2_CTRL_CLASS_IMAGE_SOURCE</constant></entry> 347 <entry>0x9e0000</entry> <entry>The class containing image 348 source controls. These controls are described in <xref 349 linkend="image-source-controls" />.</entry> 350 </row> 351 <row> 352 <entry><constant>V4L2_CTRL_CLASS_IMAGE_PROC</constant></entry> 353 <entry>0x9f0000</entry> <entry>The class containing image 354 processing controls. These controls are described in <xref 355 linkend="image-process-controls" />.</entry> 356 </row> 357 358 <row> 359 <entry><constant>V4L2_CTRL_CLASS_FM_RX</constant></entry> 360 <entry>0xa10000</entry> 361 <entry>The class containing FM Receiver (FM RX) controls. 362These controls are described in <xref 363 linkend="fm-rx-controls" />.</entry> 364 </row> 365 <row> 366 <entry><constant>V4L2_CTRL_CLASS_RF_TUNER</constant></entry> 367 <entry>0xa20000</entry> 368 <entry>The class containing RF tuner controls. 369These controls are described in <xref linkend="rf-tuner-controls" />.</entry> 370 </row> 371 </tbody> 372 </tgroup> 373 </table> 374 375 </refsect1> 376 377 <refsect1> 378 &return-value; 379 380 <variablelist> 381 <varlistentry> 382 <term><errorcode>EINVAL</errorcode></term> 383 <listitem> 384 <para>The &v4l2-ext-control; <structfield>id</structfield> 385is invalid, the &v4l2-ext-controls; 386<structfield>ctrl_class</structfield> is invalid, or the &v4l2-ext-control; 387<structfield>value</structfield> was inappropriate (e.g. the given menu 388index is not supported by the driver). This error code is 389also returned by the <constant>VIDIOC_S_EXT_CTRLS</constant> and 390<constant>VIDIOC_TRY_EXT_CTRLS</constant> ioctls if two or more 391control values are in conflict.</para> 392 </listitem> 393 </varlistentry> 394 <varlistentry> 395 <term><errorcode>ERANGE</errorcode></term> 396 <listitem> 397 <para>The &v4l2-ext-control; <structfield>value</structfield> 398is out of bounds.</para> 399 </listitem> 400 </varlistentry> 401 <varlistentry> 402 <term><errorcode>EBUSY</errorcode></term> 403 <listitem> 404 <para>The control is temporarily not changeable, possibly 405because another applications took over control of the device function 406this control belongs to.</para> 407 </listitem> 408 </varlistentry> 409 <varlistentry> 410 <term><errorcode>ENOSPC</errorcode></term> 411 <listitem> 412 <para>The space reserved for the control's payload is insufficient. 413The field <structfield>size</structfield> is set to a value that is enough 414to store the payload and this error code is returned.</para> 415 </listitem> 416 </varlistentry> 417 <varlistentry> 418 <term><errorcode>EACCES</errorcode></term> 419 <listitem> 420 <para>Attempt to try or set a read-only control or to get a 421 write-only control.</para> 422 </listitem> 423 </varlistentry> 424 </variablelist> 425 </refsect1> 426</refentry> 427 428