7777 * xbox d-pads should map to buttons, as is required for DDR pads
7878 * but we map them to axes when possible to simplify things
7979 */
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)
8687
8788#define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \
8889 MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL)
@@ -135,14 +136,14 @@ static const struct xpad_device {
135136 { 0x03f0 , 0x048D , "HyperX Clutch" , 0 , XTYPE_XBOX360 }, /* wireless */
136137 { 0x03f0 , 0x0495 , "HyperX Clutch Gladiate" , 0 , XTYPE_XBOXONE },
137138 { 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 */
139140 { 0x03f0 , 0x09B4 , "HyperX Clutch Tanto" , 0 , XTYPE_XBOXONE },
140141 { 0x044f , 0x0f00 , "Thrustmaster Wheel" , 0 , XTYPE_XBOX },
141142 { 0x044f , 0x0f03 , "Thrustmaster Wheel" , 0 , XTYPE_XBOX },
142143 { 0x044f , 0x0f07 , "Thrustmaster, Inc. Controller" , 0 , XTYPE_XBOX },
143- { 0x044f , 0xd01e , "ThrustMaster, Inc. ESWAP X 2 ELDEN RING EDITION" , 0 , XTYPE_XBOXONE },
144144 { 0x044f , 0x0f10 , "Thrustmaster Modena GT Wheel" , 0 , XTYPE_XBOX },
145145 { 0x044f , 0xb326 , "Thrustmaster Gamepad GP XID" , 0 , XTYPE_XBOX360 },
146+ { 0x044f , 0xd01e , "ThrustMaster, Inc. ESWAP X 2 ELDEN RING EDITION" , 0 , XTYPE_XBOXONE },
146147 { 0x045e , 0x0202 , "Microsoft X-Box pad v1 (US)" , 0 , XTYPE_XBOX },
147148 { 0x045e , 0x0285 , "Microsoft X-Box pad (Japan)" , 0 , XTYPE_XBOX },
148149 { 0x045e , 0x0287 , "Microsoft Xbox Controller S" , 0 , XTYPE_XBOX },
@@ -159,7 +160,7 @@ static const struct xpad_device {
159160 { 0x045e , 0x0719 , "Xbox 360 Wireless Receiver" , MAP_DPAD_TO_BUTTONS , XTYPE_XBOX360W },
160161 { 0x045e , 0x0b00 , "Microsoft X-Box One Elite 2 pad" , MAP_PADDLES , XTYPE_XBOXONE },
161162 { 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 },
163164 { 0x046d , 0xc21d , "Logitech Gamepad F310" , 0 , XTYPE_XBOX360 },
164165 { 0x046d , 0xc21e , "Logitech Gamepad F510" , 0 , XTYPE_XBOX360 },
165166 { 0x046d , 0xc21f , "Logitech Gamepad F710" , 0 , XTYPE_XBOX360 },
@@ -205,13 +206,13 @@ static const struct xpad_device {
205206 { 0x0738 , 0x9871 , "Mad Catz Portable Drum" , 0 , XTYPE_XBOX360 },
206207 { 0x0738 , 0xb726 , "Mad Catz Xbox controller - MW2" , 0 , XTYPE_XBOX360 },
207208 { 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 },
209210 { 0x0738 , 0xcb02 , "Saitek Cyborg Rumble Pad - PC/Xbox 360" , 0 , XTYPE_XBOX360 },
210211 { 0x0738 , 0xcb03 , "Saitek P3200 Rumble Pad - PC/Xbox 360" , 0 , XTYPE_XBOX360 },
211212 { 0x0738 , 0xcb29 , "Saitek Aviator Stick AV8R02" , 0 , XTYPE_XBOX360 },
212213 { 0x0738 , 0xf738 , "Super SFIV FightStick TE S" , 0 , XTYPE_XBOX360 },
213214 { 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 },
215216 { 0x0b05 , 0x1abb , "ASUS ROG RAIKIRI PRO" , 0 , XTYPE_XBOXONE },
216217 { 0x0c12 , 0x0005 , "Intec wireless" , 0 , XTYPE_XBOX },
217218 { 0x0c12 , 0x8801 , "Nyko Xbox Controller" , 0 , XTYPE_XBOX },
@@ -240,7 +241,7 @@ static const struct xpad_device {
240241 { 0x0e6f , 0x0146 , "Rock Candy Wired Controller for Xbox One" , 0 , XTYPE_XBOXONE },
241242 { 0x0e6f , 0x0147 , "PDP Marvel Xbox One Controller" , 0 , XTYPE_XBOXONE },
242243 { 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 },
244245 { 0x0e6f , 0x0161 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
245246 { 0x0e6f , 0x0162 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
246247 { 0x0e6f , 0x0163 , "PDP Xbox One Controller" , 0 , XTYPE_XBOXONE },
@@ -281,6 +282,7 @@ static const struct xpad_device {
281282 { 0x0f0d , 0x00dc , "HORIPAD FPS for Nintendo Switch" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOX360 },
282283 { 0x0f0d , 0x0151 , "Hori Racing Wheel Overdrive for Xbox Series X" , 0 , XTYPE_XBOXONE },
283284 { 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 },
284286 { 0x0f30 , 0x010b , "Philips Recoil" , 0 , XTYPE_XBOX },
285287 { 0x0f30 , 0x0202 , "Joytech Advanced Controller" , 0 , XTYPE_XBOX },
286288 { 0x0f30 , 0x8888 , "BigBen XBMiniPad Controller" , 0 , XTYPE_XBOX },
@@ -353,6 +355,8 @@ static const struct xpad_device {
353355 { 0x20d6 , 0x2001 , "BDA Xbox Series X Wired Controller" , 0 , XTYPE_XBOXONE },
354356 { 0x20d6 , 0x2009 , "PowerA Enhanced Wired Controller for Xbox Series X|S" , 0 , XTYPE_XBOXONE },
355357 { 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 },
356360 { 0x2345 , 0xe00b , "Machenike G5 Pro Controller" , 0 , XTYPE_XBOX360 },
357361 { 0x24c6 , 0x5000 , "Razer Atrox Arcade Stick" , MAP_TRIGGERS_TO_BUTTONS , XTYPE_XBOX360 },
358362 { 0x24c6 , 0x5300 , "PowerA MINI PROEX Controller" , 0 , XTYPE_XBOX360 },
@@ -384,13 +388,16 @@ static const struct xpad_device {
384388 { 0x294b , 0x3404 , "Snakebyte GAMEPAD RGB X" , 0 , XTYPE_XBOXONE },
385389 { 0x2993 , 0x2001 , "TECNO Pocket Go" , 0 , XTYPE_XBOX360 },
386390 { 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 },
387392 { 0x2dc8 , 0x3106 , "8BitDo Ultimate Wireless / Pro 2 Wired Controller" , 0 , XTYPE_XBOX360 },
388393 { 0x2dc8 , 0x3109 , "8BitDo Ultimate Wireless Bluetooth" , 0 , XTYPE_XBOX360 },
389394 { 0x2dc8 , 0x310a , "8BitDo Ultimate 2C Wireless Controller" , 0 , XTYPE_XBOX360 },
395+ { 0x2dc8 , 0x310b , "8BitDo Ultimate 2 Wireless Controller" , 0 , XTYPE_XBOX360 },
390396 { 0x2dc8 , 0x6001 , "8BitDo SN30 Pro" , 0 , XTYPE_XBOX360 },
397+ { 0x2e24 , 0x0423 , "Hyperkin DuchesS Xbox One pad" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
391398 { 0x2e24 , 0x0652 , "Hyperkin Duke X-Box One pad" , 0 , XTYPE_XBOXONE },
392399 { 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 },
394401 { 0x31e3 , 0x1100 , "Wooting One" , 0 , XTYPE_XBOX360 },
395402 { 0x31e3 , 0x1200 , "Wooting Two" , 0 , XTYPE_XBOX360 },
396403 { 0x31e3 , 0x1210 , "Wooting Lekker" , 0 , XTYPE_XBOX360 },
@@ -714,8 +721,10 @@ static const struct xboxone_init_packet xboxone_init_packets[] = {
714721 XBOXONE_INIT_PKT (0x045e , 0x0b00 , xboxone_s_init ),
715722 XBOXONE_INIT_PKT (0x045e , 0x0b00 , extra_input_packet_init ),
716723 XBOXONE_INIT_PKT (0x0e6f , 0x0000 , xboxone_pdp_led_on ),
724+ XBOXONE_INIT_PKT (0x0f0d , 0x01b2 , xboxone_pdp_led_on ),
717725 XBOXONE_INIT_PKT (0x20d6 , 0xa01a , xboxone_pdp_led_on ),
718726 XBOXONE_INIT_PKT (0x0e6f , 0x0000 , xboxone_pdp_auth ),
727+ XBOXONE_INIT_PKT (0x0f0d , 0x01b2 , xboxone_pdp_auth ),
719728 XBOXONE_INIT_PKT (0x20d6 , 0xa01a , xboxone_pdp_auth ),
720729 XBOXONE_INIT_PKT (0x24c6 , 0x541a , xboxone_rumblebegin_init ),
721730 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
10271036 * The report format was gleaned from
10281037 * https://github.com/kylelemons/xbox/blob/master/xbox.go
10291038 */
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 )
10311040{
10321041 struct input_dev * dev = xpad -> dev ;
10331042 bool do_sync = false;
@@ -1068,8 +1077,12 @@ static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char
10681077 /* menu/view buttons */
10691078 input_report_key (dev , BTN_START , data [4 ] & BIT (2 ));
10701079 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+ }
10731086
10741087 /* buttons A,B,X,Y */
10751088 input_report_key (dev , BTN_A , data [4 ] & BIT (4 ));
@@ -1217,7 +1230,7 @@ static void xpad_irq_in(struct urb *urb)
12171230 xpad360w_process_packet (xpad , 0 , xpad -> idata );
12181231 break ;
12191232 case XTYPE_XBOXONE :
1220- xpadone_process_packet (xpad , 0 , xpad -> idata );
1233+ xpadone_process_packet (xpad , 0 , xpad -> idata , urb -> actual_length );
12211234 break ;
12221235 default :
12231236 xpad_process_packet (xpad , 0 , xpad -> idata );
@@ -1944,7 +1957,7 @@ static int xpad_init_input(struct usb_xpad *xpad)
19441957 xpad -> xtype == XTYPE_XBOXONE ) {
19451958 for (i = 0 ; xpad360_btn [i ] >= 0 ; i ++ )
19461959 input_set_capability (input_dev , EV_KEY , xpad360_btn [i ]);
1947- if (xpad -> mapping & MAP_SELECT_BUTTON )
1960+ if (xpad -> mapping & MAP_SHARE_BUTTON )
19481961 input_set_capability (input_dev , EV_KEY , KEY_RECORD );
19491962 } else {
19501963 for (i = 0 ; xpad_btn [i ] >= 0 ; i ++ )
0 commit comments