Skip to main content

Hardware and Boards

This page lists the boards that are part of the release build. The source of truth for the buildable board list is scripts/lib/boards.sh; run scripts/boards.sh --table before release docs changes and keep this table in sync.

Supported boards

Board IDBoardChipFlashNotes
picoRaspberry Pi PicoRP20402MBOnboard LED
pico2Raspberry Pi Pico 2RP23504MBOnboard LED
pico2_wRaspberry Pi Pico 2 WRP23504MBCYW43 LED support
waveshare_rp2040_zeroWaveshare RP2040-ZeroRP20402MBOnboard NeoPixel
waveshare_rp2040_pizeroWaveshare RP2040-PiZeroRP204016MBDVI/HDMI output
waveshare_rp2040_touch_lcd_1.28Waveshare RP2040 Touch LCD 1.28RP20404MBRound LCD, touch, IMU
waveshare_rp2350_lcd_1.47_aWaveshare RP2350-LCD-1.47-ARP235016MBLCD, NeoPixel
waveshare_rp2350_touch_lcd_1.69Waveshare RP2350-Touch-LCD-1.69RP235016MBLCD, touch, IMU, buzzer
adafruit_feather_rp2040Adafruit Feather RP2040RP20408MBNeoPixel, STEMMA QT

Build names

Release firmware is named mcujs-<version>-<board-id>.uf2. For example, the Raspberry Pi Pico artifact for version 0.1.0 is mcujs-0.1.0-pico.uf2.

Use the board ID when building from source:

./build.sh pico
./build.sh waveshare_rp2040_pizero
./build.sh all --clean

Pin notes

  • Onboard LED: usually GPIO 25 on Pico-style boards.
  • Pico 2 W uses the CYW43 wireless chip for the LED, not a direct GPIO LED.
  • Waveshare RP2040-Zero uses a NeoPixel on GPIO 16.
  • Waveshare RP2040-PiZero exposes DVI/HDMI output through the board-specific DVI bindings.
  • Waveshare LCD boards use board-local display driver examples under examples/.
  • Check your board silkscreen for I2C, SPI, and ADC pins before wiring peripherals.

Waveshare RP2040 Touch LCD 1.28

FunctionGPIO
LCD SPI1 SCK10
LCD SPI1 MOSI11
LCD SPI1 MISO12
LCD CS9
LCD DC8
LCD RST13
LCD BL25
Touch/IMU I2C1 SDA6
Touch/IMU I2C1 SCL7
Touch INT21
Touch RST22
IMU INT123
IMU INT224
Battery ADC29

Quickstart: Copy files from examples/waveshare-lcd-1.28/ to the device:

// Display example
const { GC9A01A } = require('./gc9a01a');
const display = GC9A01A();
display.init();
display.fill(display.color565(8, 12, 18));

// Touch example
const { CST816S } = require('./cst816s');
const touch = CST816S();
touch.init();
const t = touch.read();
if (t.touching) console.log(t.x, t.y);

// IMU example
const { QMI8658 } = require('./qmi8658');
const imu = QMI8658();
imu.init();
const data = imu.read();
console.log('Accel:', data.accel);

Available demos: demo-slideshow.js, demo-fps.js, demo-touch-draw.js, demo-imu.js

Waveshare RP2350-LCD-1.47-A

FunctionGPIO
LCD SPI0 SCK18
LCD SPI0 MOSI19
LCD CS17
LCD DC16
LCD RST20
LCD BL21
SD Card SPI1 SCK10
SD Card SPI1 MOSI11
SD Card SPI1 MISO12
SD Card CS15
NeoPixel (WS2812B)22

Quickstart: Copy files from examples/waveshare-lcd-1.47/ to the device:

// Display example (320x172 horizontal, ST7789V3)
var s = require('./screen.js').createScreen();
s.init();
s.clear();
s.fillRect(0, 0, 320, 86, s.RED);
s.fillRect(0, 86, 320, 86, s.BLUE);
s.flush();

Waveshare RP2350-Touch-LCD-1.69

FunctionGPIO
LCD SPI1 SCK10
LCD SPI1 MOSI11
LCD SPI1 MISO12
LCD CS9
LCD DC8
LCD RST13
LCD BL25
Touch/IMU I2C1 SDA6
Touch/IMU I2C1 SCL7
Touch INT21
Touch RST22
IMU INT123
IMU INT224
Buzzer PWM2
Battery ADC29

Available demos: demo-slideshow.js, demo-fps.js, demo-touch.js, demo-imu.js, demo-buzzer.js

Adding a board

  1. Add board/<board-id>/board_config.h and board/<board-id>/board_config.cmake.
  2. Add a memory map file if the board needs a non-default flash layout.
  3. Add the board ID and metadata to scripts/lib/boards.sh.
  4. Run scripts/verify-release.sh --allow-dirty.
  5. Build the board with ./build.sh <board-id>.
  6. Document any board-specific examples or pin notes here.

Key terms