Skip to content

2.3.0

Latest

Choose a tag to compare

@kilograham kilograham released this 03 Jul 14:35

This is a minor release of the SDK with many bug fixes and documentation improvements, along with some new features.

Highlights are listed below, or you can see the full list of individual commits here, and the full list of resolved issues here.

Board support

The following board configurations have been added and can be specified using PICO_BOARD:

  • debug_probe
  • nologo_rp2350_usb
  • raspberry_pi_pi500_rp2040
  • soldered_nula_ethernet_w55rp20
  • soldered_nula_max_rp2350
  • vcc-gnd_yd-rp2040_4m
  • vcc-gnd_yd-rp2040_8m
  • vcc-gnd_yd-rp2040_16m
  • waveshare_rp2350_pizero
  • weact_studio_rp2350a_core_v10_4mb
  • weact_studio_rp2350a_core_v10_16mb

The following board configurations have been modified to define constants for their included PSRAM:

  • adafruit_feather_rp2350
  • adafruit_fruit_jam
  • defcon32_badge
  • eetree_gamekit_rp2040
  • pimoroni_pga2350
  • pimoroni_pico_plus2_rp2350
  • pimoroni_pico_plus2_w_rp2350
  • pololu_3pi_2040_robot
  • pololu_zumo_2040_robot
  • sparkfun_iotnode_lorawan_rp2350
  • sparkfun_iotredboard_rp2350
  • sparkfun_promicro_rp2350
  • sparkfun_thingplus_rp2350 - (Additionally PICO_SD_DAT3_PIN corrected to 9)
  • sparkfun_xrp_controller
  • waveshare_pico_cam_a
  • weact_studio_rp2350b_core

The following other board configuration has been modified:

  • seeed_xiao_rp2350 - Flash size corrected from 4 MB to 2 MB

New Features

XIP Cache as SRAM (RP2350)

RP2350's XIP cache can now be used as additional SRAM via pico_use_xip_cache_as_ram() in CMakeLists.txt. This adds the __in_xip_ram attribute for placing data or code in XIP SRAM. Additionally, the pico_set_time_critical_placement() and pico_set_not_in_flash_placement() CMake functions can be used to place code there. For more information, see Linker script modularisation, below.

Linker script modularisation

The SDK linker scripts have been significantly refactored into modular .incl include files, making custom linker configurations much simpler:

  • Scripts are now decomposed into section_*.incl / sections_*.incl files that can be selectively overridden by pico_add_linker_script_override_path().
  • pico_set_linker_script_var() allows setting linker script variables from CMake (for example, heap location), including referencing default memory addresses.
  • pico_set_time_critical_placement() / pico_set_not_in_flash_placement() redirect __time_critical_func / __not_in_flash sections (for example, to XIP cache or scratch X/Y).
  • Linker script files are now tracked as build dependencies, so changes trigger re-links.
  • Breaking change for Bazel builds using non-default binary types: PICO_DEFAULT_LINKER_SCRIPT targets have moved from //src/rp2_common/pico_crt0 to //src/rp2_common/pico_standard_link.

New libraries

hardware_psram

A new hardware_psram library initialises and manages PSRAM on RP2350 boards. It runs automatically at startup when linked, using flash device-info from OTP or the PICO_PSRAM_CS_PIN / PICO_PSRAM_SIZE_BYTES board constants (or their auto-detect variants). It also provides:

  • psram_check_address() to validate whether an address lies in available PSRAM.
  • psram_or_malloc() / psram_or_free() for static PSRAM allocation with a malloc fallback if the detected PSRAM size is too small.

For more information, see the hardware_psram documentation.

pico_low_power

This library provides helper methods for entering, and resuming from, low power modes.

