Overheating converter and USB-C Alternate Mode
I just bought a USB-C to HDMI converter (see this snapshot in case the seller deletes the product). It looks nice: made of aluminum, with an additional port for USB-C power delivery, meaning only one cable is needed for my laptop. However, there’s a problem: it heats up while I’m using my 4K screen. And by hot I mean hot enough to cook an egg. What’s the issue here?
It turns out the USB standard has grown over the last two decades. The same USB port and cable can be used for three distinct features:
- Data transfer: the original purpose of USB. USB 2.0, and the confusing names “USB 3.2 Gen 1x1”, “USB 3.2 Gen 2x1”, “USB 3.2 Gen 1x2” and “USB 3.2 Gen 2x2” all refer to this aspect of USB.
- Power Delivery: most phones support this feature.
- Alternate Mode: this is the way a USB device can output video. There’s a DP alternate mode and HDMI alternate mode, as well as others.
USB hosts devices can support any combination of these features: some phones only support power delivery, and no data transfer. Other only support data transfer. My laptop support all three as a host, but only support the DP alternate mode, which is what caused my issue.
The alternate mode is a way to transmit other protocols over the USB-C cable. Everything other than the cable is different. The physical pins are assigned different meanings, and a completely different driver is used to handle the process, bypassing the ordinary USB driver.
This means what comes into the USB-C cable is actually DP signal, adapted for the USB-C electrical interface, and transmitted over the USB-C cable. The HDMI converter will then need to do quite some processing to convert the signal into the HDMI format, like the following graph shows:
GPU->USB Hub->USB Port ---> DP Signal ---> Chip that use power ---> HDMI Signal
Laptop ---> USB-C cable ---> HDMI converter ---> Display
So when I’m using my display, the tiny converter is doing digital signal processing on the 10Gbps+ bitstream. No wonder it heats up. After I switched to a DP converter and used the DP port on the display, it cooled down considerably , as expected.
It’s quite hard to check for USB-C alternate mode support in Linux. There’s a
kernel API
for alt mode, but I can’t find any command line tool for it. lsusb
and dmesg
only show a USB 2.0 Billboard device, a dummy device that tells the machine what
alt modes the device support, like this:
kern :info : [Aug13 22:04] usb 1-1: USB disconnect, device number 4
kern :info : [ +1.268893] usb 1-1: new full-speed USB device number 5 using xhci_hcd
kern :info : [ +0.164247] usb 1-1: not running at top speed; connect to a high speed hub
kern :info : [ +0.020166] usb 1-1: New USB device found, idVendor=2109, idProduct=0103, bcdDevice=15.51
kern :info : [ +0.000010] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kern :info : [ +0.000002] usb 1-1: Product: USB 2.0 BILLBOARD
kern :info : [ +0.000002] usb 1-1: Manufacturer: VIA Technologies Inc.
kern :info : [ +0.000002] usb 1-1: SerialNumber: 0000000000000001
Only xrandr
shows some useful information:
Screen 0: minimum 320 x 200, current 6400 x 2160, maximum 16384 x 16384
eDP connected 2560x1600+3840+0 (normal left inverted right x axis y axis) 286mm x 179mm
2560x1600 59.99*+
1920x1200 59.99
......
DisplayPort-0 disconnected (normal left inverted right x axis y axis)
DisplayPort-1 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 622mm x 294mm
3840x2160 60.00*+ 30.00
2560x1440 59.95
......
It shows the (“logical”) displays the X server can see. DisplayPort-1 is the output
of the USB-C cable. (I’m not sure if my understanding of xrandr
is correct, please correct
me if I’m wrong.)
I hope someone can write a tool, or add a flag in lsusb to show alternative mode support, and I hope the HDMI & DP consortium enforce accurate descriptions for devices. Otherwise, people would keep plugging in USB-C cables and be surprised when nothing works.