Kraken V3: Cleanup and add additional devices from pcaps

This commit is contained in:
superstrom
2025-11-19 06:32:47 +00:00
committed by Adam Honse
parent 769d433373
commit fb4359b009
7 changed files with 191 additions and 36 deletions

View File

@@ -389,7 +389,9 @@ REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Edition", Det
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Black Edition", DetectRazerControllers, RAZER_VID, RAZER_KRAKEN_KITTY_BLACK_EDITION_PID, 0x01, 0x01, 0x03);
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Black Edition V2", DetectRazerKrakenControllers, RAZER_VID, RAZER_KRAKEN_KITTY_BLACK_EDITION_V2_PID, 0x03, 0x0C, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken Ultimate", DetectRazerKrakenControllers, RAZER_VID, RAZER_KRAKEN_ULTIMATE_PID, 0x03, 0x0C, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3 HyperSense", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_HYPERSENSE_PID, 0x03, 0x0C, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3 X", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_X_PID, 0x03, 0x0C, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_PID, 0x03, 0x0C, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken V4 (Wired)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_V4_WIRED_PID, 0x05, 0xFF14, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken V4 (Wireless)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_V4_WIRELESS_PID, 0x05, 0xFF14, 0x01);
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty V3 Pro (Wired)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_KITTY_V3_PRO_WIRED_PID, 0x05, 0xFF14, 0x01);

View File

