Added detection of the joystick type for third party PS4 and PS5 controllers
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
diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c
index 04c3d40..d1c422c 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps4.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps4.c
@@ -239,6 +239,7 @@ HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device)
Uint8 data[USB_PACKET_LENGTH];
int size;
char serial[18];
+ SDL_JoystickType joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
ctx = (SDL_DriverPS4_Context *)SDL_calloc(1, sizeof(*ctx));
if (!ctx) {
@@ -315,6 +316,7 @@ HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device)
} else if ((size = ReadFeatureReport(device->dev, k_ePS4FeatureReportIdCapabilities, data, sizeof(data))) == 48 &&
data[2] == 0x27) {
Uint8 capabilities = data[4];
+ Uint8 device_type = data[5];
#ifdef DEBUG_PS4_PROTOCOL
HIDAPI_DumpPacket("PS4 capabilities: size = %d", data, size);
@@ -331,6 +333,33 @@ HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device)
if ((capabilities & 0x40) != 0) {
ctx->touchpad_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 0x04:
+ joystick_type = SDL_JOYSTICK_TYPE_DANCE_PAD;
+ 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;
+ }
} else if (device->vendor_id == USB_VENDOR_RAZER) {
/* The Razer Raiju doesn't respond to the detection protocol, but has a touchpad and vibration */
ctx->vibration_supported = SDL_TRUE;
@@ -338,6 +367,7 @@ HIDAPI_DriverPS4_InitDevice(SDL_HIDAPI_Device *device)
}
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported);
+ device->joystick_type = joystick_type;
device->type = SDL_CONTROLLER_TYPE_PS4;
if (device->vendor_id == USB_VENDOR_SONY) {
HIDAPI_SetDeviceName(device, "PS4 Controller");
diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c
index 6f26c3b..5f72d56 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps5.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps5.c
@@ -340,6 +340,7 @@ HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
Uint8 data[USB_PACKET_LENGTH*2];
int size;
char serial[18];
+ SDL_JoystickType joystick_type = SDL_JOYSTICK_TYPE_GAMECONTROLLER;
ctx = (SDL_DriverPS5_Context *)SDL_calloc(1, sizeof(*ctx));
if (!ctx) {
@@ -422,6 +423,7 @@ HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
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);
@@ -442,10 +444,35 @@ HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device)
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;
}
ctx->effects_supported = (ctx->lightbar_supported || ctx->vibration_supported || ctx->playerled_supported);
+ device->joystick_type = joystick_type;
device->type = SDL_CONTROLLER_TYPE_PS5;
if (device->vendor_id == USB_VENDOR_SONY) {
HIDAPI_SetDeviceName(device, "PS5 Controller");