These include Sleep, Dormant, and, on RP2350, Pstate for the various configurable power states.

  • Added low_power_set_pins_low_leakage_exclude_mask(exclude_mask) / low_power_set_pins_low_leakage_exclude_mask64(exclude_mask) — configures all GPIO pins in the given mask to a low-leakage input state, reducing current draw whilst dormant.
  • The easiest way to enter these low-power modes for 10 seconds is to use low_power_sleep_for_ms(10000, NULL, true), low_power_dormant_for_ms(10000, DORMANT_CLOCK_SOURCE_DEFAULT, NULL), or low_power_pstate_for_ms(10000, NULL, NULL). For information about the functions to use for waking based on GPIO pin state changes, and other arguments you can pass to the APIs, see the documentation.
  • Provides __persistent_data() macro to make variables persist across Pstate changes, and the pico_set_persistent_data_loc() CMake function to place that data in specific areas of SRAM (for example, xip_ram for the lowest power consumption).

For more information, see the pico_low_power documentation.

pico_thread_local

This library provides runtime support for thread local variables __thread in C and thread_local in C++, and is included by default in applications as part of the pico_runtime runtime support library.

  • Provides consistent thread local support across:
    • All GCC and LLVM/Clang versions
    • Arm/RISC-V
    • Newlib and Picolibc
  • Attempts to minimise runtime overhead when not used.
  • Provides three types of TLS support:
    • per_thread (default) - proper per core (and potentially RTOS task) values for __thread/thread_local variables
    • global - __thread/thread_local is supported but only a single shared value is used. This was usually the behaviour on prior pico-sdk versions.
    • none - programs using __thread/thread_local might fail to link and runtime results are undefined. However, this always produces the smallest binary if you're known not to be using thread local variables.
  • Provides FreeRTOS support. You can enable FreeRTOS support with per_thread mode by defining configUSE_PICOLIBC_TLS=1 in your FreeRTOS configuration becasue pico_thread_local provides Picolibc-style TLS support functions tls_size() and _init_tls() in per_thread mode, even when Picolibc isn't being used.

For more information, see the pico_thread_local documentation.

pico_usb_reset

USB reset-interface support has been extracted from pico_stdio_usb into a separate pico_usb_reset library, allowing its use with custom USB descriptors independently of stdio. For the instructions on how to use it depending on how your project uses TinyUSB, see the documentation for this library.

  • All of the old defines have been renamed to remove STDIO, with backwards compatible aliases kept in place. For example, PICO_STDIO_USB_ENABLE_RESET_VIA_VENDOR_INTERFACE has been renamed to PICO_ENABLE_USB_RESET_VIA_VENDOR_INTERFACE.

For more information, see the pico_usb_reset documentation.

Notable library changes and improvements

hardware_alarm

  • Fixed alarm pending flag not being cleared when an alarm was cancelled, which could cause spurious alarm callbacks.

hardware_clocks

  • Added clock_configure_mhz(), similar to clock_configure(), but only accepting frequencies in integer numbers of MHz. This new method might be preferable when code size is paramount because it doesn't pull in library code for 64-bit division.

hardware_divider

  • Fixed divmod_s32s32_unsafe() and divmod_u32u32_unsafe() on RP2040, which crashed before if (PICO_DIVIDER_DISABLE_INTERRUPTS=0).

hardware_exception

  • Fixed RISC-V exception handling; exception_is_compile_time_default was always returning false, causing exception_set_exclusive_handler to assert.

hardware_flash

  • Added PICO_ALWAYS_INCLUDE_FLASH_ID_FUNCTIONS preprocessor define (defaults to 0), which can be set to 1 to include flash_get_unique_id() even in "no_flash" binaries. This might be useful if your binary is designed to load and run from RAM, but is still expected to run on a chip with flash, and is particularly useful when using Bluetooth and Wi-Fi because the flash unique ID is used by default to generate the MAC address.

hardware_gpio

  • Added gpio_init_mask64().
  • Improved the efficiency of various gpio_...mask() and gpio_...mask64() functions.
  • Fixed race condition in gpio_set_irq_enabled_with_callback().

