Re: [PATCH v1] HID: rakk: add support for Rakk Dasig X side buttons

From: Terry Junge

Date: Tue Mar 17 2026 - 16:57:34 EST




On 2/25/26 7:56 AM, Karl Cayme wrote:
> The Rakk Dasig X gaming mouse has a faulty HID report descriptor that
> declares USAGE_MAXIMUM=3 (buttons 1-3) while actually sending 5 button
> bits (REPORT_COUNT=5). This causes the kernel to ignore side buttons
> (buttons 4 and 5).
>
> Fix by patching the descriptor to set USAGE_MAXIMUM=5 in the
> report_fixup callback.
>
> The mouse uses Telink vendor ID 0x248a with three product IDs for USB
> direct (0xfb01), wireless dongle (0xfa02), and Bluetooth (0x8266)
> connection modes. All three variants have the same bug at byte offset 17.
>
> Signed-off-by: Karl Cayme <kcayme@xxxxxxxxx>
> ---
> drivers/hid/Kconfig | 8 +++++
> drivers/hid/Makefile | 1 +
> drivers/hid/hid-ids.h | 5 +++
> drivers/hid/hid-rakk.c | 72 ++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 86 insertions(+)
> create mode 100644 drivers/hid/hid-rakk.c
>
> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
> index c1d9f7c6a5f2..930ea0773169 100644
> --- a/drivers/hid/Kconfig
> +++ b/drivers/hid/Kconfig
> @@ -755,6 +755,14 @@ config HID_MEGAWORLD_FF
> Say Y here if you have a Mega World based game controller and want
> to have force feedback support for it.
>
> +config HID_RAKK
> + tristate "Rakk support"
> + help
> + Support for Rakk gaming peripherals.
> +
> + Fixes the HID report descriptor of the Rakk Dasig X mouse,
> + which declares only 3 buttons instead of 5.
> +
> config HID_REDRAGON
> tristate "Redragon keyboards"
> default !EXPERT
> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index e01838239ae6..7800613f5b2b 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -113,6 +113,7 @@ obj-$(CONFIG_HID_PLANTRONICS) += hid-plantronics.o
> obj-$(CONFIG_HID_PLAYSTATION) += hid-playstation.o
> obj-$(CONFIG_HID_PRIMAX) += hid-primax.o
> obj-$(CONFIG_HID_PXRC) += hid-pxrc.o
> +obj-$(CONFIG_HID_RAKK) += hid-rakk.o
> obj-$(CONFIG_HID_RAPOO) += hid-rapoo.o
> obj-$(CONFIG_HID_RAZER) += hid-razer.o
> obj-$(CONFIG_HID_REDRAGON) += hid-redragon.o
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 3e299a30dcde..68fab837e8b3 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -1369,6 +1369,11 @@
> #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_017 0x73f6
> #define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5 0x81a7
>
> +#define USB_VENDOR_ID_TELINK 0x248a
> +#define USB_DEVICE_ID_TELINK_RAKK_DASIG_X 0xfb01
> +#define USB_DEVICE_ID_TELINK_RAKK_DASIG_X_DONGLE 0xfa02
> +#define USB_DEVICE_ID_TELINK_RAKK_DASIG_X_BT 0x8266
> +
> #define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047
> #define USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA 0x0855
>
> diff --git a/drivers/hid/hid-rakk.c b/drivers/hid/hid-rakk.c
> new file mode 100644
> index 000000000000..c2b969ce7259
> --- /dev/null
> +++ b/drivers/hid/hid-rakk.c
> @@ -0,0 +1,72 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * HID driver for Rakk devices
> + *
> + * Copyright (c) 2025 Karl Cayme
> + *
> + * The Rakk Dasig X gaming mouse has a faulty HID report descriptor that
> + * declares USAGE_MAXIMUM = 3 (buttons 1-3) while actually sending 5 button
> + * bits (REPORT_COUNT = 5). This causes the kernel to ignore side buttons
> + * (buttons 4 and 5). This driver fixes the descriptor so all 5 buttons
> + * are properly recognized across 3 modes (wired, dongle, and Bluetooth).
> + */
> +
> +#include <linux/device.h>
> +#include <linux/hid.h>
> +#include <linux/module.h>
> +#include "hid-ids.h"
> +
> +/*
> + * The faulty byte is at offset 17 in the report descriptor for all three
> + * connection modes (USB direct, wireless dongle, and Bluetooth).
> + *
> + * Bytes 16-17 are: 0x29 0x03 (USAGE_MAXIMUM = 3)
> + * The fix changes byte 17 to 0x05 (USAGE_MAXIMUM = 5).
> + *
> + * Original descriptor bytes 0-17:
> + * 05 01 09 02 a1 01 85 01 09 01 a1 00 05 09 19 01 29 03
> + * ^^
> + * Should be 0x05 to declare 5 buttons instead of 3.
> + */
> +#define RAKK_RDESC_USAGE_MAX_OFFSET 17
> +#define RAKK_RDESC_USAGE_MAX_ORIG 0x03
> +#define RAKK_RDESC_USAGE_MAX_FIXED 0x05
> +#define RAKK_RDESC_USB_SIZE 193
> +#define RAKK_RDESC_DONGLE_SIZE 150
> +#define RAKK_RDESC_BT_SIZE 89
> +
> +static const __u8 *rakk_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> + unsigned int *rsize)
> +{
> + if ((*rsize == RAKK_RDESC_USB_SIZE ||
> + *rsize == RAKK_RDESC_DONGLE_SIZE ||
> + *rsize == RAKK_RDESC_BT_SIZE) &&

These should be checking the PID to match with its size.

((*rsize == USB size && PID == USB PID) ||
(*rsize == DONGLE size && PID == DONGLE PID) ||
(*rsize == BT size && PID == BT PID)) &&

Thanks,
Terry

> + rdesc[RAKK_RDESC_USAGE_MAX_OFFSET] == RAKK_RDESC_USAGE_MAX_ORIG) {
> + hid_info(hdev, "fixing Rakk Dasig X button count (3 -> 5)\n");
> + rdesc[RAKK_RDESC_USAGE_MAX_OFFSET] = RAKK_RDESC_USAGE_MAX_FIXED;
> + }
> +
> + return rdesc;
> +}
> +
> +static const struct hid_device_id rakk_devices[] = {
> + { HID_USB_DEVICE(USB_VENDOR_ID_TELINK,
> + USB_DEVICE_ID_TELINK_RAKK_DASIG_X) },
> + { HID_USB_DEVICE(USB_VENDOR_ID_TELINK,
> + USB_DEVICE_ID_TELINK_RAKK_DASIG_X_DONGLE) },
> + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TELINK,
> + USB_DEVICE_ID_TELINK_RAKK_DASIG_X_BT) },
> + { }
> +};
> +MODULE_DEVICE_TABLE(hid, rakk_devices);
> +
> +static struct hid_driver rakk_driver = {
> + .name = "rakk",
> + .id_table = rakk_devices,
> + .report_fixup = rakk_report_fixup,
> +};
> +module_hid_driver(rakk_driver);
> +
> +MODULE_DESCRIPTION("HID driver for Rakk Dasig X mouse - fix side button support");
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Karl Cayme");