Skip to content

5" panel unresponsive on Linux despite byte-identical HELLO to working Windows capture #1030

Description

@jepp3103

Describe the bug

The 5" panel (as used in the Lian Li O11D EVO RGB Lamborghini Edition) stops responding to any serial commands on Linux — both of its known USB identities enumerate correctly and consistently, but the handshake (HELLO) never gets a response, even when sending byte-identical protocol data confirmed via a Wireshark/USBPcap capture of the official Windows driver successfully talking to the same physical device.

This isn't a "never worked" report — it worked correctly for several hours using this exact library before failing, and hasn't recovered since, despite the panel being confirmed fully functional via the official Windows driver in the meantime.

I ran into this while building lambo-dashboard, an independent host-streamed (not on-device-storage) implementation targeting this same panel via LcdCommRevC, in case a second working (until it wasn't) implementation against this exact hardware is useful corroboration.

To Reproduce

  1. Connect the panel, confirm clean USB enumeration (see below).
  2. Attempt InitializeComm() / raw HELLO handshake.
  3. Handshake loop retries indefinitely with Display returned invalid or unsupported ID and never receives a valid chs_... response.

Expected behavior

Handshake should succeed and return chs_5inch.dev1_rom1.89 (confirmed this is the correct/expected response — see below).

Environment:

  • Smart screen model: Turing/Turzx 5" (Lian Li O11D EVO RGB Lamborghini Edition rear panel, appears to be OEM Turing 5" hardware)
  • Revision of this project: main branch, LcdCommRevC
  • OS with version: Nobara Linux 44, kernel 7.1.3-200.nobara.fc44.x86_64
  • Python version: Python 3.14.6
  • Hardware: AMD Ryzen 9 7950X3D / Radeon 9070 XT

USB identity details

This panel presents as two separate USB devices on the same internal hub, both consistent and reproducible across many reconnects/reboots:

idVendor=1a86, idProduct=ca50, Manufacturer=Turing, Product=UsbMonitor, SerialNumber=CT50INCH
idVendor=1d6b, idProduct=0106, Manufacturer=Android, Product=Android,   SerialNumber=20080411

The second identity (1d6b:0106, serial 20080411) exactly matches what LcdCommRevC._get_awake_com_port() already checks for by VID/PID and serial number — so this isn't an unrelated device, it's a known "awake" identity for this panel family, just not currently documented as applying to the 5" model specifically.

What was tested and ruled out

  • Wrong port/identity: raw protocol tests were run directly against both known identities, cross-verified against correct VID:PID, not relying on serial-number matching alone.
  • Infinite retry in _hello(): confirmed and worked around locally (original loop has no retry limit at all — worth fixing upstream regardless of this specific bug, as it can hang a caller indefinitely on any transient failure).
  • Missing write timeout: added write_timeout to the serial.Serial() connection; didn't change this specific symptom.
  • Missing wake sequence: replicated _wake_up_device()'s exact repeated open/close pattern (15x) manually before attempting HELLO — no change.
  • Insufficient boot time: waited 35 seconds after a cold USB replug, doing nothing else, before sending HELLO — no change.
  • Physical/power issues: full system power cycle (not just USB replug) — no change. Reverted to a known-good build of the calling code from several hours earlier (before the issue started) — same failure, ruling out anything in the calling application.
  • Protocol correctness: captured the official Windows driver's traffic via Wireshark + USBPcap. The HELLO command bytes sent are byte-for-byte identical to what this library sends (01 ef 69 00 00 00 01 00 00 00 c5 d3). The official driver's successful handshake response, decoded from the capture, is chs_5inch.dev1_rom1.89.

Key finding from the packet capture

The official driver's actual working HELLO exchange happens over bulk endpoints (0x01 OUT / 0x81 IN) on the 1d6b:0106 ("Android") identity, not the 1a86:ca50 ("Turing"/CT50INCH) identity. Both identities complete standard USB/CDC-ACM enumeration quickly, then the official driver deliberately waits roughly 23-30 seconds before sending any real commands (matched independently in our own 35s-wait test, which still failed on Linux — so this delay alone isn't sufficient by itself, but is present in genuine working sessions).

Despite replicating the exact same bytes, target identity, and generous timing, the device does not respond at all when the same sequence is attempted from Linux (tested against both identities), while the identical byte sequence works correctly moments later/before via the official Windows driver on the same physical hardware, same USB port, same session.

Additional context

This suggests a difference at the USB/kernel driver level between how Windows' USB stack initializes this specific device versus Linux's generic cdc_acm class driver — possibly a vendor-specific SELECT_INTERFACE/pipe-configuration step Windows performs that has no direct Linux equivalent being sent. Happy to provide the full .pcapng capture and/or test further changes against the real hardware if useful — this is a limited-edition case panel so testing turnaround may be slow, but the hardware is available.

Repo for the independent implementation mentioned above, in case the code/README is useful context: https://github.com/jepp3103/lambo-dashboard

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions