Skip to content

SDK 2.0.0

Latest
Compare
Choose a tag to compare
@kilograham kilograham released this 08 Aug 14:59

This is a major release which adds support for the new RP2350 and for compiling RISC-V code in addition to Arm.

  • There is a lot of new functionality in the RP2350 microcontroller, it is recommended that you read the RP2350 Datasheet
  • There is a lot of new functionality in the SDK, it is also worth reading the Raspberry Pi Pico C/C++ SDK book. This also includes documentation for RP2040 and RP2350 APIs, along with much more complete documentation of SDK #defines and CMake build variables.

Notices

  • You should delete/recreate all build directories when upgrading from previous versions of the Raspberry Pi Pico SDK

Major New Features

Support for RP2350

Many programs you have written for RP2040 (say a Raspberry Pi Pico) should work unmodified on RP2350 (say a Raspberry Pi Pico 2) even when compiled for RISC-V.

  • You can now specify rp2350-arm-s (Arm Secure) or rp2350-riscv (RISC-V) as well as the previous rp2040 (default) and host.
  • Setting PICO_BOARD=some_board will now set PICO_PLATFORM if one is specified in some_board.h since most boards either use exclusively RP2040 or RP2350.
  • PICO_PLATFORM also supports rp2350 but this gets replaced with the value PICO_DEFAULT_RP2350_PLATFORM which you can set in your environment or CMakeLists.txt. Many of the boards for RP2350 - including pico2- select rp2350 as the PICO_BOARD to honour your preference.
  • NOTE: This release of the SDK does not support writing Arm Non-Secure binaries to run under the wing of an Arm Secure binary. This support will be added in a subsequent release.

Security and Code Signing

  • The RP2350 bootrom contains support for signed images and a variety of other security features. The SDK supports building signed images etc. as part of the CMake build. For further information, please read RP2350 Datasheet "Bootrom Concepts" section, and also the Raspberry Pi Pico C/C++ SDK book for details on configuring your build to sign code. Note that signed code is only applicable to chips that have been locked down for security, but you can also hash your image for integrity checking.

Board Support

The following boards have been added and may be specified via PICO_BOARD:

  • defcon32_badge
  • gen4_rp2350_24
  • gen4_rp2350_24ct
  • gen4_rp2350_24t
  • gen4_rp2350_28
  • gen4_rp2350_28ct
  • gen4_rp2350_28t
  • gen4_rp2350_32
  • gen4_rp2350_32ct
  • gen4_rp2350_32t
  • gen4_rp2350_35
  • gen4_rp2350_35ct
  • gen4_rp2350_35t
  • hellbender_2350A_devboard
  • ilabs_challenger_rp2350_bconnect
  • ilabs_challenger_rp2350_wifi_ble
  • melopero_perpetuo_rp2350_lora
  • phyx_rick_tny_rp2350
  • pico2
  • pimoroni_pga2350
  • pimoroni_pico_plus2_rp2350
  • pimoroni_plasma2350
  • pimoroni_tiny2350
  • seeed_xiao_rp2350
  • solderparty_rp2350_stamp
  • solderparty_rp2350_stamp_xl
  • sparkfun_promicro_rp2350
  • switchscience_picossci2_conta_base
  • switchscience_picossci2_dev_board
  • switchscience_picossci2_micro
  • switchscience_picossci2_rp2350_breakout
  • switchscience_picossci2_tiny
  • tinycircuits_thumby_color_rp2350

New Libraries

hardware_boot_lock (RP2350)

  • New library for accessing the BOOT locks from secure code.

hardware_dcp (RP2350 Arm)

  • Contains assembler macros for individual DCP (Double Co-Processor) instructions
  • Contains assembler macros for canned instruction sequences for higher-level operations
  • HAS_DOUBLE_COPROCESSOR define indicates hardware support

hardware_hazard3 (RP2350 RISC-V)

  • Assembler macros and inline functions for accessing Hazard3 extensions

hardware_powman (RP2350)

  • Hardware APIs for the Power Management hardware.
  • HAS_POWMAN_TIMER define indicates hardware support.

hardware_rcp (RP2350 Arm)

  • Contains inline functions and assembler macros for the RCP (Redundancy Co-Processor) instructions.
  • HAS_REDUNDANCY_COPROCESSOR define indicates hardware support.

hardware_riscv_platform_timer (RP2350)

  • Hardware APIs for the RISC-V Platform Timer (which is also made available on Arm).

hardware_sha256 (RP2350)

  • Hardware APIs for the SHA256 hashing hardware.

hardware_ticks

  • Hardware APIs for the RP2350 tick generators.
  • On RP2040 the same API is used, but only one tick generator TICK_WATCHDOG is used, which is backed by the hardware in the RP2040 WatchDog hardware.

pico_aon_timer

  • Abstraction for a hardware timer that is "Always-On", and can wake the processor up even from a low power state at a given time.
  • On RP2040 this uses the RTC.
  • On RP2350 this uses the Powman Timer.

pico_atomic

  • Additional support for C11 atomic functions using spin lock number PICO_SPINLOCK_ID_ATOMIC.
  • On RP2040, all functions are implemented via spinlock.
  • On RP2350, only 64-bit or arbitrary-sized atomics are implemented via spin lock; the reset user processor exclusive/atomic instructions.
    • Note on ACTLR.EXTEXCLALL must be set to 1 on each processor for the exclusive instructions to work. This is done automatically in the SDK by one of the per-core initializers in pico_runtime_init.
  • Included by pico_runtime by default.