hardware_irq

  • Change the default maximum number of shared IRQ handlers (PICO_MAX_SHARED_IRQ_HANDLERS) from 4 to 6 when using pico_stdio_usb because its implementation consumes 2 shared IRQ handlers.

hardware_pio

  • Added pio_set_input_sync_bypass_with_mask() and pio_set_input_sync_bypass_with_mask64() to enable/disable the input synchronizer bypass for multiple PIO pins
  • Added pio_encode_wait_jmppin(), which was missing.
  • Fixed pio_encode_mov(pio_exec).
  • Fixed some incorrect range-checking assertions.
  • Fixed possible resource leak in unsuccessful pio_claim_free_sm_and_add_program_for_gpio_range().
  • The pio_sm_restart() documentation was significantly clarified.

hardware_powman

  • Fixed incorrect bit mask in powman_set_debug_power_request_ignored().
  • powman_timer_set_1khz_tick_source_lposc() now calls the weak powman_timer_get_lposc_calib_freq() function to get the LPOSC frequency; by default, this function reads the frequency from OTP when PICO_POWMAN_CALIBRATE_LPOSC_FROM_OTP is set, but it can be overridden (for example, to use frequency_count_khz() at runtime).
  • Added powman_timer_pause() function, which saves and restores the current time, and uses this in powman_timer_set_1khz_tick_source_... functions. Previously these functions called powman_timer_stop(), which then restarts the timer from the original start time when powman_timer_start() is called.
  • Added LPOSC_MIN_EXPECTED_HZ / LPOSC_MAX_EXPECTED_HZ defines for range validation in powman_timer_get_lposc_calib_freq().

hardware_spi

  • Added spi_get_instance() for consistency with other instanced hardware APIs.

hardware_sync

  • Modified predefined PICO_SPINLOCK_ID_xxx constants when using PICO_USE_SW_SPIN_LOCKS=0 on RP2350 to use spin lock numbers that are unaffected by RP2350-E2.

pico_async_context

  • Make sure xTimerDelete completes synchronously during async_context_freertos deinitialisation to prevent a possible race with the timer task if it's running on the other core.

pico_bootrom

  • Due to a boot ROM bug (RP2350-E30) on RP2350, rom_reboot() with a delay of 0 milliseconds doesn't actually cause a reboot. To work around this issue, the SDK implementation now passes a delay of 1 millisecond instead.
  • Added preprocessor define PICO_BOOTROM_WORKAROUND_RP2350_A2_ACTIVITY_LED_BUG (defaults to 1 on RP2350 QFN60 Arm builds where A2 is supported) to force a reboot into RISC-V USB boot if an activity LED is requested using rom_reset_usb_boot* functions, so that the LED correctly flashes (RP2350 A2 access control has a bug which the bootrom hits in Arm mode which prevents this, see RP2350-E3)

pico_btstack

  • Fixed BTstack flash bank reads on RP2350 to use XIP_NOCACHE_NOALLOC_NOTRANSLATE_BASE instead of XIP_BASE, fixing bond data storage and retrieval when running from partitions.
  • Fixed a CMake target name collision in pico_btstack_make_gatt_header() that prevented a single target from consuming more than one .gatt file.
  • Fixed pico_btstack_make_gatt_header() invoking compile_gatt.py from PICO_SDK_PATH rather than PICO_BTSTACK_PATH when an out-of-tree BTstack is supplied.

pico_crt0

  • Added PICO_CRT0_DEBUG_ENTRY_RESETS_VIA_BOOTROM on RP2350 (enabled by default, with a minimal code-size cost): no_flash binaries now reset through the boot ROM when entered from a debugger, enabling load-maps, XIP SRAM pinning, and similar initialisation to operate correctly.

pico_cyw43_driver

  • BTstack HCI transport no longer uses async send callbacks; sends are now synchronous, improving reliability.
  • Updated cyw43-driver.
  • Added a weak cyw43_tcpip_link_status() implementation for builds not using lwIP, so that such builds link correctly; the application is expected to supply its own implementation.

