About Blog Contact

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:

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.