121 lines
4.3 KiB
Markdown
121 lines
4.3 KiB
Markdown
# RP2040 Connection List — Securityfest Badge 2026
|
||
|
||
A programmer-friendly breakdown of how the RP2040 (U2) is wired on the badge.
|
||
|
||
## 🔌 Programming & Debug
|
||
|
||
| Function | RP2040 Pin | Notes |
|
||
|---|---|---|
|
||
| **USB-C (J2)** | USB_DM (46), USB_DP (47) | Primary way to flash firmware (UF2 bootloader / picotool / PlatformIO) |
|
||
| **BOOTSEL button (SW3)** | Pulls QSPI_CS low | Hold while plugging in USB or while pressing RESET to enter UF2 bootloader |
|
||
| **RESET button (SW1)** | RUN (26) | Pulls RUN to GND through R6 (330 Ω) |
|
||
| **SWCLK test point** | SWCLK (24) | For SWD debugging (e.g. with a Picoprobe / J-Link) |
|
||
| **SWDIO test point** | SWDIO (25) | Same — these are exposed as test pads, not a header |
|
||
| **Crystal X1** | XIN (20), XOUT (21) | External clock source |
|
||
|
||
To flash: hold `BOOTSEL`, press and release `RESET`, release `BOOTSEL` → device shows up as `RPI-RP2` mass storage.
|
||
|
||
## 🎮 Buttons (all active-LOW, enable internal pull-ups)
|
||
|
||
| GPIO | Pin | Function | Schematic Net |
|
||
|---|---|---|---|
|
||
| GPIO9 | 12 | **A** button (SW2) | RP_BTN_A |
|
||
| GPIO10 | 13 | **B** button (SW4) | RP_BTN_B |
|
||
| GPIO11 | 14 | **Up** (SW5) | RP_BTN_UP |
|
||
| GPIO12 | 15 | **Down** (SW8) | RP_BTN_DWN |
|
||
| GPIO13 | 16 | **Left** (SW6) | RP_BTN_LFT |
|
||
| GPIO14 | 17 | **Right** (SW7) | RP_BTN_RGT |
|
||
|
||
All buttons short to GND when pressed — there are no external pull-ups, so configure with `gpio_pull_up()` (or equivalent in your SDK).
|
||
|
||
## 💡 LEDs
|
||
|
||
| GPIO | Pin | Function | Notes |
|
||
|---|---|---|---|
|
||
| GPIO15 | 18 | **Flashlight LEDs** (FLED1–3) | Drives MOSFET Q1 gate (FL_LED net). Set HIGH to turn on. |
|
||
| GPIO23 | 35 | Front LED 1 | Direct drive |
|
||
| GPIO24 | 36 | Front LED 2 | Direct drive |
|
||
| GPIO25 | 37 | Front LED 3 | Direct drive |
|
||
| GPIO26 / ADC0 | 38 | Front LED 4 | Direct drive (ADC capable but used as LED) |
|
||
|
||
## 🟦 LED Matrix (9×9 Charlieplex via IS31FL3731)
|
||
|
||
The 9×9 matrix is driven by the IS31FL3731 (U1). You don't talk to the LEDs directly — you talk to the chip over a **dedicated I²C bus**:
|
||
|
||
| GPIO | Pin | Function |
|
||
|---|---|---|
|
||
| GPIO2 | 4 | **SDA_LED** → IS31FL3731 SDA |
|
||
| GPIO3 | 5 | **SCL_LED** → IS31FL3731 SCL |
|
||
|
||
The IS31FL3731 has its `AD` pin tied to GND, so its I²C address is `0x74`. There are existing libraries for this chip (CircuitPython, Adafruit, etc.).
|
||
|
||
## 🧩 Main I²C bus (shared with SAO + expansion header)
|
||
|
||
| GPIO | Pin | Function |
|
||
|---|---|---|
|
||
| GPIO4 | 6 | **SDA** (4.7 kΩ pull-up via R29) |
|
||
| GPIO5 | 7 | **SCL** (4.7 kΩ pull-up via R28) |
|
||
|
||
## 🔧 SAO Connector (J3 — DEFCON Simple Add-On)
|
||
|
||
| RP2040 GPIO | SAO Pin |
|
||
|---|---|
|
||
| 3V3 | Power |
|
||
| GND | Ground |
|
||
| GPIO4 (SDA) | SDA |
|
||
| GPIO5 (SCL) | SCL |
|
||
| GPIO0 | SAO_GPIO1 |
|
||
| GPIO1 | SAO_GPIO2 |
|
||
|
||
GPIO0 and GPIO1 are also UART0 TX/RX by default — handy for a SAO that wants serial.
|
||
|
||
## 📍 Expansion Header (J1, 8-pin)
|
||
|
||
Exposes spare GPIOs and the main I²C bus:
|
||
|
||
| Pin | Net | RP2040 |
|
||
|---|---|---|
|
||
| 1 | +3V3 | — |
|
||
| 2 | GND | — |
|
||
| 3 | GP19 | GPIO19 (pin 30) |
|
||
| 4 | GP18 | GPIO18 (pin 29) |
|
||
| 5 | GP17 | GPIO17 (pin 28) |
|
||
| 6 | GP16 | GPIO16 (pin 27) |
|
||
| 7 | SCL | GPIO5 |
|
||
| 8 | SDA | GPIO4 |
|
||
|
||
GPIO16–19 are great for SPI (SPI0: SCK=GP18, TX=GP19, RX=GP16, CS=GP17) if you want to add peripherals.
|
||
|
||
## 💾 External Flash (W25Q128JVS — 16 MB)
|
||
|
||
You normally don't touch these — the bootrom and SDK handle them — but for completeness:
|
||
|
||
| Function | RP2040 Pin |
|
||
|---|---|
|
||
| QSPI_CS | 56 |
|
||
| QSPI_SCLK | 52 |
|
||
| QSPI_SD0 | 53 |
|
||
| QSPI_SD1 | 55 |
|
||
| QSPI_SD2 | 54 |
|
||
| QSPI_SD3 | 51 |
|
||
|
||
## ⚡ Power
|
||
|
||
- **+3V3** rail comes from either the TPS63020 buck-boost (battery side) or the AP2112K-3.3 LDO (USB-C side), combined through a Schottky diode.
|
||
- All RP2040 power pins (IOVDD, DVDD, VREG_VIN, ADC_AVDD, USB_VDD) tie to +3V3 with local decoupling.
|
||
|
||
## 🚫 Unused / available GPIOs
|
||
|
||
These pins aren't wired to anything on the schematic — fair game for hacks, mods, or bodges:
|
||
|
||
`GPIO6, GPIO7, GPIO8, GPIO20, GPIO21, GPIO22, GPIO27 (ADC1), GPIO28 (ADC2), GPIO29 (ADC3)`
|
||
|
||
---
|
||
|
||
## Quick programming cheat-sheet
|
||
|
||
- USB CDC serial works out of the box on the USB-C port.
|
||
- Use `gpio_pull_up()` on all 6 button pins.
|
||
- Two I²C buses available — `i2c0`/`i2c1` mapping depends on your firmware, but **GPIO2/3 = LED matrix**, **GPIO4/5 = user/SAO bus**.
|
||
- ADC0 is already taken (front LED 4); ADC1–3 are free if you want analog inputs.
|