SDK version 1.4.0
This release adds wireless support for the Raspberry Pi Pico W, adds support for other new boards, and contains various
bug fixes, documentation improvements, and minor improvements/added functionality. You can see the full list of individual commits here.
New Board Support
The following boards have been added and may be specified via PICO_BOARD
:
pico_w
datanoisetv_rp2040_dsp
solderparty_rp2040_stamp_round_carrier
Wireless Support
-
Support for the Raspberry Pi Pico W is now included with the SDK (
PICO_BOARD=pico_w
). The Pico W uses a driver
for the wireless chip calledcyw43_driver
which is included as a submodule of the SDK. You need to initialize
this submodule for Pico W wireless support to be available. Note that the LED on the Pico W board is only
accessible via the wireless chip and can be accessed viacyw43_arch_gpio_put()
and
cyw43_arch_gpio_get()
(part of thepico_cyw43_arch
library described below). As a result of the LED being on
the wireless chip, there is noPICO_DEFAULT_LED_PIN
setting and the default LED based examples in pico-examples
do not work with the Pico W. -
IP support is provided by lwIP which is also included as a
submodule which you should initialize if you want to use it.The following libraries exposing lwIP functionality are provided by the SDK:
pico_lwip_core
(included inpico_lwip
)pico_lwip_core4
(included inpico_lwip
)pico_lwip_core6
(included inpico_lwip
)pico_lwip_netif
(included inpico_lwip
)pico_lwip_sixlowpan
(included inpico_lwip
)pico_lwip_ppp
(included inpico_lwip
)pico_lwip_api
(this is a blocking API that may be used with FreeRTOS and is not included inpico_lwip
)
As referenced above, the SDK provides a
pico_lwip
which aggregates all of the commonly needed lwIP functionality.
You are of course free to use the substituent libraries explicitly instead.The following libraries are provided that contain the equivalent lwIP application support:
pico_lwip_snmp
pico_lwip_http
pico_lwip_makefsdata
pico_lwip_iperf
pico_lwip_smtp
pico_lwip_sntp
pico_lwip_mdns
pico_lwip_netbios
pico_lwip_tftp
pico_lwip_mbedtls
-
Integration of the IP stack and the
cyw43_driver
network driver into the user's code is handled by
pico_cyw43_arch
. Both the IP stack and the driver need to do work in response to network traffic, and
pico_cyw43_arch
provides a variety of strategies for servicing that work. Four architecture variants
are currently provided as libraries:pico_cyw43_arch_lwip_poll
- For using the RAW lwIP API (NO_SYS=1
mode) with polling. With this architecture
the user code must periodically poll viacyw43_arch_poll()
to perform background work. This architecture
matches the common use of lwIP on microcontrollers, and provides no multicore safetypico_cyw43_arch_lwip_threadsafe_background
- For using the RAW lwIP API (NO_SYS=1
mode) with multicore
safety, and automatic servicing of thecyw43_driver
and
lwIP in the background. User polling is not required with this architecture, but care should be taken as lwIP
callbacks happen in an IRQ context.pico_cyw43_arch_lwip_sys_freertos
- For using the full lwIP API including blocking sockets in OS mode
(NO_SYS=0
), along with multicore/task safety, and automatic servicing of thecyw43_driver
and the lwIP
stack in a separate task. This powerful architecture works with both SMP and non-SMP variants of the RP2040 port
of FreeRTOS-Kernel. Note you must setFREERTOS_KERNEL_PATH
in your build to use this variant.pico_cyw43_arch_none
- If you do not need the TCP/IP stack but wish to use the on-board LED or other wireless
chip connected GPIOs.
See the library documentation or the
pico/cyw43_arch.h
header for more details.
Notable Library Changes/Improvements
hardware_dma
- Added
dma_unclaim_mask()
function for un-claiming multiple DMA channels at once. - Added
channel_config_set_high_priority()
function to set the channel priority via a channel config object.
hardware_gpio
-
Improved the documentation for the pre-existing gpio IRQ functions which use the "one callback per core" callback
mechanism,
and added agpio_set_irq_callback()
function to explicitly set the callback independently of enabling per pin GPIO
IRQs. -
Reduced the latency of calling the existing "one callback per core" GPIO IRQ callback.
-
Added new support for the user to add their own shared GPIO IRQ handler independent of the pre-existing
"one callback per core" callback mechanism, allowing for independent usage of GPIO IRQs without having to share one
handler.
See
the
documentation inhardware/irq.h
for full details of the functions added:gpio_add_raw_irq_handler()
gpio_add_raw_irq_handler_masked()
gpio_add_raw_irq_handler_with_order_priority()
gpio_add_raw_irq_handler_with_order_priority_masked()
gpio_remove_raw_irq_handler()
gpio_remove_raw_irq_handler_masked()
-
Added a
gpio_get_irq_event_mask()
utility function for use by the new "raw" IRQ handlers.
hardware_irq
- Added
user_irq_claim()
,user_irq_unclaim()
,user_irq_claim_unused()
anduser_irq_is_claimed()
functions for claiming ownership of the user IRQs (the ones numbered 26-31 and not connected to any hardware).
Uses of the user IRQs have been updated to use these functions. Forstdio_usb
, thePICO_STDIO_USB_LOW_PRIORITY_IRQ
define is still respected if specified, but otherwise an unclaimed one is
chosen. - Added an
irq_is_shared_handler()
function to determine if a particular IRQ uses a shared handler.
pico_sync
- Added a
sem_try_acquire()
function, for non blocking acquisition of a semaphore.
pico_stdio
stderr
is now supported and goes to the same destination asstdout
.- Zero timeouts for
getchar_timeout_us()
are now correctly honored (previously they were a 1us minimum).
stdio_usb
- stdio over USB can now be used even if you are linking to
tinyusb_device
yourself. If you have a CDC device in your device descriptors, you can usepico_enable_stdio_usb(TARGET 1)
in yourCMakeLists.txt
- The use of a 1ms timer to handle background TinyUSB work has been replaced with use of a more interrupt driven
approach using a user IRQ for better performance. Note this new feature is disabled if shared IRQ handlers
are disabled viaPICO_DISABLE_SHARED_IRQ_HANDLERS=1
miscellaneous
get_core_num()
has been moved topico/platform.h
fromhardware/sync.h
.- The C library function
realloc()
is now multicore safe too. - The minimum PLL frequency has been increased from 400Mhz to 750Mhz to improve stability across operating
conditions. This should not affect the majority of users in any way, but may impact those trying to set
particularly low clock frequencies. If you do wish to return to the previous
minimum, you can setPICO_PLL_VCO_MIN_FREQ_MHZ
back to400
. There is also a newPICO_PLL_VCO_MAX_FREQ_MHZ
which defaults to1600
.
Build
- Compilation with GCC 12 is now supported.