|
| 1 | +@defgroup boards_rpi_pico_w Raspberry Pi Pico W |
| 2 | +@ingroup boards |
| 3 | +@brief Support for the RP2040 based Raspberry Pi Pico W board |
| 4 | + |
| 5 | +## Overview |
| 6 | + |
| 7 | +The Raspberry Pi Pico W and Pico WH (with headers) is a board with RP2040 MCU, |
| 8 | +a custom dual core ARM Cortex-M0+ MCU with relatively high CPU clock, plenty of |
| 9 | +RAM, some unique peripheral (the Programmable IO) and the Infineon CYW43439 wireless |
| 10 | +chip. |
| 11 | + |
| 12 | +## Hardware |
| 13 | + |
| 14 | +@image html https://www.raspberrypi.com/documentation/computers/images/pico-w.png "Raspberry Pi Pico W" width=50% |
| 15 | + |
| 16 | +Raspberry Pi Pico W is provided in two versions - without and with headers, |
| 17 | +the second one is called Pico WH. Detailed photos can be found at [Raspberry Pi Pico family](https://www.raspberrypi.com/documentation/microcontrollers/images/four_picos.jpg). |
| 18 | + |
| 19 | +### MCU |
| 20 | + |
| 21 | +The Programmable IO (PIO) peripheral and the SSI/QSPI peripheral that supports execution from |
| 22 | +flash (XIP) are the most distinguishing features of the MCU. The latter is especially important, |
| 23 | +since the RP2040 contains no internal flash. |
| 24 | + |
| 25 | +| MCU | RP2040 | |
| 26 | +|:-----------|:------------------------------------------------------------ | |
| 27 | +| Family | (2x) ARM Cortex-M0+ | |
| 28 | +| Vendor | Raspberry Pi | |
| 29 | +| RAM | 264 KiB | |
| 30 | +| Flash | 2 MiB (up to 16 MiB) | |
| 31 | +| Frequency | up to 133 MHz | |
| 32 | +| FPU | no | |
| 33 | +| PIOs | 8 | |
| 34 | +| Timers | 1 x 64-bit | |
| 35 | +| ADCs | 1x 12-bit (4 channels + temperature sensor) | |
| 36 | +| UARTs | 2 | |
| 37 | +| SPIs | 2 | |
| 38 | +| I2Cs | 2 | |
| 39 | +| RTCs | 1 | |
| 40 | +| USBs | 1 (USB 2.0) | |
| 41 | +| Watchdog | 1 | |
| 42 | +| SSI/QSPI | 1 (connected to flash, with XIP support) | |
| 43 | +| WiFi | via wireless chip (Infineon CYW43439) (*) | |
| 44 | +| Bluetooth | via wireless chip (Infineon CYW43439) (*) | |
| 45 | +| Vcc | 1.62V - 3.63V | |
| 46 | +| Datasheet | [Datasheet](https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf) | |
| 47 | +| Wireless chip | [Infineon CYW43439 Datasheet](https://www.infineon.com/dgdl/Infineon-CYW43439-DataSheet-v03_00-EN.pdf?fileId=8ac78c8c8386267f0183c320336c029f) | |
| 48 | + |
| 49 | +(*) Currently not implemented in the RIOT OS. |
| 50 | + |
| 51 | +### User Interface |
| 52 | + |
| 53 | +1 button (also used for boot selection) and 1 LED: |
| 54 | + |
| 55 | +| Device | PIN | |
| 56 | +|:------ |:---------------- | |
| 57 | +| LED0 | WL_GPIO0 (*) | |
| 58 | +| SW0 | QSPI_SS_N (**) | |
| 59 | + |
| 60 | +(*) In the Pico W LED0 is directly connected to the Infineon CYW43439 module, |
| 61 | +and cannot be directly controlled by MCU. |
| 62 | + |
| 63 | +(**) Since the switch is connected to the chip-select pin of the QSPI interface the flash chip RIOT |
| 64 | +is running from via XIP, the switch is difficult to read out from software. This is currently not |
| 65 | +supported. |
| 66 | + |
| 67 | +### Pinout |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | +## Flashing the Board |
| 72 | + |
| 73 | +### Flashing the Board Using the Bootloader |
| 74 | + |
| 75 | +Connect the device to your Micro-USB cable while the button (labeled `BOOTSEL` |
| 76 | +on the silkscreen of the PCB) is pressed to enter the bootloader. The pico |
| 77 | +will present itself as a storage medium to the system, to which a UF2 file |
| 78 | +can be copied perform the flashing of the device. This can be automated by |
| 79 | +running: |
| 80 | + |
| 81 | +``` |
| 82 | +make BOARD=rpi-pico-w flash |
| 83 | +``` |
| 84 | + |
| 85 | +This is default flashing option using picotool PROGRAMMER. |
| 86 | + |
| 87 | +### Flashing the Board Using OpenOCD |
| 88 | + |
| 89 | +Currently (June 2021), only two methods for debugging via OpenOCD are supported: |
| 90 | + |
| 91 | +1. Using a bit-banging low-level adapter, e.g. via the GPIOs of a Raspberry Pi 4B |
| 92 | +2. Using a virtual CMSIS-DAP adapter provided by the second CPU core via |
| 93 | + https://github.com/majbthrd/pico-debug |
| 94 | + |
| 95 | +Option 2 requires no additional hardware however, you need to |
| 96 | +first "flash" the gimme-cache variant of [pico-debug](https://github.com/majbthrd/pico-debug) |
| 97 | +into RAM using the UF2 bootloader. For this, plug in the USB cable while holding down the BOOTSEL |
| 98 | +button of the Pico and copy the `pico-debug-gimmecache.uf2` from the |
| 99 | +[latest pico-debug release](https://github.com/majbthrd/pico-debug/releases) into the virtual FAT |
| 100 | +formatted drive the bootloader provides. Once this drive is unmounted again, this will result in |
| 101 | +the Raspberry Pi Pico showing up as CMSIS-DAP debugger. Afterwards run: |
| 102 | + |
| 103 | +``` |
| 104 | +make BOARD=rpi-pico-w PROGRAMMER=openocd flash |
| 105 | +``` |
| 106 | + |
| 107 | +@warning The `rpi-pico-w` virtual debugger is not persistent and needs to be "flashed" into RAM |
| 108 | + again after each cold boot. |
| 109 | + |
| 110 | +@note The RP2040 MCU is supported from OpenOCD version 0.12.0 onwards. |
| 111 | + |
| 112 | +### Flashing the Board Using J-Link |
| 113 | + |
| 114 | +Connect the Board to an Segger J-Link debugger, e.g. the EDU mini debugger is relatively affordable, |
| 115 | +but limited to educational purposes. Afterwards run: |
| 116 | + |
| 117 | +``` |
| 118 | +make BOARD=rpi-pico-w PROGRAMMER=jlink flash |
| 119 | +``` |
| 120 | + |
| 121 | +## Accessing RIOT shell |
| 122 | + |
| 123 | +This board's default access to RIOT shell is via UART (UART0 TX - pin 1, UART0 RX - pin 2). |
| 124 | + |
| 125 | +The default baud rate is 115 200. |
| 126 | + |
| 127 | +The simplest way to connect to the shell is the execution of the command: |
| 128 | + |
| 129 | +``` |
| 130 | +make BOARD=rpi-pico-w term |
| 131 | +``` |
| 132 | + |
| 133 | +@warning Raspberry Pi Pico board is not 5V tolerant. Use voltage divider or logic level shifter when connecting to 5V UART. |
| 134 | + |
| 135 | +## On-Chip Debugging |
| 136 | + |
| 137 | +There are currently (June 2021) few hardware options for debugging the Raspberry Pi Pico: |
| 138 | + |
| 139 | +1. Via J-Link using one of Seggers debuggers |
| 140 | +2. Via OpenOCD using a low-level bit-banging debugger (e.g. a Raspberry Pi 4B with the GPIOs |
| 141 | + connected to the Raspberry Pi Pico via jump wires) |
| 142 | +3. Via a recently updated [Black Magic Probe](https://github.com/blacksphere/blackmagic) |
| 143 | + |
| 144 | +In addition, a software-only option is possible using |
| 145 | +[pico-debug](https://github.com/majbthrd/pico-debug). The default linker script reserved 16 KiB of |
| 146 | +RAM for this debugger, hence just "flash" the "gimme-cache" flavor into RAM using the UF2 |
| 147 | +bootloader. Once this is done, debugging is as simple as running: |
| 148 | + |
| 149 | +``` |
| 150 | +make BOARD=rpi-pico-w debug |
| 151 | +``` |
| 152 | + |
| 153 | +***Beware:*** The `rpi-pico-w` virtual debugger is not persistent and needs to be "flashed" |
| 154 | +into RAM again after each cold boot. The initialization code of RIOT now seems to play well with the |
| 155 | +debugger, so it remains persistent on soft reboots. If you face issues with losing connection to |
| 156 | +the debugger on reboot, try `monitor reset init` in GDB to soft-reboot instead. |
| 157 | + |
| 158 | +## Known Issues / Problems |
| 159 | + |
| 160 | +### Early State Implementation |
| 161 | + |
| 162 | +Currently no support for the following peripherals is implemented: |
| 163 | + |
| 164 | +- USB |
| 165 | +- RTC |
| 166 | +- Watchdog |
| 167 | +- SMP support (multi CPU support is not implemented in RIOT) |
| 168 | +- Infineon CYW 43439 wireless chip |
| 169 | + |
| 170 | +The I2C peripheral is implemented through the PIO. |
0 commit comments