Jump to content
Corsair Community

Developers: The Corsair Link USB protocol!


CFSworks

Recommended Posts

Hi all

 

This is my first post on this forum. I have been following this thread

for sometime. I have a h80i and a Command module with a cooling node.

I am a software engineer (I do operating systems). I have had the need

for support for the hardware under Linux (on my personal home system).

So I decided to take all the great information supplied by other users and

develop a driver, which I did. Since I did this off of research and the hard

work of the other users. I am giving this work back to you all.

 

 

The attached tar-ball has a readme file that should help get things going.

Remember this is not a polished thing. While it has been working well (for

two weeks), it is new code. The install processes is ruff at best...

 

Also I think that if there is enough interest, it should get cleaned up some

and ultimately get put into appropriate community projects... At this point

I am getting good use out of it and I hope others can also... :biggrin:

 

Barry

Wow. Great job.

Link to comment
Share on other sites

  • Replies 185
  • Created
  • Last Reply

Top Posters In This Topic

  • 3 months later...
  • 3 weeks later...

I have done some coding and got to this: https://github.com/Doridian/CorsairLinkPlusPlus

This can communicate with the Commander Mini (or other USB things), enumerate devices connected to it etc.

However, my problem now is: The AX1200i and AirFlow Pro. They reply totally weird.

Both of them give me a 0x00 ID on register 0x00 (ID).

One gives me all 0xFF bytes on 0x02 (name), the other 00 00 fe 58 00 00 00 00.

The one giving me all 0xFF on 0x02 (name) also gives me all 0xFF on 0x01 (version) and fan count, the other all 0x00.

Link to comment
Share on other sites

Finally got most things to work (missing LEDs and the huge Mains power sensor block as well as control):

fRnK8xTW4D6.png

 

As we can also deduct from this: The temperature sensor breakage and PSU sensor breakage are a fault of the hardware or firmware (on the Commander Mini).

Link to comment
Share on other sites

We are currently trying to figure out the specifics of the firmware, we already figured out it's saved in an SREC(http://en.wikipedia.org/wiki/SREC_(file_format)) format and unpacked the actual firmware from it.

 

We still need to figure out what exactly is running the firmware before we can start messing with that and fix stuff like the temp sensors not working.

Link to comment
Share on other sites

For now we shifted our focus away from the driver as it's pretty much complete at this stage.

 

Dori is currently implementing a RESTful API, that will allow us to query the driver via browser or whatever, we also hope to implement a proper standalone program that does not require a browser.

 

Here's the full device tree I queried from the API:

 

