xref: /openbmc/linux/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst (revision 059b1c5b15579b09c3787c3a3f843574233ab976)
1*059b1c5bSMauro Carvalho Chehab.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
254f38fcaSMauro Carvalho Chehab
354f38fcaSMauro Carvalho Chehab.. _VIDIOC_G_EXT_CTRLS:
454f38fcaSMauro Carvalho Chehab
554f38fcaSMauro Carvalho Chehab******************************************************************
654f38fcaSMauro Carvalho Chehabioctl VIDIOC_G_EXT_CTRLS, VIDIOC_S_EXT_CTRLS, VIDIOC_TRY_EXT_CTRLS
754f38fcaSMauro Carvalho Chehab******************************************************************
854f38fcaSMauro Carvalho Chehab
954f38fcaSMauro Carvalho ChehabName
1054f38fcaSMauro Carvalho Chehab====
1154f38fcaSMauro Carvalho Chehab
1254f38fcaSMauro Carvalho ChehabVIDIOC_G_EXT_CTRLS - VIDIOC_S_EXT_CTRLS - VIDIOC_TRY_EXT_CTRLS - Get or set the value of several controls, try control values
1354f38fcaSMauro Carvalho Chehab
1454f38fcaSMauro Carvalho Chehab
1554f38fcaSMauro Carvalho ChehabSynopsis
1654f38fcaSMauro Carvalho Chehab========
1754f38fcaSMauro Carvalho Chehab
1854f38fcaSMauro Carvalho Chehab.. c:function:: int ioctl( int fd, VIDIOC_G_EXT_CTRLS, struct v4l2_ext_controls *argp )
1954f38fcaSMauro Carvalho Chehab    :name: VIDIOC_G_EXT_CTRLS
2054f38fcaSMauro Carvalho Chehab
2154f38fcaSMauro Carvalho Chehab
2254f38fcaSMauro Carvalho Chehab.. c:function:: int ioctl( int fd, VIDIOC_S_EXT_CTRLS, struct v4l2_ext_controls *argp )
2354f38fcaSMauro Carvalho Chehab    :name: VIDIOC_S_EXT_CTRLS
2454f38fcaSMauro Carvalho Chehab
2554f38fcaSMauro Carvalho Chehab
2654f38fcaSMauro Carvalho Chehab.. c:function:: int ioctl( int fd, VIDIOC_TRY_EXT_CTRLS, struct v4l2_ext_controls *argp )
2754f38fcaSMauro Carvalho Chehab    :name: VIDIOC_TRY_EXT_CTRLS
2854f38fcaSMauro Carvalho Chehab
2954f38fcaSMauro Carvalho Chehab
3054f38fcaSMauro Carvalho ChehabArguments
3154f38fcaSMauro Carvalho Chehab=========
3254f38fcaSMauro Carvalho Chehab
3354f38fcaSMauro Carvalho Chehab``fd``
3454f38fcaSMauro Carvalho Chehab    File descriptor returned by :ref:`open() <func-open>`.
3554f38fcaSMauro Carvalho Chehab
3654f38fcaSMauro Carvalho Chehab``argp``
3754f38fcaSMauro Carvalho Chehab    Pointer to struct :c:type:`v4l2_ext_controls`.
3854f38fcaSMauro Carvalho Chehab
3954f38fcaSMauro Carvalho Chehab
4054f38fcaSMauro Carvalho ChehabDescription
4154f38fcaSMauro Carvalho Chehab===========
4254f38fcaSMauro Carvalho Chehab
4354f38fcaSMauro Carvalho ChehabThese ioctls allow the caller to get or set multiple controls
4454f38fcaSMauro Carvalho Chehabatomically. Control IDs are grouped into control classes (see
4554f38fcaSMauro Carvalho Chehab:ref:`ctrl-class`) and all controls in the control array must belong
4654f38fcaSMauro Carvalho Chehabto the same control class.
4754f38fcaSMauro Carvalho Chehab
4854f38fcaSMauro Carvalho ChehabApplications must always fill in the ``count``, ``which``, ``controls``
4954f38fcaSMauro Carvalho Chehaband ``reserved`` fields of struct
5054f38fcaSMauro Carvalho Chehab:c:type:`v4l2_ext_controls`, and initialize the
5154f38fcaSMauro Carvalho Chehabstruct :c:type:`v4l2_ext_control` array pointed to
5254f38fcaSMauro Carvalho Chehabby the ``controls`` fields.
5354f38fcaSMauro Carvalho Chehab
5454f38fcaSMauro Carvalho ChehabTo get the current value of a set of controls applications initialize
5554f38fcaSMauro Carvalho Chehabthe ``id``, ``size`` and ``reserved2`` fields of each struct
5654f38fcaSMauro Carvalho Chehab:c:type:`v4l2_ext_control` and call the
5754f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_G_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` ioctl. String controls controls must also set the
5854f38fcaSMauro Carvalho Chehab``string`` field. Controls of compound types
5954f38fcaSMauro Carvalho Chehab(``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is set) must set the ``ptr`` field.
6054f38fcaSMauro Carvalho Chehab
6154f38fcaSMauro Carvalho ChehabIf the ``size`` is too small to receive the control result (only
6254f38fcaSMauro Carvalho Chehabrelevant for pointer-type controls like strings), then the driver will
6354f38fcaSMauro Carvalho Chehabset ``size`` to a valid value and return an ``ENOSPC`` error code. You
6454f38fcaSMauro Carvalho Chehabshould re-allocate the memory to this new size and try again. For the
6554f38fcaSMauro Carvalho Chehabstring type it is possible that the same issue occurs again if the
6654f38fcaSMauro Carvalho Chehabstring has grown in the meantime. It is recommended to call
6754f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_QUERYCTRL` first and use
6854f38fcaSMauro Carvalho Chehab``maximum``\ +1 as the new ``size`` value. It is guaranteed that that is
6954f38fcaSMauro Carvalho Chehabsufficient memory.
7054f38fcaSMauro Carvalho Chehab
7154f38fcaSMauro Carvalho ChehabN-dimensional arrays are set and retrieved row-by-row. You cannot set a
7254f38fcaSMauro Carvalho Chehabpartial array, all elements have to be set or retrieved. The total size
7354f38fcaSMauro Carvalho Chehabis calculated as ``elems`` * ``elem_size``. These values can be obtained
7454f38fcaSMauro Carvalho Chehabby calling :ref:`VIDIOC_QUERY_EXT_CTRL <VIDIOC_QUERYCTRL>`.
7554f38fcaSMauro Carvalho Chehab
7654f38fcaSMauro Carvalho ChehabTo change the value of a set of controls applications initialize the
7754f38fcaSMauro Carvalho Chehab``id``, ``size``, ``reserved2`` and ``value/value64/string/ptr`` fields
7854f38fcaSMauro Carvalho Chehabof each struct :c:type:`v4l2_ext_control` and call
7954f38fcaSMauro Carvalho Chehabthe :ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` ioctl. The controls will only be set if *all*
8054f38fcaSMauro Carvalho Chehabcontrol values are valid.
8154f38fcaSMauro Carvalho Chehab
8254f38fcaSMauro Carvalho ChehabTo check if a set of controls have correct values applications
8354f38fcaSMauro Carvalho Chehabinitialize the ``id``, ``size``, ``reserved2`` and
8454f38fcaSMauro Carvalho Chehab``value/value64/string/ptr`` fields of each struct
8554f38fcaSMauro Carvalho Chehab:c:type:`v4l2_ext_control` and call the
8654f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` ioctl. It is up to the driver whether wrong
8754f38fcaSMauro Carvalho Chehabvalues are automatically adjusted to a valid value or if an error is
8854f38fcaSMauro Carvalho Chehabreturned.
8954f38fcaSMauro Carvalho Chehab
9054f38fcaSMauro Carvalho ChehabWhen the ``id`` or ``which`` is invalid drivers return an ``EINVAL`` error
9154f38fcaSMauro Carvalho Chehabcode. When the value is out of bounds drivers can choose to take the
9254f38fcaSMauro Carvalho Chehabclosest valid value or return an ``ERANGE`` error code, whatever seems more
9354f38fcaSMauro Carvalho Chehabappropriate. In the first case the new value is set in struct
9454f38fcaSMauro Carvalho Chehab:c:type:`v4l2_ext_control`. If the new control value
9554f38fcaSMauro Carvalho Chehabis inappropriate (e.g. the given menu index is not supported by the menu
9654f38fcaSMauro Carvalho Chehabcontrol), then this will also result in an ``EINVAL`` error code error.
9754f38fcaSMauro Carvalho Chehab
9854f38fcaSMauro Carvalho ChehabIf ``request_fd`` is set to a not-yet-queued :ref:`request <media-request-api>`
9954f38fcaSMauro Carvalho Chehabfile descriptor and ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``,
10054f38fcaSMauro Carvalho Chehabthen the controls are not applied immediately when calling
10154f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`, but instead are applied by
10254f38fcaSMauro Carvalho Chehabthe driver for the buffer associated with the same request.
10354f38fcaSMauro Carvalho ChehabIf the device does not support requests, then ``EACCES`` will be returned.
10454f38fcaSMauro Carvalho ChehabIf requests are supported but an invalid request file descriptor is given,
10554f38fcaSMauro Carvalho Chehabthen ``EINVAL`` will be returned.
10654f38fcaSMauro Carvalho Chehab
10754f38fcaSMauro Carvalho ChehabAn attempt to call :ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` for a
10854f38fcaSMauro Carvalho Chehabrequest that has already been queued will result in an ``EBUSY`` error.
10954f38fcaSMauro Carvalho Chehab
11054f38fcaSMauro Carvalho ChehabIf ``request_fd`` is specified and ``which`` is set to
11154f38fcaSMauro Carvalho Chehab``V4L2_CTRL_WHICH_REQUEST_VAL`` during a call to
11254f38fcaSMauro Carvalho Chehab:ref:`VIDIOC_G_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`, then it will return the
11354f38fcaSMauro Carvalho Chehabvalues of the controls at the time of request completion.
11454f38fcaSMauro Carvalho ChehabIf the request is not yet completed, then this will result in an
11554f38fcaSMauro Carvalho Chehab``EACCES`` error.
11654f38fcaSMauro Carvalho Chehab
11754f38fcaSMauro Carvalho ChehabThe driver will only set/get these controls if all control values are
11854f38fcaSMauro Carvalho Chehabcorrect. This prevents the situation where only some of the controls
11954f38fcaSMauro Carvalho Chehabwere set/get. Only low-level errors (e. g. a failed i2c command) can
12054f38fcaSMauro Carvalho Chehabstill cause this situation.
12154f38fcaSMauro Carvalho Chehab
12254f38fcaSMauro Carvalho Chehab
12354f38fcaSMauro Carvalho Chehab.. tabularcolumns:: |p{1.2cm}|p{3.0cm}|p{1.5cm}|p{11.8cm}|
12454f38fcaSMauro Carvalho Chehab
12554f38fcaSMauro Carvalho Chehab.. c:type:: v4l2_ext_control
12654f38fcaSMauro Carvalho Chehab
12754f38fcaSMauro Carvalho Chehab.. cssclass: longtable
12854f38fcaSMauro Carvalho Chehab
12954f38fcaSMauro Carvalho Chehab.. flat-table:: struct v4l2_ext_control
13054f38fcaSMauro Carvalho Chehab    :header-rows:  0
13154f38fcaSMauro Carvalho Chehab    :stub-columns: 0
13254f38fcaSMauro Carvalho Chehab    :widths:       1 1 2
13354f38fcaSMauro Carvalho Chehab
13454f38fcaSMauro Carvalho Chehab    * - __u32
13554f38fcaSMauro Carvalho Chehab      - ``id``
13654f38fcaSMauro Carvalho Chehab      - Identifies the control, set by the application.
13754f38fcaSMauro Carvalho Chehab    * - __u32
13854f38fcaSMauro Carvalho Chehab      - ``size``
13954f38fcaSMauro Carvalho Chehab      - The total size in bytes of the payload of this control. This is
14054f38fcaSMauro Carvalho Chehab	normally 0, but for pointer controls this should be set to the
14154f38fcaSMauro Carvalho Chehab	size of the memory containing the payload, or that will receive
14254f38fcaSMauro Carvalho Chehab	the payload. If :ref:`VIDIOC_G_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` finds that this value is
14354f38fcaSMauro Carvalho Chehab	less than is required to store the payload result, then it is set
14454f38fcaSMauro Carvalho Chehab	to a value large enough to store the payload result and ``ENOSPC`` is
14554f38fcaSMauro Carvalho Chehab	returned.
14654f38fcaSMauro Carvalho Chehab
14754f38fcaSMauro Carvalho Chehab	.. note::
14854f38fcaSMauro Carvalho Chehab
14954f38fcaSMauro Carvalho Chehab	   For string controls, this ``size`` field should
15054f38fcaSMauro Carvalho Chehab	   not be confused with the length of the string. This field refers
15154f38fcaSMauro Carvalho Chehab	   to the size of the memory that contains the string. The actual
15254f38fcaSMauro Carvalho Chehab	   *length* of the string may well be much smaller.
15354f38fcaSMauro Carvalho Chehab    * - __u32
15454f38fcaSMauro Carvalho Chehab      - ``reserved2``\ [1]
15554f38fcaSMauro Carvalho Chehab      - Reserved for future extensions. Drivers and applications must set
15654f38fcaSMauro Carvalho Chehab	the array to zero.
15754f38fcaSMauro Carvalho Chehab    * - union {
15854f38fcaSMauro Carvalho Chehab      - (anonymous)
15954f38fcaSMauro Carvalho Chehab    * - __s32
16054f38fcaSMauro Carvalho Chehab      - ``value``
16154f38fcaSMauro Carvalho Chehab      - New value or current value. Valid if this control is not of type
16254f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_TYPE_INTEGER64`` and ``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is
16354f38fcaSMauro Carvalho Chehab	not set.
16454f38fcaSMauro Carvalho Chehab    * - __s64
16554f38fcaSMauro Carvalho Chehab      - ``value64``
16654f38fcaSMauro Carvalho Chehab      - New value or current value. Valid if this control is of type
16754f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_TYPE_INTEGER64`` and ``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is
16854f38fcaSMauro Carvalho Chehab	not set.
16954f38fcaSMauro Carvalho Chehab    * - char *
17054f38fcaSMauro Carvalho Chehab      - ``string``
17154f38fcaSMauro Carvalho Chehab      - A pointer to a string. Valid if this control is of type
17254f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_TYPE_STRING``.
17354f38fcaSMauro Carvalho Chehab    * - __u8 *
17454f38fcaSMauro Carvalho Chehab      - ``p_u8``
17554f38fcaSMauro Carvalho Chehab      - A pointer to a matrix control of unsigned 8-bit values. Valid if
17654f38fcaSMauro Carvalho Chehab	this control is of type ``V4L2_CTRL_TYPE_U8``.
17754f38fcaSMauro Carvalho Chehab    * - __u16 *
17854f38fcaSMauro Carvalho Chehab      - ``p_u16``
17954f38fcaSMauro Carvalho Chehab      - A pointer to a matrix control of unsigned 16-bit values. Valid if
18054f38fcaSMauro Carvalho Chehab	this control is of type ``V4L2_CTRL_TYPE_U16``.
18154f38fcaSMauro Carvalho Chehab    * - __u32 *
18254f38fcaSMauro Carvalho Chehab      - ``p_u32``
18354f38fcaSMauro Carvalho Chehab      - A pointer to a matrix control of unsigned 32-bit values. Valid if
18454f38fcaSMauro Carvalho Chehab	this control is of type ``V4L2_CTRL_TYPE_U32``.
18554f38fcaSMauro Carvalho Chehab    * - :c:type:`v4l2_area` *
18654f38fcaSMauro Carvalho Chehab      - ``p_area``
18754f38fcaSMauro Carvalho Chehab      - A pointer to a struct :c:type:`v4l2_area`. Valid if this control is
18854f38fcaSMauro Carvalho Chehab        of type ``V4L2_CTRL_TYPE_AREA``.
18954f38fcaSMauro Carvalho Chehab    * - void *
19054f38fcaSMauro Carvalho Chehab      - ``ptr``
19154f38fcaSMauro Carvalho Chehab      - A pointer to a compound type which can be an N-dimensional array
19254f38fcaSMauro Carvalho Chehab	and/or a compound type (the control's type is >=
19354f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_COMPOUND_TYPES``). Valid if
19454f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_FLAG_HAS_PAYLOAD`` is set for this control.
19554f38fcaSMauro Carvalho Chehab    * - }
19654f38fcaSMauro Carvalho Chehab      -
19754f38fcaSMauro Carvalho Chehab
19854f38fcaSMauro Carvalho Chehab
19954f38fcaSMauro Carvalho Chehab.. tabularcolumns:: |p{4.0cm}|p{2.2cm}|p{2.1cm}|p{8.2cm}|
20054f38fcaSMauro Carvalho Chehab
20154f38fcaSMauro Carvalho Chehab.. c:type:: v4l2_ext_controls
20254f38fcaSMauro Carvalho Chehab
20354f38fcaSMauro Carvalho Chehab.. cssclass:: longtable
20454f38fcaSMauro Carvalho Chehab
20554f38fcaSMauro Carvalho Chehab.. flat-table:: struct v4l2_ext_controls
20654f38fcaSMauro Carvalho Chehab    :header-rows:  0
20754f38fcaSMauro Carvalho Chehab    :stub-columns: 0
20854f38fcaSMauro Carvalho Chehab    :widths:       1 1 2
20954f38fcaSMauro Carvalho Chehab
21054f38fcaSMauro Carvalho Chehab    * - union {
21154f38fcaSMauro Carvalho Chehab      - (anonymous)
21254f38fcaSMauro Carvalho Chehab    * - __u32
21354f38fcaSMauro Carvalho Chehab      - ``ctrl_class``
21454f38fcaSMauro Carvalho Chehab      - The control class to which all controls belong, see
21554f38fcaSMauro Carvalho Chehab	:ref:`ctrl-class`. Drivers that use a kernel framework for
21654f38fcaSMauro Carvalho Chehab	handling controls will also accept a value of 0 here, meaning that
21754f38fcaSMauro Carvalho Chehab	the controls can belong to any control class. Whether drivers
21854f38fcaSMauro Carvalho Chehab	support this can be tested by setting ``ctrl_class`` to 0 and
21954f38fcaSMauro Carvalho Chehab	calling :ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` with a ``count`` of 0. If that
22054f38fcaSMauro Carvalho Chehab	succeeds, then the driver supports this feature.
22154f38fcaSMauro Carvalho Chehab    * - __u32
22254f38fcaSMauro Carvalho Chehab      - ``which``
22354f38fcaSMauro Carvalho Chehab      - Which value of the control to get/set/try.
22454f38fcaSMauro Carvalho Chehab	``V4L2_CTRL_WHICH_CUR_VAL`` will return the current value of the
22554f38fcaSMauro Carvalho Chehab	control, ``V4L2_CTRL_WHICH_DEF_VAL`` will return the default
22654f38fcaSMauro Carvalho Chehab	value of the control and ``V4L2_CTRL_WHICH_REQUEST_VAL`` indicates that
22754f38fcaSMauro Carvalho Chehab	these controls have to be retrieved from a request or tried/set for
22854f38fcaSMauro Carvalho Chehab	a request. In the latter case the ``request_fd`` field contains the
22954f38fcaSMauro Carvalho Chehab	file descriptor of the request that should be used. If the device
23054f38fcaSMauro Carvalho Chehab	does not support requests, then ``EACCES`` will be returned.
23154f38fcaSMauro Carvalho Chehab
23254f38fcaSMauro Carvalho Chehab	.. note::
23354f38fcaSMauro Carvalho Chehab
23454f38fcaSMauro Carvalho Chehab	   When using ``V4L2_CTRL_WHICH_DEF_VAL`` be aware that you can only
23554f38fcaSMauro Carvalho Chehab	   get the default value of the control, you cannot set or try it.
23654f38fcaSMauro Carvalho Chehab
23754f38fcaSMauro Carvalho Chehab	For backwards compatibility you can also use a control class here
23854f38fcaSMauro Carvalho Chehab	(see :ref:`ctrl-class`). In that case all controls have to
23954f38fcaSMauro Carvalho Chehab	belong to that control class. This usage is deprecated, instead
24054f38fcaSMauro Carvalho Chehab	just use ``V4L2_CTRL_WHICH_CUR_VAL``. There are some very old
24154f38fcaSMauro Carvalho Chehab	drivers that do not yet support ``V4L2_CTRL_WHICH_CUR_VAL`` and
24254f38fcaSMauro Carvalho Chehab	that require a control class here. You can test for such drivers
24354f38fcaSMauro Carvalho Chehab	by setting ctrl_class to ``V4L2_CTRL_WHICH_CUR_VAL`` and calling
24454f38fcaSMauro Carvalho Chehab	VIDIOC_TRY_EXT_CTRLS with a count of 0. If that fails, then the
24554f38fcaSMauro Carvalho Chehab	driver does not support ``V4L2_CTRL_WHICH_CUR_VAL``.
24654f38fcaSMauro Carvalho Chehab    * - }
24754f38fcaSMauro Carvalho Chehab      -
24854f38fcaSMauro Carvalho Chehab    * - __u32
24954f38fcaSMauro Carvalho Chehab      - ``count``
25054f38fcaSMauro Carvalho Chehab      - The number of controls in the controls array. May also be zero.
25154f38fcaSMauro Carvalho Chehab    * - __u32
25254f38fcaSMauro Carvalho Chehab      - ``error_idx``
25354f38fcaSMauro Carvalho Chehab      - Set by the driver in case of an error. If the error is associated
25454f38fcaSMauro Carvalho Chehab	with a particular control, then ``error_idx`` is set to the index
25554f38fcaSMauro Carvalho Chehab	of that control. If the error is not related to a specific
25654f38fcaSMauro Carvalho Chehab	control, or the validation step failed (see below), then
25754f38fcaSMauro Carvalho Chehab	``error_idx`` is set to ``count``. The value is undefined if the
25854f38fcaSMauro Carvalho Chehab	ioctl returned 0 (success).
25954f38fcaSMauro Carvalho Chehab
26054f38fcaSMauro Carvalho Chehab	Before controls are read from/written to hardware a validation
26154f38fcaSMauro Carvalho Chehab	step takes place: this checks if all controls in the list are
26254f38fcaSMauro Carvalho Chehab	valid controls, if no attempt is made to write to a read-only
26354f38fcaSMauro Carvalho Chehab	control or read from a write-only control, and any other up-front
26454f38fcaSMauro Carvalho Chehab	checks that can be done without accessing the hardware. The exact
26554f38fcaSMauro Carvalho Chehab	validations done during this step are driver dependent since some
26654f38fcaSMauro Carvalho Chehab	checks might require hardware access for some devices, thus making
26754f38fcaSMauro Carvalho Chehab	it impossible to do those checks up-front. However, drivers should
26854f38fcaSMauro Carvalho Chehab	make a best-effort to do as many up-front checks as possible.
26954f38fcaSMauro Carvalho Chehab
27054f38fcaSMauro Carvalho Chehab	This check is done to avoid leaving the hardware in an
27154f38fcaSMauro Carvalho Chehab	inconsistent state due to easy-to-avoid problems. But it leads to
27254f38fcaSMauro Carvalho Chehab	another problem: the application needs to know whether an error
27354f38fcaSMauro Carvalho Chehab	came from the validation step (meaning that the hardware was not
27454f38fcaSMauro Carvalho Chehab	touched) or from an error during the actual reading from/writing
27554f38fcaSMauro Carvalho Chehab	to hardware.
27654f38fcaSMauro Carvalho Chehab
27754f38fcaSMauro Carvalho Chehab	The, in hindsight quite poor, solution for that is to set
27854f38fcaSMauro Carvalho Chehab	``error_idx`` to ``count`` if the validation failed. This has the
27954f38fcaSMauro Carvalho Chehab	unfortunate side-effect that it is not possible to see which
28054f38fcaSMauro Carvalho Chehab	control failed the validation. If the validation was successful
28154f38fcaSMauro Carvalho Chehab	and the error happened while accessing the hardware, then
28254f38fcaSMauro Carvalho Chehab	``error_idx`` is less than ``count`` and only the controls up to
28354f38fcaSMauro Carvalho Chehab	``error_idx-1`` were read or written correctly, and the state of
28454f38fcaSMauro Carvalho Chehab	the remaining controls is undefined.
28554f38fcaSMauro Carvalho Chehab
28654f38fcaSMauro Carvalho Chehab	Since :ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` does not access hardware there is
28754f38fcaSMauro Carvalho Chehab	also no need to handle the validation step in this special way, so
28854f38fcaSMauro Carvalho Chehab	``error_idx`` will just be set to the control that failed the
28954f38fcaSMauro Carvalho Chehab	validation step instead of to ``count``. This means that if
29054f38fcaSMauro Carvalho Chehab	:ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` fails with ``error_idx`` set to ``count``,
29154f38fcaSMauro Carvalho Chehab	then you can call :ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` to try to discover the
29254f38fcaSMauro Carvalho Chehab	actual control that failed the validation step. Unfortunately,
29354f38fcaSMauro Carvalho Chehab	there is no ``TRY`` equivalent for :ref:`VIDIOC_G_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>`.
29454f38fcaSMauro Carvalho Chehab    * - __s32
29554f38fcaSMauro Carvalho Chehab      - ``request_fd``
29654f38fcaSMauro Carvalho Chehab      - File descriptor of the request to be used by this operation. Only
29754f38fcaSMauro Carvalho Chehab	valid if ``which`` is set to ``V4L2_CTRL_WHICH_REQUEST_VAL``.
29854f38fcaSMauro Carvalho Chehab	If the device does not support requests, then ``EACCES`` will be returned.
29954f38fcaSMauro Carvalho Chehab	If requests are supported but an invalid request file descriptor is
30054f38fcaSMauro Carvalho Chehab	given, then ``EINVAL`` will be returned.
30154f38fcaSMauro Carvalho Chehab    * - __u32
30254f38fcaSMauro Carvalho Chehab      - ``reserved``\ [1]
30354f38fcaSMauro Carvalho Chehab      - Reserved for future extensions.
30454f38fcaSMauro Carvalho Chehab
30554f38fcaSMauro Carvalho Chehab	Drivers and applications must set the array to zero.
30654f38fcaSMauro Carvalho Chehab    * - struct :c:type:`v4l2_ext_control` *
30754f38fcaSMauro Carvalho Chehab      - ``controls``
30854f38fcaSMauro Carvalho Chehab      - Pointer to an array of ``count`` v4l2_ext_control structures.
30954f38fcaSMauro Carvalho Chehab
31054f38fcaSMauro Carvalho Chehab	Ignored if ``count`` equals zero.
31154f38fcaSMauro Carvalho Chehab
31254f38fcaSMauro Carvalho Chehab
31354f38fcaSMauro Carvalho Chehab.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
31454f38fcaSMauro Carvalho Chehab
31554f38fcaSMauro Carvalho Chehab.. _ctrl-class:
31654f38fcaSMauro Carvalho Chehab
31754f38fcaSMauro Carvalho Chehab.. flat-table:: Control classes
31854f38fcaSMauro Carvalho Chehab    :header-rows:  0
31954f38fcaSMauro Carvalho Chehab    :stub-columns: 0
32054f38fcaSMauro Carvalho Chehab    :widths:       3 1 4
32154f38fcaSMauro Carvalho Chehab
32254f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_USER``
32354f38fcaSMauro Carvalho Chehab      - 0x980000
32454f38fcaSMauro Carvalho Chehab      - The class containing user controls. These controls are described
32554f38fcaSMauro Carvalho Chehab	in :ref:`control`. All controls that can be set using the
32654f38fcaSMauro Carvalho Chehab	:ref:`VIDIOC_S_CTRL <VIDIOC_G_CTRL>` and
32754f38fcaSMauro Carvalho Chehab	:ref:`VIDIOC_G_CTRL <VIDIOC_G_CTRL>` ioctl belong to this
32854f38fcaSMauro Carvalho Chehab	class.
32954f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_MPEG``
33054f38fcaSMauro Carvalho Chehab      - 0x990000
33154f38fcaSMauro Carvalho Chehab      - The class containing MPEG compression controls. These controls are
33254f38fcaSMauro Carvalho Chehab	described in :ref:`mpeg-controls`.
33354f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_CAMERA``
33454f38fcaSMauro Carvalho Chehab      - 0x9a0000
33554f38fcaSMauro Carvalho Chehab      - The class containing camera controls. These controls are described
33654f38fcaSMauro Carvalho Chehab	in :ref:`camera-controls`.
33754f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_FM_TX``
33854f38fcaSMauro Carvalho Chehab      - 0x9b0000
33954f38fcaSMauro Carvalho Chehab      - The class containing FM Transmitter (FM TX) controls. These
34054f38fcaSMauro Carvalho Chehab	controls are described in :ref:`fm-tx-controls`.
34154f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_FLASH``
34254f38fcaSMauro Carvalho Chehab      - 0x9c0000
34354f38fcaSMauro Carvalho Chehab      - The class containing flash device controls. These controls are
34454f38fcaSMauro Carvalho Chehab	described in :ref:`flash-controls`.
34554f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_JPEG``
34654f38fcaSMauro Carvalho Chehab      - 0x9d0000
34754f38fcaSMauro Carvalho Chehab      - The class containing JPEG compression controls. These controls are
34854f38fcaSMauro Carvalho Chehab	described in :ref:`jpeg-controls`.
34954f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_IMAGE_SOURCE``
35054f38fcaSMauro Carvalho Chehab      - 0x9e0000
35154f38fcaSMauro Carvalho Chehab      - The class containing image source controls. These controls are
35254f38fcaSMauro Carvalho Chehab	described in :ref:`image-source-controls`.
35354f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_IMAGE_PROC``
35454f38fcaSMauro Carvalho Chehab      - 0x9f0000
35554f38fcaSMauro Carvalho Chehab      - The class containing image processing controls. These controls are
35654f38fcaSMauro Carvalho Chehab	described in :ref:`image-process-controls`.
35754f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_FM_RX``
35854f38fcaSMauro Carvalho Chehab      - 0xa10000
35954f38fcaSMauro Carvalho Chehab      - The class containing FM Receiver (FM RX) controls. These controls
36054f38fcaSMauro Carvalho Chehab	are described in :ref:`fm-rx-controls`.
36154f38fcaSMauro Carvalho Chehab    * - ``V4L2_CTRL_CLASS_RF_TUNER``
36254f38fcaSMauro Carvalho Chehab      - 0xa20000
36354f38fcaSMauro Carvalho Chehab      - The class containing RF tuner controls. These controls are
36454f38fcaSMauro Carvalho Chehab	described in :ref:`rf-tuner-controls`.
36554f38fcaSMauro Carvalho Chehab
36654f38fcaSMauro Carvalho Chehab
36754f38fcaSMauro Carvalho ChehabReturn Value
36854f38fcaSMauro Carvalho Chehab============
36954f38fcaSMauro Carvalho Chehab
37054f38fcaSMauro Carvalho ChehabOn success 0 is returned, on error -1 and the ``errno`` variable is set
37154f38fcaSMauro Carvalho Chehabappropriately. The generic error codes are described at the
37254f38fcaSMauro Carvalho Chehab:ref:`Generic Error Codes <gen-errors>` chapter.
37354f38fcaSMauro Carvalho Chehab
37454f38fcaSMauro Carvalho ChehabEINVAL
37554f38fcaSMauro Carvalho Chehab    The struct :c:type:`v4l2_ext_control` ``id`` is
37654f38fcaSMauro Carvalho Chehab    invalid, or the struct :c:type:`v4l2_ext_controls`
37754f38fcaSMauro Carvalho Chehab    ``which`` is invalid, or the struct
37854f38fcaSMauro Carvalho Chehab    :c:type:`v4l2_ext_control` ``value`` was
37954f38fcaSMauro Carvalho Chehab    inappropriate (e.g. the given menu index is not supported by the
38054f38fcaSMauro Carvalho Chehab    driver), or the ``which`` field was set to ``V4L2_CTRL_WHICH_REQUEST_VAL``
38154f38fcaSMauro Carvalho Chehab    but the given ``request_fd`` was invalid or ``V4L2_CTRL_WHICH_REQUEST_VAL``
38254f38fcaSMauro Carvalho Chehab    is not supported by the kernel.
38354f38fcaSMauro Carvalho Chehab    This error code is also returned by the
38454f38fcaSMauro Carvalho Chehab    :ref:`VIDIOC_S_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` and :ref:`VIDIOC_TRY_EXT_CTRLS <VIDIOC_G_EXT_CTRLS>` ioctls if two or
38554f38fcaSMauro Carvalho Chehab    more control values are in conflict.
38654f38fcaSMauro Carvalho Chehab
38754f38fcaSMauro Carvalho ChehabERANGE
38854f38fcaSMauro Carvalho Chehab    The struct :c:type:`v4l2_ext_control` ``value``
38954f38fcaSMauro Carvalho Chehab    is out of bounds.
39054f38fcaSMauro Carvalho Chehab
39154f38fcaSMauro Carvalho ChehabEBUSY
39254f38fcaSMauro Carvalho Chehab    The control is temporarily not changeable, possibly because another
39354f38fcaSMauro Carvalho Chehab    applications took over control of the device function this control
39454f38fcaSMauro Carvalho Chehab    belongs to, or (if the ``which`` field was set to
39554f38fcaSMauro Carvalho Chehab    ``V4L2_CTRL_WHICH_REQUEST_VAL``) the request was queued but not yet
39654f38fcaSMauro Carvalho Chehab    completed.
39754f38fcaSMauro Carvalho Chehab
39854f38fcaSMauro Carvalho ChehabENOSPC
39954f38fcaSMauro Carvalho Chehab    The space reserved for the control's payload is insufficient. The
40054f38fcaSMauro Carvalho Chehab    field ``size`` is set to a value that is enough to store the payload
40154f38fcaSMauro Carvalho Chehab    and this error code is returned.
40254f38fcaSMauro Carvalho Chehab
40354f38fcaSMauro Carvalho ChehabEACCES
40454f38fcaSMauro Carvalho Chehab    Attempt to try or set a read-only control, or to get a write-only
40554f38fcaSMauro Carvalho Chehab    control, or to get a control from a request that has not yet been
40654f38fcaSMauro Carvalho Chehab    completed.
40754f38fcaSMauro Carvalho Chehab
40854f38fcaSMauro Carvalho Chehab    Or the ``which`` field was set to ``V4L2_CTRL_WHICH_REQUEST_VAL`` but the
40954f38fcaSMauro Carvalho Chehab    device does not support requests.
410