A while ago I bought a PC case made by 3R Systems. It came with a built-in iMon LCD that had been custom-made by Soundgraph for 3R Systems. The case is good, but I discovered that this LCD panel has no Free Software drivers, and Soundgraph do not support Linux or any Free OS. In fact, Soundgraph refuse to even try to understand simple questions if you mention Linux anywhere in the message. That sort of behaviour used to be common, but the growing popularity of Free Software / Open Source, and the Linux kernel in particular, has made many companies change their attitude: some release technical details of their products so we can write our own software; some write and release their own Free Software (or Open Source); and some others release non-Free software for Free OSes. But Soundgraph does nothing except ignore it.
So, I started to reverse engineer the device. I’m not the only one doing this, and I got some hints from ralph.y, Codeka, and someone called “tsuppiduppi” on the iMon user forum. To make it easy to experiment I wrote a quick’n’dirty C program using libusb to allow me to send commands to the device. Now I can do:
- imon-poke 0x02 0x1c 0x02 to initialise the LCD screen
- imon-poke 0x0d 0x0f 0x48 0x45 0x4c 0x4c 0x4f 0x00 0x20 0x57 0x4f 0x52 0x4c 0x44 0x20 to display “HELLO WORLD”
Below is a brief summary (well, random notes) of what I have found so far. The first two bytes select the main command. Subsequent bytes may be used as parameters. The 8th byte should always be zero, and the 16h should always be 2.
0x02, 0x00: eq graph: 1 byte 1=off 2=on 0x02, 0x01: eq graph bars (no pattern yet) 0x09, 0x01: eq graph bars: 16 nybbles, value 0 to 6 0x0d, 0x01: eq graph bars, seems to match previous 0x09, 0x01 0x02, 0x09: fan icon bits lsb: F1 F2 F3 LMH 0x02, 0x0a: fan guage 2 bits lsb: F1 F2 F3 0x02, 0x0b: 1 byte temp degree c icons 0x02, 0x0c: 1 byte temp value 0x02, 0x0d: cpu icons 1 byte on=2 off=1 (or not 2) 0x02, 0x0e: cpu guage 1 byte value 0x02, 0x1b: the colon 1=off 2=on 0x02, 0x1c: whole display: 0=off 1=auto clock 2=on 0x02, 0x1d: strange xx/yy zzzz; xx = l nibble; 0x02, 0x26: fan speed 0x0d, 0x0f: ASCII text