Hello,
Dzimbahwe wrote: ↑2024-10-04 13:05
I am a linux newbie trying to get a ps4 dual shock controller to work on debian 12.
here is the output from lsusb-
Code: Select all
Bus 003 Device 004: ID 054c:05c4 Sony Corp. DualShock 4 [CUH-ZCT1x]
here is the output from dmesg -L -w
Code: Select all
[ 1846.705620] usb 3-2: new full-speed USB device number 4 using xhci_hcd
[ 1846.970345] usb 3-2: New USB device found, idVendor=054c, idProduct=05c4, bcdDevice= 1.00
[ 1846.970360] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1846.970367] usb 3-2: Product: Wireless controller
[ 1846.970372] usb 3-2: Manufacturer: Sony Computer Entertainment
[ 1852.186057] sony 0003:054C:05C4.0009: failed to retrieve feature report 0x81 with the DualShock 4 MAC address
[ 1852.186250] sony 0003:054C:05C4.0009: hidraw6: USB HID v81.00 Gamepad [Sony Computer Entertainment Wireless controller] on usb-0000:06:00.0-2/input0
[ 1852.186264] sony 0003:054C:05C4.0009: failed to claim input
Any help would be greatly appreciated.
It seems that your device
Sony Corp. DualShock 4 [CUH-ZCT1x] (ID 054c:05c4) is detected, but it is not configured.
Searching the internet, the following discussion was found:
It seems that a kernel patch can help:
Code: Select all
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -491,6 +491,7 @@ struct motion_output_report_02 {
#define DS4_FEATURE_REPORT_0x02_SIZE 37
#define DS4_FEATURE_REPORT_0x05_SIZE 41
+#define DS4_FEATURE_REPORT_0x12_SIZE 16
#define DS4_FEATURE_REPORT_0x81_SIZE 7
#define DS4_FEATURE_REPORT_0xA3_SIZE 49
#define DS4_INPUT_REPORT_0x11_SIZE 78
@@ -2593,6 +2594,53 @@ static int sony_get_bt_devaddr(struct sony_sc *sc)
return 0;
}
+static int sony_get_usb_ds4_devaddr(struct sony_sc *sc)
+{
+ u8 *buf = NULL;
+ int ret;
+
+ buf = kmalloc(max(DS4_FEATURE_REPORT_0x12_SIZE, DS4_FEATURE_REPORT_0x81_SIZE), GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ /*
+ * The MAC address of a DS4 controller connected via USB can be
+ * retrieved with feature report 0x81. The address begins at
+ * offset 1.
+ */
+ ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
+ DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
+ HID_REQ_GET_REPORT);
+ if (ret == DS4_FEATURE_REPORT_0x81_SIZE) {
+ memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
+ goto out_free;
+ }
+ dbg_hid("%s: hid_hw_raw_request(..., 0x81, ...) returned %d\n", __func__, ret);
+
+ /*
+ * Some variants do not implement feature report 0x81 at all.
+ * Fortunately, feature report 0x12 also contains the MAC address of
+ * a controller.
+ */
+ ret = hid_hw_raw_request(sc->hdev, 0x12, buf,
+ DS4_FEATURE_REPORT_0x12_SIZE, HID_FEATURE_REPORT,
+ HID_REQ_GET_REPORT);
+ if (ret == DS4_FEATURE_REPORT_0x12_SIZE) {
+ memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
+ goto out_free;
+ }
+ dbg_hid("%s: hid_hw_raw_request(..., 0x12, ...) returned %d\n", __func__, ret);
+
+ hid_err(sc->hdev, "failed to retrieve feature reports 0x81 and 0x12 with the DualShock 4 MAC address\n");
+ ret = ret < 0 ? ret : -EINVAL;
+
+out_free:
+
+ kfree(buf);
+
+ return ret;
+}
+
static int sony_check_add(struct sony_sc *sc)
{
u8 *buf = NULL;
@@ -2613,26 +2661,9 @@ static int sony_check_add(struct sony_sc *sc)
return 0;
}
} else if (sc->quirks & (DUALSHOCK4_CONTROLLER_USB | DUALSHOCK4_DONGLE)) {
- buf = kmalloc(DS4_FEATURE_REPORT_0x81_SIZE, GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
-
- /*
- * The MAC address of a DS4 controller connected via USB can be
- * retrieved with feature report 0x81. The address begins at
- * offset 1.
- */
- ret = hid_hw_raw_request(sc->hdev, 0x81, buf,
- DS4_FEATURE_REPORT_0x81_SIZE, HID_FEATURE_REPORT,
- HID_REQ_GET_REPORT);
-
- if (ret != DS4_FEATURE_REPORT_0x81_SIZE) {
- hid_err(sc->hdev, "failed to retrieve feature report 0x81 with the DualShock 4 MAC address\n");
- ret = ret < 0 ? ret : -EINVAL;
- goto out_free;
- }
-
- memcpy(sc->mac_address, &buf[1], sizeof(sc->mac_address));
+ ret = sony_get_usb_ds4_devaddr(sc);
+ if (ret < 0)
+ return ret;
snprintf(sc->hdev->uniq, sizeof(sc->hdev->uniq),
"%pMR", sc->mac_address);
@@ -2670,6 +2701,7 @@ static int sony_check_add(struct sony_sc *sc)
return 0;
}
+ dbg_hid("%s: retrieved MAC address: %s\n", __func__, sc->hdev->uniq);
ret = sony_check_add_dev_list(sc);
out_free:
It is also reported that kernel >= 6.2 should fix the problem.
Therefore, you may consider installing a newer kernel version from the Debian Backports Repositories; you can find instructions here:
Hope this helps.
Please let me know.
--
note: please, use
code tags to include commands and/or their logs in the body of a message. I fixed the previous message for you.