An embedded PSP BaryonSweeper — a self-contained "Pandora battery" for unbricking a
PlayStation Portable. It runs on a Raspberry Pi Pico and emulates a PSP "JigKick"
service battery: it answers the console's battery authentication over the single-wire
Baryon serial line and presents the service-mode serial (FFFFFFFF), so the PSP boots
into service mode — the state used to run an unbricking IPL from a Memory Stick.
The goal of this project is to make BaryonSweeper a standalone piece of hardware. Where the original tool drives the authentication from a PC over a USB-to-TTL adapter, this port runs the whole exchange on-device — so the Pico is the Pandora battery, with no computer in the loop.
This is a MicroPython port of khubik2/pysweeper, the original BaryonSweeper. See Credits.
⚠️ Authentication keys are not included. See Authentication keys.
- Raspberry Pi Pico (RP2040) running MicroPython
- A single WS2812 / NeoPixel status LED (on-board or wired to GP16)
- A wiring harness to the PSP battery terminals (Baryon data line + ground)
| Pico | PSP battery connector |
|---|---|
| GP0 (UART0 TX) | Baryon data line (K-line) |
| GP1 (UART0 RX) | Baryon data line (K-line) |
| GND | Battery GND |
| GP16 | NeoPixel status LED (data) |
The data line is half-duplex single-wire: GP0 (TX) and GP1 (RX) are tied together to the one battery data pad. The Pico emulates only the data / authentication side of the battery. In the intended build it is embedded inside a real PSP battery, so the battery's own cells supply the PSP's power — you do not power the console separately.
PSP-1000 exception: the original PSP-1000 only boots into service mode with the AC charger connected. All other models (2000, 3000, Go, Street) enter service mode from the battery alone.
19200 baud, 8 data bits, EVEN parity, 1 stop bit (8E1).
Note: the PC reference (
pysweeper) uses 8E2, but on the RP2040 + PSP this build runs at 8E1 — that is the empirically-working configuration. Do not change it to 2 stop bits.
The challenge/response uses a set of per-version AES keys and challenge secrets. They are intentionally not distributed with this project — they are sensitive material, and sourcing them is left to you. Everything key-related is kept out of the repository:
keys.example.py— a committed template with the required structure and placeholder (all-zero) values.keys.py— your real values. It is listed in.gitignoreand must never be committed.
Set it up by copying the template and filling it in:
cp keys.example.py keys.py
# then edit keys.py and replace every placeholder with a real value
keys.py provides the following, all imported by main.py:
| Name | Shape |
|---|---|
keystore[v] |
16-byte AES key (32 hex) |
challenge1_secret[v] |
8 bytes (16 hex) |
challenge2_secret[v] |
8 bytes (16 hex) |
go_key1 / go_key2 / go_secret |
16 bytes each (32 hex) |
v is the board key-version id. Fill in the versions your target PSP uses; with the
placeholder values (or missing entries) the authentication will simply fail.
- Flash MicroPython to your Pico.
- Create and fill in
keys.pyas above. - Copy these three files to the Pico's filesystem:
main.py,neopixel.py,keys.py. - Reset the Pico, insert the battery it's embedded in (or connect it to the PSP battery terminals), and power on the PSP. On a PSP-1000, also connect the AC charger — it will not enter service mode on battery alone.
Raise DEBUG_LEVEL (0–3) at the top of main.py for more verbose serial logging.
| Color | Meaning |
|---|---|
| Yellow | Booting |
| Blue | Frame start received from the PSP |
| Orange | Transmitting a reply |
| Green | Idle / last exchange OK |
| Violet | Checksum failed on a received frame |
| Pink | Error, timeout, or bad frame length |
| Red | UART echo self-test failed (non-fatal) |
On boot the firmware runs a UART echo self-test. On the single-wire harness it sees its own transmission and passes; if it fails it flashes red but continues anyway.
Consumer PSP hardware revisions — 1000, 2000, 3000, Street (E1000), and the various Slim/Street board revisions — subject to having the correct per-version keys.
- khubik2/pysweeper by khubik — the original BaryonSweeper (JigKick service-tool emulator) that this project is a port of. With dogecore (response-generator port, stream repair, interface code), Proxima (battery-authentication reverse engineering), and the wider PSPx.Ru community.
- This repository is the MicroPython / Raspberry Pi Pico port of that work — the same protocol, moved onto a standalone microcontroller.
neopixel.pyis a vendored copy of pi_pico_neopixel by Blaž Rolih (blaz-r), used under the MIT License (Copyright © 2021 blaz-r). ItscolorHSV()is adapted from Adafruit_NeoPixel.
For education and repair of hardware you own. The authentication keys are the property of their respective owner and are intentionally not included. No warranty — see LICENSE. Use at your own risk.
MIT © 2026 CAATZ