2016-07-08 20:55:42 +02:00
.. -*- coding: utf-8; mode: rst -*-
2016-07-08 20:55:43 +02:00
.. _CEC_TRANSMIT:
.. _CEC_RECEIVE:
2016-07-08 20:55:42 +02:00
2016-07-13 08:48:54 -03:00
***** ***** ***** ***** ***** ***** *****
ioctls CEC_RECEIVE and CEC_TRANSMIT
***** ***** ***** ***** ***** ***** *****
2016-07-08 20:55:42 +02:00
2016-07-08 20:55:43 +02:00
Name
====
2016-07-08 20:55:42 +02:00
2016-07-08 20:55:43 +02:00
CEC_RECEIVE, CEC_TRANSMIT - Receive or transmit a CEC message
2016-07-08 20:55:42 +02:00
Synopsis
========
2016-07-08 20:55:43 +02:00
.. cpp:function :: int ioctl( int fd, int request, struct cec_msg *argp )
2016-07-08 20:55:42 +02:00
Arguments
=========
`` fd ``
File descriptor returned by :ref: `open() <cec-func-open>` .
`` request ``
CEC_RECEIVE, CEC_TRANSMIT
`` argp ``
Description
===========
2016-07-10 11:57:43 -03:00
.. note :: This documents the proposed CEC API. This API is not yet finalized
and is currently only available as a staging kernel module.
2016-07-08 20:55:42 +02:00
To receive a CEC message the application has to fill in the
2016-07-13 08:48:54 -03:00
:c:type: `struct cec_msg` and pass it to :ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` .
The :ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` is only available if `` CEC_CAP_RECEIVE `` is set.
2016-07-08 20:55:42 +02:00
If the file descriptor is in non-blocking mode and there are no received
messages pending, then it will return -1 and set errno to the EAGAIN
error code. If the file descriptor is in blocking mode and `` timeout ``
is non-zero and no message arrived within `` timeout `` milliseconds, then
it will return -1 and set errno to the ETIMEDOUT error code.
To send a CEC message the application has to fill in the
2016-07-13 08:48:54 -03:00
:c:type: `struct cec_msg` and pass it to
:ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` . The :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` is only available if
2016-07-08 20:55:42 +02:00
`` CEC_CAP_TRANSMIT `` is set. If there is no more room in the transmit
queue, then it will return -1 and set errno to the EBUSY error code.
.. _cec-msg:
.. flat-table :: struct cec_msg
:header-rows: 0
:stub-columns: 0
2016-07-08 17:59:27 -03:00
:widths: 1 1 16
2016-07-08 20:55:42 +02:00
- .. row 1
- __u64
2016-07-12 15:07:44 -03:00
- `` tx_ts ``
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- Timestamp in ns of when the last byte of the message was transmitted.
2016-07-08 20:55:42 +02:00
- .. row 2
2016-07-12 15:07:44 -03:00
- __u64
- `` rx_ts ``
- Timestamp in ns of when the last byte of the message was received.
- .. row 3
2016-07-08 20:55:42 +02:00
- __u32
- `` len ``
2016-07-13 08:48:54 -03:00
- The length of the message. For :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in
2016-07-10 11:57:43 -03:00
by the application. The driver will fill this in for
2016-07-13 08:48:54 -03:00
:ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` . For :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be
filled in by the driver with the length of the reply message if `` reply `` was set.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 4
2016-07-08 20:55:42 +02:00
- __u32
- `` timeout ``
- The timeout in milliseconds. This is the time the device will wait
2016-07-10 11:57:43 -03:00
for a message to be received before timing out. If it is set to 0,
2016-07-13 08:48:54 -03:00
then it will wait indefinitely when it is called by :ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` .
If it is 0 and it is called by :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` ,
2016-07-10 11:57:43 -03:00
then it will be replaced by 1000 if the `` reply `` is non-zero or
ignored if `` reply `` is 0.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 5
2016-07-08 20:55:42 +02:00
- __u32
- `` sequence ``
- The sequence number is automatically assigned by the CEC framework
2016-07-10 11:57:43 -03:00
for all transmitted messages. It can be later used by the
framework to generate an event if a reply for a message was
requested and the message was transmitted in a non-blocking mode.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 6
2016-07-08 20:55:42 +02:00
- __u32
- `` flags ``
- Flags. No flags are defined yet, so set this to 0.
- .. row 7
- __u8
- `` tx_status ``
- The status bits of the transmitted message. See
2016-07-10 11:57:43 -03:00
:ref: `cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
2016-07-08 20:55:42 +02:00
- .. row 8
- __u8
2016-07-13 08:43:30 -03:00
- `` msg ` ` \ [16]
2016-07-08 20:55:42 +02:00
2016-07-13 08:48:54 -03:00
- The message payload. For :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in by the
application. The driver will fill this in for :ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` .
For :ref: `ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be filled in by the driver with
the payload of the reply message if `` timeout `` was set.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 8
2016-07-08 20:55:42 +02:00
- __u8
- `` reply ``
- Wait until this message is replied. If `` reply `` is 0 and the
2016-07-10 11:57:43 -03:00
`` timeout `` is 0, then don't wait for a reply but return after
2016-07-12 15:07:44 -03:00
transmitting the message. If there was an error as indicated by the
`` tx_status `` field, then `` reply `` and `` timeout `` are
2016-07-13 08:48:54 -03:00
both set to 0 by the driver. Ignored by :ref: `ioctl CEC_RECEIVE <CEC_RECEIVE>` . The case
2016-07-10 11:57:43 -03:00
where `` reply `` is 0 (this is the opcode for the Feature Abort
message) and `` timeout `` is non-zero is specifically allowed to
send a message and wait up to `` timeout `` milliseconds for a
Feature Abort reply. In this case `` rx_status `` will either be set
2016-07-13 08:48:54 -03:00
to :ref: `CEC_RX_STATUS_TIMEOUT <CEC-RX-STATUS-TIMEOUT>` or :ref: `CEC_RX_STATUS_FEATURE_ABORT <CEC-RX-STATUS-FEATURE-ABORT>` .
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 9
- __u8
- `` rx_status ``
- The status bits of the received message. See
:ref: `cec-rx-status` for the possible status values. It is 0 if
this message was transmitted, not received, unless this is the
reply to a transmitted message. In that case both `` rx_status ``
and `` tx_status `` are set.
2016-07-08 20:55:42 +02:00
- .. row 10
- __u8
2016-07-12 15:07:44 -03:00
- `` tx_status ``
- The status bits of the transmitted message. See
:ref: `cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
- .. row 11
- __u8
2016-07-08 20:55:42 +02:00
- `` tx_arb_lost_cnt ``
- A counter of the number of transmit attempts that resulted in the
2016-07-10 11:57:43 -03:00
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref: `CEC_TX_STATUS_ARB_LOST <CEC-TX-STATUS-ARB-LOST>` status bit is set.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 12
2016-07-08 20:55:42 +02:00
- __u8
- `` tx_nack_cnt ``
- A counter of the number of transmit attempts that resulted in the
2016-07-10 11:57:43 -03:00
Not Acknowledged error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref: `CEC_TX_STATUS_NACK <CEC-TX-STATUS-NACK>` status bit is set.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 13
2016-07-08 20:55:42 +02:00
- __u8
- `` tx_low_drive_cnt ``
- A counter of the number of transmit attempts that resulted in the
2016-07-10 11:57:43 -03:00
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref: `CEC_TX_STATUS_LOW_DRIVE <CEC-TX-STATUS-LOW-DRIVE>` status bit is set.
2016-07-08 20:55:42 +02:00
2016-07-12 15:07:44 -03:00
- .. row 14
2016-07-08 20:55:42 +02:00
- __u8
- `` tx_error_cnt ``
- A counter of the number of transmit errors other than Arbitration
2016-07-10 11:57:43 -03:00
Lost or Not Acknowledged. This is only set if the hardware
supports this, otherwise it is always 0. This counter is only
valid if the :ref: `CEC_TX_STATUS_ERROR <CEC-TX-STATUS-ERROR>` status bit is set.
2016-07-08 20:55:42 +02:00
.. _cec-tx-status:
.. flat-table :: CEC Transmit Status
:header-rows: 0
:stub-columns: 0
2016-07-08 17:59:27 -03:00
:widths: 3 1 16
2016-07-08 20:55:42 +02:00
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-OK` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_OK ``
- 0x01
- The message was transmitted successfully. This is mutually
2016-07-10 11:57:43 -03:00
exclusive with :ref: `CEC_TX_STATUS_MAX_RETRIES <CEC-TX-STATUS-MAX-RETRIES>` . Other bits can still
be set if earlier attempts met with failure before the transmit
was eventually successful.
2016-07-08 20:55:42 +02:00
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-ARB-LOST` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_ARB_LOST ``
- 0x02
- CEC line arbitration was lost.
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-NACK` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_NACK ``
- 0x04
- Message was not acknowledged.
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-LOW-DRIVE` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_LOW_DRIVE ``
- 0x08
- Low drive was detected on the CEC bus. This indicates that a
2016-07-10 11:57:43 -03:00
follower detected an error on the bus and requests a
retransmission.
2016-07-08 20:55:42 +02:00
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-ERROR` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_ERROR ``
- 0x10
- Some error occurred. This is used for any errors that do not fit
2016-07-10 11:57:43 -03:00
the previous two, either because the hardware could not tell which
error occurred, or because the hardware tested for other
conditions besides those two.
2016-07-08 20:55:42 +02:00
2016-07-09 10:25:05 -03:00
- .. _`CEC-TX-STATUS-MAX-RETRIES` :
2016-07-08 20:55:42 +02:00
- `` CEC_TX_STATUS_MAX_RETRIES ``
- 0x20
- The transmit failed after one or more retries. This status bit is
2016-07-10 11:57:43 -03:00
mutually exclusive with :ref: `CEC_TX_STATUS_OK <CEC-TX-STATUS-OK>` . Other bits can still
be set to explain which failures were seen.
2016-07-08 20:55:42 +02:00
.. _cec-rx-status:
.. flat-table :: CEC Receive Status
:header-rows: 0
:stub-columns: 0
2016-07-08 17:59:27 -03:00
:widths: 3 1 16
2016-07-08 20:55:42 +02:00
2016-07-09 10:25:05 -03:00
- .. _`CEC-RX-STATUS-OK` :
2016-07-08 20:55:42 +02:00
- `` CEC_RX_STATUS_OK ``
- 0x01
- The message was received successfully.
2016-07-09 10:25:05 -03:00
- .. _`CEC-RX-STATUS-TIMEOUT` :
2016-07-08 20:55:42 +02:00
- `` CEC_RX_STATUS_TIMEOUT ``
- 0x02
- The reply to an earlier transmitted message timed out.
2016-07-09 10:25:05 -03:00
- .. _`CEC-RX-STATUS-FEATURE-ABORT` :
2016-07-08 20:55:42 +02:00
- `` CEC_RX_STATUS_FEATURE_ABORT ``
- 0x04
- The message was received successfully but the reply was
2016-07-10 11:57:43 -03:00
`` CEC_MSG_FEATURE_ABORT `` . This status is only set if this message
was the reply to an earlier transmitted message.
2016-07-08 20:55:42 +02:00
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.