PicoSystem crams a whole heap of goodness into a tiny package:
When Raspberry Pi launched the RP2040 chip it was obvious to us that it would be the perfect heart for a miniature games console. Generous RAM means plenty of space for a framebuffer and assets. High performance cores mean lots of cycles per pixel to do interesting things. PIOs combined with DMA can perform pixel doubling in the background without using any CPU time. Built-in USB support means easy programming and debugging. And, finally, the large number of flexible IOs can interface the controls, speaker, flash storage, screen, and other components.
RP2040 is a dual core ARM Cortex M0+ that by default is clocked at 133MHz (but can go a lot faster!). It includes 264kB of high performance accessible SRAM, USB controller and PHY, four ADC channels, special programmable IOs, and the normal hardware peripherals you'd expect from a modern microcontroller including SPI, UART, and I2C.
The programmable IOs (PIOs) allow you to "bit bang" many other digital protocols that would usually consume too much CPU time to be viable (I2S audio for example).
By default we overclock the RP2040 chip to 250MHz (up from its stock 133MHz) and apply a small over voltage to 1.2v (up from 1.1v), ensuring that it's stable at the higher speed. You can optionally disable overclock, but we've found that every RP2040 we've tested is happy to run at these speeds without any issues.
PicoSystem uses most of the IO pins on RP2040. See below for a complete list of all used pins and special functions:
Pin | Use | Note |
---|---|---|
0 | UART TX | Exposed on internal header |
1 | UART RX | Exposed on internal header |
2 | USB Power Detect | Active high |
3 | -- | -- |
4 | Screen Reset | Active low |
5 | Screen Chip Select | Active low |
6 | SPI Clock | |
7 | SPI Data Out | |
8 | Screen VSYNC Signal | Active low |
9 | Screen Data/Command Signal | |
10 | -- | -- |
11 | Audio | PWM |
12 | Backlight | PWM dimmable |
13 | LED Green | |
14 | LED Red | Also used for charge status |
15 | LED Blue | |
16 | Button Y | 10K pullup |
17 | Button X | 10K pullup, force DFU Boot |
18 | Button A | 10K pullup |
19 | Button B | 10K pullup |
20 | D-pad Down | 10K pullup |
21 | D-pad Right | 10K pullup |
22 | D-pad Left | 10K pullup |
23 | D-pad Up | 10K pullup |
24 | Charging Status | Active low |
25 | -- | -- |
26 | Battery Level | ADC (1:2 ratio divider) |
27 | -- | -- |
28 | -- | -- |
29 | -- | -- |
On the main PCB we've exposed a debug header for users that want access to the primary UART and SWD (serial wire debug) interface. You can find the debug header on the right hand side of the main PCB when looking at the component side.
Pin | Use | Note |
---|---|---|
0 | 3v3 | 3v3 power rail |
1 | UART TX | Primary UART transmit |
2 | UART RX | Primary UART receive |
3 | SWDIO | SWD interface data |
4 | SWCLK | SWD interface clock |
5 | GND | Ground |
We've loaded up PicoSystem with 16MB of QSPI flash (the most RP2040 can use!) into which you can program your games and assets.
The flash appears transparently to the system, as if it were RAM, thanks to RP2040 having XiP (execute in place) hardware. This means you can read assets directly from flash, in realtime, without using up valuable SRAM space. There are performance tradeoffs (flash is generally much slower than RAM) but there is a dedicated 16kB internal cache on the RP2040 which helps mask the latency difference between flash and RAM accesses in many cases.
You can easily force data to stay on flash when developing projects in C++ by declaring the value const
.
// directly embed ~14kb of sprite data into flash, this can
// then be used as the source (but not target! it is ROM after
// all) for blitting and sprite drawing operations.
const uint8_t sprite_data[14400] = {0xff, 0xfa, 0xe2, 0xc4, ...};
You can use a Raspberry Pi Pico to act as a USB bridge to SWD and UART making step by step debugging available on Windows, MacOS, and Linux.
This is possible using a tool called Picoprobe - details on setting this up can be found in the Getting started with Raspberry Pi Pico guide.
The case is machined from Aluminium and the face plate is created from a PCB that sits on top of the main PCB to sandwich in the control plastics. This gives PicoSystem a really solid and delightfully weighty feel for its size. There is even a lanyard loop for a wrist or neck strap!
The D-pad and action buttons are our custom design and injection moulded from ABS plastic and the power button is 3D printed!
PicoSystem is manufactured, with love, by us in our workshop in Sheffield.