pico_float / pico_double

  • Fixed crash on RP2040 when PICO_FLOAT_IN_RAM / PICO_DOUBLE_IN_RAM was enabled.
  • Fixed float2fix, float2ufix, double2fix, double2ufix, and their variants to saturate correctly to the nearest representable integer value (for example, INT32_MAX/INT32_MIN, UINT32_MAX/0) when given out-of-range inputs such as infinity or NaN; previously, the behaviour was undefined.
  • Fixed RISC-V builds when pico_float_none is set.
  • Documentation updated to clarify saturation behaviour and RP2350-specific function availability.
  • Added new PICO_FLOAT_HAS_* / PICO_DOUBLE_HAS_* preprocessor defines in pico/float.h and pico/double.h that indicate which SDK-specific functions (conversions, fast variants, and so on) are available on the current build target; this is useful for writing portable code that conditionally uses SDK extensions.

pico_lwip

  • makefsdata script now supports .response sidecar files alongside content files, allowing per-file HTTP response overrides (for example, for captive portal redirects).

pico_mbedtls

  • Added source file block_cipher.c for MbedTLS versions 3.6.0 and greater.

pico_multicore

  • Added new PICO_MULTICORE_LOCKOUT_BEFORE_CORE1_STARTED preprocessor define (defaults to 1), which removes the requirement that core 1 be started (and lockout-victim-initialised) before entering multicore-core-lockout from core 0. This is generally useful behaviour, but consumes a little code space when using pico_multicore even without the use of multicore lockout, so this option may be turned off if not needed, including through pico_minimize_runtime.
  • Fixed off-by-one error breaking check of claimed doorbells on core 1 for multicore_doorbell_claim() and multicore_doorbell_claim_unused().

pico_platform

  • rp2040_rom_version() is now called rp2350_rom_version() on RP2350.
  • panic() with PICO_PANIC_FUNCTION=xxx now works correctly on RISC-V.
  • The stack is now properly aligned when hitting a breakpoint in the default panic(), which fixes stack trace problems when debugging.

pico_rand

  • Fixed possible decreased entropy during overlapping calls to the random number generation functions.

pico_status_led

  • Fixed implementation for WS2812 LEDs to correctly set the first LED in the chain to the latest colour/state, in all cases, including when updated rapidly:

    WS2812 LEDs require a "reset delay" between updates, so this fix makes sure such a delay (configured via the new PICO_COLORED_STATUS_LED_RESET_DELAY_US define which defaults to 50) occurs between updates sent to the LED. If the time since the last update is less than the reset delay, an alarm is set for when a safe reset time has passed since the last update to update the LED with the then last value passed by the application, allowing the application to update as frequently as it likes, and the LED to update to the latest value as fast as it can. The use of an alarm requires the default alarm pool, and can be disabled by using PICO_COLORED_STATUS_LED_USE_DEFAULT_ALARM_POOL=0, in which case the pico_status_led API will just busy-wait if needed for a reset delay, throttling the API to the fastest the LED can apply each update.

pico_stdio

  • When using pico_set_printf_implementation(compiler) with PICO_STDIO_SHORT_CIRCUIT_CLIB_FUNCS=1, stdout is now explicitly flushed after each printf call, partially working around C library buffering issues. Consider using PICO_STDIO_SHORT_CIRCUIT_CLIB_FUNCS=0 with pico_set_printf_implementation(compiler) for the most correct output.

pico_stdio_usb

  • pico_stdio_usb is no longer disabled when tinyusb_host is enabled, allowing use of STDIO over USB while using PIO USB host mode.
  • Fixed duplicate spin lock unclaim in stdio_usb_deinit that caused assertion failures in debug builds.