pico_boot_lock (RP2350)

  • Support for acquiring and releasing locks to prevent concurrent use of hardware resources used by bootrom functions.
  • Enabled via PICO_BOOTROM_LOCKING_ENABLED which defaults to 1 on RP2350.
  • Some bootrom functions use shared resources such as the single SHA256 or put hardware such as the OTP or XIP interface into a state that cannot execute concurrently with certain other code. The bootrom supports checking that the resource is owned, and this library turns that checking on.
  • The bootrom function wrappers in pico_bootrom call the functions in pico_boot_lock around affects bootrom functions, and thus will take and release locks if PICO_BOOTROM_LOCKING_ENABLED=1.
  • NUM_BOOT_LOCKS define indicates the number of boot locks (8 on 'RP2350', 0 on 'RP2040').

pico_clib_interface

  • New library to encapsulate the interface between the SDK and the C library.
  • Supports
  • newlib (full).
  • picolibc (preview).
  • llvm-libc(preview).
  • Included by pico_runtime by default.

pico_crt0

  • New library split out of pico_standard_link to encapsulate the earliest startup code before the runtime initialisation, and shutdown code after the runtime.
  • Repository for the default RP2040 and RP2350 linker scripts.
  • The flash size specified in the board header is now used when linking which is handy if you have >2M of flash and >2M of code/data.
  • Note: The linker scripts have changed since the previous release of the SDK. If you have custom linker scripts, it is recommended that you update them to match.
    • In particular the new linker scripts include an "embedded block" which is required for a binary to boot on RP2350.
    • __HeapLimit is now defined to be the end of RAM rather than the end of a PICO_HEAP_SIZE chunk, to better match the standard behaviour. PICO_HEAP_SIZE is the minimum heap size required, and space is required for it at link time. sbrk in the previous SDK ignored it anyway and used the end of RAM so there is no functional change there.
  • Included by pico_runtime by default

pico_cxx_options

  • New library split out of pico_standard_link to configure C++ options.
  • Included by pico_standard_link by default.

pico_platform_compiler

  • New library split out of pico_platform with the functions/macros related to the compiler.
  • Included by pico_platform by default.

pico_platform_panic

  • New library split out of pico_platform with the panic function implementation.
  • Included by pico_platform by default.

pico_platform_sections

  • New library split out of pico_platform with the section macros such as __not_in_flash_func.
  • Included by pico_platform by default.

pico_runtime_init

  • Contains the standard initialisers that should get run before main, or per core.
  • Unlike in the previous SDK version where runtime_init() was a monolithic function which also called some __preinit_array initialisers, the new runtime_init library:
  • Separates each initialiser out individually, for say initialiser "foo".
    • Defines PICO_RUNTIME_INIT_FOO which is a "12345" line number ordering of the initialiser with respect to others.
    • Declares runtime_init_foo() which is the actual initialiser.
    • If PICO_RUNTIME_SKIP_INIT_FOO is not set, it adds the initialiser entry to call runtime_init_foo() before main (or per core initialisation).
    • If PICO_RUNTIME_NO_INIT_FOO is not set, it adds the (weak) implementation of runtime_init_foo().
  • This gives the user full control to customise runtime initialisation, either skipping or replacing parts.
  • Included by pico_runtime by default.

pico_sha256

  • High level APIs for generating SHA256 hashes both synchronously and asynchronously

pico_standard_binary_info

  • New library split out of pico_standard_link that adds the "common" binary info items to the binary.
  • Included by pico_standard_link by default.

Library Changes / Improvements

Note that all hardware libraries now support the increased number of GPIOs on RP2350B in APIs that take a GPIO number; this is not noted for every library.

pico_base

  • More error return codes were added to pico/error.h, mostly because these are the same values returned by RP2350 bootrom API functions, but also a number of new SDK APIs also return meaningful errors.
  • In pico/types.h, by popular demand, absolute_time_t now always defaults to uint64_t regardless of the type of build. You can set PICO_OPAQUE_ABSOLUTE_TIME_T=1 to make it a struct in all build types.

pico_binary_info

  • Now supports > 32 GPIO pins when PICO_BINARY_INFO_USE_PINS_64=1 - this is defaulted for you based on the number of GPIOs on the board.

hardware_adc

  • PARAM_ASSERTIONS_ENABLED_ADC is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_ADC - the old define is still supported as a fallback.
  • ADC_TEMPERATURE_CHANNEL_NUM added since this value varies between RP2040 and RP2350.

