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