log #000247
DualSense for Mac

half my controller stopped working.

not all of it — just the interesting half. back paddles, touchpad, gyro. gone. sticks and face buttons still fine, which is just enough to make you think nothing’s wrong until you actually try to play.

the edge? i’m not seeing any hid errors. as far as the system’s concerned, it connected fine.

that’s what makes it annoying. no errors. it just… gives me the reduced surface and acts like that’s normal. the game needs the full thing — without the back paddles the whole control scheme falls apart.

when did it start?

i don’t think it started. i think it was always like this over bluetooth and i just didn’t notice because i was running it through the other software stack. when that’s in the loop, everything works — back paddles, touchpad, all of it. three separate input devices show up, actually.

three? the controller plus two virtual devices. the software’s creating xbox controllers as proxies.

right. and here’s the thing — when i close the software and reopen the game natively, everything still works. until i disconnect the controller. power cycle, reconnect, and i’m back to half a surface.

so the mode is persisting in hardware after the software sets it. something it does on connection isn’t just software state — it’s changing the device.

exactly. i want to know what.


i ran a protocol analyser on the usb traffic. A started cross-referencing the report IDs while i watched the capture.

there are two distinct input report structures. one’s about nine bytes — sticks, triggers, buttons, d-pad. the other is 78 bytes. that’s where your missing inputs are. report ID 0x01 versus 0x31.

simple mode and enhanced mode. the software is triggering the switch somehow and it’s sticking until the controller loses power. the question is what.

looking at the initialisation sequence… it’s requesting feature report 0x05 on connection. that’s IMU calibration data. i’m finding a reference — hid-playstation.c in the linux kernel. roderick colenbrander, sony, 2020. he documented this exact behaviour for the dualshock 4 first. the device uses the calibration request as a handshake. when a driver asks for it, the controller interprets that as you know what you’re doing and promotes to enhanced mode.

so the software wasn’t trying to do it. it just requests calibration data as part of its own ps controller setup, and the mode flip is a side effect.

and the edge inherited the same behaviour from the dualshock 4. you’ve been accidentally benefiting from someone else’s driver work for months. is it a write operation? output report? CRC?

just a read. hid.get_feature_report(0x05, 41). that’s it. no write, no output report, no CRC construction. the controller does the rest.

a read. the device promotes itself.

forty lines of python.


you’ll need it running continuously — the mode resets on every power cycle. poll for the vendor and product ID, call the feature report on connection, then keep watching for reconnects. a menu bar app makes sense, something that starts at login and runs quietly.

already thinking the same thing. give me an hour.

the script watches for the device, calls the report the moment it connects, handles reconnects automatically. been running for a few weeks now. hasn’t missed one.

one feature report. for something you’d been working around for months.

once we knew what to look for. that’s usually how it goes.


app’s on the repo. it’s on homebrew if you need it.