xref: /openbmc/linux/Documentation/userspace-api/media/cec/cec-pin-error-inj.rst (revision 54f38fcae536ea202ce7d6a359521492fba30c1f)
1*54f38fcaSMauro Carvalho Chehab.. Permission is granted to copy, distribute and/or modify this
2*54f38fcaSMauro Carvalho Chehab.. document under the terms of the GNU Free Documentation License,
3*54f38fcaSMauro Carvalho Chehab.. Version 1.1 or any later version published by the Free Software
4*54f38fcaSMauro Carvalho Chehab.. Foundation, with no Invariant Sections, no Front-Cover Texts
5*54f38fcaSMauro Carvalho Chehab.. and no Back-Cover Texts. A copy of the license is included at
6*54f38fcaSMauro Carvalho Chehab.. Documentation/userspace-api/media/fdl-appendix.rst.
7*54f38fcaSMauro Carvalho Chehab..
8*54f38fcaSMauro Carvalho Chehab.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
9*54f38fcaSMauro Carvalho Chehab
10*54f38fcaSMauro Carvalho ChehabCEC Pin Framework Error Injection
11*54f38fcaSMauro Carvalho Chehab=================================
12*54f38fcaSMauro Carvalho Chehab
13*54f38fcaSMauro Carvalho ChehabThe CEC Pin Framework is a core CEC framework for CEC hardware that only
14*54f38fcaSMauro Carvalho Chehabhas low-level support for the CEC bus. Most hardware today will have
15*54f38fcaSMauro Carvalho Chehabhigh-level CEC support where the hardware deals with driving the CEC bus,
16*54f38fcaSMauro Carvalho Chehabbut some older devices aren't that fancy. However, this framework also
17*54f38fcaSMauro Carvalho Chehaballows you to connect the CEC pin to a GPIO on e.g. a Raspberry Pi and
18*54f38fcaSMauro Carvalho Chehabyou have now made a CEC adapter.
19*54f38fcaSMauro Carvalho Chehab
20*54f38fcaSMauro Carvalho ChehabWhat makes doing this so interesting is that since we have full control
21*54f38fcaSMauro Carvalho Chehabover the bus it is easy to support error injection. This is ideal to
22*54f38fcaSMauro Carvalho Chehabtest how well CEC adapters can handle error conditions.
23*54f38fcaSMauro Carvalho Chehab
24*54f38fcaSMauro Carvalho ChehabCurrently only the cec-gpio driver (when the CEC line is directly
25*54f38fcaSMauro Carvalho Chehabconnected to a pull-up GPIO line) and the AllWinner A10/A20 drm driver
26*54f38fcaSMauro Carvalho Chehabsupport this framework.
27*54f38fcaSMauro Carvalho Chehab
28*54f38fcaSMauro Carvalho ChehabIf ``CONFIG_CEC_PIN_ERROR_INJ`` is enabled, then error injection is available
29*54f38fcaSMauro Carvalho Chehabthrough debugfs. Specifically, in ``/sys/kernel/debug/cec/cecX/`` there is
30*54f38fcaSMauro Carvalho Chehabnow an ``error-inj`` file.
31*54f38fcaSMauro Carvalho Chehab
32*54f38fcaSMauro Carvalho Chehab.. note::
33*54f38fcaSMauro Carvalho Chehab
34*54f38fcaSMauro Carvalho Chehab    The error injection commands are not a stable ABI and may change in the
35*54f38fcaSMauro Carvalho Chehab    future.
36*54f38fcaSMauro Carvalho Chehab
37*54f38fcaSMauro Carvalho ChehabWith ``cat error-inj`` you can see both the possible commands and the current
38*54f38fcaSMauro Carvalho Chehaberror injection status::
39*54f38fcaSMauro Carvalho Chehab
40*54f38fcaSMauro Carvalho Chehab	$ cat /sys/kernel/debug/cec/cec0/error-inj
41*54f38fcaSMauro Carvalho Chehab	# Clear error injections:
42*54f38fcaSMauro Carvalho Chehab	#   clear          clear all rx and tx error injections
43*54f38fcaSMauro Carvalho Chehab	#   rx-clear       clear all rx error injections
44*54f38fcaSMauro Carvalho Chehab	#   tx-clear       clear all tx error injections
45*54f38fcaSMauro Carvalho Chehab	#   <op> clear     clear all rx and tx error injections for <op>
46*54f38fcaSMauro Carvalho Chehab	#   <op> rx-clear  clear all rx error injections for <op>
47*54f38fcaSMauro Carvalho Chehab	#   <op> tx-clear  clear all tx error injections for <op>
48*54f38fcaSMauro Carvalho Chehab	#
49*54f38fcaSMauro Carvalho Chehab	# RX error injection:
50*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] rx-nack              NACK the message instead of sending an ACK
51*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] rx-low-drive <bit>   force a low-drive condition at this bit position
52*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] rx-add-byte          add a spurious byte to the received CEC message
53*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] rx-remove-byte       remove the last byte from the received CEC message
54*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] rx-arb-lost <poll>   generate a POLL message to trigger an arbitration lost
55*54f38fcaSMauro Carvalho Chehab	#
56*54f38fcaSMauro Carvalho Chehab	# TX error injection settings:
57*54f38fcaSMauro Carvalho Chehab	#   tx-ignore-nack-until-eom           ignore early NACKs until EOM
58*54f38fcaSMauro Carvalho Chehab	#   tx-custom-low-usecs <usecs>        define the 'low' time for the custom pulse
59*54f38fcaSMauro Carvalho Chehab	#   tx-custom-high-usecs <usecs>       define the 'high' time for the custom pulse
60*54f38fcaSMauro Carvalho Chehab	#   tx-custom-pulse                    transmit the custom pulse once the bus is idle
61*54f38fcaSMauro Carvalho Chehab	#
62*54f38fcaSMauro Carvalho Chehab	# TX error injection:
63*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-no-eom            don't set the EOM bit
64*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-early-eom         set the EOM bit one byte too soon
65*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-add-bytes <num>   append <num> (1-255) spurious bytes to the message
66*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-remove-byte       drop the last byte from the message
67*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-short-bit <bit>   make this bit shorter than allowed
68*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-long-bit <bit>    make this bit longer than allowed
69*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-custom-bit <bit>  send the custom pulse instead of this bit
70*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-short-start       send a start pulse that's too short
71*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-long-start        send a start pulse that's too long
72*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-custom-start      send the custom pulse instead of the start pulse
73*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-last-bit <bit>    stop sending after this bit
74*54f38fcaSMauro Carvalho Chehab	#   <op>[,<mode>] tx-low-drive <bit>   force a low-drive condition at this bit position
75*54f38fcaSMauro Carvalho Chehab	#
76*54f38fcaSMauro Carvalho Chehab	# <op>       CEC message opcode (0-255) or 'any'
77*54f38fcaSMauro Carvalho Chehab	# <mode>     'once' (default), 'always', 'toggle' or 'off'
78*54f38fcaSMauro Carvalho Chehab	# <bit>      CEC message bit (0-159)
79*54f38fcaSMauro Carvalho Chehab	#            10 bits per 'byte': bits 0-7: data, bit 8: EOM, bit 9: ACK
80*54f38fcaSMauro Carvalho Chehab	# <poll>     CEC poll message used to test arbitration lost (0x00-0xff, default 0x0f)
81*54f38fcaSMauro Carvalho Chehab	# <usecs>    microseconds (0-10000000, default 1000)
82*54f38fcaSMauro Carvalho Chehab
83*54f38fcaSMauro Carvalho Chehab	clear
84*54f38fcaSMauro Carvalho Chehab
85*54f38fcaSMauro Carvalho ChehabYou can write error injection commands to ``error-inj`` using
86*54f38fcaSMauro Carvalho Chehab``echo 'cmd' >error-inj`` or ``cat cmd.txt >error-inj``. The ``cat error-inj``
87*54f38fcaSMauro Carvalho Chehaboutput contains the current error commands. You can save the output to a file
88*54f38fcaSMauro Carvalho Chehaband use it as an input to ``error-inj`` later.
89*54f38fcaSMauro Carvalho Chehab
90*54f38fcaSMauro Carvalho ChehabBasic Syntax
91*54f38fcaSMauro Carvalho Chehab------------
92*54f38fcaSMauro Carvalho Chehab
93*54f38fcaSMauro Carvalho ChehabLeading spaces/tabs are ignored. If the next character is a ``#`` or the end
94*54f38fcaSMauro Carvalho Chehabof the line was reached, then the whole line is ignored. Otherwise a command
95*54f38fcaSMauro Carvalho Chehabis expected.
96*54f38fcaSMauro Carvalho Chehab
97*54f38fcaSMauro Carvalho ChehabThe error injection commands fall in two main groups: those relating to
98*54f38fcaSMauro Carvalho Chehabreceiving CEC messages and those relating to transmitting CEC messages. In
99*54f38fcaSMauro Carvalho Chehabaddition, there are commands to clear existing error injection commands and
100*54f38fcaSMauro Carvalho Chehabto create custom pulses on the CEC bus.
101*54f38fcaSMauro Carvalho Chehab
102*54f38fcaSMauro Carvalho ChehabMost error injection commands can be executed for specific CEC opcodes or for
103*54f38fcaSMauro Carvalho Chehaball opcodes (``any``). Each command also has a 'mode' which can be ``off``
104*54f38fcaSMauro Carvalho Chehab(can be used to turn off an existing error injection command), ``once``
105*54f38fcaSMauro Carvalho Chehab(the default) which will trigger the error injection only once for the next
106*54f38fcaSMauro Carvalho Chehabreceived or transmitted message, ``always`` to always trigger the error
107*54f38fcaSMauro Carvalho Chehabinjection and ``toggle`` to toggle the error injection on or off for every
108*54f38fcaSMauro Carvalho Chehabtransmit or receive.
109*54f38fcaSMauro Carvalho Chehab
110*54f38fcaSMauro Carvalho ChehabSo '``any rx-nack``' will NACK the next received CEC message,
111*54f38fcaSMauro Carvalho Chehab'``any,always rx-nack``' will NACK all received CEC messages and
112*54f38fcaSMauro Carvalho Chehab'``0x82,toggle rx-nack``' will only NACK if an Active Source message was
113*54f38fcaSMauro Carvalho Chehabreceived and do that only for every other received message.
114*54f38fcaSMauro Carvalho Chehab
115*54f38fcaSMauro Carvalho ChehabAfter an error was injected with mode ``once`` the error injection command
116*54f38fcaSMauro Carvalho Chehabis cleared automatically, so ``once`` is a one-time deal.
117*54f38fcaSMauro Carvalho Chehab
118*54f38fcaSMauro Carvalho ChehabAll combinations of ``<op>`` and error injection commands can co-exist. So
119*54f38fcaSMauro Carvalho Chehabthis is fine::
120*54f38fcaSMauro Carvalho Chehab
121*54f38fcaSMauro Carvalho Chehab	0x9e tx-add-bytes 1
122*54f38fcaSMauro Carvalho Chehab	0x9e tx-early-eom
123*54f38fcaSMauro Carvalho Chehab	0x9f tx-add-bytes 2
124*54f38fcaSMauro Carvalho Chehab	any rx-nack
125*54f38fcaSMauro Carvalho Chehab
126*54f38fcaSMauro Carvalho ChehabAll four error injection commands will be active simultaneously.
127*54f38fcaSMauro Carvalho Chehab
128*54f38fcaSMauro Carvalho ChehabHowever, if the same ``<op>`` and command combination is specified,
129*54f38fcaSMauro Carvalho Chehabbut with different arguments::
130*54f38fcaSMauro Carvalho Chehab
131*54f38fcaSMauro Carvalho Chehab	0x9e tx-add-bytes 1
132*54f38fcaSMauro Carvalho Chehab	0x9e tx-add-bytes 2
133*54f38fcaSMauro Carvalho Chehab
134*54f38fcaSMauro Carvalho ChehabThen the second will overwrite the first.
135*54f38fcaSMauro Carvalho Chehab
136*54f38fcaSMauro Carvalho ChehabClear Error Injections
137*54f38fcaSMauro Carvalho Chehab----------------------
138*54f38fcaSMauro Carvalho Chehab
139*54f38fcaSMauro Carvalho Chehab``clear``
140*54f38fcaSMauro Carvalho Chehab    Clear all error injections.
141*54f38fcaSMauro Carvalho Chehab
142*54f38fcaSMauro Carvalho Chehab``rx-clear``
143*54f38fcaSMauro Carvalho Chehab    Clear all receive error injections
144*54f38fcaSMauro Carvalho Chehab
145*54f38fcaSMauro Carvalho Chehab``tx-clear``
146*54f38fcaSMauro Carvalho Chehab    Clear all transmit error injections
147*54f38fcaSMauro Carvalho Chehab
148*54f38fcaSMauro Carvalho Chehab``<op> clear``
149*54f38fcaSMauro Carvalho Chehab    Clear all error injections for the given opcode.
150*54f38fcaSMauro Carvalho Chehab
151*54f38fcaSMauro Carvalho Chehab``<op> rx-clear``
152*54f38fcaSMauro Carvalho Chehab    Clear all receive error injections for the given opcode.
153*54f38fcaSMauro Carvalho Chehab
154*54f38fcaSMauro Carvalho Chehab``<op> tx-clear``
155*54f38fcaSMauro Carvalho Chehab    Clear all transmit error injections for the given opcode.
156*54f38fcaSMauro Carvalho Chehab
157*54f38fcaSMauro Carvalho ChehabReceive Messages
158*54f38fcaSMauro Carvalho Chehab----------------
159*54f38fcaSMauro Carvalho Chehab
160*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] rx-nack``
161*54f38fcaSMauro Carvalho Chehab    NACK broadcast messages and messages directed to this CEC adapter.
162*54f38fcaSMauro Carvalho Chehab    Every byte of the message will be NACKed in case the transmitter
163*54f38fcaSMauro Carvalho Chehab    keeps transmitting after the first byte was NACKed.
164*54f38fcaSMauro Carvalho Chehab
165*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] rx-low-drive <bit>``
166*54f38fcaSMauro Carvalho Chehab    Force a Low Drive condition at this bit position. If <op> specifies
167*54f38fcaSMauro Carvalho Chehab    a specific CEC opcode then the bit position must be at least 18,
168*54f38fcaSMauro Carvalho Chehab    otherwise the opcode hasn't been received yet. This tests if the
169*54f38fcaSMauro Carvalho Chehab    transmitter can handle the Low Drive condition correctly and reports
170*54f38fcaSMauro Carvalho Chehab    the error correctly. Note that a Low Drive in the first 4 bits can also
171*54f38fcaSMauro Carvalho Chehab    be interpreted as an Arbitration Lost condition by the transmitter.
172*54f38fcaSMauro Carvalho Chehab    This is implementation dependent.
173*54f38fcaSMauro Carvalho Chehab
174*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] rx-add-byte``
175*54f38fcaSMauro Carvalho Chehab    Add a spurious 0x55 byte to the received CEC message, provided
176*54f38fcaSMauro Carvalho Chehab    the message was 15 bytes long or less. This is useful to test
177*54f38fcaSMauro Carvalho Chehab    the high-level protocol since spurious bytes should be ignored.
178*54f38fcaSMauro Carvalho Chehab
179*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] rx-remove-byte``
180*54f38fcaSMauro Carvalho Chehab    Remove the last byte from the received CEC message, provided it
181*54f38fcaSMauro Carvalho Chehab    was at least 2 bytes long. This is useful to test the high-level
182*54f38fcaSMauro Carvalho Chehab    protocol since messages that are too short should be ignored.
183*54f38fcaSMauro Carvalho Chehab
184*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] rx-arb-lost <poll>``
185*54f38fcaSMauro Carvalho Chehab    Generate a POLL message to trigger an Arbitration Lost condition.
186*54f38fcaSMauro Carvalho Chehab    This command is only allowed for ``<op>`` values of ``next`` or ``all``.
187*54f38fcaSMauro Carvalho Chehab    As soon as a start bit has been received the CEC adapter will switch
188*54f38fcaSMauro Carvalho Chehab    to transmit mode and it will transmit a POLL message. By default this is
189*54f38fcaSMauro Carvalho Chehab    0x0f, but it can also be specified explicitly via the ``<poll>`` argument.
190*54f38fcaSMauro Carvalho Chehab
191*54f38fcaSMauro Carvalho Chehab    This command can be used to test the Arbitration Lost condition in
192*54f38fcaSMauro Carvalho Chehab    the remote CEC transmitter. Arbitration happens when two CEC adapters
193*54f38fcaSMauro Carvalho Chehab    start sending a message at the same time. In that case the initiator
194*54f38fcaSMauro Carvalho Chehab    with the most leading zeroes wins and the other transmitter has to
195*54f38fcaSMauro Carvalho Chehab    stop transmitting ('Arbitration Lost'). This is very hard to test,
196*54f38fcaSMauro Carvalho Chehab    except by using this error injection command.
197*54f38fcaSMauro Carvalho Chehab
198*54f38fcaSMauro Carvalho Chehab    This does not work if the remote CEC transmitter has logical address
199*54f38fcaSMauro Carvalho Chehab    0 ('TV') since that will always win.
200*54f38fcaSMauro Carvalho Chehab
201*54f38fcaSMauro Carvalho ChehabTransmit Messages
202*54f38fcaSMauro Carvalho Chehab-----------------
203*54f38fcaSMauro Carvalho Chehab
204*54f38fcaSMauro Carvalho Chehab``tx-ignore-nack-until-eom``
205*54f38fcaSMauro Carvalho Chehab    This setting changes the behavior of transmitting CEC messages. Normally
206*54f38fcaSMauro Carvalho Chehab    as soon as the receiver NACKs a byte the transmit will stop, but the
207*54f38fcaSMauro Carvalho Chehab    specification also allows that the full message is transmitted and only
208*54f38fcaSMauro Carvalho Chehab    at the end will the transmitter look at the ACK bit. This is not
209*54f38fcaSMauro Carvalho Chehab    recommended behavior since there is no point in keeping the CEC bus busy
210*54f38fcaSMauro Carvalho Chehab    for longer than is strictly needed. Especially given how slow the bus is.
211*54f38fcaSMauro Carvalho Chehab
212*54f38fcaSMauro Carvalho Chehab    This setting can be used to test how well a receiver deals with
213*54f38fcaSMauro Carvalho Chehab    transmitters that ignore NACKs until the very end of the message.
214*54f38fcaSMauro Carvalho Chehab
215*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-no-eom``
216*54f38fcaSMauro Carvalho Chehab    Don't set the EOM bit. Normally the last byte of the message has the EOM
217*54f38fcaSMauro Carvalho Chehab    (End-Of-Message) bit set. With this command the transmit will just stop
218*54f38fcaSMauro Carvalho Chehab    without ever sending an EOM. This can be used to test how a receiver
219*54f38fcaSMauro Carvalho Chehab    handles this case. Normally receivers have a time-out after which
220*54f38fcaSMauro Carvalho Chehab    they will go back to the Idle state.
221*54f38fcaSMauro Carvalho Chehab
222*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-early-eom``
223*54f38fcaSMauro Carvalho Chehab    Set the EOM bit one byte too soon. This obviously only works for messages
224*54f38fcaSMauro Carvalho Chehab    of two bytes or more. The EOM bit will be set for the second-to-last byte
225*54f38fcaSMauro Carvalho Chehab    and not for the final byte. The receiver should ignore the last byte in
226*54f38fcaSMauro Carvalho Chehab    this case. Since the resulting message is likely to be too short for this
227*54f38fcaSMauro Carvalho Chehab    same reason the whole message is typically ignored. The receiver should be
228*54f38fcaSMauro Carvalho Chehab    in Idle state after the last byte was transmitted.
229*54f38fcaSMauro Carvalho Chehab
230*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-add-bytes <num>``
231*54f38fcaSMauro Carvalho Chehab    Append ``<num>`` (1-255) spurious bytes to the message. The extra bytes
232*54f38fcaSMauro Carvalho Chehab    have the value of the byte position in the message. So if you transmit a
233*54f38fcaSMauro Carvalho Chehab    two byte message (e.g. a Get CEC Version message) and add 2 bytes, then
234*54f38fcaSMauro Carvalho Chehab    the full message received by the remote CEC adapter is
235*54f38fcaSMauro Carvalho Chehab    ``0x40 0x9f 0x02 0x03``.
236*54f38fcaSMauro Carvalho Chehab
237*54f38fcaSMauro Carvalho Chehab    This command can be used to test buffer overflows in the receiver. E.g.
238*54f38fcaSMauro Carvalho Chehab    what does it do when it receives more than the maximum message size of 16
239*54f38fcaSMauro Carvalho Chehab    bytes.
240*54f38fcaSMauro Carvalho Chehab
241*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-remove-byte``
242*54f38fcaSMauro Carvalho Chehab    Drop the last byte from the message, provided the message is at least
243*54f38fcaSMauro Carvalho Chehab    two bytes long. The receiver should ignore messages that are too short.
244*54f38fcaSMauro Carvalho Chehab
245*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-short-bit <bit>``
246*54f38fcaSMauro Carvalho Chehab    Make this bit period shorter than allowed. The bit position cannot be
247*54f38fcaSMauro Carvalho Chehab    an Ack bit.  If <op> specifies a specific CEC opcode then the bit position
248*54f38fcaSMauro Carvalho Chehab    must be at least 18, otherwise the opcode hasn't been received yet.
249*54f38fcaSMauro Carvalho Chehab    Normally the period of a data bit is between 2.05 and 2.75 milliseconds.
250*54f38fcaSMauro Carvalho Chehab    With this command the period of this bit is 1.8 milliseconds, this is
251*54f38fcaSMauro Carvalho Chehab    done by reducing the time the CEC bus is high. This bit period is less
252*54f38fcaSMauro Carvalho Chehab    than is allowed and the receiver should respond with a Low Drive
253*54f38fcaSMauro Carvalho Chehab    condition.
254*54f38fcaSMauro Carvalho Chehab
255*54f38fcaSMauro Carvalho Chehab    This command is ignored for 0 bits in bit positions 0 to 3. This is
256*54f38fcaSMauro Carvalho Chehab    because the receiver also looks for an Arbitration Lost condition in
257*54f38fcaSMauro Carvalho Chehab    those first four bits and it is undefined what will happen if it
258*54f38fcaSMauro Carvalho Chehab    sees a too-short 0 bit.
259*54f38fcaSMauro Carvalho Chehab
260*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-long-bit <bit>``
261*54f38fcaSMauro Carvalho Chehab    Make this bit period longer than is valid. The bit position cannot be
262*54f38fcaSMauro Carvalho Chehab    an Ack bit.  If <op> specifies a specific CEC opcode then the bit position
263*54f38fcaSMauro Carvalho Chehab    must be at least 18, otherwise the opcode hasn't been received yet.
264*54f38fcaSMauro Carvalho Chehab    Normally the period of a data bit is between 2.05 and 2.75 milliseconds.
265*54f38fcaSMauro Carvalho Chehab    With this command the period of this bit is 2.9 milliseconds, this is
266*54f38fcaSMauro Carvalho Chehab    done by increasing the time the CEC bus is high.
267*54f38fcaSMauro Carvalho Chehab
268*54f38fcaSMauro Carvalho Chehab    Even though this bit period is longer than is valid it is undefined what
269*54f38fcaSMauro Carvalho Chehab    a receiver will do. It might just accept it, or it might time out and
270*54f38fcaSMauro Carvalho Chehab    return to Idle state. Unfortunately the CEC specification is silent about
271*54f38fcaSMauro Carvalho Chehab    this.
272*54f38fcaSMauro Carvalho Chehab
273*54f38fcaSMauro Carvalho Chehab    This command is ignored for 0 bits in bit positions 0 to 3. This is
274*54f38fcaSMauro Carvalho Chehab    because the receiver also looks for an Arbitration Lost condition in
275*54f38fcaSMauro Carvalho Chehab    those first four bits and it is undefined what will happen if it
276*54f38fcaSMauro Carvalho Chehab    sees a too-long 0 bit.
277*54f38fcaSMauro Carvalho Chehab
278*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-short-start``
279*54f38fcaSMauro Carvalho Chehab    Make this start bit period shorter than allowed. Normally the period of
280*54f38fcaSMauro Carvalho Chehab    a start bit is between 4.3 and 4.7 milliseconds. With this command the
281*54f38fcaSMauro Carvalho Chehab    period of the start bit is 4.1 milliseconds, this is done by reducing
282*54f38fcaSMauro Carvalho Chehab    the time the CEC bus is high. This start bit period is less than is
283*54f38fcaSMauro Carvalho Chehab    allowed and the receiver should return to Idle state when this is detected.
284*54f38fcaSMauro Carvalho Chehab
285*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-long-start``
286*54f38fcaSMauro Carvalho Chehab    Make this start bit period longer than is valid. Normally the period of
287*54f38fcaSMauro Carvalho Chehab    a start bit is between 4.3 and 4.7 milliseconds. With this command the
288*54f38fcaSMauro Carvalho Chehab    period of the start bit is 5 milliseconds, this is done by increasing
289*54f38fcaSMauro Carvalho Chehab    the time the CEC bus is high. This start bit period is more than is
290*54f38fcaSMauro Carvalho Chehab    valid and the receiver should return to Idle state when this is detected.
291*54f38fcaSMauro Carvalho Chehab
292*54f38fcaSMauro Carvalho Chehab    Even though this start bit period is longer than is valid it is undefined
293*54f38fcaSMauro Carvalho Chehab    what a receiver will do. It might just accept it, or it might time out and
294*54f38fcaSMauro Carvalho Chehab    return to Idle state. Unfortunately the CEC specification is silent about
295*54f38fcaSMauro Carvalho Chehab    this.
296*54f38fcaSMauro Carvalho Chehab
297*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-last-bit <bit>``
298*54f38fcaSMauro Carvalho Chehab    Just stop transmitting after this bit.  If <op> specifies a specific CEC
299*54f38fcaSMauro Carvalho Chehab    opcode then the bit position must be at least 18, otherwise the opcode
300*54f38fcaSMauro Carvalho Chehab    hasn't been received yet. This command can be used to test how the receiver
301*54f38fcaSMauro Carvalho Chehab    reacts when a message just suddenly stops. It should time out and go back
302*54f38fcaSMauro Carvalho Chehab    to Idle state.
303*54f38fcaSMauro Carvalho Chehab
304*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-low-drive <bit>``
305*54f38fcaSMauro Carvalho Chehab    Force a Low Drive condition at this bit position. If <op> specifies a
306*54f38fcaSMauro Carvalho Chehab    specific CEC opcode then the bit position must be at least 18, otherwise
307*54f38fcaSMauro Carvalho Chehab    the opcode hasn't been received yet. This can be used to test how the
308*54f38fcaSMauro Carvalho Chehab    receiver handles Low Drive conditions. Note that if this happens at bit
309*54f38fcaSMauro Carvalho Chehab    positions 0-3 the receiver can interpret this as an Arbitration Lost
310*54f38fcaSMauro Carvalho Chehab    condition. This is implementation dependent.
311*54f38fcaSMauro Carvalho Chehab
312*54f38fcaSMauro Carvalho ChehabCustom Pulses
313*54f38fcaSMauro Carvalho Chehab-------------
314*54f38fcaSMauro Carvalho Chehab
315*54f38fcaSMauro Carvalho Chehab``tx-custom-low-usecs <usecs>``
316*54f38fcaSMauro Carvalho Chehab    This defines the duration in microseconds that the custom pulse pulls
317*54f38fcaSMauro Carvalho Chehab    the CEC line low. The default is 1000 microseconds.
318*54f38fcaSMauro Carvalho Chehab
319*54f38fcaSMauro Carvalho Chehab``tx-custom-high-usecs <usecs>``
320*54f38fcaSMauro Carvalho Chehab    This defines the duration in microseconds that the custom pulse keeps the
321*54f38fcaSMauro Carvalho Chehab    CEC line high (unless another CEC adapter pulls it low in that time).
322*54f38fcaSMauro Carvalho Chehab    The default is 1000 microseconds. The total period of the custom pulse is
323*54f38fcaSMauro Carvalho Chehab    ``tx-custom-low-usecs + tx-custom-high-usecs``.
324*54f38fcaSMauro Carvalho Chehab
325*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-custom-bit <bit>``
326*54f38fcaSMauro Carvalho Chehab    Send the custom bit instead of a regular data bit. The bit position cannot
327*54f38fcaSMauro Carvalho Chehab    be an Ack bit.  If <op> specifies a specific CEC opcode then the bit
328*54f38fcaSMauro Carvalho Chehab    position must be at least 18, otherwise the opcode hasn't been received yet.
329*54f38fcaSMauro Carvalho Chehab
330*54f38fcaSMauro Carvalho Chehab``<op>[,<mode>] tx-custom-start``
331*54f38fcaSMauro Carvalho Chehab    Send the custom bit instead of a regular start bit.
332*54f38fcaSMauro Carvalho Chehab
333*54f38fcaSMauro Carvalho Chehab``tx-custom-pulse``
334*54f38fcaSMauro Carvalho Chehab    Transmit a single custom pulse as soon as the CEC bus is idle.
335