| # 32blit + Pico SDK <!-- omit in toc --> |
| |
| The Pico port brings the 32blit SDK to PicoSystem and other RP2040-based devices. |
| |
| Since RP2040 is slower and less capable than 32blit's STM32H750 there are some limitations, but most of the 32blit SDK conceniences work well. |
| |
| - [Why use 32blit SDK on PicoSystem?](#why-use-32blit-sdk-on-picosystem) |
| - [Building The SDK \& Examples](#building-the-sdk--examples) |
| - [Fetch Pico SDK Automatically (Quick-Start)](#fetch-pico-sdk-automatically-quick-start) |
| - [Building Examples](#building-examples) |
| - [Existing Pico SDK (Advanced)](#existing-pico-sdk-advanced) |
| - [Starting Your Own 32blit SDK Project](#starting-your-own-32blit-sdk-project) |
| - [Coniguring PicoSystem builds](#coniguring-picosystem-builds) |
| - [Building](#building) |
| - [Copying to your PicoSystem](#copying-to-your-picosystem) |
| - [Extra configuration](#extra-configuration) |
| - [API Limitations \& Board Details](#api-limitations--board-details) |
| - [Unsupported Features](#unsupported-features) |
| - [Limitations](#limitations) |
| - [Board-specific details](#board-specific-details) |
| - [Troubleshooting](#troubleshooting) |
| - [fatal error: tusb.h: No such file or directory](#fatal-error-tusbh-no-such-file-or-directory) |
| |
| |
| ## Why use 32blit SDK on PicoSystem? |
| |
| The number 1 reason is portability! 32blit SDK will build for: |
| |
| * Windows |
| * macOS |
| * Linux |
| * Emscripten (WebAssembly) |
| * PicoSystem |
| * 32blit |
| |
| And is portable to any platform supporting SDL2. |
| |
| This means you can ship your game to more people on more platforms, share it online to play, and reach a little further than the confines of PicoSystem! |
| |
| Additionally the 32blit SDK has some conveniences: |
| |
| * Tiled editor .tmx support for levels |
| * An asset pipeline for converting fonts & spritesheets for use on device |
| * A boilerplate project with GitHub Actions - https://github.com/32blit/picosystem-boilerplate |
| |
| ## Building The SDK & Examples |
| |
| We recommend using Linux to work with PicoSystem/Pico SDK. It's the path of least resistance! |
| |
| This guide was tested with Ubuntu 21.04, and most of these instructions will work in its WSL (Windows Subsystem for Linux) equivalent. |
| |
| You'll need a compiler and a few other dependencies to get started building C++ for PicoSystem: |
| |
| ``` |
| sudo apt install git gcc g++ gcc-arm-none-eabi cmake make \ |
| python3 python3-pip python3-setuptools \ |
| libsdl2-dev libsdl2-image-dev libsdl2-net-dev unzip |
| ``` |
| |
| And the 32blit tools: |
| |
| ``` |
| pip3 install 32blit |
| ``` |
| |
| If pip gives you warnings about 32blit being installed in a directory not on PATH, make sure you add it, eg: |
| |
| ``` |
| export PATH=$PATH:~/.local/bin |
| ``` |
| |
| You might also want to add this to the bottom of your `~/.bashrc`. |
| |
| And finally you should fetch the 32blit SDK and examples: |
| |
| ``` |
| git clone https://github.com/32blit/32blit-sdk |
| git clone https://github.com/32blit/32blit-examples |
| ``` |
| |
| ### Fetch Pico SDK Automatically (Quick-Start) |
| |
| You can use Pico SDK's fetch-from-git feature and build like so: |
| |
| ``` |
| cd 32blit-sdk |
| mkdir build.pico |
| cd build.pico |
| cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem |
| ``` |
| |
| The 32blit SDK includes only `picosystem-hardware-test` which you can make with: |
| |
| ``` |
| make picosystem-hardware-test |
| ``` |
| |
| |
| #### Building Examples |
| |
| The [32blit-examples](https://github.com/32blit/32blit-examples) repository includes a series of demos showcasing various 32blit SDK features. |
| |
| In order to compile examples against pico-sdk, your directory tree should look something like: |
| |
| - root_dir |
| - 32blit-sdk |
| - 32blit-examples |
| |
| For example: |
| |
| ``` |
| cd 32blit-examples |
| mkdir build.pico |
| cd build.pico |
| cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true -DPICO_BOARD=pimoroni_picosystem |
| ``` |
| |
| Now you can start hacking on an existing example, or skip to [Starting Your Own 32blit SDK Project](#starting-your-own-32blit-sdk-project). |
| |
| ### Existing Pico SDK (Advanced) |
| |
| This requires a working Pico SDK setup ([Getting started with Raspberry Pi Pico](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf)), the 32blit tools and a copy of the 32blit SDK (this repository). |
| |
| To build for a pico-based device you need to specify both the 32blit and Pico SDK paths, and the device/board you are building for. |
| |
| Your directory tree should look something like: |
| |
| - root_dir |
| - 32blit-sdk |
| - 32blit-examples |
| - pico-sdk |
| - pico-extras |
| |
| To build the examples for a PicoSystem: |
| |
| ``` |
| cd 32blit-examples |
| mkdir build.pico |
| cd build.pico |
| cmake .. -D32BLIT_DIR=`pwd`/.. -DPICO_SDK_PATH=/path/to/pico-sdk -DPICO_BOARD=pimoroni_picosystem |
| ``` |
| |
| And then run `make` as usual. |
| |
| Now you can start hacking on an existing example, or skip to [Starting Your Own 32blit SDK Project](#starting-your-own-32blit-sdk-project). |
| |
| ## Starting Your Own 32blit SDK Project |
| |
| We've created a boilerplate 32blit SDK project to get you started: https://github.com/32blit/picosystem-boilerplate/ |
| |
| Click the green "Use this template" button to start creating your new project. |
| |
| ### Coniguring PicoSystem builds |
| |
| Clone your new GitHub project to your local machine alongside the "pico-sdk" directory. |
| |
| Create a new build directory for PicoSystem, the name doesn't matter but we tend to use "build.pico": |
| |
| ``` |
| cd your-repo-name |
| mkdir build.pico |
| cd build.pico |
| ``` |
| |
| Then configure, like so: |
| |
| ``` |
| cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/pico.toolchain -DPICO_BOARD=pimoroni_picosystem |
| ``` |
| This requires the Pico SDK, Pico Extras and 32blit SDK to be alongside your project directory. |
| |
| Alternatively you can ask the Pico SDK to fetch itself from git: |
| |
| ``` |
| cmake .. -DCMAKE_TOOLCHAIN_FILE=../../32blit-sdk/pico.toolchain -DPICO_BOARD=pimoroni_picosystem -DPICO_SDK_FETCH_FROM_GIT=true -DPICO_EXTRAS_FETCH_FROM_GIT=true |
| ``` |
| |
| :warning: Note: you should probably grab local copies of `pico-sdk` and `pico-extras` somewhere memorable, since fetching them from git every time you configure will get tedious! |
| |
| ### Building |
| |
| Finally type `make` to build your project into a `.uf2` file compatible with PicoSystem. This will output `your-project-name.uf2` which you must copy to your PicoSystem. |
| |
| ### Copying to your PicoSystem |
| |
| Connect your PicoSystem to your computer using a USB Type-C cable. |
| |
| From a power-off state, hold down X (the top face button) and press Power (the button at the top left, next to the USB Type-C port). |
| |
| Your PicoSystem should mount as "RPI-RP2". On Linux this might be `/media/<username>/RPI-RP2`: |
| |
| ``` |
| cp your-project-name.uf2 /media/`whoami`/RPI-RP2 |
| ``` |
| |
| The file should copy over, and your PicoSystem should automatically reboot into your game. |
| |
| ### Extra configuration |
| |
| If you're not using `hires` mode and need some more RAM, it can be disabled: |
| ```cmake |
| ... |
| |
| blit_executable(amazing-lores-game ...) |
| |
| ... |
| |
| target_compile_definitions(amazing-lores-game PRIVATE ALLOW_HIRES=0) |
| ``` |
| |
| ## API Limitations & Board Details |
| |
| ### Unsupported Features |
| |
| These features of the 32blit API are currently unsupported on any pico-based device: |
| |
| - Accelerometer |
| - Vibration |
| - Paletted screen mode |
| - JPEG decoding |
| - `OpenMode::cached` |
| |
| ### Limitations |
| |
| Additionally some supported features have limitations: |
| |
| - The `screen` surface is RGB565 instead of RGB888 |
| - `hires` screen mode is not double-buffered, usually resulting in a lower framerate |
| - `blit::random` is `pico_rand` |
| - Multiplayer has fixed host/device role |
| - Using the MP3 decoder is probably not a good idea |
| |
| ### Board-specific details |
| |
| The RP2040/Pico port supports PicoSystem, PicoVision and VGA board. Below is a table showing which features are available on each platform, and which `PICO_BOARD` to use to target them: |
| |
| | | 32blit | PicoSystem | PicoVision | VGA Board |
| |------------|------------------------------|-----------------------------|--------------------------|-------------------------- |
| | PICO_BOARD | N/A | pimoroni_picosystem | pimoroni_picovision | vgaboard |
| | CPU | 480MHz | 250MHz † | 250MHz † | 250MHz † |
| | RAM | 583K § | 151K to 207K (lores only ¶) | ~250K | ~189K |
| | FPU | Yes | No | No | No |
| | Buttons | 6 + reset | 4 + power | HID Gamepad (up to 6) | HID Gamepad (up to 6) |
| | Joystick | Yes | No | HID Gamepad | HID Gamepad |
| | Tilt | Yes | No | No | No |
| | Sound | 8CH mini speaker | 1CH piezo booper ‡ | 8CH 3.5mm jack (i2s DAC) | 8CH 3.5mm jack (i2s DAC) |
| | Storage | 32MB XiP QSPI + 128K Flash | 12MB XiP QSPI | 2MB XiP QSPI | 2MB XiP QSPI |
| | | SD card for data | 4MB QSPI for data (FAT) | SD card for data | SD card for data |
| | Screen | 320x240 (160x120 lores) | 240x240 (120x120 lores) | 320x240 (160x120 lores) | 160x120 only |
| | Firmware | Yes | No | No | No |
| | Launcher | Browse + Launch Games | No | No | No |
| | LED | Yes | Yes | No | No |
| |
| * † - technically 2 cores overclocked from 133MHz to 250MHz but the 32Blit SDK uses only one |
| * ‡ - makes a best-effort attempt to play any `SQUARE` waveforms (single-channel) |
| * § - 362K main RAM, 64K D3 RAM, 127K DTCMRAM, 30K ITCMRAM |
| * ¶ - setting `ALLOW_HIRES=0` allocates a doubled buffered 120x120 16bit framebuffer (56.25k) and disables the hires screen mode. |
| |
| # Troubleshooting |
| |
| ## fatal error: tusb.h: No such file or directory |
| |
| You forgot to `git submodule update --init` in your local copy of `pico-sdk`. |