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,7 +136,7 @@ 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 },
@@ -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 },
@@ -211,7 +212,7 @@ static const struct xpad_device {
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 },
@@ -391,7 +392,7 @@ static const struct xpad_device {
391
392
{ 0x2dc8 , 0x6001 , "8BitDo SN30 Pro" , 0 , XTYPE_XBOX360 },
392
393
{ 0x2e24 , 0x0652 , "Hyperkin Duke X-Box One pad" , 0 , XTYPE_XBOXONE },
393
394
{ 0x2e24 , 0x1688 , "Hyperkin X91 X-Box One pad" , 0 , XTYPE_XBOXONE },
394
- { 0x2e95 , 0x0504 , "SCUF Gaming Controller" , MAP_SELECT_BUTTON , XTYPE_XBOXONE },
395
+ { 0x2e95 , 0x0504 , "SCUF Gaming Controller" , MAP_SHARE_BUTTON , XTYPE_XBOXONE },
395
396
{ 0x31e3 , 0x1100 , "Wooting One" , 0 , XTYPE_XBOX360 },
396
397
{ 0x31e3 , 0x1200 , "Wooting Two" , 0 , XTYPE_XBOX360 },
397
398
{ 0x31e3 , 0x1210 , "Wooting Lekker" , 0 , XTYPE_XBOX360 },
@@ -1028,7 +1029,7 @@ static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned cha
1028
1029
* The report format was gleaned from
1029
1030
* https://github.com/kylelemons/xbox/blob/master/xbox.go
1030
1031
*/
1031
- static void xpadone_process_packet (struct usb_xpad * xpad , u16 cmd , unsigned char * data )
1032
+ static void xpadone_process_packet (struct usb_xpad * xpad , u16 cmd , unsigned char * data , u32 len )
1032
1033
{
1033
1034
struct input_dev * dev = xpad -> dev ;
1034
1035
bool do_sync = false;
@@ -1069,8 +1070,12 @@ static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char
1069
1070
/* menu/view buttons */
1070
1071
input_report_key (dev , BTN_START , data [4 ] & BIT (2 ));
1071
1072
input_report_key (dev , BTN_SELECT , data [4 ] & BIT (3 ));
1072
- if (xpad -> mapping & MAP_SELECT_BUTTON )
1073
- input_report_key (dev , KEY_RECORD , data [22 ] & BIT (0 ));
1073
+ if (xpad -> mapping & MAP_SHARE_BUTTON ) {
1074
+ if (xpad -> mapping & MAP_SHARE_OFFSET )
1075
+ input_report_key (dev , KEY_RECORD , data [len - 26 ] & BIT (0 ));
1076
+ else
1077
+ input_report_key (dev , KEY_RECORD , data [len - 18 ] & BIT (0 ));
1078
+ }
1074
1079
1075
1080
/* buttons A,B,X,Y */
1076
1081
input_report_key (dev , BTN_A , data [4 ] & BIT (4 ));
@@ -1218,7 +1223,7 @@ static void xpad_irq_in(struct urb *urb)
1218
1223
xpad360w_process_packet (xpad , 0 , xpad -> idata );
1219
1224
break ;
1220
1225
case XTYPE_XBOXONE :
1221
- xpadone_process_packet (xpad , 0 , xpad -> idata );
1226
+ xpadone_process_packet (xpad , 0 , xpad -> idata , urb -> actual_length );
1222
1227
break ;
1223
1228
default :
1224
1229
xpad_process_packet (xpad , 0 , xpad -> idata );
@@ -1945,7 +1950,7 @@ static int xpad_init_input(struct usb_xpad *xpad)
1945
1950
xpad -> xtype == XTYPE_XBOXONE ) {
1946
1951
for (i = 0 ; xpad360_btn [i ] >= 0 ; i ++ )
1947
1952
input_set_capability (input_dev , EV_KEY , xpad360_btn [i ]);
1948
- if (xpad -> mapping & MAP_SELECT_BUTTON )
1953
+ if (xpad -> mapping & MAP_SHARE_BUTTON )
1949
1954
input_set_capability (input_dev , EV_KEY , KEY_RECORD );
1950
1955
} else {
1951
1956
for (i = 0 ; xpad_btn [i ] >= 0 ; i ++ )
0 commit comments