From fb4359b009ae10c4c0b5f2d0ff768dbfb461ddcd Mon Sep 17 00:00:00 2001 From: superstrom Date: Wed, 19 Nov 2025 06:32:47 +0000 Subject: [PATCH] Kraken V3: Cleanup and add additional devices from pcaps --- .../RazerController/RazerControllerDetect.cpp | 2 + Controllers/RazerController/RazerDevices.cpp | 72 +++++++++++++ Controllers/RazerController/RazerDevices.h | 2 + .../RGBController_RazerKrakenV3.cpp | 21 +++- .../RGBController_RazerKrakenV3.h | 3 +- .../RazerKrakenV3Controller.cpp | 100 ++++++++++++------ .../RazerKrakenV3Controller.h | 27 ++++- 7 files changed, 191 insertions(+), 36 deletions(-) diff --git a/Controllers/RazerController/RazerControllerDetect.cpp b/Controllers/RazerController/RazerControllerDetect.cpp index 105c1022a..51f0a38c0 100644 --- a/Controllers/RazerController/RazerControllerDetect.cpp +++ b/Controllers/RazerController/RazerControllerDetect.cpp @@ -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); diff --git a/Controllers/RazerController/RazerDevices.cpp b/Controllers/RazerController/RazerDevices.cpp index 5927e2274..237e54ca1 100644 --- a/Controllers/RazerController/RazerDevices.cpp +++ b/Controllers/RazerController/RazerDevices.cpp @@ -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, diff --git a/Controllers/RazerController/RazerDevices.h b/Controllers/RazerController/RazerDevices.h index 7e5d56100..fbe69d449 100644 --- a/Controllers/RazerController/RazerDevices.h +++ b/Controllers/RazerController/RazerDevices.h @@ -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 diff --git a/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.cpp b/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.cpp index 1f8459292..4028c0d53 100644 --- a/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.cpp +++ b/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.cpp @@ -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; } } diff --git a/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.h b/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.h index 1c95f7405..e9763162e 100644 --- a/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.h +++ b/Controllers/RazerController/RazerKrakenV3Controller/RGBController_RazerKrakenV3.h @@ -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 diff --git a/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.cpp b/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.cpp index 0a4a8fc42..b83a5b4d3 100644 --- a/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.cpp +++ b/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.cpp @@ -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 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) diff --git a/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.h b/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.h index 14ea8a164..e67c00ab4 100644 --- a/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.h +++ b/Controllers/RazerController/RazerKrakenV3Controller/RazerKrakenV3Controller.h @@ -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 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);