~/workshop $ cat ./inventory/waveshare-rp2350-lcd-1.28/README.md

Waveshare RP2350-LCD-1.28

category
MCU
qty
1
status
owned / untested
maker
Waveshare
Waveshare RP2350-LCD-1.28

Overview

A round MCU board built around the Raspberry Pi RP2350 chip with a 1.28“ round IPS LCD, a 6-axis IMU, and Li-ion battery charge management all integrated on one small (Φ~32.4mm active display) circular PCB. Same display driver chip (GC9A01A) as the GC9A01 1.28“ round LCD already in this library, but here it’s soldered directly to the MCU board rather than a separate module needing external SPI wiring.

Key specs

  • MCU: RP2350, dual-core+dual-architecture (2× Arm Cortex-M33 + 2× Hazard3 RISC-V, switchable), up to 150MHz
  • Flash: 4MB on-chip; SRAM: 520KB
  • Display: GC9A01A driver, 240×240 IPS round LCD, Φ32.4mm active area, SPI interface, 0.135×0.135mm pixel pitch
  • IMU: QMI8658 6-axis (3-axis accelerometer + 3-axis gyroscope), 16-bit resolution, accelerometer range ±2/±4/±8/±16g, gyro range up to ±2048°/sec
  • USB: USB-C (power, programming, USB1.1 host/device)
  • GPIO: 30 total, brought out via two 1.27mm-pitch female headers (silkscreened H1 and H2) — 11 pins are pre-committed to onboard peripherals (display, IMU), 19 are free for general use (full breakdown in Pinout below)
  • Interfaces: 2× SPI, 2× I2C, 2× UART, 3× 12-bit ADC, 24× PWM channels
  • Onboard: BOOT button, RESET button, 2-pin battery connector with integrated Li-ion recharge/discharge management

Pinout

Two 1.27mm-pitch female headers (H1, H2) expose 30 GPIO. Fully resolved as of 2026-08-02 against Waveshare’s own official pinout diagram (/inventory/waveshare-rp2350-lcd-1.28/pinout-diagram.png, supplied by Alex) — which independently confirms every GPIO-to-function binding previously sourced from Adafruit’s CircuitPython board definition, and additionally supplies the physical H1/H2 pin positions, the GND pin locations, and the SWD debug pins, none of which the CircuitPython source covered.

Physical header layout

Pin 1 is nearest the board edge marked on the silkscreen; odd pins are one row, even the other.

H1 H1
GP8 LCD_DC 1 2 GP0
GP9 LCD_CS 3 4 GP1
GP10 LCD_CLK 5 6 GP2
GP11 LCD_DIN 7 8 GP3
GP12 LCD_RST 9 10 GP4
GP13 11 12 GP5
GP14 13 14 GP6 IMU_SDA
GP15 15 16 GP7 IMU_SCL
SWCLK 17 18 VSYS
SWDIO 19 20 GND
H2 H2
GP24 IMU_INT2 1 2 GP16
GP25 LCD_BL 3 4 GP17
GP26 5 6 GP18
GP27 7 8 GP19
GP28 9 10 GP20
GP29 BAT_ADC 11 12 GP21
RUN 13 14 GP22
BOOT 15 16 GP23 IMU_INT1
ADC_AVDD 17 18 VSYS
GND 19 20 GND

Three GND pins, all documented: H1 pin 20, H2 pin 19, H2 pin 20. Each header carries at least one, so any external wiring can ground on its own header without a jumper across the board.

SWCLK/SWDIO on H1 pins 17/19 means full Arm SWD debugging is available — single-stepping, breakpoints, live variable inspection — not just printf-over-serial. Worth knowing before debugging a display driver blind.

RUN (H2 p13) and BOOT (H2 p15) are broken out, so reset and bootloader entry can be triggered externally — useful if the enclosure covers the onboard buttons.

GPIO Function Reserved?
GP0–GP5 General purpose Free
GP6 IMU_SDA — QMI8658 I2C data Reserved
GP7 IMU_SCL — QMI8658 I2C clock Reserved
GP8 LCD_DC — display data/command Reserved
GP9 LCD_CS — display chip select Reserved
GP10 LCD_CLK — display SPI clock Reserved
GP11 LCD_DIN — display SPI MOSI Reserved
GP12 LCD_RST — display reset Reserved
GP13–GP22 General purpose Free (10 pins)
GP23 IMU_INT1 — QMI8658 interrupt 1 Reserved
GP24 IMU_INT2 — QMI8658 interrupt 2 Reserved
GP25 LCD_BL — display backlight Reserved, but see note below
GP26 / A0 General purpose, ADC-capable Free
GP27 / A1 General purpose, ADC-capable Free
GP28 / A2 General purpose, ADC-capable Free
GP29 / A3 BAT_ADC — battery voltage readout (0.5 bias divider) Reserved, but see note below

19 of the 30 GPIO are genuinely free for a project to use (GP0–5, GP13–22, GP26–28).

Two reserved pins are actually useful, not just off-limits: LCD_BL (GP25) means this board’s backlight has real software on/off/PWM-dimming control — unlike the standalone 7-pin GC9A01 module in this library, whose backlight is hardwired always-on with no control pin at all. BAT_ADC (GP29) means battery-voltage monitoring is already wired in with no extra circuit needed — read it as an analog input (apply the 0.5 bias/divider factor) rather than building a separate sense-divider.

Feature Notes
Display GC9A01A, SPI on GP8–12, backlight independently controllable on GP25
IMU (QMI8658) I2C on GP6/7, interrupts on GP23/24
Battery connector 2-pin, MX1.25 (1.25mm pitch), ETA6096 charge-management IC, voltage sense on GP29/A3
BOOT / RESET Dedicated buttons, not user GPIO
H1 / H2 headers 19 of 30 GPIO free for general use (see table above)

