1.. SPDX-License-Identifier: GPL-2.0 2 3======== 4HDMI CEC 5======== 6 7Supported hardware in mainline 8============================== 9 10HDMI Transmitters: 11 12- Exynos4 13- Exynos5 14- STIH4xx HDMI CEC 15- V4L2 adv7511 (same HW, but a different driver from the drm adv7511) 16- stm32 17- Allwinner A10 (sun4i) 18- Raspberry Pi 19- dw-hdmi (Synopsis IP) 20- amlogic (meson ao-cec and ao-cec-g12a) 21- drm adv7511/adv7533 22- omap4 23- tegra 24- rk3288, rk3399 25- tda998x 26- DisplayPort CEC-Tunneling-over-AUX on i915, nouveau and amdgpu 27- ChromeOS EC CEC 28- CEC for SECO boards (UDOO x86). 29- Chrontel CH7322 30 31 32HDMI Receivers: 33 34- adv7604/11/12 35- adv7842 36- tc358743 37 38USB Dongles (see below for additional information on how to use these 39dongles): 40 41- Pulse-Eight: the pulse8-cec driver implements the following module option: 42 ``persistent_config``: by default this is off, but when set to 1 the driver 43 will store the current settings to the device's internal eeprom and restore 44 it the next time the device is connected to the USB port. 45- RainShadow Tech. Note: this driver does not support the persistent_config 46 module option of the Pulse-Eight driver. The hardware supports it, but I 47 have no plans to add this feature. But I accept patches :-) 48 49Miscellaneous: 50 51- vivid: emulates a CEC receiver and CEC transmitter. 52 Can be used to test CEC applications without actual CEC hardware. 53 54- cec-gpio. If the CEC pin is hooked up to a GPIO pin then 55 you can control the CEC line through this driver. This supports error 56 injection as well. 57 58 59Utilities 60========= 61 62Utilities are available here: https://git.linuxtv.org/v4l-utils.git 63 64``utils/cec-ctl``: control a CEC device 65 66``utils/cec-compliance``: test compliance of a remote CEC device 67 68``utils/cec-follower``: emulate a CEC follower device 69 70Note that ``cec-ctl`` has support for the CEC Hospitality Profile as is 71used in some hotel displays. See http://www.htng.org. 72 73Note that the libcec library (https://github.com/Pulse-Eight/libcec) supports 74the linux CEC framework. 75 76If you want to get the CEC specification, then look at the References of 77the HDMI wikipedia page: https://en.wikipedia.org/wiki/HDMI. CEC is part 78of the HDMI specification. HDMI 1.3 is freely available (very similar to 79HDMI 1.4 w.r.t. CEC) and should be good enough for most things. 80 81 82DisplayPort to HDMI Adapters with working CEC 83============================================= 84 85Background: most adapters do not support the CEC Tunneling feature, 86and of those that do many did not actually connect the CEC pin. 87Unfortunately, this means that while a CEC device is created, it 88is actually all alone in the world and will never be able to see other 89CEC devices. 90 91This is a list of known working adapters that have CEC Tunneling AND 92that properly connected the CEC pin. If you find adapters that work 93but are not in this list, then drop me a note. 94 95To test: hook up your DP-to-HDMI adapter to a CEC capable device 96(typically a TV), then run:: 97 98 cec-ctl --playback # Configure the PC as a CEC Playback device 99 cec-ctl -S # Show the CEC topology 100 101The ``cec-ctl -S`` command should show at least two CEC devices, 102ourselves and the CEC device you are connected to (i.e. typically the TV). 103 104General note: I have only seen this work with the Parade PS175, PS176 and 105PS186 chipsets and the MegaChips 2900. While MegaChips 28x0 claims CEC support, 106I have never seen it work. 107 108USB-C to HDMI 109------------- 110 111Samsung Multiport Adapter EE-PW700: https://www.samsung.com/ie/support/model/EE-PW700BBEGWW/ 112 113Kramer ADC-U31C/HF: https://www.kramerav.com/product/ADC-U31C/HF 114 115Club3D CAC-2504: https://www.club-3d.com/en/detail/2449/usb_3.1_type_c_to_hdmi_2.0_uhd_4k_60hz_active_adapter/ 116 117DisplayPort to HDMI 118------------------- 119 120Club3D CAC-1080: https://www.club-3d.com/en/detail/2442/displayport_1.4_to_hdmi_2.0b_hdr/ 121 122CableCreation (SKU: CD0712): https://www.cablecreation.com/products/active-displayport-to-hdmi-adapter-4k-hdr 123 124HP DisplayPort to HDMI True 4k Adapter (P/N 2JA63AA): https://www.hp.com/us-en/shop/pdp/hp-displayport-to-hdmi-true-4k-adapter 125 126Mini-DisplayPort to HDMI 127------------------------ 128 129Club3D CAC-1180: https://www.club-3d.com/en/detail/2443/mini_displayport_1.4_to_hdmi_2.0b_hdr/ 130 131Note that passive adapters will never work, you need an active adapter. 132 133The Club3D adapters in this list are all MegaChips 2900 based. Other Club3D adapters 134are PS176 based and do NOT have the CEC pin hooked up, so only the three Club3D 135adapters above are known to work. 136 137I suspect that MegaChips 2900 based designs in general are likely to work 138whereas with the PS176 it is more hit-and-miss (mostly miss). The PS186 is 139likely to have the CEC pin hooked up, it looks like they changed the reference 140design for that chipset. 141 142 143USB CEC Dongles 144=============== 145 146These dongles appear as ``/dev/ttyACMX`` devices and need the ``inputattach`` 147utility to create the ``/dev/cecX`` devices. Support for the Pulse-Eight 148has been added to ``inputattach`` 1.6.0. Support for the Rainshadow Tech has 149been added to ``inputattach`` 1.6.1. 150 151You also need udev rules to automatically start systemd services:: 152 153 SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1002", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service" 154 SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1001", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service" 155 SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ff59", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rainshadow-cec-inputattach@%k.service" 156 157and these systemd services: 158 159For Pulse-Eight make /lib/systemd/system/pulse8-cec-inputattach@.service:: 160 161 [Unit] 162 Description=inputattach for pulse8-cec device on %I 163 164 [Service] 165 Type=simple 166 ExecStart=/usr/bin/inputattach --pulse8-cec /dev/%I 167 168For the RainShadow Tech make /lib/systemd/system/rainshadow-cec-inputattach@.service:: 169 170 [Unit] 171 Description=inputattach for rainshadow-cec device on %I 172 173 [Service] 174 Type=simple 175 ExecStart=/usr/bin/inputattach --rainshadow-cec /dev/%I 176 177 178For proper suspend/resume support create: /lib/systemd/system/restart-cec-inputattach.service:: 179 180 [Unit] 181 Description=restart inputattach for cec devices 182 After=suspend.target 183 184 [Service] 185 Type=forking 186 ExecStart=/bin/bash -c 'for d in /dev/serial/by-id/usb-Pulse-Eight*; do /usr/bin/inputattach --daemon --pulse8-cec $d; done; for d in /dev/serial/by-id/usb-RainShadow_Tech*; do /usr/bin/inputattach --daemon --rainshadow-cec $d; done' 187 188 [Install] 189 WantedBy=suspend.target 190 191And run ``systemctl enable restart-cec-inputattach``. 192 193To automatically set the physical address of the CEC device whenever the 194EDID changes, you can use ``cec-ctl`` with the ``-E`` option:: 195 196 cec-ctl -E /sys/class/drm/card0-DP-1/edid 197 198This assumes the dongle is connected to the card0-DP-1 output (``xrandr`` will tell 199you which output is used) and it will poll for changes to the EDID and update 200the Physical Address whenever they occur. 201 202To automatically run this command you can use cron. Edit crontab with 203``crontab -e`` and add this line:: 204 205 @reboot /usr/local/bin/cec-ctl -E /sys/class/drm/card0-DP-1/edid 206 207This only works for display drivers that expose the EDID in ``/sys/class/drm``, 208such as the i915 driver. 209 210 211CEC Without HPD 212=============== 213 214Some displays when in standby mode have no HDMI Hotplug Detect signal, but 215CEC is still enabled so connected devices can send an <Image View On> CEC 216message in order to wake up such displays. Unfortunately, not all CEC 217adapters can support this. An example is the Odroid-U3 SBC that has a 218level-shifter that is powered off when the HPD signal is low, thus 219blocking the CEC pin. Even though the SoC can use CEC without a HPD, 220the level-shifter will prevent this from functioning. 221 222There is a CEC capability flag to signal this: ``CEC_CAP_NEEDS_HPD``. 223If set, then the hardware cannot wake up displays with this behavior. 224 225Note for CEC application implementers: the <Image View On> message must 226be the first message you send, don't send any other messages before. 227Certain very bad but unfortunately not uncommon CEC implementations 228get very confused if they receive anything else but this message and 229they won't wake up. 230 231When writing a driver it can be tricky to test this. There are two 232ways to do this: 233 2341) Get a Pulse-Eight USB CEC dongle, connect an HDMI cable from your 235 device to the Pulse-Eight, but do not connect the Pulse-Eight to 236 the display. 237 238 Now configure the Pulse-Eight dongle:: 239 240 cec-ctl -p0.0.0.0 --tv 241 242 and start monitoring:: 243 244 sudo cec-ctl -M 245 246 On the device you are testing run:: 247 248 cec-ctl --playback 249 250 It should report a physical address of f.f.f.f. Now run this 251 command:: 252 253 cec-ctl -t0 --image-view-on 254 255 The Pulse-Eight should see the <Image View On> message. If not, 256 then something (hardware and/or software) is preventing the CEC 257 message from going out. 258 259 To make sure you have the wiring correct just connect the 260 Pulse-Eight to a CEC-enabled display and run the same command 261 on your device: now there is a HPD, so you should see the command 262 arriving at the Pulse-Eight. 263 2642) If you have another linux device supporting CEC without HPD, then 265 you can just connect your device to that device. Yes, you can connect 266 two HDMI outputs together. You won't have a HPD (which is what we 267 want for this test), but the second device can monitor the CEC pin. 268 269 Otherwise use the same commands as in 1. 270 271If CEC messages do not come through when there is no HPD, then you 272need to figure out why. Typically it is either a hardware restriction 273or the software powers off the CEC core when the HPD goes low. The 274first cannot be corrected of course, the second will likely required 275driver changes. 276 277 278Microcontrollers & CEC 279====================== 280 281We have seen some CEC implementations in displays that use a microcontroller 282to sample the bus. This does not have to be a problem, but some implementations 283have timing issues. This is hard to discover unless you can hook up a low-level 284CEC debugger (see the next section). 285 286You will see cases where the CEC transmitter holds the CEC line high or low for 287a longer time than is allowed. For directed messages this is not a problem since 288if that happens the message will not be Acked and it will be retransmitted. 289For broadcast messages no such mechanism exists. 290 291It's not clear what to do about this. It is probably wise to transmit some 292broadcast messages twice to reduce the chance of them being lost. Specifically 293<Standby> and <Active Source> are candidates for that. 294 295 296Making a CEC debugger 297===================== 298 299By using a Raspberry Pi 2B/3/4 and some cheap components you can make 300your own low-level CEC debugger. 301 302Here is a picture of my setup: 303 304https://hverkuil.home.xs4all.nl/rpi3-cec.jpg 305 306It's a Raspberry Pi 3 together with a breadboard and some breadboard wires: 307 308http://www.dx.com/p/diy-40p-male-to-female-male-to-male-female-to-female-dupont-line-wire-3pcs-356089#.WYLOOXWGN7I 309 310Finally on of these HDMI female-female passthrough connectors (full soldering type 1): 311 312https://elabbay.myshopify.com/collections/camera/products/hdmi-af-af-v1a-hdmi-type-a-female-to-hdmi-type-a-female-pass-through-adapter-breakout-board?variant=45533926147 313 314We've tested this and it works up to 4kp30 (297 MHz). The quality is not high 315enough to pass-through 4kp60 (594 MHz). 316 317I also added an RTC and a breakout shield: 318 319https://www.amazon.com/Makerfire%C2%AE-Raspberry-Module-DS1307-Battery/dp/B00ZOXWHK4 320 321https://www.dx.com/p/raspberry-pi-gpio-expansion-board-breadboard-easy-multiplexing-board-one-to-three-with-screw-for-raspberry-pi-2-3-b-b-2729992.html#.YGRCG0MzZ7I 322 323These two are not needed but they make life a bit easier. 324 325If you want to monitor the HPD line as well, then you need one of these 326level shifters: 327 328https://www.adafruit.com/product/757 329 330(This is just where I got these components, there are many other places you 331can get similar things). 332 333The CEC pin of the HDMI connector needs to be connected to these pins: 334CE0/IO8 and CE1/IO7 (pull-up GPIOs). The (optional) HPD pin of the HDMI 335connector should be connected (via a level shifter to convert the 5V 336to 3.3V) to these pins: IO17 and IO27. The (optional) 5V pin of the HDMI 337connector should be connected (via a level shifter) to these pins: IO22 338and IO24. Monitoring the HPD an 5V lines is not necessary, but it is helpful. 339 340This kernel patch will hook up the cec-gpio driver correctly to 341e.g. ``arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts``:: 342 343 cec@7 { 344 compatible = "cec-gpio"; 345 cec-gpios = <&gpio 7 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 346 hpd-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>; 347 v5-gpios = <&gpio 22 GPIO_ACTIVE_HIGH>; 348 }; 349 350 cec@8 { 351 compatible = "cec-gpio"; 352 cec-gpios = <&gpio 8 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 353 hpd-gpios = <&gpio 27 GPIO_ACTIVE_HIGH>; 354 v5-gpios = <&gpio 24 GPIO_ACTIVE_HIGH>; 355 }; 356 357This dts change will enable two cec GPIO devices: I typically use one to 358send/receive CEC commands and the other to monitor. If you monitor using 359an unconfigured CEC adapter then it will use GPIO interrupts which makes 360monitoring very accurate. 361 362The documentation on how to use the error injection is here: :ref:`cec_pin_error_inj`. 363 364``cec-ctl --monitor-pin`` will do low-level CEC bus sniffing and analysis. 365You can also store the CEC traffic to file using ``--store-pin`` and analyze 366it later using ``--analyze-pin``. 367 368You can also use this as a full-fledged CEC device by configuring it 369using ``cec-ctl --tv -p0.0.0.0`` or ``cec-ctl --playback -p1.0.0.0``. 370