From 717bb2dcef9b8a04def7fcfb916e776507777b24 Mon Sep 17 00:00:00 2001
From: Rachel Blackman <[EMAIL REDACTED]>
Date: Mon, 11 May 2026 15:19:57 -0700
Subject: [PATCH] Correctly support OG Steam Controller when connected via USB
on Android (#15561)
(cherry picked from commit e4a327709dcf7d5a623aa5c0403cccfe09e6c0c4)
---
.../src/main/java/org/libsdl/app/HIDDeviceUSB.java | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java b/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java
index f9e9389802b79..8ec1cd1bc825c 100644
--- a/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java
+++ b/android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java
@@ -132,8 +132,10 @@ public boolean open() {
}
}
- // Make sure the required endpoints were present
- if (mInputEndpoint == null || mOutputEndpoint == null) {
+ // Make sure the required endpoints were present. The original Steam Controller and the wireless dongle for it do NOT
+ // actually have -- or require -- output endpoints, so we need to accept only an input one for them or else we'll fall
+ // back to the Android system gamepad functionality (and lose our paddles et al).
+ if (mInputEndpoint == null) {
Log.w(TAG, "Missing required endpoint on USB device " + getDeviceName());
close();
return false;
@@ -185,6 +187,11 @@ public int writeReport(byte[] report, boolean feature) {
}
return length;
} else {
+ if (mOutputEndpoint == null)
+ {
+ Log.e(TAG, "Tried to write an output report to an interface with no output endpoint!");
+ return -1;
+ }
int res = mConnection.bulkTransfer(mOutputEndpoint, report, report.length, 1000);
if (res != report.length) {
Log.w(TAG, "writeOutputReport() returned " + res + " on device " + getDeviceName());