From e3048a963738c502f034b78d0fd13352eaf09006 Mon Sep 17 00:00:00 2001
From: Henrique Jorge Barateli <[EMAIL REDACTED]>
Date: Fri, 30 Jan 2026 12:57:13 -0300
Subject: [PATCH] Fixed PS2 joystick analog sticks not enabled
(cherry picked from commit 99eca2ca0d1386a0c6ab983a2fee5413a5cd081c)
---
src/joystick/ps2/SDL_sysjoystick.c | 63 ++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/src/joystick/ps2/SDL_sysjoystick.c b/src/joystick/ps2/SDL_sysjoystick.c
index 73683500a2716..c75f400f457ce 100644
--- a/src/joystick/ps2/SDL_sysjoystick.c
+++ b/src/joystick/ps2/SDL_sysjoystick.c
@@ -36,6 +36,7 @@
#include "SDL_events.h"
#include "SDL_error.h"
+#include "SDL_timer.h"
#define PS2_MAX_PORT 2 /* each ps2 has 2 ports */
#define PS2_MAX_SLOT 4 /* maximum - 4 slots in one multitap */
@@ -191,6 +192,66 @@ static SDL_JoystickID PS2_JoystickGetDeviceInstanceID(int device_index)
return device_index;
}
+static void PS2_WaitPadReady(int port, int slot)
+{
+ int state = padGetState(port, slot);
+ while ((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) {
+ SDL_Delay(1);
+ state = padGetState(port, slot);
+ }
+}
+
+static void PS2_InitializePad(int port, int slot)
+{
+ int modes;
+ int i;
+ char actAlign[6];
+
+ PS2_WaitPadReady(port, slot);
+
+ // How many different modes can this device operate in?
+ modes = padInfoMode(port, slot, PAD_MODETABLE, -1);
+
+ // Verify that the controller has a DUAL SHOCK mode
+ for (i = 0; i < modes; i++) {
+ if (padInfoMode(port, slot, PAD_MODETABLE, i) == PAD_TYPE_DUALSHOCK) {
+ break;
+ }
+ }
+ if (i >= modes) {
+ // This is no Dual Shock controller
+ return;
+ }
+
+ // If ExId != 0x0 => This controller has actuator engines
+ // This check should always pass if the Dual Shock test above passed
+ if (!padInfoMode(port, slot, PAD_MODECUREXID, 0)) {
+ // This is no Dual Shock controller??
+ return;
+ }
+
+ // When using MMODE_LOCK, user cant change mode with Select button
+ padSetMainMode(port, slot, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK);
+
+ PS2_WaitPadReady(port, slot);
+ padEnterPressMode(port, slot);
+
+ PS2_WaitPadReady(port, slot);
+ if (padInfoAct(port, slot, -1, 0)) {
+ actAlign[0] = 0; // Enable small engine
+ actAlign[1] = 1; // Enable big engine
+ actAlign[2] = 0xff;
+ actAlign[3] = 0xff;
+ actAlign[4] = 0xff;
+ actAlign[5] = 0xff;
+
+ PS2_WaitPadReady(port, slot);
+ padSetActAlign(port, slot, actAlign);
+ }
+
+ PS2_WaitPadReady(port, slot);
+}
+
/* Function to open a joystick for use.
The joystick to open is specified by the device index.
This should fill the nbuttons and naxes fields of the joystick structure.
@@ -208,6 +269,8 @@ static int PS2_JoystickOpen(SDL_Joystick *joystick, int device_index)
return -1;
}
}
+ PS2_InitializePad(info->port, info->slot);
+
joystick->nbuttons = PS2_BUTTONS;
joystick->naxes = PS2_TOTAL_AXIS;
joystick->nhats = 0;