{
 "Name": "Root Device",
 "Present": true,
 "Valid": true,
 "AbsolutePath": "/",
 "ParentPath": null,
 "Children": [
   {
     "Name": "Corsair Link",
     "Present": true,
     "Valid": true,
     "AbsolutePath": "/CorsairLink",
     "ParentPath": "/",
     "Children": [
       {
         "Name": "Corsair Commander Mini USB",
         "Present": true,
         "Valid": true,
         "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_",
         "ParentPath": "/CorsairLink",
         "Children": [
           {
             "Name": "Corsair Commander Mini",
             "Present": true,
             "Valid": true,
             "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0",
             "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_",
             "Children": [
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 0",
                 "Present": true,
                 "Value": 2759,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 1",
                 "Present": true,
                 "Value": 873,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan1",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 2",
                 "Present": true,
                 "Value": 1248,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan2",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 3",
                 "Present": true,
                 "Value": 882,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan3",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 4",
                 "Present": true,
                 "Value": 860,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan4",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": 94,
                   "RegisteredName": "CorsairLink.FanFixedPercentController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 5",
                 "Present": true,
                 "Value": 831,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorFan5",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 0",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorTemp0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 1",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorTemp1",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 2",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorTemp2",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 3",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorTemp3",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               },
               {
                 "Controller": {
                   "Value": {
                     "R": 255,
                     "G": 2,
                     "B": 39
                   },
                   "RegisteredName": "CorsairLink.LEDSingleColorController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.LEDSingleColorController",
                   "CorsairLink.LEDTwoColorController",
                   "CorsairLink.LEDFourColorController",
                   "CorsairLink.LEDTemperatureController"
                 ],
                 "Color": {
                   "R": 255,
                   "G": 2,
                   "B": 39
                 },
                 "SensorType": "LED",
                 "Unit": "Color",
                 "Name": "LED 0",
                 "Present": true,
                 "Value": 2556671,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0/SensorLED0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel0"
               }
             ]
           },
           {
             "Name": "Corsair PSU AX1200i",
             "Present": true,
             "Valid": true,
             "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1",
             "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_",
             "Children": [
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 0",
                 "Present": true,
                 "Value": 37.5,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorTemp0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Controller": {
                   "RegisteredName": "CorsairLink.FanDefaultController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": false,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 0",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorFan0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PSU 5V",
                 "Present": true,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1",
                 "Children": [
                   {
                     "SensorType": "Current",
                     "Unit": "Ampere",
                     "Name": "Current 0",
                     "Present": true,
                     "Value": 0,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1/SensorCurrent0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1"
                   },
                   {
                     "SensorType": "Power",
                     "Unit": "Watt",
                     "Name": "Power 0",
                     "Present": true,
                     "Value": 0,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1/SensorPower0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1"
                   },
                   {
                     "SensorType": "Voltage",
                     "Unit": "Volt",
                     "Name": "Voltage 0",
                     "Present": true,
                     "Value": 5,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1/SensorVoltage0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain1"
                   }
                 ]
               },
               {
                 "Name": "PSU 3.3V",
                 "Present": true,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1",
                 "Children": [
                   {
                     "SensorType": "Current",
                     "Unit": "Ampere",
                     "Name": "Current 0",
                     "Present": true,
                     "Value": 0,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2/SensorCurrent0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2"
                   },
                   {
                     "SensorType": "Power",
                     "Unit": "Watt",
                     "Name": "Power 0",
                     "Present": true,
                     "Value": 0,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2/SensorPower0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2"
                   },
                   {
                     "SensorType": "Voltage",
                     "Unit": "Volt",
                     "Name": "Voltage 0",
                     "Present": true,
                     "Value": 3.3,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2/SensorVoltage0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain2"
                   }
                 ]
               },
               {
                 "Name": "PCIe 1 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 2 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent1",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 3 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent2",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 4 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent3",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 5 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 7.6,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent4",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 6 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent5",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 7 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent6",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PCIe 8 Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent7",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PSU 12V Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent8",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "PERIPHERAL 12V Current",
                 "SensorType": "Current",
                 "Unit": "Ampere",
                 "Present": true,
                 "Value": 0,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/SensorCurrent9",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1"
               },
               {
                 "Name": "Mains",
                 "Present": true,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1",
                 "Children": [
                   {
                     "SensorType": "Current",
                     "Unit": "Ampere",
                     "Name": "Current 0",
                     "Present": true,
                     "Value": 0.8,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0/SensorCurrent0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0"
                   },
                   {
                     "SensorType": "Power",
                     "Unit": "Watt",
                     "Name": "Power 0",
                     "Present": true,
                     "Value": 153.33360879160318,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0/SensorPower0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0"
                   },
                   {
                     "SensorType": "Voltage",
                     "Unit": "Volt",
                     "Name": "Voltage 0",
                     "Present": true,
                     "Value": 228,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0/SensorVoltage0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0"
                   },
                   {
                     "SensorType": "Power",
                     "Unit": "Watt",
                     "Name": "Power 0",
                     "Present": true,
                     "Value": 153.33360879160318,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0/SensorPower0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0"
                   },
                   {
                     "SensorType": "Efficiency",
                     "Unit": "Percent",
                     "Name": "Efficiency 0",
                     "Present": true,
                     "Value": 89.56402382687102,
                     "Valid": true,
                     "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0/SensorEfficiency0",
                     "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel1/PowerMain0"
                   }
                 ]
               }
             ]
           },
           {
             "Name": "Corsair H100i",
             "Present": true,
             "Valid": true,
             "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2",
             "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_",
             "Children": [
               {
                 "Controller": {
                   "Value": {
                     "Points": [
                       {
                         "X": 25,
                         "Y": 1000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       }
                     ]
                   },
                   "RegisteredName": "CorsairLink.FanCustomCurveController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": true,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 0",
                 "Present": true,
                 "Value": 1248,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2/SensorFan0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2"
               },
               {
                 "Controller": {
                   "Value": {
                     "Points": [
                       {
                         "X": 25,
                         "Y": 1000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       },
                       {
                         "X": 60,
                         "Y": 2000
                       }
                     ]
                   },
                   "RegisteredName": "CorsairLink.FanCustomCurveController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.FanDefaultController",
                   "CorsairLink.FanBalancedModeController",
                   "CorsairLink.FanQuiteModeController",
                   "CorsairLink.FanPerformanceModeController",
                   "CorsairLink.FanCustomCurveController",
                   "CorsairLink.FanFixedRPMController",
                   "CorsairLink.FanFixedPercentController"
                 ],
                 "PWM": true,
                 "SensorType": "Fan",
                 "Unit": "RPM",
                 "Name": "Fan 1",
                 "Present": true,
                 "Value": 1268,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2/SensorFan1",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2"
               },
               {
                 "SensorType": "Pump",
                 "Unit": "RPM",
                 "Name": "Pump 4",
                 "Present": true,
                 "Value": 2261,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2/SensorPump4",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2"
               },
               {
                 "SensorType": "Temperature",
                 "Unit": "DegreeCelsius",
                 "Name": "Temp 0",
                 "Present": true,
                 "Value": 33.265625,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2/SensorTemp0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2"
               },
               {
                 "Controller": {
                   "Value": {
                     "R": 255,
                     "G": 1,
                     "B": 1
                   },
                   "RegisteredName": "CorsairLink.LEDSingleColorController"
                 },
                 "ValidControllerNames": [
                   "CorsairLink.LEDSingleColorController",
                   "CorsairLink.LEDTwoColorController",
                   "CorsairLink.LEDFourColorController",
                   "CorsairLink.LEDTemperatureController"
                 ],
                 "Color": {
                   "R": 255,
                   "G": 1,
                   "B": 1
                 },
                 "SensorType": "LED",
                 "Unit": "Color",
                 "Name": "LED 0",
                 "Present": true,
                 "Value": 66047,
                 "Valid": true,
                 "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2/SensorLED0",
                 "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel2"
               }
             ]
           },
           {
             "Name": "Corsair AirFlow Pro",
             "Present": true,
             "Valid": true,
             "AbsolutePath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_/Channel3",
             "ParentPath": "/CorsairLink/____hid_vid_1b1c_pid_0c04_6_34b03405_0_0000__4d1e55b2-f16f-11cf-88cb-001111000030_"
           }
         ]
       }
     ]
   }
 ]
} 