hardware_clocks

  • set_sys_clock_ functions are now in hardware/clocks.h.
  • Clock configuration.
  • PLL_COMMON_REFDIV is deprecated in favour of PLL_SYS_REFDIV and PLL_USB_REFDIV.
  • PLL_SYS_VCO_FREQ_HZ is new and preferred over PLL_SYS_VCO_FREQ_KHZ.
  • PLL_USB_VCO_FREQ_HZ is new and preferred over PLL_USB_VCO_FREQ_KHZ.
  • XOSC_HZ, SYS_CLK_HZ, USB_CLK_HZ now added, and take preference over the still supported XOSC_KHZ, SYS_CLK_KHZ, and USB_CLK_KHZ.
  • set_sys_clock_hz() and check_sys_clock_hz() added.
  • clock_configure_undivided() and clock_configure_int_divider() for no divisor or a whole integer divider as the code doesn't require 64-bit arithmetic and thus saves space.
  • The enum clock_index no longer exists and has been replaced with clock_num_t. However, all clock functions now take clock_handle_t to allow for future enhancement. This is currently just an alias for clock_num_t
  • vcocalc.py can now be used to generate the CMake configuration for a particular clock setting.
  • The default system clock on RP2350 is 150Mhz.

hardware_divider

  • Since the RP2350 processors have efficient divider instructions, RP2350 has no SIO HW Divider. Software versions of the hardware_divider functions are provided for RP2350.
  • HAS_SIO_DIVIDER define is now provided for you.

hardware_dma

  • PARAM_ASSERTIONS_ENABLED_DMA is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_DMA - the old define is still supported as a fallback.
  • Added dma_get_irq_num()function and DMA_IRQ_NUM() macro to return the process IRQ Number for the n th DMA IRQ.
  • NUM_DMA_IRQS define is provided for you.
  • it is 2 on RP2040 and 4 on RP2350.

hardware_exception

  • PARAM_ASSERTIONS_ENABLED_EXCEPTION is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_EXCEPTION - the old define is still supported as a fallback.
  • Added RISC-V support.
  • exception numbers are processor exception cause numbers.
  • exeception_[get|set]_priority() are added for Arm.

hardware_flash

  • PARAM_ASSERTIONS_ENABLED_FLASH is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_FLASH - the old define is still supported as a fallback.
  • flash_flush_cache() is added.

hardware_gpio

  • PARAM_ASSERTIONS_ENABLED_GPIO is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_GPIO - the old define is still supported as a fallback.
  • The enum gpio_function no longer exists and has been replaced with gpio_function_t.
  • gpio_xxx_masked() functions now have a gpio_xxx_masked64() variant that takes a 64-bit mask of GPIO indexes.
  • gpio_xxx_mask() functions now have a gpio_xxx_mask64() variant that takes a 64-bit mask of GPIO indexes.
  • gpio_get_all64() added to read the state of >32 pins.
  • gpio_put_all64() added to write the state of >32 pins.
  • On Arm RP2350 GPIO Co-Processor instructions are used by default. This is controlled via PICO_USE_GPIO_COPROCESSOR.
  • HAS_GPIO_COPROCESSOR define indicates hardware support.

hardware_i2c

  • PARAM_ASSERTIONS_ENABLED_I2C is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_I2C - the old define is still supported as a fallback.
  • PICO_DEFAULT_I2C_INSTANCE() macro added which is equivalent to the pre-existing i2c_default
  • Added I2C_NUM(), I2C_INSTANCE(), I2C_DREQ_NUM() macros to abstract differences between platforms.
  • Fixed per-character timeouts.

hardware_interp

  • PARAM_ASSERTIONS_ENABLED_INTERP is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_INTERP - the old define is still supported as a fallback.

hardware_irq

  • PARAM_ASSERTIONS_ENABLED_IRQ is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_IRQ - the old define is still supported as a fallback.
  • irq_xxx_mask_xxx() functions now have a gpio_xxx_mask_n_xxx() variant that affects the n th set of 32 IRQs
  • Expose runtime_init_per_core_irq_priorities() function
  • Added irq_set_riscv_vector_handler() function to replace code entries in the machine vector table.

