[PATCH] HID: sony: add support for Rock Band 2 instruments
STALE222d
From: <hidden>
Date: 2026-02-20 16:50:49
Also in:
lkml
Subsystem:
hid core layer, the rest · Maintainers:
Jiri Kosina, Benjamin Tissoires, Linus Torvalds
From: Brenton Simpson <redacted>
Rock Band 2 for the Nintendo Wii and for the Sony PlayStation 3 use the
same mapping as later games:
Green: SOUTH (A)
Red: EAST (B)
Yellow: NORTH (Y)
Blue: WEST (X)
Orange/pedal: TL (L1)
Solo flag: TL2 (L2)
Tilt: TR (R1)
Pad flag: THUMBL (L3)
Instrument button: MODE (Steam/Xbox)
Whammy bar: ABS_Z (Axis 4)
Effects switch: Z (Axis 5)
As documented at https://github.com/TheNathannator/PlasticBand/blob/main/Docs/.
The guitar and drums both use the same mapping. Tested using the Wii
versions of the instruments.
Signed-off-by: Brenton Simpson <redacted>
---
drivers/hid/hid-ids.h | 8 +++++++-
drivers/hid/hid-sony.c | 45 +++++++++++++++++++++++++++++-------------
2 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 3e299a30dcde..644d3c4df144 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h@@ -664,6 +664,10 @@ #define USB_DEVICE_ID_UGCI_FLYING 0x0020 #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 +#define USB_VENDOR_ID_HARMONIX 0x1bad +#define USB_DEVICE_ID_HARMONIX_WII_RB2_GUITAR_DONGLE 0x3010 +#define USB_DEVICE_ID_HARMONIX_WII_RB2_DRUMS_DONGLE 0x3110 + #define USB_VENDOR_ID_HP 0x03f0 #define USB_PRODUCT_ID_HP_ELITE_PRESENTER_MOUSE_464A 0x464a #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0A4A 0x0a4a
@@ -1299,7 +1303,9 @@ #define USB_VENDOR_ID_SONY_RHYTHM 0x12ba #define USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE_DONGLE 0x074b -#define USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE 0x0100 +#define USB_DEVICE_ID_SONY_PS3_GH_GUITAR_DONGLE 0x0100 +#define USB_DEVICE_ID_SONY_PS3_RB2_GUITAR_DONGLE 0x0200 +#define USB_DEVICE_ID_SONY_PS3_RB2_DRUMS_DONGLE 0x0210 #define USB_VENDOR_ID_SINO_LITE 0x1345 #define USB_DEVICE_ID_SINO_LITE_CONTROLLER 0x3008
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index a89af14e4acc..f6975f6ae882 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c@@ -62,9 +62,10 @@ #define GH_GUITAR_CONTROLLER BIT(14) #define GHL_GUITAR_PS3WIIU BIT(15) #define GHL_GUITAR_PS4 BIT(16) -#define RB4_GUITAR_PS4_USB BIT(17) -#define RB4_GUITAR_PS4_BT BIT(18) -#define RB4_GUITAR_PS5 BIT(19) +#define RB2_INSTRUMENT BIT(17) +#define RB4_GUITAR_PS4_USB BIT(18) +#define RB4_GUITAR_PS4_BT BIT(19) +#define RB4_GUITAR_PS5 BIT(20) #define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT) #define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
@@ -422,12 +423,12 @@ static const unsigned int sixaxis_keymap[] = { [0x11] = BTN_MODE, /* PS */ }; -static const unsigned int rb4_absmap[] = { +static const unsigned int rb_absmap[] = { [0x30] = ABS_X, [0x31] = ABS_Y, }; -static const unsigned int rb4_keymap[] = { +static const unsigned int rb_keymap[] = { [0x1] = BTN_WEST, /* Square */ [0x2] = BTN_SOUTH, /* Cross */ [0x3] = BTN_EAST, /* Circle */
@@ -625,17 +626,17 @@ static int gh_guitar_mapping(struct hid_device *hdev, struct hid_input *hi, return 0; } -static int rb4_guitar_mapping(struct hid_device *hdev, struct hid_input *hi, +static int rb_instrument_mapping(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) { if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { unsigned int key = usage->hid & HID_USAGE; - if (key >= ARRAY_SIZE(rb4_keymap)) + if (key >= ARRAY_SIZE(rb_keymap)) return 0; - key = rb4_keymap[key]; + key = rb_keymap[key]; hid_map_usage_clear(hi, usage, bit, max, EV_KEY, key); return 1; } else if ((usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK) {
@@ -645,10 +646,10 @@ static int rb4_guitar_mapping(struct hid_device *hdev, struct hid_input *hi, if (usage->hid == HID_GD_HATSWITCH) return 0; - if (abs >= ARRAY_SIZE(rb4_absmap)) + if (abs >= ARRAY_SIZE(rb_absmap)) return 0; - abs = rb4_absmap[abs]; + abs = rb_absmap[abs]; hid_map_usage_clear(hi, usage, bit, max, EV_ABS, abs); return 1; }
@@ -1101,11 +1102,14 @@ static int sony_mapping(struct hid_device *hdev, struct hid_input *hi, if (sc->quirks & GH_GUITAR_CONTROLLER) return gh_guitar_mapping(hdev, hi, field, usage, bit, max); + if (sc->quirks & RB2_INSTRUMENT) + return rb_instrument_mapping(hdev, hi, field, usage, bit, max); + if (sc->quirks & (RB4_GUITAR_PS4_USB | RB4_GUITAR_PS4_BT)) - return rb4_guitar_mapping(hdev, hi, field, usage, bit, max); + return rb_instrument_mapping(hdev, hi, field, usage, bit, max); if (sc->quirks & RB4_GUITAR_PS5) - return rb4_guitar_mapping(hdev, hi, field, usage, bit, max); + return rb_instrument_mapping(hdev, hi, field, usage, bit, max); /* Let hid-core decide for the others */ return 0;
@@ -2369,12 +2373,25 @@ static const struct hid_device_id sony_devices[] = { /* Guitar Hero PC Guitar Dongle */ { HID_USB_DEVICE(USB_VENDOR_ID_REDOCTANE, USB_DEVICE_ID_REDOCTANE_GUITAR_DONGLE), .driver_data = GH_GUITAR_CONTROLLER }, - /* Guitar Hero PS3 World Tour Guitar Dongle */ - { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE), + /* Guitar Hero World Tour PS3 Guitar Dongle */ + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_GH_GUITAR_DONGLE), .driver_data = GH_GUITAR_CONTROLLER }, /* Guitar Hero Live PS4 guitar dongles */ { HID_USB_DEVICE(USB_VENDOR_ID_REDOCTANE, USB_DEVICE_ID_REDOCTANE_PS4_GHLIVE_DONGLE), .driver_data = GHL_GUITAR_PS4 | GH_GUITAR_CONTROLLER }, + /* Rock Band 2 instruments + * Nintendo Wii instruments are included in `hid-sony` because `hid-nintendo` + * is for the newer Nintendo Switch, and the Wii instruments use the same + * protocol as their Sony PlayStation 3 cousins. + */ + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB2_GUITAR_DONGLE), + .driver_data = RB2_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_HARMONIX, USB_DEVICE_ID_HARMONIX_WII_RB2_DRUMS_DONGLE), + .driver_data = RB2_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB2_GUITAR_DONGLE), + .driver_data = RB2_INSTRUMENT }, + { HID_USB_DEVICE(USB_VENDOR_ID_SONY_RHYTHM, USB_DEVICE_ID_SONY_PS3_RB2_DRUMS_DONGLE), + .driver_data = RB2_INSTRUMENT }, /* Rock Band 4 PS4 guitars */ { HID_USB_DEVICE(USB_VENDOR_ID_PDP, USB_DEVICE_ID_PDP_PS4_RIFFMASTER), .driver_data = RB4_GUITAR_PS4_USB },
--
2.53.0.414.gf7e9f6c205-goog