11
11
* Copyright (c) 2013 Colin Leitner <[email protected] >
12
12
* Copyright (c) 2014-2016 Frank Praznik <[email protected] >
13
13
* Copyright (c) 2018 Todd Kelner
14
- * Copyright (c) 2020 Pascal Giard <[email protected] >
14
+ * Copyright (c) 2020-2021 Pascal Giard <[email protected] >
15
15
* Copyright (c) 2020 Sanjay Govind <[email protected] >
16
+ * Copyright (c) 2021 Daniel Nguyen <[email protected] >
16
17
*/
17
18
18
19
/*
62
63
#define SHANWAN_GAMEPAD BIT(16)
63
64
#define GH_GUITAR_CONTROLLER BIT(17)
64
65
#define GHL_GUITAR_PS3WIIU BIT(18)
66
+ #define GHL_GUITAR_PS4 BIT(19)
65
67
66
68
#define SIXAXIS_CONTROLLER (SIXAXIS_CONTROLLER_USB | SIXAXIS_CONTROLLER_BT)
67
69
#define MOTION_CONTROLLER (MOTION_CONTROLLER_USB | MOTION_CONTROLLER_BT)
85
87
#define NSG_MRXU_MAX_X 1667
86
88
#define NSG_MRXU_MAX_Y 1868
87
89
88
- #define GHL_GUITAR_POKE_INTERVAL 10 /* In seconds */
90
+ /* The PS3/Wii U dongles require a poke every 10 seconds, but the PS4
91
+ * requires one every 8 seconds. Using 8 seconds for all for simplicity.
92
+ */
93
+ #define GHL_GUITAR_POKE_INTERVAL 8 /* In seconds */
89
94
#define GUITAR_TILT_USAGE 44
90
95
91
- /* Magic value and data taken from GHLtarUtility:
96
+ /* Magic data taken from GHLtarUtility:
92
97
* https://github.com/ghlre/GHLtarUtility/blob/master/PS3Guitar.cs
93
98
* Note: The Wii U and PS3 dongles happen to share the same!
94
99
*/
95
- static const u16 ghl_ps3wiiu_magic_value = 0x201 ;
96
100
static const char ghl_ps3wiiu_magic_data [] = {
97
101
0x02 , 0x08 , 0x20 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
98
102
};
99
103
104
+ /* Magic data for the PS4 dongles sniffed with a USB protocol
105
+ * analyzer.
106
+ */
107
+ static const char ghl_ps4_magic_data [] = {
108
+ 0x30 , 0x02 , 0x08 , 0x0A , 0x00 , 0x00 , 0x00 , 0x00 , 0x00
109
+ };
110
+
100
111
/* PS/3 Motion controller */
101
112
static u8 motion_rdesc [] = {
102
113
0x05 , 0x01 , /* Usage Page (Desktop), */
@@ -642,14 +653,14 @@ static void ghl_magic_poke(struct timer_list *t)
642
653
hid_err (sc -> hdev , "usb_submit_urb failed: %d" , ret );
643
654
}
644
655
645
- static int ghl_init_urb (struct sony_sc * sc , struct usb_device * usbdev )
656
+ static int ghl_init_urb (struct sony_sc * sc , struct usb_device * usbdev ,
657
+ const char ghl_magic_data [], u16 poke_size )
646
658
{
647
659
struct usb_ctrlrequest * cr ;
648
- u16 poke_size ;
649
660
u8 * databuf ;
650
661
unsigned int pipe ;
662
+ u16 ghl_magic_value = (((HID_OUTPUT_REPORT + 1 ) << 8 ) | ghl_magic_data [0 ]);
651
663
652
- poke_size = ARRAY_SIZE (ghl_ps3wiiu_magic_data );
653
664
pipe = usb_sndctrlpipe (usbdev , 0 );
654
665
655
666
cr = devm_kzalloc (& sc -> hdev -> dev , sizeof (* cr ), GFP_ATOMIC );
@@ -663,10 +674,10 @@ static int ghl_init_urb(struct sony_sc *sc, struct usb_device *usbdev)
663
674
cr -> bRequestType =
664
675
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT ;
665
676
cr -> bRequest = USB_REQ_SET_CONFIGURATION ;
666
- cr -> wValue = cpu_to_le16 (ghl_ps3wiiu_magic_value );
677
+ cr -> wValue = cpu_to_le16 (ghl_magic_value );
667
678
cr -> wIndex = 0 ;
668
679
cr -> wLength = cpu_to_le16 (poke_size );
669
- memcpy (databuf , ghl_ps3wiiu_magic_data , poke_size );
680
+ memcpy (databuf , ghl_magic_data , poke_size );
670
681
usb_fill_control_urb (
671
682
sc -> ghl_urb , usbdev , pipe ,
672
683
(unsigned char * ) cr , databuf , poke_size ,
@@ -3031,11 +3042,17 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
3031
3042
return - ENODEV ;
3032
3043
}
3033
3044
3034
- if (sc -> quirks & GHL_GUITAR_PS3WIIU ) {
3045
+ if (sc -> quirks & ( GHL_GUITAR_PS3WIIU | GHL_GUITAR_PS4 ) ) {
3035
3046
sc -> ghl_urb = usb_alloc_urb (0 , GFP_ATOMIC );
3036
3047
if (!sc -> ghl_urb )
3037
3048
return - ENOMEM ;
3038
- ret = ghl_init_urb (sc , usbdev );
3049
+
3050
+ if (sc -> quirks & GHL_GUITAR_PS3WIIU )
3051
+ ret = ghl_init_urb (sc , usbdev , ghl_ps3wiiu_magic_data ,
3052
+ ARRAY_SIZE (ghl_ps3wiiu_magic_data ));
3053
+ else if (sc -> quirks & GHL_GUITAR_PS4 )
3054
+ ret = ghl_init_urb (sc , usbdev , ghl_ps4_magic_data ,
3055
+ ARRAY_SIZE (ghl_ps4_magic_data ));
3039
3056
if (ret ) {
3040
3057
hid_err (hdev , "error preparing URB\n" );
3041
3058
return ret ;
@@ -3053,7 +3070,7 @@ static void sony_remove(struct hid_device *hdev)
3053
3070
{
3054
3071
struct sony_sc * sc = hid_get_drvdata (hdev );
3055
3072
3056
- if (sc -> quirks & GHL_GUITAR_PS3WIIU ) {
3073
+ if (sc -> quirks & ( GHL_GUITAR_PS3WIIU | GHL_GUITAR_PS4 ) ) {
3057
3074
del_timer_sync (& sc -> ghl_poke_timer );
3058
3075
usb_free_urb (sc -> ghl_urb );
3059
3076
}
@@ -3173,11 +3190,14 @@ static const struct hid_device_id sony_devices[] = {
3173
3190
{ HID_USB_DEVICE (USB_VENDOR_ID_SONY_RHYTHM , USB_DEVICE_ID_SONY_PS3WIIU_GHLIVE_DONGLE ),
3174
3191
.driver_data = GHL_GUITAR_PS3WIIU | GH_GUITAR_CONTROLLER },
3175
3192
/* Guitar Hero PC Guitar Dongle */
3176
- { HID_USB_DEVICE (USB_VENDOR_ID_ACTIVISION , USB_DEVICE_ID_ACTIVISION_GUITAR_DONGLE ),
3193
+ { HID_USB_DEVICE (USB_VENDOR_ID_REDOCTANE , USB_DEVICE_ID_REDOCTANE_GUITAR_DONGLE ),
3177
3194
.driver_data = GH_GUITAR_CONTROLLER },
3178
3195
/* Guitar Hero PS3 World Tour Guitar Dongle */
3179
3196
{ HID_USB_DEVICE (USB_VENDOR_ID_SONY_RHYTHM , USB_DEVICE_ID_SONY_PS3_GUITAR_DONGLE ),
3180
3197
.driver_data = GH_GUITAR_CONTROLLER },
3198
+ /* Guitar Hero Live PS4 guitar dongles */
3199
+ { HID_USB_DEVICE (USB_VENDOR_ID_REDOCTANE , USB_DEVICE_ID_REDOCTANE_PS4_GHLIVE_DONGLE ),
3200
+ .driver_data = GHL_GUITAR_PS4 | GH_GUITAR_CONTROLLER },
3181
3201
{ }
3182
3202
};
3183
3203
MODULE_DEVICE_TABLE (hid , sony_devices );
0 commit comments