| .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later |
| .. c:namespace:: CEC |
| |
| .. _CEC_ADAP_PHYS_ADDR: |
| .. _CEC_ADAP_G_PHYS_ADDR: |
| .. _CEC_ADAP_S_PHYS_ADDR: |
| |
| **************************************************** |
| ioctls CEC_ADAP_G_PHYS_ADDR and CEC_ADAP_S_PHYS_ADDR |
| **************************************************** |
| |
| Name |
| ==== |
| |
| CEC_ADAP_G_PHYS_ADDR, CEC_ADAP_S_PHYS_ADDR - Get or set the physical address |
| |
| Synopsis |
| ======== |
| |
| .. c:macro:: CEC_ADAP_G_PHYS_ADDR |
| |
| ``int ioctl(int fd, CEC_ADAP_G_PHYS_ADDR, __u16 *argp)`` |
| |
| .. c:macro:: CEC_ADAP_S_PHYS_ADDR |
| |
| ``int ioctl(int fd, CEC_ADAP_S_PHYS_ADDR, __u16 *argp)`` |
| |
| Arguments |
| ========= |
| |
| ``fd`` |
| File descriptor returned by :c:func:`open()`. |
| |
| ``argp`` |
| Pointer to the CEC address. |
| |
| Description |
| =========== |
| |
| To query the current physical address applications call |
| :ref:`ioctl CEC_ADAP_G_PHYS_ADDR <CEC_ADAP_G_PHYS_ADDR>` with a pointer to a __u16 where the |
| driver stores the physical address. |
| |
| To set a new physical address applications store the physical address in |
| a __u16 and call :ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>` with a pointer to |
| this integer. The :ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>` is only available if |
| ``CEC_CAP_PHYS_ADDR`` is set (the ``ENOTTY`` error code will be returned |
| otherwise). The :ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>` can only be called |
| by a file descriptor in initiator mode (see :ref:`CEC_S_MODE`), if not |
| the ``EBUSY`` error code will be returned. |
| |
| To clear an existing physical address use ``CEC_PHYS_ADDR_INVALID``. |
| The adapter will go to the unconfigured state. |
| |
| If logical address types have been defined (see :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`), |
| then this ioctl will block until all |
| requested logical addresses have been claimed. If the file descriptor is in non-blocking mode |
| then it will not wait for the logical addresses to be claimed, instead it just returns 0. |
| |
| A :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>` event is sent when the physical address |
| changes. |
| |
| The physical address is a 16-bit number where each group of 4 bits |
| represent a digit of the physical address a.b.c.d where the most |
| significant 4 bits represent 'a'. The CEC root device (usually the TV) |
| has address 0.0.0.0. Every device that is hooked up to an input of the |
| TV has address a.0.0.0 (where 'a' is ≥ 1), devices hooked up to those in |
| turn have addresses a.b.0.0, etc. So a topology of up to 5 devices deep |
| is supported. The physical address a device shall use is stored in the |
| EDID of the sink. |
| |
| For example, the EDID for each HDMI input of the TV will have a |
| different physical address of the form a.0.0.0 that the sources will |
| read out and use as their physical address. |
| |
| Return Value |
| ============ |
| |
| On success 0 is returned, on error -1 and the ``errno`` variable is set |
| appropriately. The generic error codes are described at the |
| :ref:`Generic Error Codes <gen-errors>` chapter. |
| |
| The :ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>` can return the following |
| error codes: |
| |
| ENOTTY |
| The ``CEC_CAP_PHYS_ADDR`` capability wasn't set, so this ioctl is not supported. |
| |
| EBUSY |
| Another filehandle is in exclusive follower or initiator mode, or the filehandle |
| is in mode ``CEC_MODE_NO_INITIATOR``. |
| |
| EINVAL |
| The physical address is malformed. |