Link to comment
Share on other sites

I feel we should define and use a mutex to interlock access to the Corsair Link hardware so all our programs can be run at the same time. We should also request that Corsair Link use it.

In SIV (http://rh-software.com/) I have already implemented this and the mutex is called Access_CorsairLink and it is in the global namespace (Global\Access_CorsairLink).

 

From CL 4.2.4.25 Global\CorsairLinkReadWriteGuardMutex should be used to interlock access, see http://forum.corsair.com/forums/showthread.php?p=896054 for the history of locking.

Edited by red-ray
Global\CorsairLinkReadWriteGuardMutex
  • Confused 1
Link to comment
Share on other sites

I feel we should define and use a mutex to interlock access to the Corsair Link hardware so all our programs can be run at the same time. We should also request that Corsair Link use it.

In SIV (http://rh-software.com/) I have already implemented this and the mutex is called Access_CorsairLink and is in the global namespace (GLOBAL\Access_CorsairLink).

 

I also added this Mutex to my app already.

Link to comment
Share on other sites

I'm very grateful for this shining example of community developers. Well done indeed. Thanks to all for the effort!

 

I just wish I could convince someone at Corsair to hand me the firmware source code so I can fix the bugs in there as well, because disassembling it is hard and I am not too experienced in reverse-engineering firmware.

Link to comment
Share on other sites

I just wish I could convince someone at Corsair to hand me the firmware source code so I can fix the bugs in there as well, because disassembling it is hard and I am not too experienced in reverse-engineering firmware.

 

Well, maybe there's a chance of that happening, seeing as there's no competition for this particular product (not that I'm aware of, correct me if I'm wrong). Better yet, why don't they just send it to you, have you fix it, and then pay you for your time :)

  • Like 1
Link to comment
Share on other sites

Thanks, this seems to work well. I hope that someone converts this into a kernel module.

 

I'm taking a preliminary look at it (I don't plan on building the PC which will have the Corsair Link components in it for another month, though). It'd be great to cooperate with the existing guys on here who've hacked stuff together, of course.

Link to comment
Share on other sites

@red-ray what're the chances of switching from HidLibrary (which is heavily Windows-based) to http://www.signal11.us/oss/hidapi/ (which is cross-platform)? The driver and CLI build fine on linux, but obviously don't run due to the hid.dll P/Invokes in HidLibrary

 

red-ray is the maker of SIV. Not CL++. That would be me.

I will try swapping to a more cross-platform library if I can get it wrapped up nicely in a .NET DLL. If you know of any existing wrappers, go ahead and poke me with them!

Link to comment
Share on other sites

Good news everyone: I have swapped CorsairLink++ over to the cross-platform HidSharp library! (It is also faster than HidLibrary)

 

I've reported one obvious problem in HidSharp to the library's author. It'd be nice if it was just on GitHub or something, but never mind.

 

I should be able to take a closer look once my kit actually arrives.

Link to comment
Share on other sites

Has anyone managed to get the Corsair Link Lighting Node to work? I can controll the LEDs in the H100i and CLCC with no issues, but the Lighting Node will not work with the V1.1.09 firmware. It's also reporting three LEDs when there are only two connectors. Typically it's reporting Blue rather than the actual LED colours and writing to it changes nothing.

 

http://rh-software.com/siv_led.png

 

I tried using Corsair Link and it did not even find the Lighting Node.

 

I am looking more and more through Corsair's nightmare of a software.

Well, the Lighting Node has it's entirely own protocol it seems.

Sadly I don't own one so I can't test too much :(

Link to comment
Share on other sites

I have thus far found the following registers,

 

// Device ID 0x39 Lighting Node Registers by deduction

 

#define CNR_BUTTON_1 0x04 // R 1 byte Button 1 State // Range 1 -> 7

#define CNR_BUTTON_2 0x05 // R 1 byte Button 2 State //

 

#define CNR_LIGHTS_1 0x20 // RW 3 bytes Lights 1 RGB // Changed by buttons

#define CNR_LIGHTS_1_R 0x20 // RW 1 byte Lights 1 R // and writable.

#define CNR_LIGHTS_1_G 0x21 // RW 1 byte Lights 1 G // When written button

#define CNR_LIGHTS_1_B 0x22 // RW 1 byte Lights 1 B // goes to zero.

 

#define CNR_LIGHTS_2 0x40 // RW 3 bytes Lights 2 RGB //

#define CNR_LIGHTS_2_R 0x40 // RW 1 byte Lights 2 R //

#define CNR_LIGHTS_2_G 0x41 // RW 1 byte Lights 2 G //

#define CNR_LIGHTS_2_B 0x42 // RW 1 byte Lights 2 B //

Link to comment
Share on other sites


×
×
  • Create New...