@@ -7736,6 +7736,41 @@ static const razer_device kraken_kitty_black_v2_device =
NULL
};
/*-------------------------------------------------------------*\
| Razer Kraken V3 HyperSense 1532:0533 |
| |
| Zone "Headset" |
| Single |
| 1 LED |
\*-------------------------------------------------------------*/
static const razer_zone kraken_v3_hs_zone =
{
"Headset",
ZONE_TYPE_SINGLE,
1,
1
};
static const razer_device kraken_v3_hs_device =
{
"Razer Kraken V3 HyperSense",
RAZER_KRAKEN_V3_HYPERSENSE_PID,
DEVICE_TYPE_HEADSET,
RAZER_MATRIX_TYPE_NONE,
0,
1,
1,
{
&kraken_v3_hs_zone,
NULL,
NULL,
NULL,
NULL,
NULL
},
NULL
};
/*-------------------------------------------------------------*\
| Razer Kraken V3 X 1532:0537 |
| |
@@ -7771,6 +7806,41 @@ static const razer_device kraken_v3_x_device =
NULL
};
/*-------------------------------------------------------------*\
| Razer Kraken V3 1532:0549 |
| |
| Zone "Headset" |
| Single |
| 1 LED |
\*-------------------------------------------------------------*/
static const razer_zone kraken_v3_zone =
{
"Headset",
ZONE_TYPE_SINGLE,
1,
1
};
static const razer_device kraken_v3_device =
{
"Razer Kraken V3",
RAZER_KRAKEN_V3_PID,
DEVICE_TYPE_HEADSET,
RAZER_MATRIX_TYPE_NONE,
0,
1,
1,
{
&kraken_v3_zone,
NULL,
NULL,
NULL,
NULL,
NULL
},
NULL
};
/*-------------------------------------------------------------*\
| Razer Kraken V4 Wired 1532:056B |
| |
@@ -9112,7 +9182,9 @@ const razer_device* razer_device_list[] =
&kraken_ultimate_device,
&kraken_kitty_device,
&kraken_kitty_black_v2_device,
&kraken_v3_hs_device,
&kraken_v3_x_device,
&kraken_v3_device,
&kraken_v4_wired_device,
&kraken_v4_wireless_device,
&kraken_kitty_v3_pro_wired_device,

View File

@@ -225,7 +225,9 @@
#define RAZER_KRAKEN_ULTIMATE_PID 0x0527
#define RAZER_KRAKEN_V2_PID 0x0510
#define RAZER_KRAKEN_KITTY_BLACK_EDITION_V2_PID 0x0560
#define RAZER_KRAKEN_V3_HYPERSENSE_PID 0x0533
#define RAZER_KRAKEN_V3_X_PID 0x0537
#define RAZER_KRAKEN_V3_PID 0x0549
#define RAZER_KRAKEN_V4_WIRED_PID 0x056B
#define RAZER_KRAKEN_V4_WIRELESS_PID 0x056C
#define RAZER_KRAKEN_KITTY_V3_PRO_WIRED_PID 0x0587

View File

@@ -1,7 +1,7 @@
/*---------------------------------------------------------*\
| RGBController_RazerKrakenV3.cpp |
| |
| RGBController for Razer devices with 9-byte report |
| RGBController for Razer devices with 13-byte reports |
| |
| Greg Sandstrom (superstrom) 1 Nov 2025 |
| |
@@ -51,6 +51,20 @@ RGBController_RazerKrakenV3::RGBController_RazerKrakenV3(RazerKrakenV3Controller
Direct.brightness = max_brightness;
modes.push_back(Direct);
// V3 X does not support this mode.
if(device_list[controller->GetDeviceIndex()]->pid == RAZER_KRAKEN_V3_HYPERSENSE_PID)
{
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = RAZER_KRAKEN_V3_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.colors_min = 1;
Breathing.colors_max = 2;
Breathing.colors.resize(1);
modes.push_back(Breathing);
}
SetupZones();
}
@@ -166,5 +180,10 @@ void RGBController_RazerKrakenV3::DeviceUpdateMode()
controller->SetModeWave();
controller->SetBrightness(modes[active_mode].brightness);
break;
case RAZER_KRAKEN_V3_MODE_BREATHING:
controller->SetModeBreathing(modes[active_mode].colors);
controller->SetBrightness(modes[active_mode].brightness);
break;
}
}

View File

@@ -1,7 +1,7 @@
/*---------------------------------------------------------*\
| RGBController_RazerKrakenV3.h |
| |
| RGBController for Razer devices with 9-byte report |
| RGBController for Razer devices with 13-byte reports |
| |
| Greg Sandstrom (superstrom) 1 Nov 2025 |
| |
@@ -18,6 +18,7 @@ enum
{
RAZER_KRAKEN_V3_MODE_DIRECT,
RAZER_KRAKEN_V3_MODE_WAVE,
RAZER_KRAKEN_V3_MODE_BREATHING,
};
class RGBController_RazerKrakenV3 : public RGBController

View File

@@ -1,7 +1,7 @@
/*---------------------------------------------------------*\
| RazerKrakenV3Controller.cpp |
| |
| Driver for Razer devices with 9-byte report |
| Driver for Razer devices with 13-byte reports |
| |
| Greg Sandstrom (superstrom) 1 Nov 2025 |
| |
@@ -92,74 +92,108 @@ unsigned char RazerKrakenV3Controller::GetMaxBrightness()
void RazerKrakenV3Controller::SetModeDirect()
{
unsigned char usb_buf[9];
memset(usb_buf, 0, sizeof(usb_buf));
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
// 0 1 2 3 4 5 6 7 8
// 4001000f0800000000
usb_buf[0] = 0x40;
usb_buf[1] = 0x01;
usb_buf[3] = 0x0F;
usb_buf[4] = 0x08;
// 40010000080000000000000000
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
report.arguments[1] = 0x0F;
report.arguments[2] = RAZER_KRAKEN_V3_MODE_ID_DIRECT;
hid_write(dev, usb_buf, sizeof(usb_buf));
hid_write(dev, (unsigned char*)&report, sizeof(report));
}
void RazerKrakenV3Controller::SetDirect(RGBColor* colors)
{
unsigned char usb_buf[9];
memset(usb_buf, 0, sizeof(usb_buf));
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
// how to get the number of leds?
unsigned int led_count = device_list[device_index]->cols;
// 0 1 2 3 4 5 6 7 8
// 400300ffffff000000
usb_buf[0] = 0x40;
usb_buf[1] = 0x03;
// 400300ffffff00000000000000
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_COLOR;
for(unsigned int led_idx = 0; led_idx < led_count; led_idx++)
{
usb_buf[3 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
usb_buf[4 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
usb_buf[5 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
report.arguments[1 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
report.arguments[2 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
report.arguments[3 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
}
hid_write(dev, usb_buf, sizeof(usb_buf));
hid_write(dev, (unsigned char*)&report, sizeof(report));
}
void RazerKrakenV3Controller::SetBrightness(unsigned char brightness)
{
unsigned char usb_buf[24];
memset(usb_buf, 0, sizeof(usb_buf));
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
// 0 1 2 3 4 5 6 7 8
// 40020000ff00000000
usb_buf[0] = 0x40;
usb_buf[1] = 0x02;
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_BRIGHTNESS;
usb_buf[4] = brightness;
report.arguments[2] = brightness;
hid_write(dev, usb_buf, sizeof(usb_buf));
hid_write(dev, (unsigned char*)&report, sizeof(report));
}
void RazerKrakenV3Controller::SetModeWave()
{
unsigned char usb_buf[9];
memset(usb_buf, 0, sizeof(usb_buf));
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
// 0 1 2 3 4 5 6 7 8
// 4001000f0300000000
usb_buf[0] = 0x40;
usb_buf[1] = 0x01;
usb_buf[3] = 0x0F;
usb_buf[4] = 0x03;
// 40010100030000000000000000
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
report.arguments[1] = 0x0F;
report.arguments[2] = RAZER_KRAKEN_V3_MODE_ID_WAVE;
hid_write(dev, usb_buf, sizeof(usb_buf));
hid_write(dev, (unsigned char*)&report, sizeof(report));
}
void RazerKrakenV3Controller::SetModeBreathing(std::vector<RGBColor> colors)
{
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
unsigned char led_count = colors.size();
// 0 1 2 3 4 5 6 7 8 9 0 1 2
// 400101000101ff000000000000
// 40010100010100ffff00000000
// 40010100020200ff00ff000000
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
report.arguments[0] = 0x01;
report.arguments[2] = led_count; // normally this is where the MODE_ID goes....
report.arguments[3] = led_count;
for(unsigned int led_idx = 0; led_idx < led_count; led_idx++)
{
report.arguments[4 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
report.arguments[5 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
report.arguments[6 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
}
hid_write(dev, (unsigned char*)&report, sizeof(report));
}
razer_kraken_v3_request_report RazerKrakenV3Controller::razer_kraken_create_v3_report()
{
razer_kraken_v3_request_report new_report;
/*---------------------------------------------------------*\
| Zero out the new report |
\*---------------------------------------------------------*/
memset(&new_report, 0, sizeof(razer_kraken_v3_request_report));
new_report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
return new_report;
}
razer_kraken_request_report RazerKrakenV3Controller::razer_kraken_create_report(unsigned char report_id, unsigned char destination, unsigned char length, unsigned short address)

