From f20686b2965b9a650cd6edb5956d1f8e5fdcd17e Mon Sep 17 00:00:00 2001 From: Matt Coffin Date: Sat, 4 Feb 2023 16:25:12 -0700 Subject: [PATCH] steelseries: add support for Rival 650 Wireless --- .../steelseries-rival-650-wireless.device | 13 +++++++++++++ src/driver-steelseries.c | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 data/devices/steelseries-rival-650-wireless.device diff --git a/data/devices/steelseries-rival-650-wireless.device b/data/devices/steelseries-rival-650-wireless.device new file mode 100644 index 00000000..16d5f306 --- /dev/null +++ b/data/devices/steelseries-rival-650-wireless.device @@ -0,0 +1,13 @@ +[Device] +# Wired mode; 2.4 Ghz wireless mode. +DeviceMatch=usb:1038:172b;usb:1038:1726 +DeviceType=mouse +Driver=steelseries +Name=SteelSeries Rival 650 Wireless + +[Driver/steelseries] +Buttons=0 +DeviceVersion=4 +DpiRange=100:12000@100 +Leds=0 +MacroLength=0 diff --git a/src/driver-steelseries.c b/src/driver-steelseries.c index 3102c10e..dbfe8a07 100644 --- a/src/driver-steelseries.c +++ b/src/driver-steelseries.c @@ -74,6 +74,9 @@ #define STEELSERIES_ID_FIRMWARE_PROTOCOL3 0x10 #define STEELSERIES_ID_SETTINGS_PROTOCOL3 0x16 +#define STEELSERIES_ID_DPI_PROTOCOL4 0x15 +#define STEELSERIES_ID_REPORT_RATE_PROTOCOL4 0x17 + #define STEELSERIES_BUTTON_OFF 0x00 #define STEELSERIES_BUTTON_RES_CYCLE 0x30 #define STEELSERIES_BUTTON_WHEEL_UP 0x31 @@ -219,6 +222,7 @@ steelseries_get_firmware_version(struct ratbag_device *device, int *major_out, i msg.msg.parameters[0] = STEELSERIES_ID_FIRMWARE_PROTOCOL3; msg_len = STEELSERIES_REPORT_SIZE; break; + case 4: default: return -ENOTSUP; } @@ -265,7 +269,6 @@ steelseries_read_settings(struct ratbag_device *device) case 3: msg.msg.parameters[0] = STEELSERIES_ID_SETTINGS_PROTOCOL3; break; - case 1: default: return -ENOTSUP; } @@ -483,6 +486,12 @@ steelseries_write_dpi(struct ratbag_resolution *resolution) msg.msg.parameters[3] = resolution->dpi_x / dpirange->step - 1; msg.msg.parameters[5] = 0x42; /* not sure if needed */ break; + case 4: + buf_len = STEELSERIES_REPORT_SIZE; + msg.msg.parameters[0] = STEELSERIES_ID_DPI_PROTOCOL4; + msg.msg.parameters[1] = resolution->index + 1; + msg.msg.parameters[2] = resolution->dpi_x / dpirange->step - 1; + break; default: return -ENOTSUP; } @@ -510,6 +519,7 @@ steelseries_write_report_rate(struct ratbag_profile *profile) }; switch (device_version) { + case 4: case 1: if (profile->hz >= 1000) { profile->hz = 1000; @@ -526,7 +536,7 @@ steelseries_write_report_rate(struct ratbag_profile *profile) } buf_len = STEELSERIES_REPORT_SIZE_SHORT; - msg.msg.parameters[0] = STEELSERIES_ID_REPORT_RATE_SHORT; + msg.msg.parameters[0] = device_version == 1 ? STEELSERIES_ID_REPORT_RATE_SHORT : STEELSERIES_ID_REPORT_RATE_PROTOCOL4; msg.msg.parameters[2] = reported_rate; break; case 2: @@ -980,7 +990,7 @@ steelseries_write_save(struct ratbag_device *device) } else if (device_version == 2) { buf_len = STEELSERIES_REPORT_SIZE; msg.msg.parameters[0] = STEELSERIES_ID_SAVE; - } else if (device_version == 3) { + } else if (device_version == 3 || device_version == 4) { buf_len = STEELSERIES_REPORT_SIZE; msg.msg.parameters[0] = STEELSERIES_ID_SAVE_PROTOCOL3; } else {