PS4 controller not detected in Retropie 4.6 on Pi 4B
-
@mitu ran the two commands. I did not get any output on my screen
-
@jmcdra Did you connect the gamepad between the 2 commands ? Otherwise nothing will be shown.
-
@jmcdra
Are you absolutely sure it's a genuine Dualshock 4 Controller?As far as i know the official retail controllers these days don't come with an usb cable.
There is a myriad of fake controllers out there and it's getting more difficult to spot a fake from a real one.
The best way to be completely sure is to open it up and look at the pcb.
-
@mitu yes I did
-
-
@Rion I'm sure it is. It has the sony logo and a sony model number on it and the packaging.
-
@mitu
Here we go. I don't know why it didn't read it the first time. Here's the message I got.[ 1625.139228] usb 1-1.3: new full-speed USB device number 5 using xhci_hcd [ 1625.239449] usb 1-1.3: device descriptor read/64, error -32 [ 1625.459455] usb 1-1.3: device descriptor read/64, error -32 [ 1634.359323] usb 1-1.3: new full-speed USB device number 7 using xhci_hcd [ 1634.495641] usb 1-1.3: New USB device found, idVendor=054c, idProduct=05c4, bcdDevice= 1.00 [ 1634.495657] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 1634.495669] usb 1-1.3: Product: Wireless Controller [ 1634.495681] usb 1-1.3: Manufacturer: Sony Computer Entertainment [ 1637.573784] sony 0003:054C:05C4.0005: failed to retrieve feature report 0x81 with the DualShock 4 MAC address [ 1637.574041] sony 0003:054C:05C4.0005: hidraw2: USB HID v81.11 Gamepad [Sony Computer Entertainment Wireless Controller] on usb-0000:01:00.0-1.3/input0 [ 1637.574055] sony 0003:054C:05C4.0005: failed to claim input [ 1637.645948] usb 1-1.3: USB disconnect, device number 7 [ 1742.400667] usb 1-1.3: new full-speed USB device number 8 using xhci_hcd [ 1742.546984] usb 1-1.3: New USB device found, idVendor=054c, idProduct=05c4, bcdDevice= 1.00 [ 1742.546999] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 1742.547011] usb 1-1.3: Product: Wireless Controller [ 1742.547023] usb 1-1.3: Manufacturer: Sony Computer Entertainment [ 1747.621036] sony 0003:054C:05C4.0006: failed to retrieve feature report 0x81 with the DualShock 4 MAC address [ 1747.621300] sony 0003:054C:05C4.0006: hidraw2: USB HID v81.11 Gamepad [Sony Computer Entertainment Wireless Controller] on usb-0000:01:00.0-1.3/input0 [ 1747.621314] sony 0003:054C:05C4.0006: failed to claim input
-
This looks like a problem with the USB connection - bad cable/bad USB port (less likely). Can you try different ports (assuming you didn't do that already) or another USB cable ?
-
@mitu I'll have to go and get a different cable. Anything I should look for in a cable for a ps4 controller then?
-
I ended up trading my ps4 controller with a friend that had one that came with her console. Kinda sucked because I really liked the Electric Purple color but I'd rather have a working wireless controller than one that's just a paperweight. I wonder if Sony changed something slightly with their controllers that kept it from connecting to Raspberry OS. I guess this topic can be closed now since it's technically resolved.
-
I have the same problem in Retropie 4.7.1 on Pi 3B
PS4 Controller is listed on lsusb:
$ lsusb Bus 001 Device 113: ID 054c:09cc Sony Corp. DualShock 4 [CUH-ZCT2x] Bus 001 Device 005: ID 0424:7800 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
But not on cat /proc/bus/input/devices
So I quit emulestation and disconnecting the gamepad and I type this command:
sudo dmesg -c > /dev/null
Then type dmesg:
$ dmesg [ 1044.875365] usb 1-1.3: new full-speed USB device number 33 using dwc_otg [ 1045.011009] usb 1-1.3: New USB device found, idVendor=054c, idProduct=09cc, bcdDevice= 1.00 [ 1045.011030] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1045.011046] usb 1-1.3: Product: Wireless Controller [ 1045.011062] usb 1-1.3: Manufacturer: Sony Interactive Entertainment [ 1045.011078] usb 1-1.3: SerialNumber: Wireless Controller [ 1045.046250] sony 0003:054C:09CC.0096: failed to retrieve feature report 0x81 with the DualShock 4 MAC address [ 1045.046563] sony 0003:054C:09CC.0096: hidraw0: USB HID v81.11 Gamepad [Sony Interactive Entertainment Wireless Controller] on usb-3f980000.usb-1.3/input3 [ 1045.046577] sony 0003:054C:09CC.0096: failed to claim input [ 1048.928523] usb 1-1.3: USB disconnect, device number 33 [ 1049.235375] usb 1-1.3: new full-speed USB device number 34 using dwc_otg [ 1049.370882] usb 1-1.3: New USB device found, idVendor=054c, idProduct=09cc, bcdDevice= 1.00 [ 1049.370905] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1049.370921] usb 1-1.3: Product: Wireless Controller [ 1049.370937] usb 1-1.3: Manufacturer: Sony Interactive Entertainment [ 1049.370951] usb 1-1.3: SerialNumber: Wireless Controller [ 1049.394514] sony 0003:054C:09CC.0097: failed to retrieve feature report 0x81 with the DualShock 4 MAC address [ 1049.394868] sony 0003:054C:09CC.0097: hidraw0: USB HID v81.11 Gamepad [Sony Interactive Entertainment Wireless Controller] on usb-3f980000.usb-1.3/input3 [ 1049.394886] sony 0003:054C:09CC.0097: failed to claim input [ 1053.281480] usb 1-1.3: USB disconnect, device number 34 [ 1053.625377] usb 1-1.3: new full-speed USB device number 35 using dwc_otg
Any help?
Thank you
-
I found some info about a patch to fix it:
https://bbs.archlinux.org/viewtopic.php?id=262451--- a/drivers/hid/hid-sony.c 2021-12-21 22:16:46.190024249 -0500 +++ b/drivers/hid/hid-sony.c 2021-12-21 22:30:16.048986978 -0500 @@ -504,6 +504,7 @@ #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,55 @@ 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 +2663,9 @@ 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 +2703,7 @@ return 0; } + dbg_hid("%s: retrieved MAC address: %s\n", __func__, sc->hdev->uniq); ret = sony_check_add_dev_list(sc); out_free:
I don't know how to apply this patch to be able to test it with the controller.
Could someone tell me all the steps to follow to test this patch in Retropie?
Thanks
-
@juanzt said in PS4 controller not detected in Retropie 4.6 on Pi 4B:
The forum link you posted indicates this is a patch for a 3rd party PS4 controller, which fails detection because of missing functionality, but it might not work for all controllers (https://bbs.archlinux.org/viewtopic.php?pid=2010615#p2010615).
Could someone tell me all the steps to follow to test this patch in Retropie?
You could try to install using the makefile from https://github.com/soreau/hid-sony, but you'll need to replace the
hid_sony.c
file with the one from the upstream kernel and then apply the patch before installing it:git clone https://github.com/soreau/hid-sony cd hid-sony wget -O hid-sony.c https://raw.githubusercontent.com/raspberrypi/linux/rpi-5.10.y/drivers/hid/hid-sony.c # save the patch from https://bbs.archlinux.org/viewtopic.php?pid=2010615#p2010615 to a `patch.diff` file in the `hid-sony` folder # then run the patch patch < patch.diff make && sudo make install
-
Hello,
I do all these steps but it seems hid-sony.ko patched is not using because in hid-sony.c patched the string " failed to retrieve feature report 0x81 with the DualShock 4 MAC address" is not found and dmesg show this message.
Regards.
-
If the installation of the patched
hid-sony
module went fine, you should reboot before trying out again the controller. If that doesn't work, then the patched driver is not working with your controller. -
I type
make && sudo make install
And then reboot.
When the system was reloaded again, I get "failed to retrieve feature report 0x81 with the DualShock 4 MAC address" in dmesg and I take a look a hid-sony.c patched and I not found this string in the file.
-
Then the patching hasn't been successful, maybe the patch doesn't apply correctly to the current version of
hid-sony
. Do you get any errors after running thepatch
command ? -
patching file hid-sony.c Hunk #1 succeeded at 476 (offset -28 lines). Hunk #2 succeeded at 2455 (offset -139 lines). Hunk #3 succeeded at 2524 (offset -139 lines). patch unexpectedly ends in middle of line Hunk #4 succeeded at 2564 with fuzz 1 (offset -139 lines).
It seems ok.
I have looked at the resulting hid-sony.c file and the new function appears and it seems that the rest of the things that have marked to remove on .diff file has been removed.
$ make && sudo make install make -C /lib/modules/5.10.63-v7+/build M=/home/pi/hid-sony modules make[1]: Entering directory '/usr/src/linux-headers-5.10.63-v7+' CC [M] /home/pi/hid-sony/hid-sony.o MODPOST /home/pi/hid-sony/Module.symvers CC [M] /home/pi/hid-sony/hid-sony.mod.o LD [M] /home/pi/hid-sony/hid-sony.ko make[1]: Leaving directory '/usr/src/linux-headers-5.10.63-v7+' cp hid-sony.ko /lib/modules/5.10.63-v7+/kernel/drivers/hid/
-
Looks like it the patch/install went ok, if it's still not working then maybe the patch is not enough for the controller.
-
I take a look at: https://github.com/soreau/hid-sony and I see a Reload module section.
I try it and I get this:
$ sudo rmmod hid_sony && modprobe hid-sony modprobe: ERROR: could not insert 'hid_sony': Operation not permitted
How could I remove the module and add it again?
I type:
$ lsmod Module Size Used by hid_sony 36864 0 hidp 24576 2 cmac 16384 1 bnep 20480 0 hci_uart 40960 1 btbcm 16384 1 hci_uart bluetooth 393216 9 hidp,hci_uart,bnep,btbcm
hid_sony is not use.
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.