hardware_pio

  • PARAM_ASSERTIONS_ENABLED_PIO is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_PIO - the old define is still supported as a fallback.
  • PICO_PIO_VERSION is used to determine whether new RP2350 functionality (PICO_PIO_VERSION=1) is supported. This is defaulted based on the platform.
  • PICO_PIO_USE_GPIO_BASE is used to determine whether support is enabled for GPIOs above 32. TThe default value is set based on the chip package.
  • Added pio_sm_set_jmp_pin().
  • Added pio_claim_free_sm_and_add_program(), pio_claim_free_sm_and_add_program_for_gpio_range() and `pio_remove_program_and_unclaim_sm() to simplify finding and claiming a free PIO instance and state machine and installing programs.
  • Added pio_get_irq_num()function to return the process IRQ Number for the n th PIO IRQ for a PIO instance.
  • Added PIO_NUM(), PIO_INSTANCE(), PIO_IRQ_NUM(), PIO_DREQ_NUM() and PIO_FUNCSEL_NUM() macros to abstract differences between platforms.
  • Added sm_config_set_out_pin_base() and sm_config_set_out_pin_count().
  • Added sm_config_set_in_pin_base() and sm_config_set_in_pin_count(). Note the latter is only meaningful on PICO_PIO_VERSION=1 which supports a limit.
  • Added sm_config_set_set_pin_base() and sm_config_set_set_pin_count().
  • Added sm_config_set_sideset_pin_base() and sm_config_set_sideset_pin_count().
  • For PICO_PICO_VERSION=1 i.e. RP2350:
  • Added pio_set_gpio_base() and pio_get_gpio_base() to assign the PIO instance to pins 0-31 or 16-47.
  • Added pio_set_sm_multi_mask_enabled().
  • Added pio_clkdiv_restart_sm_multi_mask().
  • Added pio_enable_sm_multi_mask_in_sync().
  • NUM_PIO_IRQS define is now provided for you (2 on both RP2040 and RP2350).

hardware_pll

  • PICO_PLL_VCO_MIN_FREQ_HZ is new and now preferred to PICO_PLL_VCO_MIN_FREQ_KHZ or PICO_PLL_VCO_MIN_FREQ_MHZ.
  • PICO_PLL_VCO_MAX_FREQ_HZ is new and now preferred to PICO_PLL_VCO_MAX_FREQ_KHZ or PICO_PLL_VCO_MAX_FREQ_MHZ.
  • PLL_RESET_NUM() macro added to abstract differences between platforms.

hardware_pwm

  • PARAM_ASSERTIONS_ENABLED_PWM is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_PWM - the old define is still supported as a fallback.
  • PICO_DEFAULT_PWM_INSTANCE() macro added which is equivalent to the pre-existing pwm_default.
  • Added PWM_SLICE_NUM() and PWM_DREQ_NUM() macros to abstract differences between platforms.
  • Added PWM_DEFAULT_IRQ_NUM() since RP2350 supports 2 PWM IRQs to indicate which IRQ the pre-existing RP2040 functions use.
  • Added pwm_set_irq0_enabled(), pwm_set_irq1_enabled() and pwm_irqn_set_slice_enabled() to differentiate between the IRQs.
  • Added pwm_set_irq0_mask_enabled(), pwm_set_irq1_mask_enabled() and pwm_irqn_set_mask_enabled() to differentiate between the IRQs.
  • Added pwm_get_irq0_status_mask(), pwm_get_irq1_status_mask() and pwm_irqn_get_status_mask() to differentiate between the IRQs.
  • Added pwm_pwm_force_irq0(), pwm_force_irq1() and pwm_irqn_force() to differentiate between the IRQs.

hardware_resets

  • PARAM_ASSERTIONS_ENABLED_RESETS is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_RESETS - the old define is still supported as a fallback.
  • reset_block() is renamed to reset_block_mask() but the old name is still supported.
  • unreset_block() is renamed to unreset_block_mask() but the old name is still supported.
  • unreset_block_wait() is renamed to unreset_block_mask_wait_blocking() but the old name is still supported.
  • reset_block_num(), unreset_block_num(), unreset_block_num_wait_blocking() and reset_unreset_block_num_wait_blocking() added to reset or unreset a single block by reset_num_t index.

hardware_rtc

  • Note this library is only available on RP2040, since the RP2350 lacks the RTC hardware.
  • There is a similar always-on timer in hardware_powman.
  • A common API for both RP2040 and RP2350 is provided in pico_aon_timer.
  • HAS_RP2040_RTC define is now provided for you.

hardware_spi

  • PARAM_ASSERTIONS_ENABLED_SPI is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_SPI - the old define is still supported as a fallback.
  • PICO_DEFAULT_SPI_INSTANCE() macro added which is equivalent to the pre-existing spi_default.
  • Added SPI_NUM(), SPI_INSTANCE(), SPI_DREQ_NUM() macros to abstract differences between platforms.
  • Fixed per-character timeouts.

hardware_sync

  • restore_interrupts_from_disabled() is added as a variant for restore_interrupts() which must be paired with a matching save_and_disable_interrupts(). This is the common usage and produces smaller/faster code on RISC-V.
  • Spinlock functionality has been delegated to a separate hardware_sync_spinlock library, which is included for you.
  • hardware_sync_spin_lock.
  • Whilst RP2350 has the same SIO spin locks as RP2040, due to Errata RP2350-E2, these are not used by default.
    • Instead, a software implementation using atomic instructions is used.
    • You can set PICO_USE_SW_SPIN_LOCKS=0 to disable this if you know you aren't affected by RP2350-E2 and want to use the h/w spin locks instead.
  • Added spin_try_lock_unsafe() function.

hardware_timer

  • PARAM_ASSERTIONS_ENABLED_TIMER is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_TIMER - the old define is still supported as a fallback.
  • RP2350 supports two timer instances.
  • PICO_DEFAULT_TIMER_INSTANCE() macro added based on PICO_DEFAULT_TIMER (0 on RP2040, 0/1 on RP2350).
  • Added TIMER_NUM(), TIMER_INSTANCE(), TIMER_ALARM_NUM_FROM_IRQ() and TIMER_ALARM_NUM_FROM_IRQ() macros to abstract differences between platforms
  • Added hardware_alarm_get_irq_num() to get the processor IRQ number for a particular alarm on a timer.
  • New versions of all functions added with a timer_ prefix and a timer instance passed as the first argument. The pre-existing functions call these with the default timer instance.
  • NUM_TIMERS has been renamed to NUM_ALARMS as that's what it was (4).
  • NUM_GENERIC_TIMERS has been added which is 1 on RP2040 and 2 on RP2350.

hardware_uart

  • PARAM_ASSERTIONS_ENABLED_UART is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_UART - the old define is still supported as a fallback.
  • PICO_DEFAULT_UART_INSTANCE() macro added which is equivalent to the pre-existing uart_default.
  • Added UART_NUM(), UART_INSTANCE(), UART_DREQ_NUM(), UART_IRQ_NUM(), UART_CLOCK_NUM(), UART_RESET_NUM() macros to abstract differences between platforms.
  • uart_set_irq_enables() is renamed to uart_set_irqs_enabled() but the old name is still supported.
  • uart_get_dreq() is renamed to uart_get_dreq_num() but the old name is still supported.
  • uart_get_reset_num() is added.
  • Incorrect baud setting for certain frequencies was fixed.

hardware_vreg

  • vreg_disable_voltage_limit() added to allow full range of DVDD voltage selection on RP2350

hardware_watchdog

  • PARAM_ASSERTIONS_ENABLED_WATCHDOG is renamed to PARAM_ASSERTIONS_ENABLED_HARDWARE_WATCHDOG - the old define is still supported as a fallback.
  • Added watchdog_disable().
  • watchdog_get_count() is renamed to watchdog_get_time_remaining_ms() but the old name is still supported.

hardware_xosc

  • XOSC_HZ is new and now preferred to XOSC_KHZ.

hardware_regs

  • enum irq_num_[rp2040|rp2350] (typedef-ed as irq_num_t) added with the constants from inctrl.h. Note these remain as #defines when included from assembly.
  • enum dreq_num_[rp2040|rp2350] (typedef-ed as dreq_num_t) added with the constants from dreq.h. Note these remain as #defines when included from assembly.

hardware_structs

  • enum bus_ctrl_perf_counter_[rp2040|rp2350] (typedef-ed as bus_ctrl_perf_counter_t) added.
  • Note enum bus_ctrl_per_counter no longer exists.
  • enum clock_num_[rp2040|rp2350] (typedef-ed as clock_num_t) added.
  • Note enum clock_index no longer exists.
  • enum clock_dest_num_[rp2040|rp2350] (typedef-ed as clock_dest_num_t) added.
  • enum gpio_function_[rp2040|rp2350] (typedef-ed as gpio_function_t) added.
  • Note enum gpio_function no longer exists.
  • enum gpio_function1_[rp2040|rp2350] (typedef-ed as gpio_function1_t) added (for QSPI bank).
  • enum reset_num_[rp2040|rp2350] (typedef-ed as reset_num_t) added.
  • enum tick_gen_num_rp2350 (typedef-ed as reset_num_t) added.
  • Various naming consistencies have been fixed.
  • iobank0.h -> io_bank00.h, iobank0_hw -> io_bank0_hw - shims are provided for the old versions.
  • ioqspi.h -> io_qspi0.h, ioqspi_hw -> io_qspi_hw - shims are provided for the old versions.
  • padsbank0.h -> pads_bank0.h, padsbank0_hw -> pads_bank0_hw - shims are provided for the old versions.
  • padsqspi.h -> pads_qspi.h, padsqspi_hw -> pads_qspi_hw - shims are provided for the old versions.
  • bus_ctrl.h -> busctrl.h, bus_ctrl_hw -> busctrl_hw (don't ask! but hardware_struct headers now match hardware_regs names at least!).

boot_stage2

  • There are now separate implementations for RP2040 and RP2350.
  • A boot_stage2 is not needed on RP2350, but one can be included via the define PICO_EMBED_XIP_SETUP=1.

cmsis

  • CMSIS headers are updated to CMSIS 6.1
  • Device headers RP2040.h and RP2350.h are generated, and now include basic hardware structures as per the latest SVDConv defaults.

pico_bootrom

  • New RP2350 bootrom APIs added.
  • rom_xxx() inline function wrappers added for all xxx() ROM functions.
  • Additional rom_get_boot_random() and rom_add_flash_runtime_partition() for RP2350 which use underlying bootrom functionality but aren't just wrapper functions.

pico_bt_stack

  • BTStack updated to 1.6.1 from 1.5.6
  • Lots of additions, fixes and changes, for the full list see the change log

pico_cyw43_arch

  • PARAM_ASSERTIONS_ENABLED_CYW43_ARCH is renamed to PARAM_ASSERTIONS_ENABLED_PICO_CYW43_ARCH - the old define is still supported as a fallback.
  • lib/cyw43-driver has been updated to the latest version
  • Mostly bug fixes.
  • Adds WPA3 support for Pico W. To use this, use CYW43_AUTH_WPA3_SAE_AES_PSK or CYW43_AUTH_WPA3_WPA2_AES_PSK instead of CYW43_AUTH_WPA2_AES_PSK when connecting to wifi with cyw43_arch_wifi_connect_timeout_ms or cyw43_arch_enable_ap_mode.

pico_cyw43_driver

  • cyw43_driver updated to commit faf36381.
  • Added support for changing the clock speed of the SPI connection to the Wi-Fi chip. See CYW43_PIO_CLOCK_DIV_INT, CYW43_PIO_CLOCK_DIV_FRAC and CYW43_PIO_CLOCK_DIV_DYNAMIC.

pico_divider

  • Functions that returned a quotient and divider in a uint64_t or int64_t now return a divmod_result_t - the signed-ness of the value before was meaningless anyway, and the compiler will still return it as a 64-bit value.
  • Extra functions in pico/divider.h now implemented for pico_set_divider_implemtation(compiler) as well as for RP2350 which has no RP2040 hardware divider.

pico_double

  • pico_set_double_implementation(pico) (the default) now uses the Double Co-Processor (DCP) for double-precision floating-point arithmetic on Arm RP2350, and highly optimised Arm VFP implementations of the double-precision scientific functions, for much improved performance over the C library versions.
  • Extra functions exposed from pico implementation
  • int2double()
  • uint2double()
  • int642double()
  • uint642double()
  • double2uint()
  • double2uint64()
  • Extra functions exposed from pico implementation for Arm RP2350 only
  • ddiv_fast()
  • sqrt_fast()
  • mla()

pico_float

  • pico_set_float_implementation(pico) (the default) now uses the compiler for single-precision floating point arithmetic on Arm RP2350 since the processor has VFP instructions, but includes custom optimised scientific functions also using the VFP.
  • pico_set_diouble_implementation(pico_dcp) uses the Double Co-Processor (DCP) for single-precision floating point arithmetic on Arm RP2350, and highly optimised Arm M33 implementations of the single-precision scientific functions, for much improved performance over the C library versions. This library is intended for those situations where you cannot (or don't want to) use the VFP instructions.
  • Extra functions exposed from pico implementation.
  • int2float()
  • uint2float()
  • int642float()
  • uint642float()
  • float2uint()
  • float2uint64()
  • float2uint_z()
  • float2uint64_z()
  • Extra functions exposed from pico implementation for Arm R2350 only.
  • float2fix64_z()
  • fdiv_fast()
  • fsqrt_fast()

pico_lwip

  • Update lib/lwip to 2.2.0
  • There have been some bugs fixed, and some new features were added (most notably full Address Conflict Detection support).

pico_mbedtls

  • Update to lib/mbedtls to 2.28.8 from 2.28.1
  • This release of Mbed TLS provides bug fixes and minor enhancements. This release includes fixes for security issues.
  • Added support for hardware SHA256 calculation on RP2350
  • To use this in mbedtls you need to define MBEDTLS_SHA256_ALT in your mbedtls_config.h. Use LIB_PICO_SHA256 to check if hardware SHA256 is supported and fallback to defining MBEDTLS_SHA256_C for the software SHA256 calculation.

pico_multicore

  • Added SIO_FIFO_IRQ_NUM() to get the IRQ number for the FIFO IRQ on a particular core, since RP2040 and RP2350 are different.
  • note that RP2350 uses the same IRQ number on both cores, so if you have IRQ handlers for both cores, you should share the same function and check the core number in the IRQ handler. This strategy of course works on RP2040 too.
  • Added multicore_fifo_push_blocking_inline() and multicore_fifo_pop_blocking_inline().
  • Added multicore_doorbell_ functions for the new intercore Doorbells on RP2350.
  • NUM_DOORBELLS is provided which is 8 on RP2350, 0 on RP2040.

pico_rand

  • Added the hardware TRNG as an additional entropy source on RP2350.
  • HAS_RP2350_TRNG indicates hardware support.
  • Many, but not all, of the pre-existing entropy sources are disabled on RP2350 in favour of using the TRNG.

pico_runtime

  • A shadow of its former self, it now just:
  • aggregates other default libraries required for getting to main() and having the C runtime work.
  • provides low level runtime_run_initializers() and runtime_run_per_core_initializers() which run initializers from the __preinit_array.
  • The runtime_init() entrypoint has moved to pico_clib_interface.

pico_standard_link

  • Much previously included functionality has been split out into pico_crt0, pico_cxx_options and pico_standard_binary_info.
  • What remains is entirely focused on setting up the linker configuration.
  • Finally fixed a bug where changes to the linker script did not cause a relink.

pico_stdio

  • Some internal reorganisation to separate functionality between here and pico_clib_interface.
  • Added PICO_STDIO_SHORT_CIRCUIT_CLIB_FUNCS to control whether printf, vprintf, puts, putchar and getchar go thru the C library (thus usually pulling in all the FILE handling APIs resulting in huge bloat - but more sensible behaviour when mixing say printf with fprintf(stdout etc.) This defaults to 0, i.e. "do short-circuit the c lib" which was the behaviour in the previous SDK version.
  • Add support for Segger RTT stdio.
  • Implemented stdio_flush() for UART and USB CDC.
  • Added stdio_deinit_all() and individual stdio_deinit_xxx functions.

pico_stdio_usb

  • Now supports MS OS2 descriptors by default. See PICO_STDIO_USB_RESET_INTERFACE_SUPPORT_MS_OS_20_DESCRIPTOR.
  • PICO_STDIO_USB_ENABLE_RESET_VIA_VENDOR_INTERFACE and PICO_STDIO_USB_ENABLE_RESET_VIA_BAUD_RATE are now both supported even if the user is using tinyusb_device directly themselves.
  • Bug that could cause deadlock with FreeRTOS SMP and printing from IRQs fixed.

pico_stdlib

  • pico/stdlib.h no longer declares set_sys_clock_ functions. You must include hardware/clocks.h explicitly.

pico_time

  • remaining_alarm_time_ms(), remaining_alarm_time_us(), alarm_pool_remaining_alarm_time_ms() and alarm_pool_remaining_alarm_time_us() were added.
  • Implementation of alarm pools completely rewritten for much lower overhead, jitter and higher throughput in the majority of cases. The pairing heap has been replaced with a linked list which is faster and uses less memory in most normal use cases too.
  • NOTE fire_if_past now always fires asynchronously in the same way as a normal timeout (rather than being called synchronously during the call). Thus alarm_pool_add_alarm_at_force_in_context is now no different to alarm_pool_add_alarm_at.
  • New pico_timer_adapter abstraction added so pico_time could be backed by other types of timer hardware in the future, and so pico_time no longer depends directly on a hardware_timer abstraction which simplifies PICO_PLATFORM=host.
  • Support for two hardware timer blocks on RP2350.
  • alarm_pool_timer_t abstraction added to represent the time "counter" backing the alarm pool.
  • alarm_pool_t now has an associated alarm_pool_timer_t instance.
  • alarm_pool_create_on_timer() is added to create an alarm pool on a specific alarm pool timer.
  • alarm_pool_get_default_timer() is added which is used when not explicitly passing an alarm pool timer. PICO_DEFAULT_TIMER selects which timer instance is the default (0 on RP2040, 0/1 on RP2350).
  • PARAM_ASSERTIONS_ENABLED_TIME is renamed to PARAM_ASSERTIONS_ENABLED_PICO_TIME - the old define is still supported as a fallback.
  • check_timeout_fn now takes two parameters. This was likely unused outside the pico_time implementation anyway.
  • Expose runtime_init_default_alarm_pool() function.

pico_util

  • time_to_datetime(), datetime_to_time() and datetime_to_str() functions relating to hardware_rtc are now guarded by PICO_INCLUDE_RTC_DATETIME which defaults to 0 on RP2350, since RP2350 does not include the RP2040 RTC hardware.
  • timespec_to_ms(), timespec_to_us(), ms_to_timespec(), and ms_to_timespec() added to convert between C-library high-resolution time offset and millisecond or microsecond precision offsets.
  • queue_try_remove(), queue_try_remove(), queue_remove_blocking() and queue_peek_blocking() now support passing NULL as the element out pointer if the caller doesn't care.

tinyusb

  • TinyUSB moved from release 0.15.0 to commit 42326428 (0.17.0 WIP)
  • Note that bsp/board.h has been renamed by TinyUSB to bsp/board_api.h the SDK adds a re-director header for you for now.
  • Support added for RP2350. Requires a custom memcpy implementation in the rp2040 tinusb driver, as unaligned 32 bit access to device memory causes a hard fault on the Cortex M33.
  • See the [TinyUSB changelog]https://github.com/hathach/tinyusb/blob/master/docs/info/changelog.rst) for full details.

pioasm

  • pioasm now supports the full RP2350 PIO (PICO_PIO_VERSION=1) instruction set
  • Additionally, it supports many new directives. See the RP2350 Datasheet for full details.
  • Note that currently not all output formats support PICO_PIO_VERSION=1 as they are community provided.

FreeRTOS integration

  • You should use this repo for the current FreeRTOS-Kernel supporting RP2040 and RP2350: https://github.com/raspberrypi/FreeRTOS-Kernel

  • Dropped legacy support for configNUM_CORES for the correct configNUMBER_OF_CORES, which is 2 for SMP support and 1 for non-SMP support.

  • RP2350_ARM_NTZ (non-trust-zone), and RP2350_RISC-V are available as well as an updated RP2040 version; the former two basically give you the same "single privilege/security domain" experience as on RP2040.

  • SMP and non-SMP support (along with running FreeRTOS on either core) are available for all.

  • A nasty, but rare pre-existing RP2040 deadlock (especially with TinyUSB printf from IRQs) has been fixed on all three versions; If you were setting configSUPPORT_PICO_SYNC_INTEROP=0 as a workaround, you should no longer do so. Generally, if you are using printf (or anything else using SDK locking primitives) then you do really want configSUPPORT_PICO_SYNC_INTEROP=1 for the best concurrency

  • FreeRTOS on RISC-V does not currently support IRQ preemption (which is a Hazard3 only feature anyway).

Backwards Incompatibilities

There are a handful of minor backwards incompatibilities, that hopefully should affect very few people.

  • boot_picbin library is now called boot_picobin_headers.
  • boot picoboot library is now called boot_picoboot_headers.
  • boot_uf2 library is now called boot_uf2_headers.
  • pico_base library is now called pico_base_headers.
  • pico/error.h - PICO_ERROR_GENERIC is now -1 because there were pre-existing APIs that returned -1 for any error. PICO_ERROR_TIMEOUT is now -2 (they are swapped from their previous values).
  • pico_stdlib
  • pico/stdlib.h no longer declares set_sys_clock_ functions. You must include hardware/clocks.h explicitly.
  • pico_time
  • check_timeout_fn now takes two parameters. This was likely unused outside the pico_time implementation anyway.
  • fire_if_past now always fires asynchronously in the same way as a normal timeout (rather than being called synchronously during the call). Thus alarm_pool_add_alarm_at_force_in_context is now no different to alarm_pool_add_alarm_at.
  • hardware_clocks
  • The enum clock_index no longer exists and has been replaced with clock_num_t. However, all clock functions now take clock_handle_t to allow for future enhancement. This is currently just an alias for clock_num_t.
  • hardware_structs
  • enum bus_ctrl_perf_counter_[rp2040|rp2350] (typedef-ed as bus_ctrl_perf_counter_t) added.
    • Note enum bus_ctrl_per_counter no longer exists.
  • enum clock_num_[rp2040|rp2350] (typedef-ed as clock_num_t) added.
    • Note enum clock_index no longer exists.
  • enum clock_dest_num_[rp2040|rp2350] (typedef-ed as clock_dest_num_t) added.
  • enum gpio_function_[rp2040|rp2350] (typedef-ed as gpio_function_t) added.
    • Note enum gpio_function no longer exists.
  • hardware_timer
  • NUM_TIMERS has been renamed to NUM_ALARMS as that's what it was (4).

Build

  • There are major CMake build changes. If you are maintaining your own non-CMake build, you will have to make extensive changes by looking at the differences yourself.
  • All SDK headers are now "system" includes.
  • You can now specify rp2350-arm-s (Arm Secure) and rp2350-riscv (RISC-V) as well as the previous rp2040 (default) and host.
  • Setting PICO_BOARD=some_board will now set PICO_PLATFORM if one is specified in some_board.h since most boards either use exclusively RP2040 or RP2350.
  • PICO_PLATFORM also supports rp2350 but this gets replaced with the value PICO_DEFAULT_RP2350_PLATFORM which you can set in your environment or CMakeLists.txt. Many of the boards for RP2350 - including pico2- select rp2350 as the PICO_BOARD to honour your preference.
  • PICO_PLATFORM, PICO_BOARD and other variables will be taken from your environment if not otherwise defined now retain their value after the first CMake invocation. i.e. a pre-existing CMake build configuration directory will not change based on your environment if you re-run cmake.
  • PICO_BOARD=pico_w is no longer an odd child out requiring a CMake board file; support for CYW43 Wi-Fi can now be specified in the board header.
  • ELF2UF2 is now replaced by use of picotool which will be built as part of your build if not installed on the system. See the picotool GitHub repository for more details on building and installing it locally.
  • PICO_GCC_TRIPLE can now be a ';' separated list as well as a single value.
  • NOTE: This release of the SDK does not support writing Arm Non-Secure binaries to run under the wing of an Arm Secure binary. This support will be added in a subsequent release.
  • Compiler support is widening - we always recommend a recent version.)
  • All recent GCCs are supported on Arm. (GCC 14 has not yet been tested for full support though).
  • Very recent GCCs are required on RISC-V due to the bleeding-edge nature of some of the processor instructions.
  • Recent LLVM Embedded Toolchain for ArmRM versions are supported on Arm.
  • Pigweed LLVM is supported for Arm.
  • For further details see the Raspberry Pi Pico C/C++ SDK book.
  • Bazel may be used to build the SDK on Arm. See the README. Note that the Bazel build is community-provided and maintained.

Building Documentation

  • The docs build target to build the HTML code documentation now builds a set of documentation peculiar to your particular PICO_PLATFORM setting.
  • PICO_PLATFORM=combined_docs can be used (just for building docs) to build the combined documentation for both RP2040 and RP2350.

Fixed Issues

You can see a list of individual commits here, and a list of resolved issues here.

Note these only include public changes made since version 1.5.1. The majority of new code and collateral fixes for the previously unannounced RP2350 were developed and committed in private and delivered as a single "squashed" commit.

New Examples

There are in the pico_examples repository.

Example Description
enc_bootloader A bootloader which decrypts binaries from flash into SRAM.
hello_dcp Use the double-precision coprocessor directly in assembler.
dvi_out_hstx_encoder RP2350 Use the HSTX to output a DVI signal with 3:3:2 RGB
runtime_flash_permissions Demonstrates adding partitions at runtime to change the flash permissions
hello_freertos Examples that demonstrate how run FreeRTOS and tasks on 1 or 2 cores.
multicore_doorbell Claims two doorbells for signaling between the cores. Counts how many doorbell IRQs occur on the second core and uses doorbells to coordinate exit.
hello_otp Demonstrate reading and writing from the OTP on RP2350, along with some of the features of OTP (error correction and page locking).
picow_httpd Runs a LWIP HTTP server test app
picow_freertos_ntp_client_socket Connects to an NTP server using the LwIP Socket API with FreeRTOS in NO_SYS=0 (i.e. full FreeRTOS integration) mode.
pico_freertos_httpd_nosys Runs a LWIP HTTP server test app under FreeRTOS in NO_SYS=1 mode.
pico_freertos_httpd_sys Runs a LWIP HTTP server test app under FreeRTOS in NO_SYS=0 (i.e. full FreeRTOS integration) mode.
squarewave_div_sync Generates a square wave on three GPIOs and synchronises the divider on all the state machines
quadrature_encoder_substep High resolution speed measurement using a standard quadrature encoder
hello_sha256 Demonstrates how to use the pico_sha256 library to calculate a checksum using the hardware in rp2350
mbedtls_sha256 Demonstrates using the SHA-256 hardware acceleration in mbedtls
boot_info Demonstrate how to read and interpret sys info boot info.
rand Demonstrate how to use the pico random number functions.
hello_universal The obligatory Hello World program for Pico (USB and serial output). On RP2350 it will reboot to the other architecture after every 10 prints.
nuke_universal Same as the nuke binary, but universal. On RP2350 runs as a packaged SRAM binary, so is written to flash and copied to SRAM by the bootloader