Skip to content

Latest commit

 

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fx_lcd_software

Unofficial Linux driver for ID-COOLING FX series LCD AIO liquid coolers. The vendor software is Windows-only. This tool speaks the cooler's native USB HID protocol directly, so you can put any picture on your AIO's LCD from Linux — no Wine, no VM.

Features

  • Send any image to the LCD (auto-resized to 240x240)
  • Clockwise rotation: 0 / 90 / 180 / 270
  • Video mode and temperature overlay — on the roadmap

Supported devices

  • ID-COOLING FX 240 / FX 360 LCD series
  • Known USB IDs: VID 0x2000, PID 0x3000
  • Tested on: FX 240 LCD

Your VID/PID may differ! Other batches or regional versions may use different USB IDs. Find your device with:

lsusb

On my system the cooler shows up as CMX Systems HOTSPOTEKUSB HID DEMO, ID 2000:3000 — yours may be listed differently. Not sure which line is your cooler? Unplug it, run lsusb, plug it back in and run lsusb again: the new line is your device. (Or paste the lsusb output into an AI assistant and ask which entry is your AIO.)

If your IDs differ, update them in two places:

  1. In the code. Open core.py and edit the constants at the top (example values for ID 1234:abcd):
VID = 0x1234
PID = 0xabcd
  1. In the udev rule. Create /etc/udev/rules.d/99-fx-lcd.rules with your IDs, written without the 0x prefix:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="abcd", MODE="0666"

Then apply the rule and replug the cooler:

sudo udevadm control --reload-rules && sudo udevadm trigger

Requirements

Python 3.9+

hidapi and Pillow:

  • Arch:
sudo pacman -S python-hidapi python-pillow
  • pip:
pip install hidapi pillow

Installation

Step 1. Get the code

git clone https://github.com/w1n-ror/fx_lcd_software-for-linux.git
cd fx_lcd_software-for-linux

Step 2. Permissions (udev rule)

The tool writes to /dev/hidraw*. Without permissions you will get Permission denied. Either run as root, or (recommended) add a udev rule.

Create /etc/udev/rules.d/99-fx-lcd.rules:

SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2000", ATTRS{idProduct}=="3000", MODE="0666"

(adjust idVendor/idProduct if your device differs)

Apply without reboot:

sudo udevadm control --reload-rules && sudo udevadm trigger

You may need to replug the cooler afterwards.

Step 3. Install as a system command (symlink)

chmod +x main.py
ln -s "$PWD/main.py" ~/.local/bin/fx_software

Make sure ~/.local/bin is in your PATH (e.g. fish_add_path ~/.local/bin or add it to your shell profile). The symlink's name becomes the command name — call it whatever you like.

Usage

fx_software --mode image ~/wallpaper.png
fx_software --mode image --rotate 90 ~/wallpaper.png
Argument Description
--mode {image,video} Required. video is coming soon
path Required positional, path to your image
--rotate {0,90,180,270} Clockwise rotation, default 0
-h, --help Show help

The image is converted to a baseline JPEG (4:2:0), resized to 240x240 and streamed to the display in a loop. Press Ctrl+C to stop.

Run in background (no visible terminal):

fx_software --mode image ~/wallpaper.png &
disown

Stop it later with:

pkill -f fx_software

Troubleshooting

  • Permission denied — udev rule not applied, see Installation Step 2 (or run with sudo).
  • Device not found / nothing happens — check lsusb for VID/PID; if yours differ, see Supported devices above.
  • Image is upside down or sideways — use --rotate.
  • Screen stays black — make sure no other software (VM, Wine instance of the vendor tool) is holding the device.

Protocol notes (for developers)

Reverse-engineered by observing the vendor software over USB HID. All transfers are HID writes with report id 0x00.

Frame packet (32-byte header, then the JPEG):

43 52 54 00 00   "CRT"
44 52 41 00 00   "DRA"
LL LL            payload length = 32 + JPEG size, big-endian
B1               magic byte
00 * 19          padding
FF D8 ... FF D9  baseline JPEG, 4:2:0 subsampling

Payload is sent in 1024-byte chunks, each prefixed with report id 0x00. Pacing between chunks ~2.5–3 ms; faster writes overflow the device.

Other commands:

  • DIS (44 49 53 00 00 + zeros) — disconnect/clear. Sent at session start, the display clears when the stream stops; without it the last frame persists in the buffer.
  • LIG (4C 49 47 00 00 + brightness byte) — brightness, 0x64 = 100%. The vendor sends it twice per session; once is enough.

Roadmap

  • Video mode
  • Temperature overlay
  • EXIF orientation auto-fix
  • GUI

Disclaimer

Not affiliated with ID-COOLING. Use at your own risk. This tool only sends display frames; it does not touch fan or pump control.

Contributing

Issues and PRs are welcome. For device-compatibility reports please attach lsusb output and, if possible, a strace capture of the vendor software.

Releases

Packages

Contributors

Languages