Repository navigation
Releases: Wingdom/openpuck
Release list
OpenPuck Device Builds -- mdbt50q-cx@6e44790c / connectkit@5a68eed5
Built fresh from each device's branch on every push to either one. One release, both devices,
always current.
Raytac MDBT50Q-CX-40 -- mdbt50q-cx @ 6e44790c (0.9.1)
Changes since the last build:
- qos channel hopping on by default (6e44790)
This build uses OpenPuck's official Raytac support (Adafruit's mdbt50qrx profile,
OPK_BOARD_MDBT50Q_CX_40) -- the factory Nordic Open DFU bootloader and its SoftDevice are
never replaced by this workflow.
First time on a fresh dongle: it needs a one-time S140 6.1.1 SoftDevice provisioning step
before the app package below will install. That step needs the full Nordic nRF5 SDK downloaded
locally, so it isn't something this release can hand you as a file -- follow
docs/BUILD_AND_DEPLOY.md §4a
once, then come back here for the app package below. Every release after that first one only
needs the app package.
The WebUSB firmware-update tab, its serial/UF2 DFU buttons, and the debug full-board wipe all
target the Adafruit bootloader and are rejected on this build; use
the WebUSB panel for pairing/configuration only, and
flash OpenPuck-mdbt50q-cx-40.zip below with nRF Util.
Flashing (same command for first app install and every update, once S140 is provisioned):
nrfutil device program --firmware OpenPuck-mdbt50q-cx-40.zip --traits nordicDfu
Enter DFU by pressing-and-holding the dongle's button while plugging it in (release when the
LED fades).
Tested on Raytac MDBT50Q-CX-40 (1 MB flash / 256 KB RAM -- not the CX-33).
Makerdiary nRF52840 Connect Kit -- makerdiary-connectkit @ 5a68eed5 (0.9.1)
Changes since the last build:
- No source changes since the last build.
This build links the app at 0x23000 to match the Connect Kit's factory S132 5.1.0
bootloader/SoftDevice -- see
docs/MAKERDIARY_CONNECTKIT_SETUP.md
for why. The bootloader and SoftDevice are never modified; only the UF2 below is ever written.
The WebUSB firmware-update tab is disabled at the device on this build too. Use
the WebUSB panel for pairing/configuration only, and
flash updates with the UF2 below.
Flashing (same steps for first-time install and every update):
- Download
OpenPuck-makerdiary-connectkit.uf2below. - Double-tap RESET (or unplug, hold RESET, plug back in) until the
UF2BOOTdrive mounts. - Drag the
.uf2ontoUF2BOOT. - Wait for the programming blink to finish, then unplug and reconnect.
Tested on a Makerdiary nRF52840 Connect Kit (U.FL / external-antenna variant).
Same caveats as always -- see the "On LLM Use" section in the README. This is a hobbyist side
path.
OpenPuck Device Builds -- mdbt50q-cx@6ea08b00 / connectkit@5a68eed5
Built fresh from each device's branch on every push to either one. One release, both devices,
always current.
Raytac MDBT50Q-CX-40 -- mdbt50q-cx @ 6ea08b00 (0.9.1)
Changes since the last build:
- Merge branch 'safijari:main' into mdbt50q-cx (6ea08b0)
- Fix controller no longer shutting off regression (safijari#252) (f963e39)
- Refactor usbIdentity function comments (68a26b1)
- Ensure USBDevice version is set correctly for new modes (47f5d54)
- Fix how releases are done (6f47607)
- Add configurable rumble style and strength (safijari#224) (033dbfb)
- Adding ability to Cold Boot a system by emulating a power button press from GPIO pins (safijari#206) (cd449fc)
- Pure HID and Sinput modes (safijari#200) (7ebbdc9)
- Add Original Xbox (Controller S) mode (safijari#212) (308565d)
- Implement ESB forwarding, fix haptics/command overlap (safijari#230) (b52e045)
- Map trackpads to joysticks (safijari#216) (fd69c5b)
- scpair: Bunch of fixes (safijari#222) (c3a247a)
- Add OpenPuck version in 0xAE report (safijari#228) (af0fb6b)
- scpair: Support for Steam Machine internal receiver (safijari#220) (5ea73d0)
- Update README with bmac link (safijari#210) (cf8890f)
- Relay OUTPUT report 0x81 HAPTIC_PULSE (fixes safijari#163, safijari#166) (safijari#199) (f2cf9c0)
This build uses OpenPuck's official Raytac support (Adafruit's mdbt50qrx profile,
OPK_BOARD_MDBT50Q_CX_40) -- the factory Nordic Open DFU bootloader and its SoftDevice are
never replaced by this workflow.
First time on a fresh dongle: it needs a one-time S140 6.1.1 SoftDevice provisioning step
before the app package below will install. That step needs the full Nordic nRF5 SDK downloaded
locally, so it isn't something this release can hand you as a file -- follow
docs/BUILD_AND_DEPLOY.md §4a
once, then come back here for the app package below. Every release after that first one only
needs the app package.
The WebUSB firmware-update tab, its serial/UF2 DFU buttons, and the debug full-board wipe all
target the Adafruit bootloader and are rejected on this build; use
the WebUSB panel for pairing/configuration only, and
flash OpenPuck-mdbt50q-cx-40.zip below with nRF Util.
Flashing (same command for first app install and every update, once S140 is provisioned):
nrfutil device program --firmware OpenPuck-mdbt50q-cx-40.zip --traits nordicDfu
Enter DFU by pressing-and-holding the dongle's button while plugging it in (release when the
LED fades).
Tested on Raytac MDBT50Q-CX-40 (1 MB flash / 256 KB RAM -- not the CX-33).
Makerdiary nRF52840 Connect Kit -- makerdiary-connectkit @ 5a68eed5 (0.9.1)
Changes since the last build:
- No source changes since the last build.
This build links the app at 0x23000 to match the Connect Kit's factory S132 5.1.0
bootloader/SoftDevice -- see
docs/MAKERDIARY_CONNECTKIT_SETUP.md
for why. The bootloader and SoftDevice are never modified; only the UF2 below is ever written.
The WebUSB firmware-update tab is disabled at the device on this build too. Use
the WebUSB panel for pairing/configuration only, and
flash updates with the UF2 below.
Flashing (same steps for first-time install and every update):
- Download
OpenPuck-makerdiary-connectkit.uf2below. - Double-tap RESET (or unplug, hold RESET, plug back in) until the
UF2BOOTdrive mounts. - Drag the
.uf2ontoUF2BOOT. - Wait for the programming blink to finish, then unplug and reconnect.
Tested on a Makerdiary nRF52840 Connect Kit (U.FL / external-antenna variant).
Same caveats as always -- see the "On LLM Use" section in the README. This is a hobbyist side
path.
OpenPuck Device Builds -- mdbt50q-cx@a491a665 / connectkit@5a68eed5
Built fresh from each device's branch on every push to either one. One release, both devices,
always current.
Raytac MDBT50Q-CX-40 -- mdbt50q-cx @ a491a665 (0.9.1)
Changes since the last build:
- keep release history instead of reusing one tag (a491a66)
- recreate the release each run instead of reusing it (f451a93)
This build uses OpenPuck's official Raytac support (Adafruit's mdbt50qrx profile,
OPK_BOARD_MDBT50Q_CX_40) -- the factory Nordic Open DFU bootloader and its SoftDevice are
never replaced by this workflow.
First time on a fresh dongle: it needs a one-time S140 6.1.1 SoftDevice provisioning step
before the app package below will install. That step needs the full Nordic nRF5 SDK downloaded
locally, so it isn't something this release can hand you as a file -- follow
docs/BUILD_AND_DEPLOY.md §4a
once, then come back here for the app package below. Every release after that first one only
needs the app package.
The WebUSB firmware-update tab, its serial/UF2 DFU buttons, and the debug full-board wipe all
target the Adafruit bootloader and are rejected on this build; use
the WebUSB panel for pairing/configuration only, and
flash OpenPuck-mdbt50q-cx-40.zip below with nRF Util.
Flashing (same command for first app install and every update, once S140 is provisioned):
nrfutil device program --firmware OpenPuck-mdbt50q-cx-40.zip --traits nordicDfu
Enter DFU by pressing-and-holding the dongle's button while plugging it in (release when the
LED fades).
Tested on Raytac MDBT50Q-CX-40 (1 MB flash / 256 KB RAM -- not the CX-33).
Makerdiary nRF52840 Connect Kit -- makerdiary-connectkit @ 5a68eed5 (0.9.1)
Changes since the last build:
- keep release history instead of reusing one tag (5a68eed)
- recreate the release each run instead of reusing it (4cd8ede)
This build links the app at 0x23000 to match the Connect Kit's factory S132 5.1.0
bootloader/SoftDevice -- see
docs/MAKERDIARY_CONNECTKIT_SETUP.md
for why. The bootloader and SoftDevice are never modified; only the UF2 below is ever written.
The WebUSB firmware-update tab is disabled at the device on this build too. Use
the WebUSB panel for pairing/configuration only, and
flash updates with the UF2 below.
Flashing (same steps for first-time install and every update):
- Download
OpenPuck-makerdiary-connectkit.uf2below. - Double-tap RESET (or unplug, hold RESET, plug back in) until the
UF2BOOTdrive mounts. - Drag the
.uf2ontoUF2BOOT. - Wait for the programming blink to finish, then unplug and reconnect.
Tested on a Makerdiary nRF52840 Connect Kit (U.FL / external-antenna variant).
Same caveats as always -- see the "On LLM Use" section in the README. This is a hobbyist side
path.
OpenPuck Device Builds
Built fresh from each device's branch on every push to either one. One release, both devices,
always current.
Raytac MDBT50Q-CX-40 -- mdbt50q-cx @ 56391112 (0.9.1)
Changes since the last build:
- update combined build for official raytac target (5639111)
- drop custom raytac port in favor of upstream's official one (0b2384c)
- Merge branch 'main' into mdbt50q-cx (f5821fb)
- Add support for Raytac MDBT50Q-CX-40 (safijari#137) (f0f8c63)
- Add a "go back" option for gyro, remove dead controls (safijari#196) (118d9b4)
- Add BACK4+DPAD mode-switch chords (PS3/PS4/PS5/HORI) (safijari#174) (3f6abe1)
- Fix gyro of SC in switch mode being to sensitive (safijari#189) (7acdf43)
- chore(ci): bump actions to latest recommend - remove node v20 warnings in workflows (safijari#190) (75b57ca)
This build uses OpenPuck's official Raytac support (Adafruit's mdbt50qrx profile,
OPK_BOARD_MDBT50Q_CX_40) -- the factory Nordic Open DFU bootloader and its SoftDevice are
never replaced by this workflow.
First time on a fresh dongle: it needs a one-time S140 6.1.1 SoftDevice provisioning step
before the app package below will install. That step needs the full Nordic nRF5 SDK downloaded
locally, so it isn't something this release can hand you as a file -- follow
docs/BUILD_AND_DEPLOY.md §4a
once, then come back here for the app package below. Every release after that first one only
needs the app package.
The WebUSB firmware-update tab, its serial/UF2 DFU buttons, and the debug full-board wipe all
target the Adafruit bootloader and are rejected on this build; use
the WebUSB panel for pairing/configuration only, and
flash OpenPuck-mdbt50q-cx-40.zip below with nRF Util.
Flashing (same command for first app install and every update, once S140 is provisioned):
nrfutil device program --firmware OpenPuck-mdbt50q-cx-40.zip --traits nordicDfu
Enter DFU by pressing-and-holding the dongle's button while plugging it in (release when the
LED fades).
Tested on Raytac MDBT50Q-CX-40 (1 MB flash / 256 KB RAM -- not the CX-33).
Makerdiary nRF52840 Connect Kit -- makerdiary-connectkit @ 282cb555 (0.9.1)
Changes since the last build:
- update combined build for official raytac target (282cb55)
This build links the app at 0x23000 to match the Connect Kit's factory S132 5.1.0
bootloader/SoftDevice -- see
docs/MAKERDIARY_CONNECTKIT_SETUP.md
for why. The bootloader and SoftDevice are never modified; only the UF2 below is ever written.
The WebUSB firmware-update tab is disabled at the device on this build too. Use
the WebUSB panel for pairing/configuration only, and
flash updates with the UF2 below.
Flashing (same steps for first-time install and every update):
- Download
OpenPuck-makerdiary-connectkit.uf2below. - Double-tap RESET (or unplug, hold RESET, plug back in) until the
UF2BOOTdrive mounts. - Drag the
.uf2ontoUF2BOOT. - Wait for the programming blink to finish, then unplug and reconnect.
Tested on a Makerdiary nRF52840 Connect Kit (U.FL / external-antenna variant).
Same caveats as always -- see the "On LLM Use" section in the README. This is a hobbyist side
path.
OpenPuck MDBT50Q-CX 0.9.31-34d59463
What's changed since the first release
Two DFU packages instead of one — pick based on where you're starting from:
- openpuck-mdbt50q-cx.zip (~330 KB) — first flash on a stock dongle, or full recovery. Contains SoftDevice + app.
- openpuck-mdbt50q-cx-app.zip (~190 KB) — every update after the first flash. ~45% smaller, ~50% faster over USB CDC (skips rewriting the SoftDevice).
The Nordic bootloader enforces the "which one do I need" question itself: the app-only package declares sd_req=0xB6 (requires S140 6.1.1 already present), so if you try it on a dongle that hasn't been through the full package yet, the bootloader rejects it cleanly and nothing gets written. You'll always know which one you need.
WebUSB firmware-update tab is now disabled at the device. Previously the panel could still be reached and the device would attempt to service the vendor commands — safe writes on this build (all landmarks moved off the Nordic bootloader region), but it would still have left the Nordic bootloader's own settings page recording a stale CRC, and the bootloader would then refuse to boot the newly-flashed app until the next full nrfutil DFU cycle. All seven fwup* entry points now return FWUP_ERR_STATE or no-op on the OPK_TARGET_NORDIC_DONGLE build, and the UF2 capability tag is omitted so the panel warns if someone drops a dongle-target .uf2 onto an Adafruit board. If you use https://safijari.github.io/openpuck/ for pairing / configuration (still fully works!), just don't use the Firmware Update tab — the device will refuse.
Under-the-hood: the two zips share exactly the same app binary (build hash 34d5946), so behavior is identical between them; only what the DFU package installs alongside the app differs.
Hardware — unchanged
Tested on Raytac MDBT50Q-CX; should also work on any dongle that enumerates as 1915:521f Open DFU Bootloader when you press RESET (Nordic PCA10059, other MDBT50Q variants shipping the same Nordic Open Bootloader, third-party clones built from pca10059_usb_debug). See the previous release for the "won't work" list.
Flashing
Same as before, just pick the right zip:
First time on a fresh dongle
nrfutil nrf5sdk-tools dfu usb-serial
-pkg openpuck-mdbt50q-cx.zip
-p /dev/serial/by-id/usb-Nordic_Semiconductor_Open_DFU_Bootloader_*-if00
Subsequent updates (faster, SD is already installed)
nrfutil nrf5sdk-tools dfu usb-serial
-pkg openpuck-mdbt50q-cx-app.zip
-p /dev/serial/by-id/usb-Nordic_Semiconductor_Open_DFU_Bootloader_*-if00
Enter DFU the same way: press-and-hold RESET while plugging in (or press once if already plugged in and the LED starts a slow ~1 Hz breathe).
What you don't have to worry about
- Re-pairing. LittleFS at 0xD9000 is never touched by either DFU package (SD writes 0x1000-0x26000, app writes 0x26000+). Your paired controller stays bonded across updates. Only ERASE-ALL / WebUSB "Factory erase" clears bonds.
- Losing the bootloader. Still the design invariant. Every code path that could write flash is bounded strictly below 0xE0000 (Nordic bootloader start); the WebUSB update path that used to be an unaudited exception is now stubbed out entirely on this build.
Caveats
Same as always — see the "On LLM Use" section in the README. This is still a hobbyist side path.
OpenPuck Makerdiary Connect Kit 0.9.1-e679c736
OpenPuck on nRF52840 dongles with the stock Nordic Open Bootloader
OpenPuck on nRF52840 dongles with the stock Nordic Open Bootloader
First release of the openpuck-mdbt50q-cx.zip DFU package — flashes OpenPuck onto an nRF52840 dongle running Nordic's stock Open Bootloader, without SWD, soldering, or
replacing the bootloader. On the resulting board you can press RESET at any time to re-enter DFU and flash something else.
What's in the zip
A signed nrfutil DFU package containing:
- SoftDevice s140 v6.1.1 (installed at 0x1000-0x26000; the shipped dongle has no SoftDevice)
- OpenPuck application (installed at 0x26000, ~184 KB), built from the tag/commit named in this release
The resident Nordic Open Bootloader at 0xE0000-0xFE000 is left untouched.
Hardware
Tested on: Raytac MDBT50Q-CX (USB-C stick, nRF52840 module, ships with Nordic Open Bootloader from nRF5 SDK 15.3.0).
Should also work (same bootloader / same flash layout, unverified by me):
- Nordic nRF52840 Dongle (PCA10059) — the reference design this bootloader was built for
- Other Raytac MDBT50Q-based boards shipping with the stock Nordic Open Bootloader
- Any third-party board using the pca10059_usb_debug open_bootloader configuration
Quick sanity test: if pressing RESET on your dongle causes it to enumerate as 1915:521f Nordic Semiconductor ASA Open DFU Bootloader, this package should work.
Will not work — use the standard OpenPuck .uf2 release instead:
- Adafruit Feather nRF52840 Express, Nice!Nano v2, Pro Micro nRF52840 clones, or anything else with the Adafruit UF2 bootloader
- Boards that require SWD to flash (no USB DFU)
Flashing
One-time setup — install Nordic's nrfutil and the SDK tools module:
nrfutil install nrf5sdk-tools
Enter DFU mode: press and briefly hold the RESET button on the dongle (or press it while plugging in). The LED will start a slow ~1 Hz breathe pulse. Confirm with:
lsusb | grep 521f # should show "Open DFU Bootloader"
Flash:
Linux
nrfutil nrf5sdk-tools dfu usb-serial
-pkg openpuck-mdbt50q-cx.zip
-p /dev/serial/by-id/usb-Nordic_Semiconductor_Open_DFU_Bootloader_*-if00
macOS
nrfutil nrf5sdk-tools dfu usb-serial
-pkg openpuck-mdbt50q-cx.zip
-p /dev/cu.usbmodem*
Windows (find COM in Device Manager)
nrfutil nrf5sdk-tools dfu usb-serial -pkg openpuck-mdbt50q-cx.zip -p COM5
Linux permission-denied? Either add yourself to dialout (sudo usermod -aG dialout $USER && newgrp dialout) or grant one-off ACL (sudo setfacl -m u:$USER:rw
/dev/ttyACM*).
After flashing
The dongle re-enumerates as OpenPuck (default Steam mode → iProduct string STEAM(puck), six HID interfaces + WebUSB). Everything works as documented in the main
BUILD_AND_DEPLOY.md — pairing, mode switching, the WebUSB config panel — with one exception: the WebUSB "Firmware update" panel is disabled on this build (it writes to
Adafruit-bootloader-specific flash pages). For future OpenPuck updates on this dongle, re-enter DFU and push a new .zip with the same nrfutil command.
Press RESET once at any time to re-enter the Nordic bootloader — that's the "am I bricked?" recovery path, and it's always available. If it works, the bootloader is
intact.
Caveats
See "On LLM Use" in the readme — this build path is a hobbyist side target, not a supported configuration. If you brick a $15 dongle, the bootloader lets you unbrick
it; if you brick something you care about, that's on you.