Fixed locking up the Logitech F310 with the PlayStation controller detection (cherry picked from commit da134a30396e12786c14fe8d1190ab05c67d9dba)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
diff --git a/src/joystick/hidapi/SDL_hidapi_ps3.c b/src/joystick/hidapi/SDL_hidapi_ps3.c
index 1732cba..1915838 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps3.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps3.c
@@ -584,7 +584,7 @@ static SDL_bool HIDAPI_DriverPS3ThirdParty_IsSupportedDevice(SDL_HIDAPI_Device *
Uint8 data[USB_PACKET_LENGTH];
int size;
- if (SONY_THIRDPARTY_VENDOR(vendor_id)) {
+ if (HIDAPI_SupportsPlaystationDetection(vendor_id, product_id)) {
if (device && device->dev) {
size = ReadFeatureReport(device->dev, 0x03, data, sizeof data);
if (size == 8 && data[2] == 0x26) {
diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c
index 858758e..2f84d39 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps4.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps4.c
@@ -187,7 +187,7 @@ static SDL_bool HIDAPI_DriverPS4_IsSupportedDevice(SDL_HIDAPI_Device *device, co
return SDL_TRUE;
}
- if (SONY_THIRDPARTY_VENDOR(vendor_id)) {
+ if (HIDAPI_SupportsPlaystationDetection(vendor_id, product_id)) {
if (device && device->dev) {
size = ReadFeatureReport(device->dev, k_ePS4FeatureReportIdCapabilities, data, sizeof data);
if (size == 48 && data[2] == 0x27) {
diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c
index 051ccee..d3db539 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps5.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps5.c
@@ -282,7 +282,7 @@ static SDL_bool HIDAPI_DriverPS5_IsSupportedDevice(SDL_HIDAPI_Device *device, co
return SDL_TRUE;
}
- if (SONY_THIRDPARTY_VENDOR(vendor_id)) {
+ if (HIDAPI_SupportsPlaystationDetection(vendor_id, product_id)) {
if (device && device->dev) {
size = ReadFeatureReport(device->dev, k_EPS5FeatureReportIdCapabilities, data, sizeof data);
if (size == 48 && data[2] == 0x28) {
diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c
index ecb2175..a72f446 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick.c
+++ b/src/joystick/hidapi/SDL_hidapijoystick.c
@@ -138,6 +138,56 @@ void HIDAPI_DumpPacket(const char *prefix, const Uint8 *data, int size)
SDL_free(buffer);
}
+SDL_bool HIDAPI_SupportsPlaystationDetection(Uint16 vendor, Uint16 product)
+{
+ switch (vendor) {
+ case USB_VENDOR_DRAGONRISE:
+ return SDL_TRUE;
+ case USB_VENDOR_HORI:
+ return SDL_TRUE;
+ case USB_VENDOR_LOGITECH:
+ /* Most Logitech devices are fine with this, but the F310 will lock up */
+ if (product == USB_PRODUCT_LOGITECH_F310) {
+ return SDL_FALSE;
+ }
+ return SDL_TRUE;
+ case USB_VENDOR_MADCATZ:
+ return SDL_TRUE;
+ case USB_VENDOR_NACON:
+ return SDL_TRUE;
+ case USB_VENDOR_PDP:
+ return SDL_TRUE;
+ case USB_VENDOR_POWERA:
+ return SDL_TRUE;
+ case USB_VENDOR_POWERA_ALT:
+ return SDL_TRUE;
+ case USB_VENDOR_QANBA:
+ return SDL_TRUE;
+ case USB_VENDOR_RAZER:
+ /* Most Razer devices are not game controllers, and some of them lock up
+ * or reset when we send them the Sony third-party query feature report,
+ * so don't include that vendor here. Instead add devices as appropriate
+ * to controller_type.c
+ *
+ * Reference: https://github.com/libsdl-org/SDL/issues/6733
+ * https://github.com/libsdl-org/SDL/issues/6799
+ */
+ return SDL_FALSE;
+ case USB_VENDOR_SHANWAN:
+ return SDL_TRUE;
+ case USB_VENDOR_SHANWAN_ALT:
+ return SDL_TRUE;
+ case USB_VENDOR_THRUSTMASTER:
+ return SDL_TRUE;
+ case USB_VENDOR_ZEROPLUS:
+ return SDL_TRUE;
+ case 0x7545 /* SZ-MYPOWER */:
+ return SDL_TRUE;
+ default:
+ return SDL_FALSE;
+ }
+}
+
float HIDAPI_RemapVal(float val, float val_min, float val_max, float output_min, float output_max)
{
return output_min + (output_max - output_min) * (val - val_min) / (val_max - val_min);
diff --git a/src/joystick/hidapi/SDL_hidapijoystick_c.h b/src/joystick/hidapi/SDL_hidapijoystick_c.h
index 6424c87..a993b2b 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick_c.h
+++ b/src/joystick/hidapi/SDL_hidapijoystick_c.h
@@ -160,6 +160,8 @@ extern void HIDAPI_JoystickDisconnected(SDL_HIDAPI_Device *device, SDL_JoystickI
extern void HIDAPI_DumpPacket(const char *prefix, const Uint8 *data, int size);
+extern SDL_bool HIDAPI_SupportsPlaystationDetection(Uint16 vendor, Uint16 product);
+
extern float HIDAPI_RemapVal(float val, float val_min, float val_max, float output_min, float output_max);
#endif /* SDL_JOYSTICK_HIDAPI_H */
diff --git a/src/joystick/usb_ids.h b/src/joystick/usb_ids.h
index b3f90b3..fa705a0 100644
--- a/src/joystick/usb_ids.h
+++ b/src/joystick/usb_ids.h
@@ -51,27 +51,6 @@
#define USB_VENDOR_VALVE 0x28de
#define USB_VENDOR_ZEROPLUS 0x0c12
-// Most Razer devices are not game controllers, and some of them lock up or reset
-// when we send them the Sony third-party query feature report, so don't include that
-// vendor here. Instead add devices as appropriate to controller_type.c
-// Reference: https://github.com/libsdl-org/SDL/issues/6733
-// https://github.com/libsdl-org/SDL/issues/6799
-#define SONY_THIRDPARTY_VENDOR(X) \
- (X == USB_VENDOR_DRAGONRISE || \
- X == USB_VENDOR_HORI || \
- X == USB_VENDOR_LOGITECH || \
- X == USB_VENDOR_MADCATZ || \
- X == USB_VENDOR_NACON || \
- X == USB_VENDOR_PDP || \
- X == USB_VENDOR_POWERA || \
- X == USB_VENDOR_POWERA_ALT || \
- X == USB_VENDOR_QANBA || \
- X == USB_VENDOR_SHANWAN || \
- X == USB_VENDOR_SHANWAN_ALT || \
- X == USB_VENDOR_THRUSTMASTER || \
- X == USB_VENDOR_ZEROPLUS || \
- X == 0x7545 /* SZ-MYPOWER */)
-
#define USB_PRODUCT_8BITDO_XBOX_CONTROLLER 0x2002
#define USB_PRODUCT_AMAZON_LUNA_CONTROLLER 0x0419
#define USB_PRODUCT_BACKBONE_ONE_IOS 0x0103
@@ -82,6 +61,7 @@
#define USB_PRODUCT_HORI_HORIPAD_PRO_SERIES_X 0x014f
#define USB_PRODUCT_HORI_FIGHTING_STICK_ALPHA_PS4 0x011c
#define USB_PRODUCT_HORI_FIGHTING_STICK_ALPHA_PS5 0x0184
+#define USB_PRODUCT_LOGITECH_F310 0xc216
#define USB_PRODUCT_LOGITECH_CHILLSTREAM 0xcad1
#define USB_PRODUCT_NINTENDO_GAMECUBE_ADAPTER 0x0337
#define USB_PRODUCT_NINTENDO_N64_CONTROLLER 0x2019