77
77
* xbox d-pads should map to buttons, as is required for DDR pads
78
78
* but we map them to axes when possible to simplify things
79
79
*/
80
- #define MAP_DPAD_TO_BUTTONS (1 << 0)
81
- #define MAP_TRIGGERS_TO_BUTTONS (1 << 1)
82
- #define MAP_STICKS_TO_NULL (1 << 2)
83
- #define MAP_SELECT_BUTTON (1 << 3)
84
- #define MAP_PADDLES (1 << 4)
85
- #define MAP_PROFILE_BUTTON (1 << 5)
80
+ #define MAP_DPAD_TO_BUTTONS BIT(0)
81
+ #define MAP_TRIGGERS_TO_BUTTONS BIT(1)
82
+ #define MAP_STICKS_TO_NULL BIT(2)
83
+ #define MAP_SHARE_BUTTON BIT(3)
84
+ #define MAP_PADDLES BIT(4)
85
+ #define MAP_PROFILE_BUTTON BIT(5)
86
+ #define MAP_SHARE_OFFSET BIT(6)
86
87
87
88
#define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \
88
89
MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
@@ -135,14 +136,14 @@ static const struct xpad_device {
135
136
{ 0x03f0 , 0x048D , "HyperX Clutch" , 0 , XTYPE_XBOX360 }, /* wireless */
136
137
{ 0x03f0 , 0x0495 , "HyperX Clutch Gladiate" , 0 , XTYPE_XBOXONE },
137
138
{ 0x03f0 , 0x07A0 , "HyperX Clutch Gladiate RGB" , 0 , XTYPE_XBOXONE },
138
- { 0x03f0 , 0x08B6 , "HyperX Clutch Gladiate" , 0 , XTYPE_XBOXONE }, /* v2 */
139
+ { 0x03f0 , 0x08B6 , "HyperX Clutch Gladiate" , MAP_SHARE_BUTTON , XTYPE_XBOXONE }, /* v2 */
139
140
{ 0x03f0 , 0x09B4 , "HyperX Clutch Tanto" , 0 , XTYPE_XBOXONE },
140
141
{ 0x044f , 0x0f00 , "Thrustmaster Wheel" , 0 , XTYPE_XBOX },
141
142
{ 0x044f , 0x0f03 , "Thrustmaster Wheel" , 0 , XTYPE_XBOX },
142
143
{ 0x044f , 0x0f07 , "Thrustmaster, Inc. Controller" , 0 , XTYPE_XBOX },
143
- { 0x044f , 0xd01e , "ThrustMaster, Inc. ESWAP X 2 ELDEN RING EDITION" , 0 , XTYPE_XBOXONE },
144
144
{ 0x044f , 0x0f10 , "Thrustmaster Modena GT Wheel" , 0 , XTYPE_XBOX },
145
145
{ 0x044f , 0xb326 , "Thrustmaster Gamepad GP XID" , 0 , XTYPE_XBOX360 },
146
+ { 0x044f , 0xd01e , "ThrustMaster, Inc. ESWAP X 2 ELDEN RING EDITION" , 0 , XTYPE_XBOXONE },
146
147
{ 0x045e , 0x0202 , "Microsoft X-Box pad v1 (US)" , 0 , XTYPE_XBOX },
147
148
{ 0x045e , 0x0285 , "Microsoft X-Box pad (Japan)" , 0 , XTYPE_XBOX },
148
149
{ 0x045e , 0x0287 , "Microsoft Xbox Controller S" , 0 , XTYPE_XBOX },
@@ -159,7 +160,7 @@ static const struct xpad_device {
159
160
{ 0x045e , 0x0719 , "Xbox 360 Wireless Receiver" , MAP_DPAD_TO_BUTTONS , XTYPE_XBOX360W },
160
161
{ 0x045e , 0x0b00 , "Microsoft X-Box One Elite 2 pad" , MAP_PADDLES , XTYPE_XBOXONE },
161
162
{ 0x045e , 0x0b0a , "Microsoft X-Box Adaptive Controller" , MAP_PROFILE_BUTTON , XTYPE_XBOXONE },
162
- { 0x045e , 0x0b12 , "Microsoft Xbox Series S|X Controller" , MAP_SELECT_BUTTON , XTYPE_XBOXONE },
163
+ { 0x045e , 0x0b12 , "Microsoft Xbox Series S|X Controller" , MAP_SHARE_BUTTON | MAP_SHARE_OFFSET , XTYPE_XBOXONE },
163
164
{ 0x046d , 0xc21d , "Logitech Gamepad F310" , 0 , XTYPE_XBOX360 },
164
165
{ 0x046d , 0xc21e , "Logitech Gamepad F510" , 0 , XTYPE_XBOX360 },
165
166
{ 0x046d , 0xc21f , "Logitech Gamepad F710" , 0 , XTYPE_XBOX360 },
@@ -205,13 +206,13 @@ static const struct xpad_device {
205
206
{ 0x0738 , 0x9871 , "Mad Catz Portable Drum" , 0 , XTYPE_XBOX360 },
206
207
{ 0x0738 , 0xb726 , "Mad Catz Xbox controller - MW2" , 0 , XTYPE_XBOX360 },
207
208
{ 0x0738 , 0xb738 , "Mad Catz MVC2TE Stick 2" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOX360 },
208
- { 0x0738 , 0xbeef , "Mad Catz JOYTECH NEO SE Advanced GamePad" , XTYPE_XBOX360 },
209
+ { 0x0738 , 0xbeef , "Mad Catz JOYTECH NEO SE Advanced GamePad" , 0 , XTYPE_XBOX360 },
209
210
{ 0x0738 , 0xcb02 , "Saitek Cyborg Rumble Pad - PC/Xbox 360" , 0 , XTYPE_XBOX360 },
210
211
{ 0x0738 , 0xcb03 , "Saitek P3200 Rumble Pad - PC/Xbox 360" , 0 , XTYPE_XBOX360 },
211
212
{ 0x0738 , 0xcb29 , "Saitek Aviator Stick AV8R02" , 0 , XTYPE_XBOX360 },
212
213
{ 0x0738 , 0xf738 , "Super SFIV FightStick TE S" , 0 , XTYPE_XBOX360 },
213
214
{ 0x07ff , 0xffff , "Mad Catz GamePad" , 0 , XTYPE_XBOX360 },
214
- { 0x0b05 , 0x1a38 , "ASUS ROG RAIKIRI" , 0 , XTYPE_XBOXONE },
215
+ { 0x0b05 , 0x1a38 , "ASUS ROG RAIKIRI" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
215
216
{ 0x0b05 , 0x1abb , "ASUS ROG RAIKIRI PRO" , 0 , XTYPE_XBOXONE },
216
217
{ 0x0c12 , 0x0005 , "Intec wireless" , 0 , XTYPE_XBOX },
217
218
{ 0x0c12 , 0x8801 , "Nyko Xbox Controller" , 0 , XTYPE_XBOX },
@@ -240,7 +241,7 @@ static const struct xpad_device {
240
241
{ 0x0e6f , 0x0146 , "Rock Candy Wired Controller for Xbox One" , 0 , XTYPE_XBOXONE },
241
242
{ 0x0e6f , 0x0147 , "PDP Marvel Xbox One Controller" , 0 , XTYPE_XBOXONE },
242
243
{ 0x0e6f , 0x015c , "PDP Xbox One Arcade Stick" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOXONE },
243
- { 0x0e6f , 0x015d , "PDP Mirror's Edge Official Wired Controller for Xbox One" , XTYPE_XBOXONE },
244
+ { 0x0e6f , 0x015d , "PDP Mirror's Edge Official Wired Controller for Xbox One" , 0 , XTYPE_XBOXONE },
244
245
{ 0x0e6f , 0x0161 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
245
246
{ 0x0e6f , 0x0162 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
246
247
{ 0x0e6f , 0x0163 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
@@ -281,6 +282,7 @@ static const struct xpad_device {
281
282
{ 0x0f0d , 0x00dc , "HORIPAD FPS for Nintendo Switch" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOX360 },
282
283
{ 0x0f0d , 0x0151 , "Hori Racing Wheel Overdrive for Xbox Series X" , 0 , XTYPE_XBOXONE },
283
284
{ 0x0f0d , 0x0152 , "Hori Racing Wheel Overdrive for Xbox Series X" , 0 , XTYPE_XBOXONE },
285
+ { 0x0f0d , 0x01b2 , "HORI Taiko No Tatsujin Drum Controller" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
284
286
{ 0x0f30 , 0x010b , "Philips Recoil" , 0 , XTYPE_XBOX },
285
287
{ 0x0f30 , 0x0202 , "Joytech Advanced Controller" , 0 , XTYPE_XBOX },
286
288
{ 0x0f30 , 0x8888 , "BigBen XBMiniPad Controller" , 0 , XTYPE_XBOX },
@@ -353,6 +355,8 @@ static const struct xpad_device {
353
355
{ 0x20d6 , 0x2001 , "BDA Xbox Series X Wired Controller" , 0 , XTYPE_XBOXONE },
354
356
{ 0x20d6 , 0x2009 , "PowerA Enhanced Wired Controller for Xbox Series X|S" , 0 , XTYPE_XBOXONE },
355
357
{ 0x20d6 , 0x281f , "PowerA Wired Controller For Xbox 360" , 0 , XTYPE_XBOX360 },
358
+ { 0x20d6 , 0x400b , "PowerA FUSION Pro 4 Wired Controller" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
359
+ { 0x20d6 , 0x890b , "PowerA MOGA XP-Ultra Controller" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
356
360
{ 0x2345 , 0xe00b , "Machenike G5 Pro Controller" , 0 , XTYPE_XBOX360 },
357
361
{ 0x24c6 , 0x5000 , "Razer Atrox Arcade Stick" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOX360 },
358
362
{ 0x24c6 , 0x5300 , "PowerA MINI PROEX Controller" , 0 , XTYPE_XBOX360 },
@@ -384,13 +388,16 @@ static const struct xpad_device {
384
388
{ 0x294b , 0x3404 , "Snakebyte GAMEPAD RGB X" , 0 , XTYPE_XBOXONE },
385
389
{ 0x2993 , 0x2001 , "TECNO Pocket Go" , 0 , XTYPE_XBOX360 },
386
390
{ 0x2dc8 , 0x2000 , "8BitDo Pro 2 Wired Controller fox Xbox" , 0 , XTYPE_XBOXONE },
391
+ { 0x2dc8 , 0x200f , "8BitDo Ultimate 3-mode Controller for Xbox" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
387
392
{ 0x2dc8 , 0x3106 , "8BitDo Ultimate Wireless / Pro 2 Wired Controller" , 0 , XTYPE_XBOX360 },
388
393
{ 0x2dc8 , 0x3109 , "8BitDo Ultimate Wireless Bluetooth" , 0 , XTYPE_XBOX360 },
389
394
{ 0x2dc8 , 0x310a , "8BitDo Ultimate 2C Wireless Controller" , 0 , XTYPE_XBOX360 },
395
+ { 0x2dc8 , 0x310b , "8BitDo Ultimate 2 Wireless Controller" , 0 , XTYPE_XBOX360 },
390
396
{ 0x2dc8 , 0x6001 , "8BitDo SN30 Pro" , 0 , XTYPE_XBOX360 },
397
+ { 0x2e24 , 0x0423 , "Hyperkin DuchesS Xbox One pad" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
391
398
{ 0x2e24 , 0x0652 , "Hyperkin Duke X-Box One pad" , 0 , XTYPE_XBOXONE },
392
399
{ 0x2e24 , 0x1688 , "Hyperkin X91 X-Box One pad" , 0 , XTYPE_XBOXONE },
393
- { 0x2e95 , 0x0504 , "SCUF Gaming Controller" , MAP_SELECT_BUTTON , XTYPE_XBOXONE },
400
+ { 0x2e95 , 0x0504 , "SCUF Gaming Controller" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
394
401
{ 0x31e3 , 0x1100 , "Wooting One" , 0 , XTYPE_XBOX360 },
395
402
{ 0x31e3 , 0x1200 , "Wooting Two" , 0 , XTYPE_XBOX360 },
396
403
{ 0x31e3 , 0x1210 , "Wooting Lekker" , 0 , XTYPE_XBOX360 },
@@ -714,8 +721,10 @@ static const struct xboxone_init_packet xboxone_init_packets[] = {
714
721
XBOXONE_INIT_PKT (0x045e , 0x0b00 , xboxone_s_init ),
715
722
XBOXONE_INIT_PKT (0x045e , 0x0b00 , extra_input_packet_init ),
716
723
XBOXONE_INIT_PKT (0x0e6f , 0x0000 , xboxone_pdp_led_on ),
724
+ XBOXONE_INIT_PKT (0x0f0d , 0x01b2 , xboxone_pdp_led_on ),
717
725
XBOXONE_INIT_PKT (0x20d6 , 0xa01a , xboxone_pdp_led_on ),
718
726
XBOXONE_INIT_PKT (0x0e6f , 0x0000 , xboxone_pdp_auth ),
727
+ XBOXONE_INIT_PKT (0x0f0d , 0x01b2 , xboxone_pdp_auth ),
719
728
XBOXONE_INIT_PKT (0x20d6 , 0xa01a , xboxone_pdp_auth ),
720
729
XBOXONE_INIT_PKT (0x24c6 , 0x541a , xboxone_rumblebegin_init ),
721
730
XBOXONE_INIT_PKT (0x24c6 , 0x542a , xboxone_rumblebegin_init ),
@@ -1027,7 +1036,7 @@ static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned cha
1027
1036
* The report format was gleaned from
1028
1037
* https://github.com/kylelemons/xbox/blob/master/xbox.go
1029
1038
*/
1030
- static void xpadone_process_packet (struct usb_xpad * xpad , u16 cmd , unsigned char * data )
1039
+ static void xpadone_process_packet (struct usb_xpad * xpad , u16 cmd , unsigned char * data , u32 len )
1031
1040
{
1032
1041
struct input_dev * dev = xpad -> dev ;
1033
1042
bool do_sync = false;
@@ -1068,8 +1077,12 @@ static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char
1068
1077
/* menu/view buttons */
1069
1078
input_report_key (dev , BTN_START , data [4 ] & BIT (2 ));
1070
1079
input_report_key (dev , BTN_SELECT , data [4 ] & BIT (3 ));
1071
- if (xpad -> mapping & MAP_SELECT_BUTTON )
1072
- input_report_key (dev , KEY_RECORD , data [22 ] & BIT (0 ));
1080
+ if (xpad -> mapping & MAP_SHARE_BUTTON ) {
1081
+ if (xpad -> mapping & MAP_SHARE_OFFSET )
1082
+ input_report_key (dev , KEY_RECORD , data [len - 26 ] & BIT (0 ));
1083
+ else
1084
+ input_report_key (dev , KEY_RECORD , data [len - 18 ] & BIT (0 ));
1085
+ }
1073
1086
1074
1087
/* buttons A,B,X,Y */
1075
1088
input_report_key (dev , BTN_A , data [4 ] & BIT (4 ));
@@ -1217,7 +1230,7 @@ static void xpad_irq_in(struct urb *urb)
1217
1230
xpad360w_process_packet (xpad , 0 , xpad -> idata );
1218
1231
break ;
1219
1232
case XTYPE_XBOXONE :
1220
- xpadone_process_packet (xpad , 0 , xpad -> idata );
1233
+ xpadone_process_packet (xpad , 0 , xpad -> idata , urb -> actual_length );
1221
1234
break ;
1222
1235
default :
1223
1236
xpad_process_packet (xpad , 0 , xpad -> idata );
@@ -1944,7 +1957,7 @@ static int xpad_init_input(struct usb_xpad *xpad)
1944
1957
xpad -> xtype == XTYPE_XBOXONE ) {
1945
1958
for (i = 0 ; xpad360_btn [i ] >= 0 ; i ++ )
1946
1959
input_set_capability (input_dev , EV_KEY , xpad360_btn [i ]);
1947
- if (xpad -> mapping & MAP_SELECT_BUTTON )
1960
+ if (xpad -> mapping & MAP_SHARE_BUTTON )
1948
1961
input_set_capability (input_dev , EV_KEY , KEY_RECORD );
1949
1962
} else {
1950
1963
for (i = 0 ; xpad_btn [i ] >= 0 ; i ++ )
0 commit comments