linux/Documentation/userspace-api/media/cec/cec-ioc-g-mode.rst
<<
>>
Prefs
   1.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
   2.. c:namespace:: CEC
   3
   4.. _CEC_MODE:
   5.. _CEC_G_MODE:
   6.. _CEC_S_MODE:
   7
   8********************************
   9ioctls CEC_G_MODE and CEC_S_MODE
  10********************************
  11
  12CEC_G_MODE, CEC_S_MODE - Get or set exclusive use of the CEC adapter
  13
  14Synopsis
  15========
  16
  17.. c:macro:: CEC_G_MODE
  18
  19``int ioctl(int fd, CEC_G_MODE, __u32 *argp)``
  20
  21.. c:macro:: CEC_S_MODE
  22
  23``int ioctl(int fd, CEC_S_MODE, __u32 *argp)``
  24
  25Arguments
  26=========
  27
  28``fd``
  29    File descriptor returned by :c:func:`open()`.
  30
  31``argp``
  32    Pointer to CEC mode.
  33
  34Description
  35===========
  36
  37By default any filehandle can use :ref:`CEC_TRANSMIT`, but in order to prevent
  38applications from stepping on each others toes it must be possible to
  39obtain exclusive access to the CEC adapter. This ioctl sets the
  40filehandle to initiator and/or follower mode which can be exclusive
  41depending on the chosen mode. The initiator is the filehandle that is
  42used to initiate messages, i.e. it commands other CEC devices. The
  43follower is the filehandle that receives messages sent to the CEC
  44adapter and processes them. The same filehandle can be both initiator
  45and follower, or this role can be taken by two different filehandles.
  46
  47When a CEC message is received, then the CEC framework will decide how
  48it will be processed. If the message is a reply to an earlier
  49transmitted message, then the reply is sent back to the filehandle that
  50is waiting for it. In addition the CEC framework will process it.
  51
  52If the message is not a reply, then the CEC framework will process it
  53first. If there is no follower, then the message is just discarded and a
  54feature abort is sent back to the initiator if the framework couldn't
  55process it. If there is a follower, then the message is passed on to the
  56follower who will use :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>` to dequeue
  57the new message. The framework expects the follower to make the right
  58decisions.
  59
  60The CEC framework will process core messages unless requested otherwise
  61by the follower. The follower can enable the passthrough mode. In that
  62case, the CEC framework will pass on most core messages without
  63processing them and the follower will have to implement those messages.
  64There are some messages that the core will always process, regardless of
  65the passthrough mode. See :ref:`cec-core-processing` for details.
  66
  67If there is no initiator, then any CEC filehandle can use
  68:ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`. If there is an exclusive
  69initiator then only that initiator can call
  70:ref:`CEC_TRANSMIT`. The follower can of course
  71always call :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`.
  72
  73Available initiator modes are:
  74
  75.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{10.8cm}|
  76
  77.. _cec-mode-initiator_e:
  78
  79.. flat-table:: Initiator Modes
  80    :header-rows:  0
  81    :stub-columns: 0
  82    :widths:       3 1 16
  83
  84    * .. _`CEC-MODE-NO-INITIATOR`:
  85
  86      - ``CEC_MODE_NO_INITIATOR``
  87      - 0x0
  88      - This is not an initiator, i.e. it cannot transmit CEC messages or
  89        make any other changes to the CEC adapter.
  90    * .. _`CEC-MODE-INITIATOR`:
  91
  92      - ``CEC_MODE_INITIATOR``
  93      - 0x1
  94      - This is an initiator (the default when the device is opened) and
  95        it can transmit CEC messages and make changes to the CEC adapter,
  96        unless there is an exclusive initiator.
  97    * .. _`CEC-MODE-EXCL-INITIATOR`:
  98
  99      - ``CEC_MODE_EXCL_INITIATOR``
 100      - 0x2
 101      - This is an exclusive initiator and this file descriptor is the
 102        only one that can transmit CEC messages and make changes to the
 103        CEC adapter. If someone else is already the exclusive initiator
 104        then an attempt to become one will return the ``EBUSY`` error code
 105        error.
 106
 107Available follower modes are:
 108
 109.. tabularcolumns:: |p{6.6cm}|p{0.9cm}|p{9.8cm}|
 110
 111.. _cec-mode-follower_e:
 112
 113.. cssclass:: longtable
 114
 115.. flat-table:: Follower Modes
 116    :header-rows:  0
 117    :stub-columns: 0
 118    :widths:       3 1 16
 119
 120    * .. _`CEC-MODE-NO-FOLLOWER`:
 121
 122      - ``CEC_MODE_NO_FOLLOWER``
 123      - 0x00
 124      - This is not a follower (the default when the device is opened).
 125    * .. _`CEC-MODE-FOLLOWER`:
 126
 127      - ``CEC_MODE_FOLLOWER``
 128      - 0x10
 129      - This is a follower and it will receive CEC messages unless there
 130        is an exclusive follower. You cannot become a follower if
 131        :ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`
 132        was specified, the ``EINVAL`` error code is returned in that case.
 133    * .. _`CEC-MODE-EXCL-FOLLOWER`:
 134
 135      - ``CEC_MODE_EXCL_FOLLOWER``
 136      - 0x20
 137      - This is an exclusive follower and only this file descriptor will
 138        receive CEC messages for processing. If someone else is already
 139        the exclusive follower then an attempt to become one will return
 140        the ``EBUSY`` error code. You cannot become a follower if
 141        :ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`
 142        was specified, the ``EINVAL`` error code is returned in that case.
 143    * .. _`CEC-MODE-EXCL-FOLLOWER-PASSTHRU`:
 144
 145      - ``CEC_MODE_EXCL_FOLLOWER_PASSTHRU``
 146      - 0x30
 147      - This is an exclusive follower and only this file descriptor will
 148        receive CEC messages for processing. In addition it will put the
 149        CEC device into passthrough mode, allowing the exclusive follower
 150        to handle most core messages instead of relying on the CEC
 151        framework for that. If someone else is already the exclusive
 152        follower then an attempt to become one will return the ``EBUSY`` error
 153        code. You cannot become a follower if :ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>`
 154        is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>` was specified,
 155        the ``EINVAL`` error code is returned in that case.
 156    * .. _`CEC-MODE-MONITOR-PIN`:
 157
 158      - ``CEC_MODE_MONITOR_PIN``
 159      - 0xd0
 160      - Put the file descriptor into pin monitoring mode. Can only be used in
 161        combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`,
 162        otherwise the ``EINVAL`` error code will be returned.
 163        This mode requires that the :ref:`CEC_CAP_MONITOR_PIN <CEC-CAP-MONITOR-PIN>`
 164        capability is set, otherwise the ``EINVAL`` error code is returned.
 165        While in pin monitoring mode this file descriptor can receive the
 166        ``CEC_EVENT_PIN_CEC_LOW`` and ``CEC_EVENT_PIN_CEC_HIGH`` events to see the
 167        low-level CEC pin transitions. This is very useful for debugging.
 168        This mode is only allowed if the process has the ``CAP_NET_ADMIN``
 169        capability. If that is not set, then the ``EPERM`` error code is returned.
 170    * .. _`CEC-MODE-MONITOR`:
 171
 172      - ``CEC_MODE_MONITOR``
 173      - 0xe0
 174      - Put the file descriptor into monitor mode. Can only be used in
 175        combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`,
 176        otherwise the ``EINVAL`` error code will be returned.
 177        In monitor mode all messages this CEC
 178        device transmits and all messages it receives (both broadcast
 179        messages and directed messages for one its logical addresses) will
 180        be reported. This is very useful for debugging. This is only
 181        allowed if the process has the ``CAP_NET_ADMIN`` capability. If
 182        that is not set, then the ``EPERM`` error code is returned.
 183    * .. _`CEC-MODE-MONITOR-ALL`:
 184
 185      - ``CEC_MODE_MONITOR_ALL``
 186      - 0xf0
 187      - Put the file descriptor into 'monitor all' mode. Can only be used
 188        in combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`, otherwise
 189        the ``EINVAL`` error code will be returned. In 'monitor all' mode all messages
 190        this CEC device transmits and all messages it receives, including
 191        directed messages for other CEC devices, will be reported. This is
 192        very useful for debugging, but not all devices support this. This
 193        mode requires that the :ref:`CEC_CAP_MONITOR_ALL <CEC-CAP-MONITOR-ALL>` capability is set,
 194        otherwise the ``EINVAL`` error code is returned. This is only allowed if
 195        the process has the ``CAP_NET_ADMIN`` capability. If that is not
 196        set, then the ``EPERM`` error code is returned.
 197
 198Core message processing details:
 199
 200.. tabularcolumns:: |p{6.6cm}|p{10.9cm}|
 201
 202.. _cec-core-processing:
 203
 204.. flat-table:: Core Message Processing
 205    :header-rows:  0
 206    :stub-columns: 0
 207    :widths: 1 8
 208
 209    * .. _`CEC-MSG-GET-CEC-VERSION`:
 210
 211      - ``CEC_MSG_GET_CEC_VERSION``
 212      - The core will return the CEC version that was set with
 213        :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`,
 214        except when in passthrough mode. In passthrough mode the core
 215        does nothing and this message has to be handled by a follower
 216        instead.
 217    * .. _`CEC-MSG-GIVE-DEVICE-VENDOR-ID`:
 218
 219      - ``CEC_MSG_GIVE_DEVICE_VENDOR_ID``
 220      - The core will return the vendor ID that was set with
 221        :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`,
 222        except when in passthrough mode. In passthrough mode the core
 223        does nothing and this message has to be handled by a follower
 224        instead.
 225    * .. _`CEC-MSG-ABORT`:
 226
 227      - ``CEC_MSG_ABORT``
 228      - The core will return a Feature Abort message with reason
 229        'Feature Refused' as per the specification, except when in
 230        passthrough mode. In passthrough mode the core does nothing
 231        and this message has to be handled by a follower instead.
 232    * .. _`CEC-MSG-GIVE-PHYSICAL-ADDR`:
 233
 234      - ``CEC_MSG_GIVE_PHYSICAL_ADDR``
 235      - The core will report the current physical address, except when
 236        in passthrough mode. In passthrough mode the core does nothing
 237        and this message has to be handled by a follower instead.
 238    * .. _`CEC-MSG-GIVE-OSD-NAME`:
 239
 240      - ``CEC_MSG_GIVE_OSD_NAME``
 241      - The core will report the current OSD name that was set with
 242        :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`,
 243        except when in passthrough mode. In passthrough mode the core
 244        does nothing and this message has to be handled by a follower
 245        instead.
 246    * .. _`CEC-MSG-GIVE-FEATURES`:
 247
 248      - ``CEC_MSG_GIVE_FEATURES``
 249      - The core will do nothing if the CEC version is older than 2.0,
 250        otherwise it will report the current features that were set with
 251        :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`,
 252        except when in passthrough mode. In passthrough mode the core
 253        does nothing (for any CEC version) and this message has to be handled
 254        by a follower instead.
 255    * .. _`CEC-MSG-USER-CONTROL-PRESSED`:
 256
 257      - ``CEC_MSG_USER_CONTROL_PRESSED``
 258      - If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set and if
 259        :ref:`CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU <CEC-LOG-ADDRS-FL-ALLOW-RC-PASSTHRU>`
 260        is set, then generate a remote control key
 261        press. This message is always passed on to the follower(s).
 262    * .. _`CEC-MSG-USER-CONTROL-RELEASED`:
 263
 264      - ``CEC_MSG_USER_CONTROL_RELEASED``
 265      - If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set and if
 266        :ref:`CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU <CEC-LOG-ADDRS-FL-ALLOW-RC-PASSTHRU>`
 267        is set, then generate a remote control key
 268        release. This message is always passed on to the follower(s).
 269    * .. _`CEC-MSG-REPORT-PHYSICAL-ADDR`:
 270
 271      - ``CEC_MSG_REPORT_PHYSICAL_ADDR``
 272      - The CEC framework will make note of the reported physical address
 273        and then just pass the message on to the follower(s).
 274
 275
 276Return Value
 277============
 278
 279On success 0 is returned, on error -1 and the ``errno`` variable is set
 280appropriately. The generic error codes are described at the
 281:ref:`Generic Error Codes <gen-errors>` chapter.
 282
 283The :ref:`ioctl CEC_S_MODE <CEC_S_MODE>` can return the following
 284error codes:
 285
 286EINVAL
 287    The requested mode is invalid.
 288
 289EPERM
 290    Monitor mode is requested, but the process does have the ``CAP_NET_ADMIN``
 291    capability.
 292
 293EBUSY
 294    Someone else is already an exclusive follower or initiator.
 295