Quote:
Originally Posted by CFSworks
Hey all!
|
Hey CFSworks; great job so far....

Some additional information to keep this thread moving in the
positive direction.
Corsair Link protocol overview
As mentioned, the USB device uses a simple 64-byte HID "raw" report; the rawhid source code can be a useful starting point to establish low-level communication if a device isn't "just available" (e.g., on Windows).
http://www.pjrc.com/teensy/rawhid.html
The ReportID is always zero and is length-prefixed with a number of SMBus-like packets within the HID packet. Each packet has an index (which should be from 20~255), SMBus sub-packet type followed by any write data, if the sub-packet is writing data. Block types also have a length, and it appears the "quick" and "byte" modes are unsupported (only CmdByte, CmdWord and CmdBlock appear to be used).
H80i/H100i Register set:
__Number__ | R/W | __Length__ | Description |
---|
00 | R | 1 byte | Device ID - (H80 0x37, Cooling node 0x38, Lighting node 0x39, H100 0x3A, 80i 0x3B, 100i 0x3c -- this field as well as the version are common on all C-Link devices; but the rest aren't |
01 | R | 2 bytes | Firmware Version in BCD (for example 1.0.5 is 0x1005, or 0x05, 0x10 in little endianess) |
02 | R | 8 bytes | Product name, zero-terminated - only present on the H80i and H100i |
03 | R | 1 | Status, 0 okay, 0xFF bad |
04 | RW | 1 byte | Select current LED |
05 | R | 1 byte | Number of LEDs |
06 | RW | 1 byte | LED mode - 0x00 for static color, 0x40 for 2-color cycle, 0x80 for 4-color, 0xC0 for temperature mode; low nibble defines cycle speed or the temperature channel to use (0 internal sensor, 7 manual) |
07 | R | 3 bytes | LED current color, RGB color of the selected LED |
08 | RW | 2 bytes | In temperature controlled mode (0xC0) this defines the colour to use to with the below gradients |
09 | RW | 6 bytes | LED temperature-mode temperatures: 3 temperatures; used when cycle mode is 0xc0 |
0a | RW | 9 bytes | LED temperature-mode colors: RGBx3 colors, corresponding to temperatures in register above |
0b | RW | 12 bytes | LED cycle colors: RGBx4 colors (only first color used if cycle mode set to 00, first two if 4b, ignored if c0) |
0c | RW | 1 byte | Select active temperature sensor |
0d | R | 1 byte | Number of temperature sensors |
0e | R | 2 bytes | Temperature as measured by selected sensor |
0f | RW | 2 bytes | Temperature limit (when the temperature goes over this, status is set to 0xff) |
10 | RW | 1 byte | Select current fan; for H100i, 0-3 are the fans, 4 is pump |
11 | R | 1 byte | Number of fans |
12 | RW | 1 byte | Fan mode; 02=fixed PWM, 04=fixed RPM, 06=default, 08=quiet, 0a=balanced, 0c=performance, 0e=custom; high bit is one when fan is detected, low bit is one when the fan is 4-pin, bits 6~4 define the temperautre channel to use in "curve" modes, 0 internal and 7 manual |
13 | RW | 1 byte | Fan fixed PWM, 0-255, only used if fan mode is 02 |
14 | RW | 2 bytes | Fan fixed RPM; when fan mode is 04, controller will target this RPM |
15 | RW | 2 bytes | Report external temperature to fan controller - used for controlling fans via external sensors |
16 | R | 2 bytes | Current fan RPM |
17 | R | 2 bytes | Maximum RPM recorded since power-on |
18 | RW | 2 bytes | Fan under speed threshold |
19 | RW | 10 bytes | Fan RPM table, for custom (0e) mode: array of 5 RPMs |
1a | RW | 10 bytes | Fan temp table, for custom (0e) mode: array of 5 temperatures |
Note: All data is little-endian.
Temperatures are reported in units of 1/256th of a degree Celsius.