Don't send k_EPS5FeatureReportIdCapabilities to Sony PS5 controllers This report is for third party controllers only. (cherry picked from commit 16dd5f0da4ee950e9f998a757dcb4789463e67e2) (cherry picked from commit bb036ef5441f6e0374eed6a02adb9dc66273c629)
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
diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c
index db47e32..3e1a678 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps5.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps5.c
@@ -421,7 +421,6 @@ static SDL_bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
}
}
- size = ReadFeatureReport(device->dev, k_EPS5FeatureReportIdCapabilities, data, sizeof(data));
/* Get the device capabilities */
if (device->vendor_id == USB_VENDOR_SONY) {
ctx->sensors_supported = SDL_TRUE;
@@ -429,61 +428,65 @@ static SDL_bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
ctx->vibration_supported = SDL_TRUE;
ctx->playerled_supported = SDL_TRUE;
ctx->touchpad_supported = SDL_TRUE;
- } else if (size == 48 && data[2] == 0x28) {
- Uint8 capabilities = data[4];
- Uint8 capabilities2 = data[20];
- Uint8 device_type = data[5];
+ } else {
+ /* Third party controller capability request */
+ size = ReadFeatureReport(device->dev, k_EPS5FeatureReportIdCapabilities, data, sizeof(data));
+ if (size == 48 && data[2] == 0x28) {
+ Uint8 capabilities = data[4];
+ Uint8 capabilities2 = data[20];
+ Uint8 device_type = data[5];
#ifdef DEBUG_PS5_PROTOCOL
- HIDAPI_DumpPacket("PS5 capabilities: size = %d", data, size);
+ HIDAPI_DumpPacket("PS5 capabilities: size = %d", data, size);
#endif
- if (capabilities & 0x02) {
+ if (capabilities & 0x02) {
+ ctx->sensors_supported = SDL_TRUE;
+ }
+ if (capabilities & 0x04) {
+ ctx->lightbar_supported = SDL_TRUE;
+ }
+ if (capabilities & 0x08) {
+ ctx->vibration_supported = SDL_TRUE;
+ }
+ if (capabilities & 0x40) {
+ ctx->touchpad_supported = SDL_TRUE;
+ }
+ if (capabilities2 & 0x80) {
+ ctx->playerled_supported = SDL_TRUE;
+ }
+
+ switch (device_type) {
+ case 0x00:
+ joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
+ break;
+ case 0x01:
+ joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
+ break;
+ case 0x02:
+ joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
+ break;
+ case 0x06:
+ joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
+ break;
+ case 0x07:
+ joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
+ break;
+ case 0x08:
+ joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
+ break;
+ default:
+ joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
+ break;
+ }
+
+ ctx->use_alternate_report = SDL_TRUE;
+ } else if (device->vendor_id == USB_VENDOR_RAZER &&
+ (device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRED ||
+ device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRELESS)) {
+ /* The Razer Wolverine V2 Pro doesn't respond to the detection protocol, but has a touchpad and sensors, but no vibration */
ctx->sensors_supported = SDL_TRUE;
- }
- if (capabilities & 0x04) {
- ctx->lightbar_supported = SDL_TRUE;
- }
- if (capabilities & 0x08) {
- ctx->vibration_supported = SDL_TRUE;
- }
- if (capabilities & 0x40) {
ctx->touchpad_supported = SDL_TRUE;
}
- if (capabilities2 & 0x80) {
- ctx->playerled_supported = SDL_TRUE;
- }
-
- switch (device_type) {
- case 0x00:
- joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
- break;
- case 0x01:
- joystick_type = SDL_JOYSTICK_TYPE_GUITAR;
- break;
- case 0x02:
- joystick_type = SDL_JOYSTICK_TYPE_DRUM_KIT;
- break;
- case 0x06:
- joystick_type = SDL_JOYSTICK_TYPE_WHEEL;
- break;
- case 0x07:
- joystick_type = SDL_JOYSTICK_TYPE_ARCADE_STICK;
- break;
- case 0x08:
- joystick_type = SDL_JOYSTICK_TYPE_FLIGHT_STICK;
- break;
- default:
- joystick_type = SDL_JOYSTICK_TYPE_UNKNOWN;
- break;
- }
-
- ctx->use_alternate_report = SDL_TRUE;
- } else if (device->vendor_id == USB_VENDOR_RAZER &&
- (device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRED ||
- device->product_id == USB_PRODUCT_RAZER_WOLVERINE_V2_PRO_PS5_WIRELESS)) {
- /* The Razer Wolverine V2 Pro doesn't respond to the detection protocol, but has a touchpad and sensors, but no vibration */
- ctx->sensors_supported = SDL_TRUE;
- ctx->touchpad_supported = SDL_TRUE;
}
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported || ctx->playerled_supported);