View File

@@ -1,7 +1,7 @@
/*---------------------------------------------------------*\
| RazerKrakenV3Controller.h |
| |
| Driver for Razer devices with 9-byte report |
| Driver for Razer devices with 13-byte reports |
| |
| Greg Sandstrom (superstrom) 1 Nov 2025 |
| |
@@ -16,6 +16,28 @@
#include "DeviceGuardManager.h"
#include "RazerKrakenController.h"
#define RAZER_KRAKEN_V3_REPORT_ID 0x40
enum
{
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE = 0x01,
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_BRIGHTNESS = 0x02,
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_COLOR = 0x03,
};
enum
{
RAZER_KRAKEN_V3_MODE_ID_DIRECT = 0x08,
RAZER_KRAKEN_V3_MODE_ID_WAVE = 0x03,
};
PACK(struct razer_kraken_v3_request_report
{
unsigned char report_id; // usb_buf[0]
unsigned char command_id; // usb_buf[1]
unsigned char arguments[11]; // usb_buf[2...]
});
class RazerKrakenV3Controller
{
public:
@@ -35,6 +57,7 @@ public:
void SetModeDirect();
void SetModeWave();
void SetModeBreathing(std::vector<RGBColor> colors);
private:
hid_device* dev;
@@ -75,6 +98,8 @@ private:
std::string razer_get_firmware();
std::string razer_get_serial();
razer_kraken_v3_request_report razer_kraken_create_v3_report();
razer_kraken_request_report razer_kraken_create_report(unsigned char report_id, unsigned char destination, unsigned char length, unsigned short address);
int razer_usb_receive(razer_kraken_response_report* report);
int razer_usb_send(razer_kraken_request_report* report);