pico_sync

  • Added PICO_SYNC_RP2350_SPINLOCK_WORKAROUND (enabled by default on RP2350 with SW spin locks): fixes a problem on RP2350 where a spin lock/unlock causes a SEV on the executing core, thus causing a subsequent WFE to wake up immediately, preventing low power sleeps in sleeps and synchronization primitives with timeouts.

pico_time

  • Fixed a busy wait / starvation scenario that might occur when using alarm timeouts (either explicitly or through synchronization primitives) from core 1 using the alarm pool on core 0. This caused both strange behaviour, and broke entering a low power state
  • Low power sleep_ functions no longer busy-wait instead on RP2350 when using software spin locks.

pico_util

  • Added boolean success return code to queue_init.

Miscellaneous

  • Many -fanalyzer warnings from GCC 15.2 fixed. Note: only the latest GCC is checked because older versions have more false positives.

C++ development

  • C++ static initialization is now thread-, multicore-safe, controlled by PICO_CXX_THREAD_SAFE_STATIC_INIT (defaults to 1 when pico_multicore is linked)

Board Configuration

  • Nested board headers (using #include) are now searched for pico_board_cmake_set() and pico_board_cmake_set_default() declarations.
  • Added PICO_PSRAM_CS_PIN to define a CS pin for PSRAM.
  • Added PICO_PSRAM_SIZE_BYTES similar to PICO_FLASH_SIZE_BYTES to specify the PSRAM size.
  • Added boolean PICO_AUTO_DETECT_PSRAM_SIZE to request best-effort runtime detection of PSRAM size as an alternative to setting PICO_PSRAM_SIZE_BYTES.

Host platform

  • Added pico_unique_id library.
  • Updated hardware_gpio library with recent on-device additions.

Documentation

  • Many miscellaneous improvements.

Pioasm

  • Updated C SDK generated code to use constexpr rather than const for C++ code
  • Fixed a crash when reporting some errors such as for irq next set 0 rel.
  • Enhanced JSON output now includes additional program metadata: pioasm version, PIO version, used GPIO ranges, in/out/set counts, movStatus, FIFO configuration, clock divider, code blocks, and language options. A JSON schema file is included.

BTstack

Updated from v1.6.2 to v1.8.2. Highlights across releases:

v1.7

  • Chipset: support for newer AIROC controllers requiring Download Mode.
  • GATT Service Client: new component for discovering characteristics and enabling notifications or indications; supports caching in TLV.
  • GATT Server: stores database hash in TLV and discards stored CCCs if the database changes.
  • HID Host: optional HID descriptor storage; renamed to HIDS Host (hids_client.*hids_host.*, MAX_NR_HIDS_CLIENTSMAX_NR_HIDS_HOSTS).
  • Chipset: support for Realtek H4-transport controllers (for example, RTL8761CTV).
  • Linux: HCI kernel socket transport and ALSA audio sink.

v1.8

  • SM: CTKD active field in pairing complete event; explicit pairing trigger on security request.
  • GATT: database hash with TLV caching.
  • Chipset: LC3 offload for Infineon and Realtek controllers.
  • HCI Dump: printf-to-log with ENABLE_PRINTF_TO_LOG.

v1.8.1

  • HCI: Bluetooth Core v6.2 commands and events, including Channel Sounding definitions.
  • GAP: ENABLE_LE_SHORTER_CONNECTION_INTERVALS with gap_request_connection_rate_update() / gap_request_frame_space_update().
  • Many parser robustness fixes (AVDTP, AVRCP, HID Host, HFP).

v1.8.2

  • Security defaults tightened: minimum LE/BR-EDR encryption key size raised to 16 bytes; Secure Connections Only mode enabled by default; SSP auto-accept disabled by default.
  • GAP: LE Data Length configuration; LE link-layer commands now sequential
  • A2DP: MPEG-D USAC support; LE Audio Broadcast/Unicast Lite examples.
  • HCI: improved packet validation; CIS/BIG state management fixes.
  • Various parser security hardening (L2CAP, AVRCP, BNEP, HID, RFCOMM, OBEX).
  • btstack_crypto: fixed DHKey calculation for newer mbedTLS requiring f_rnd.

MbedTLS

Updated from v3.6.2 to v3.6.6. The 3.6.6 release contains several security fixes:

  • CVE-2026-25833 — buffer underflow in IPv6 address parsing (x509_inet_pton_ipv6).
  • CVE-2026-25834 — TLS 1.2 client accepted server key-exchange messages signed with a disallowed algorithm.
  • CVE-2026-25835 — RNG state duplication after fork() or VM snapshot resume; new psa_random_reseed() / psa_random_deplete() APIs provided.
  • Default entropy source changed from /dev/urandom to /dev/random.
  • FFDH: low-order element validation added.
  • CCM: tag-length validation in mbedtls_ccm_finish().
  • GCM tag calculation fixed under GCC 10–14 with -O3 without AESNI/AESCE.

CMake build

  • Added support for GCC 15.
  • Added support for LLVM Embedded Toolchain for Arm 21.
  • gcc-riscv32-pico-elf is now the preferred RISC-V compiler because it supports all the latest architecture features present in RP2350.
  • For a chosen RISC-V compiler, multiple architecture options are tried (from most exotic to least) until a supported set is found.
  • -mcpu=hazard3-rp2350 is used on gcc-riscv32-pico-elf to provide the optimiser the most accurate processor information.
  • Added support for The xPack GNU RISC-V Embedded GCC, a part of Eclipse Embedded CDT.
  • Added support for hard-float ABI (-mfloat-abi=hard) on RP2350 (Arm Cortex-M33) through the CMake variable, PICO_HARD_FLOAT_ABI=1.
  • The build now auto-detects whether the compiler (when specified using PICO_TOOLCHAIN_PATH) is GCC or LLVM/Clang, so the user no longer needs to specify PICO_COMPILER manually.
  • The build now auto-detects whether the compiler includes Newlib or Picolibc, so the user no longer needs to specify PICO_CLIB manually.
  • Removed --specs=nosys.specs from build (was only used for GCC) because this confusingly named option actually pulls in system stubs, which we shouldn't need because pico_clib_interface implements the needed hooks.
  • Fixed GCC 6 builds (had been broken for some time — was using an incorrect set of libraries causing hard faults on execution).
  • All PICO_DEFAULT_XXX_IMPL CMake variables (for example, PICO_DEFAULT_STDIO_IMPL) can now be overridden. They now expect a bare library suffix (the prefix - for example, pico_stdio_for PICO_DEFAULT_STDIO_IMPL - is added automatically), consistent with pico_set_xxx_impl(). Existing values that already include the prefix continue to work; however, if you were using a custom library name not starting with the correct prefix before, you must rename it.

Bazel build

  • Added support for hard-float ABI on RP2350 (Arm Cortex-M33).
  • Updated to a newer Clang toolchain.

New examples

There are new examples in the pico-examples repository. A new Low Power section was added covering dormant, power-state, and sleep modes using the new pico_low_power library. A new async_context section and a top-level bluetooth/ directory for standalone BLE examples (previously under pico_w/bt/standalone/) were also added.

Example Description
ble_doorbell Detect a button press on a transmitter Pico and illuminate an LED on a receiver Pico through BLE.
ble_pointer Bluetooth HID mouse using an MPU6050 to detect angle and move the cursor.
ble_secure_temp_client Connect to ble_secure_temp_server and read the temperature.
ble_secure_temp_server Variant of ble_temp_server allowing exploration of LE Secure Connection configurations.
ble_wifi_provisioner Provision Wi-Fi credentials over BLE using a mobile app or included Python script.
gatt_counter_with_wifi GATT Server - Heartbeat Counter over GATT (with Wi-Fi).
gatt_streamer_server_with_wifi Performance - Stream Data over GATT (Server, with Wi-Fi).
gps_uart Interpret standard NMEA data received from a GPS device connected to a UART.
ina219_i2c Monitor power usage using an INA219 sensor, via I2C.
ina228_i2c Monitor power usage using an INA228 sensor, via I2C.
ina237_i2c Monitor power usage using an INA237 sensor, via I2C.
ina260_i2c Monitor power usage using an INA260 sensor, via I2C.
low_power_dormant_gpio Go dormant (disable clocks) and wake up on a GPIO.
low_power_dormant_timer Go dormant (disable clocks) and wake up on a timer.
low_power_pstate_gpio Go to a lower power state (RP2350 only) and restart on a GPIO.
low_power_pstate_timer Go to a lower power state (RP2350 only) and restart on an AON timer.
low_power_sleep_gpio Go to sleep and wake up on a GPIO.
low_power_sleep_timer Go to sleep and wake up on a timer.
pan_lwip_http_server Networking - Bluetooth PAN with lwIP HTTP Server.
pbap_client_demo PBAP Client - Load Phonebook from Server.
picow_access_point_wifi_provisioning Start a Wi-Fi access point and provision Wi-Fi credentials through a web page.
picow_ntp_system_time Create a background time-of-day clock that periodically synchronizes from a pool of NTP servers.
picow_router_solicit Demonstrate using Wi-Fi without LwIP by sending an IPv6 router solicitation.
sdp_bnep_query SDP Client - Query BNEP SDP record.
simple_at_time_worker Use a worker on a threadsafe background context to blink the on-board LED.
spp_streamer_with_wifi Performance - Stream Data over SPP (Server, with Wi-Fi).
ssd1309_spi Display text on an SSD1309-driven OLED display through SPI.
ssd1309_stdout_spi Display stdout text and simple graphics on an SSD1309-based OLED panel through SPI.

Modified Examples

The standalone Bluetooth examples previously under pico_w/bt/standalone/ were moved to a new top-level bluetooth/ directory and renamed. All BTstack examples were renamed, dropping the picow_bt_example_ prefix (for example, picow_bt_example_gatt_countergatt_counter).

Example Description
ble_temp_client Renamed from picow_ble_temp_reader; moved to bluetooth/ble_temp_sensor. Previous picow_ble_temp_sensor_with_wifi removed.
ble_temp_server Renamed from picow_ble_temp_sensor; moved to bluetooth/ble_temp_sensor.
blink_universal Moved to its own universal/blink_universal directory.

Bluetooth (BTstack) examples

The BTstack examples have moved from pico_w/bt/ to bluetooth/btstack_examples.
The source code for these examples still comes from lib/btstack/example.
Each example now has its own self-contained CMake file instead of relying on shared CMake helper functions. This makes it much easier to copy an example out of the tree and adapt it as a starting point for your own project.
The BTstack examples should now work with the Pico VS Code extension.

Authors

Thanks to the following for their contributions:

adam.nelson,
alastairpatrick,
Andrew Kohlsmith,
Andrew Pochinchik,
Andrew Scheller,
Andrii Anoshyn,
Andy Lin,
armandomontanez,
BlockListed,
Carl Hamilton,
DeepPG,
Disappear9,
dmitrykos,
drewpo28,
Earle F. Philhower, III,
Edward Hesketh,
FLyrfors-MI,
Gonzalo Larralde,
Graham Sanderson.
Jaylon Gowie,
jdomnitz,
Jérôme Hordies,
josch,
Josip Šimun Kuči,
Keith Packard,
kripton,
Liam Fraser,
Lloyd Pique
Luke Wren,
m24goller09,
madh4tter,
martijn,
Martin Budden,
Miaou,
Michel Le Bihan,
Nephtaly Aniceta,
Norman Dunbar,
Peter Harper,
Peter N Lewis,
Petr Hosek,
Prabhu Rajasekaran,
qqqlab,
Rainer Keller,
Richard Hulme,
Romain,
Will Stranton,
William Vinnicombe,