Wiring / typical usage

Power/program over USB-C, or run portably off a 2-pin Li-ion battery on the MX1.25 (1.25mm pitch) connector, managed by an onboard ETA6096 charge IC (up to 2.5A, CC/CV). This is the same connector pitch already confirmed/flagged for the Heltec V4 and T-Display battery inputs in this library — the -99BATT 503035 cells were very likely bought as a matched set for this pitch family, but still verify by physical test-fit before assuming plug-and-play, per this library’s standing convention on pack-assembler-marked cells with no traceable connector spec. Whether the ETA6096 supports true power-path operation (running the board off USB while simultaneously charging the battery) was not confirmed from its datasheet in this pass — until verified, treat USB-connected-while-battery-switched-on as an open question rather than assumed-safe. The display and IMU are internally wired — no external SPI/I2C wiring needed to use them, just initialize in software. Battery voltage can be read directly off GP29/A3 (BAT_ADC, 0.5 bias divider) with no extra sense circuit needed.

Code / libraries

  • Waveshare provides MicroPython and C/C++ (Pico SDK-based) example firmware for this exact board (display driver + IMU reading) — check the official wiki’s demo downloads before writing a driver from scratch.
  • Display: any GC9A01A driver library (the same one usable for the standalone GC9A01 module in this library, since it’s the same display driver chip) works once the correct SPI pins for this board are confirmed.
  • IMU: QMI8658-specific driver (Waveshare publishes one) — different register map from more common IMUs like MPU6050, don’t assume drop-in compatibility.

Source material

  • Board silkscreen (RP2350-LCD-1.28, H1/H2 header labels, BOOT/RESET button layout) read directly from the supplied photo — matches the official Waveshare product photo pixel-for-pixel in layout.
  • Full specs (MCU, display driver, IMU model, memory, interfaces): Waveshare RP2350-LCD-1.28 wiki, Waveshare RP2350-LCD-1.28 product page — both now return HTTP 403 to automated fetching (2026-07-26), could not be re-verified directly this pass.
  • Official Waveshare pinout diagram: /inventory/waveshare-rp2350-lcd-1.28/pinout-diagram.png — supplied by Alex 2026-08-02. The authoritative source for physical H1/H2 pin positions, GND locations, SWD, RUN/BOOT and ADC_AVDD. Independently confirms every GPIO-to-function binding below.
  • Full GPIO pin map (GP0–GP29, every reserved function): Adafruit CircuitPython board.c for waveshare_rp2350_lcd_1_28 — an independent, authoritative source (official CircuitPython board support files), used specifically because Waveshare’s own wiki blocked automated access. High confidence: this is source code defining the actual pin bindings, not a secondary description.
  • Battery connector pitch (MX1.25, 1.25mm) and charge IC (ETA6096): CNX Software coverage of this board, which republished Waveshare’s own spec sheet — cross-check against Waveshare’s product page directly once it’s reachable again.
  • ETA6096 IC: eta-semi.com ETA6096 datasheet — confirms it’s a switching Li-ion charger (up to 2.5A, CC/CV, OVP to 32V input); power-path (simultaneous USB-load + battery-charge) behavior specifically not confirmed from this datasheet.
  • IMU datasheet: QMI8658A datasheet
  • Product photo: /inventory/waveshare-rp2350-lcd-1.28/product-photo.jpg — exact match, genuine Waveshare official product photo (back side, showing the RP2350 chip, QMI8658, and H1/H2 headers matching the owned unit’s silkscreen exactly), sourced 2026-07-25 from https://www.waveshare.com/media/catalog/product/cache/1/image/800x800/9df78eab33525d08d6e5fb8d27136e95/r/p/rp2350-lcd-1.28-2.jpg
  • Local files: see /inventory/waveshare-rp2350-lcd-1.28/as-supplied.jpeg (photo of the actual owned unit, silkscreen legible)

Verification

Board silkscreen verified directly against the genuine Waveshare official product photo — exact match (H1/H2 labels, button placement, chip markings all consistent), high confidence this is genuine Waveshare stock or an extremely faithful match. Full pin-by-pin GPIO table RESOLVED 2026-08-02. Waveshare's own official pinout diagram (assets/pinout-diagram.png) confirms every GPIO-to-function binding previously derived from Adafruit's CircuitPython board.c — two independent sources in agreement, no discrepancies. Physical H1/H2 positions, the three GND pins, the SWD pins, and RUN/BOOT are now documented from that diagram; the earlier "header side not confirmed" caveat is retired. Battery connector pitch and charge IC identity sourced from a third-party republication of Waveshare's spec sheet (CNX Software), not verified directly against Waveshare's own page (blocked, HTTP 403) or physically measured on the owned unit — reasonably high confidence given it's a direct spec republication, but flag as not independently re-derived.

Notes / gotchas

  • Same GC9A01A display driver as the standalone GC9A01 round LCD — a display driver library written for one should be adaptable to the other once SPI pins are confirmed for this board.
  • QMI8658 is a different IMU family from more commonly-tutorialed chips (MPU6050/MPU9250) — use Waveshare’s own demo code or a QMI8658-specific library rather than assuming register compatibility.
  • GPIO map is now confirmed by two independent sources in full agreement (Waveshare’s official pinout diagram and Adafruit’s CircuitPython board definition). The former “H1/H2 placement unknown” gap is closed — physical positions, all three GND pins, SWD and RUN/BOOT are documented above.
  • Don’t assume the onboard ETA6096 charger supports running the board off USB while the battery is connected and switched into the circuit — not confirmed from its datasheet. Treat as the same open risk already flagged in the Hummingbird Tamagotchi build guide.