drivers/hid/hid-input.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
This patch increases the limit from 80 to 112 key codes.
If a joystick has 80 or fewer buttons, mapping stays the same.
If a joystick has more than 80 buttons:
Map buttons [ 0 .. 15 ] to key codes starting with BTN_JOYSTICK;
Map buttons [ 16 .. 47 ] to key codes starting with KEY_MACRO1;
Map buttons [ 48 .. 111 ] to key codes starting with BTN_TRIGGER_HAPPY.
Signed-off-by: Ivan Gorinov <linux-kernel@altimeter.info>
---
drivers/hid/hid-input.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 2633fcd8f910..c6159f96de04 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -763,7 +763,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
if (code <= 0xf)
code += BTN_JOYSTICK;
else
- code += BTN_TRIGGER_HAPPY - 0x10;
+ if (field->maxusage <= 80)
+ code += BTN_TRIGGER_HAPPY - 0x10;
+ else
+ if (code <= 0x2f)
+ code += KEY_MACRO1 - 0x10;
+ else
+ code += BTN_TRIGGER_HAPPY - 0x30;
break;
case HID_GD_GAMEPAD:
if (code <= 0xf)
--
2.43.0
On Sat, 2025-12-20 at 19:41 +0000, Ivan Gorinov wrote: > This patch increases the limit from 80 to 112 key codes. > > If a joystick has 80 or fewer buttons, mapping stays the same. > > If a joystick has more than 80 buttons: > > Map buttons [ 0 .. 15 ] to key codes starting with BTN_JOYSTICK; > Map buttons [ 16 .. 47 ] to key codes starting with KEY_MACRO1; > Map buttons [ 48 .. 111 ] to key codes starting with BTN_TRIGGER_HAPPY. > > Signed-off-by: Ivan Gorinov <linux-kernel@altimeter.info> > --- > drivers/hid/hid-input.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c > index 2633fcd8f910..c6159f96de04 100644 > --- a/drivers/hid/hid-input.c > +++ b/drivers/hid/hid-input.c > @@ -763,7 +763,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel > if (code <= 0xf) > code += BTN_JOYSTICK; > else > - code += BTN_TRIGGER_HAPPY - 0x10; > + if (field->maxusage <= 80) > + code += BTN_TRIGGER_HAPPY - 0x10; > + else > + if (code <= 0x2f) > + code += KEY_MACRO1 - 0x10; > + else > + code += BTN_TRIGGER_HAPPY - 0x30; > break; > case HID_GD_GAMEPAD: > if (code <= 0xf) As stated previously by Dmitry when I tried to increase the KEY_MAX for the same reason, the defined usages have their place and shouldn't be misused. I finally understood that and I have to say that this is just more confusing and a dirty hack, certainly used by some drivers because it still works with SDL and Wine (they only care about the usage index). I'm working on a proper solution with a new event type that will only send button number (starting from 1 as does plain HID) and it's value. This will support up to 65535 (u16) buttons and should be enough for years to come :D I'll make sure to CC you when I'll send RFC.
On Sat, Jan 03, 2026 at 08:26:55PM +0100, tomasz.pakula.oficjalny@gmail.com wrote: > On Sat, 2025-12-20 at 19:41 +0000, Ivan Gorinov wrote: > > This patch increases the limit from 80 to 112 key codes. > > > > If a joystick has 80 or fewer buttons, mapping stays the same. > > > > If a joystick has more than 80 buttons: > > > > Map buttons [ 0 .. 15 ] to key codes starting with BTN_JOYSTICK; > > Map buttons [ 16 .. 47 ] to key codes starting with KEY_MACRO1; > > Map buttons [ 48 .. 111 ] to key codes starting with BTN_TRIGGER_HAPPY. > > > > As stated previously by Dmitry when I tried to increase the KEY_MAX for > the same reason, the defined usages have their place and shouldn't be > misused. I finally understood that and I have to say that this is just > more confusing and a dirty hack, certainly used by some drivers because > it still works with SDL and Wine (they only care about the usage index). > > I'm working on a proper solution with a new event type that will only > send button number (starting from 1 as does plain HID) and it's value. > > This will support up to 65535 (u16) buttons and should be enough for > years to come :D I'll make sure to CC you when I'll send RFC. Thank you! I learned how to map more than 80 buttons by overriding function hid_driver.input_mapping from your contribution to JacKeTUs/universal-pdiff and used the same idea in my recent changes in the hid-winwing module. Good luck in your work on new event type! I will test your changes with my Orion2/TGRIP-18 combo. Meanwhile, this patch could allow existing software (for example, X-Plane 12) to work with more input devices without any changes in userspace.
© 2016 - 2026 Red Hat, Inc.