Skip to content

Commit d71bf94

Browse files
committed
Pico 2 W (RP2350 + CYW43439): bare-metal wolfIP port
1 parent 23b8ab4 commit d71bf94

30 files changed

Lines changed: 4396 additions & 0 deletions

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ CPPCHECK_FLAGS=--enable=warning,performance,portability,missingInclude \
145145
--suppress=comparePointers:src/port/lpc54s018/syscalls.c \
146146
--suppress=comparePointers:src/port/stm32f439/startup.c \
147147
--suppress=comparePointers:src/port/stm32f439/syscalls.c \
148+
--suppress=comparePointers:src/port/rp2350_cyw43439/startup_m33.c \
149+
--suppress=comparePointers:src/port/rp2350_cyw43439/startup_hazard3.c \
150+
--suppress=comparePointers:src/port/rp2350_cyw43439/syscalls.c \
148151
--disable=style \
149152
--std=c99 --language=c \
150153
--platform=unix64 \
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# CYW43439 firmware blob - third-party license (Broadcom/Infineon +
2+
# George Robotics/Raspberry Pi, RP-silicon only). NOT distributed with
3+
# wolfIP. Obtain from the pico-sdk cyw43-driver firmware/ directory and
4+
# place the vendor headers + cyw43_fw_blob.c here for local builds.
5+
fw_local/
6+
7+
# Build artifacts
8+
*.o
9+
*.elf
10+
*.bin
11+
*.uf2

src/port/rp2350_cyw43439/Makefile

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# Pi Pico 2 W (RP2350 + CYW43439) port Makefile
2+
#
3+
# Build: make CORE=m33 (default - Cortex-M33)
4+
# make CORE=hazard3 (Hazard3 RISC-V variant)
5+
#
6+
# Optional:
7+
# WIFI_SSID, WIFI_PSK : compile-time Wi-Fi credentials
8+
# (override config.h defaults)
9+
#
10+
# Output: app.elf + app.uf2 (UF2 via picotool, if available on PATH).
11+
# picotool load app.uf2 flashes via BOOTSEL.
12+
13+
CORE ?= m33
14+
15+
# The CORE switch forces the toolchain unconditionally. To use a
16+
# different cross compiler (e.g. a vendored toolchain), pass it on the
17+
# command line: `make CORE=m33 CC=/opt/arm/bin/arm-none-eabi-gcc`.
18+
ifeq ($(CORE),m33)
19+
CROSS_PREFIX ?= arm-none-eabi-
20+
ARCH_CFLAGS := -mcpu=cortex-m33+nodsp -mthumb -mfloat-abi=soft
21+
ARCH_LDFLAGS := -T target_m33.ld
22+
STARTUP_SRC := startup_m33.c
23+
else ifeq ($(CORE),hazard3)
24+
# The Debian/Ubuntu cross toolchain ships as riscv64-unknown-elf-* and
25+
# selects rv32 via -march/-mabi. Override CROSS_PREFIX if you have a
26+
# native riscv32-unknown-elf-* build (e.g. from SiFive or upstream).
27+
CROSS_PREFIX ?= riscv64-unknown-elf-
28+
ARCH_CFLAGS := -march=rv32imac -mabi=ilp32
29+
ARCH_LDFLAGS := -T target_hazard3.ld
30+
STARTUP_SRC := startup_hazard3.c
31+
else
32+
$(error CORE must be m33 or hazard3 (got '$(CORE)'))
33+
endif
34+
35+
CC := $(CROSS_PREFIX)gcc
36+
OBJCOPY := $(CROSS_PREFIX)objcopy
37+
SIZE := $(CROSS_PREFIX)size
38+
39+
ROOT := ../../..
40+
41+
CFLAGS := $(ARCH_CFLAGS) -Os -ffreestanding
42+
CFLAGS += -fdata-sections -ffunction-sections
43+
CFLAGS += -g -ggdb -Wall -Wextra -Werror
44+
CFLAGS += -I. -I$(ROOT) -I$(ROOT)/src
45+
CFLAGS += $(EXTRA_CFLAGS)
46+
47+
ifdef WIFI_SSID
48+
CFLAGS += -DWOLFIP_WIFI_SSID="\"$(WIFI_SSID)\""
49+
endif
50+
ifdef WIFI_PSK
51+
CFLAGS += -DWOLFIP_WIFI_PSK="\"$(WIFI_PSK)\""
52+
endif
53+
54+
# Host WPA2-PSK supplicant (tier 3): set WITH_SUPPLICANT=1 to link the
55+
# in-tree supplicant plus a minimal wolfCrypt (PSK only) so the 4-way
56+
# handshake runs on the host. Needs wolfSSL cloned alongside wolfip, or
57+
# set WOLFSSL_ROOT=/path/to/wolfssl. EAP-TLS / SAE are compiled out.
58+
WITH_SUPPLICANT ?= 0
59+
WOLFSSL_ROOT ?= $(ROOT)/../wolfssl
60+
61+
ifeq ($(WITH_SUPPLICANT),1)
62+
ifeq ($(wildcard $(WOLFSSL_ROOT)/wolfssl/ssl.h),)
63+
$(error wolfSSL not found at $(WOLFSSL_ROOT); clone it or set WOLFSSL_ROOT=/path/to/wolfssl)
64+
endif
65+
SUPP_DIR := $(ROOT)/src/supplicant
66+
WC_DIR := $(WOLFSSL_ROOT)/wolfcrypt/src
67+
CFLAGS += -DWOLFIP_WITH_SUPPLICANT
68+
CFLAGS += -DWOLFIP_ENABLE_EAP_TLS=0 -DWOLFIP_ENABLE_SAE=0
69+
CFLAGS += -DWOLFIP_ENABLE_PEAP_MSCHAPV2=0
70+
CFLAGS += -DWOLFSSL_USER_SETTINGS -DWOLFSSL_NO_OPTIONS_H
71+
CFLAGS += -I$(WOLFSSL_ROOT) -I$(SUPP_DIR)
72+
endif
73+
74+
LDFLAGS := -nostdlib $(ARCH_LDFLAGS) -Wl,-gc-sections
75+
76+
APP_SRCS := $(STARTUP_SRC) syscalls.c main.c rp2350_uart.c \
77+
rp2350_clocks.c rp2350_spi.c rp2350_pio.c \
78+
cyw43439_driver.c cyw43439_wifi.c
79+
ifeq ($(WITH_SUPPLICANT),1)
80+
APP_SRCS += rp2350_rng.c
81+
endif
82+
83+
# CYW43439 firmware blob (NOT in the repo - third-party license, RP
84+
# silicon only). When fw_local/cyw43_fw_blob.c is present it is compiled
85+
# in and the firmware download runs; otherwise the weak accessors return
86+
# NULL and bring-up stops cleanly after the backplane/ALP stage.
87+
ifneq ($(wildcard fw_local/cyw43_fw_blob.c),)
88+
APP_SRCS += fw_local/cyw43_fw_blob.c
89+
CFLAGS += -Ifw_local
90+
endif
91+
APP_OBJS := $(APP_SRCS:.c=.o)
92+
93+
WOLFIP_SRC := $(ROOT)/src/wolfip.c
94+
WOLFIP_OBJ := wolfip.o
95+
96+
ALL_OBJS := $(APP_OBJS) $(WOLFIP_OBJ)
97+
98+
# Keep `all` the default goal even though the supplicant rules below
99+
# introduce targets ahead of it.
100+
.DEFAULT_GOAL := all
101+
102+
# Supplicant + minimal wolfCrypt objects (PSK-only) when WITH_SUPPLICANT=1.
103+
ifeq ($(WITH_SUPPLICANT),1)
104+
SUPP_OBJS := supplicant.o wpa_crypto.o eapol.o rsn_ie.o
105+
WC_OBJS := aes.o sha.o sha256.o hmac.o hash.o pwdbased.o random.o \
106+
wc_port.o memory.o logging.o error.o
107+
ALL_OBJS += $(SUPP_OBJS) $(WC_OBJS)
108+
# Third-party / supplicant sources build without -Werror.
109+
CFLAGS_RELAX := $(filter-out -Werror,$(CFLAGS)) \
110+
-Wno-unused-variable -Wno-unused-function \
111+
-Wno-unused-parameter -Wno-sign-compare \
112+
-Wno-missing-field-initializers
113+
$(SUPP_OBJS): %.o: $(SUPP_DIR)/%.c
114+
$(CC) $(CFLAGS_RELAX) -c $< -o $@
115+
$(WC_OBJS): %.o: $(WC_DIR)/%.c
116+
$(CC) $(CFLAGS_RELAX) -c $< -o $@
117+
# main.c pulls in wolfSSL headers via supplicant.h - build it relaxed too.
118+
main.o: main.c
119+
$(CC) $(CFLAGS_RELAX) -c $< -o $@
120+
endif
121+
122+
all: app.uf2
123+
@echo "Built RP2350+CYW43439 wolfIP port (CORE=$(CORE))"
124+
@$(SIZE) app.elf
125+
126+
app.elf: $(ALL_OBJS) target_$(CORE).ld
127+
$(CC) $(CFLAGS) $(ALL_OBJS) $(LDFLAGS) \
128+
-Wl,--start-group -lc -lm -lgcc -lnosys -Wl,--end-group -o $@
129+
130+
app.bin: app.elf
131+
$(OBJCOPY) -O binary $< $@
132+
133+
# Convert ELF to UF2. Prefers picotool when available; falls back to
134+
# the bundled tools/elf2uf2.py (~100 lines of Python, no deps) when
135+
# not. Both produce the same UF2 a BOOTSEL drive will accept.
136+
ifeq ($(CORE),m33)
137+
UF2_FAMILY := arm
138+
else
139+
UF2_FAMILY := riscv
140+
endif
141+
142+
app.uf2: app.elf
143+
@if command -v picotool >/dev/null 2>&1; then \
144+
picotool uf2 convert $< $@ ; \
145+
else \
146+
python3 tools/elf2uf2.py $< $@ --family $(UF2_FAMILY) ; \
147+
fi
148+
149+
%.o: %.c
150+
$(CC) $(CFLAGS) -c $< -o $@
151+
152+
$(WOLFIP_OBJ): $(WOLFIP_SRC)
153+
$(CC) $(CFLAGS) -Wno-unused-variable -Wno-unused-function \
154+
-Wno-unused-parameter -Wno-sign-compare \
155+
-Wno-missing-field-initializers -c $< -o $@
156+
157+
flash: app.uf2
158+
picotool load -f app.uf2
159+
160+
clean:
161+
rm -f *.o fw_local/*.o app.elf app.bin app.uf2 \
162+
selftest.elf selftest.bin selftest.uf2
163+
164+
.PHONY: all clean flash

src/port/rp2350_cyw43439/README.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# wolfIP port: Pi Pico 2 W (RP2350 + CYW43439)
2+
3+
Bare-metal wolfIP port for the [Raspberry Pi Pico 2 W](https://www.raspberrypi.com/products/raspberry-pi-pico-2/) board (RP2350 dual-arch SoC + Infineon CYW43439 Wi-Fi radio).
4+
5+
## Highlights
6+
7+
- **Dual-arch build**. `make CORE=m33` for Cortex-M33, `make CORE=hazard3` for Hazard3 RISC-V. Same wolfIP + supplicant source, different toolchain and entry stub.
8+
- **Firmware-loader-only CYW43439 driver**. Clean-room gSPI transport + SDPCM/CDC/BDC ioctl shim. No `cyw43-driver`, no WHD source reuse. The Infineon firmware blob is loaded into the radio's RAM at boot and is the only binary artifact carried over.
9+
- **WPA2-PSK is firmware-offload**. The CYW43439 is a FullMAC radio: its firmware runs the WPA2-PSK 4-way handshake internally once the host pushes the passphrase (`WLC_SET_WSEC_PMK` + `sup_wpa=1`). Host-run PSK is not supported on this firmware. The in-tree `src/supplicant/` (linked under `WOLFIP_WITH_SUPPLICANT`) is for the paths where EAPOL *does* reach the host: WPA3-SAE external-auth and 802.1X/EAP. It is kept cross-built and linked so those paths are ready, but it is not on the PSK data path.
10+
11+
## Status
12+
13+
| Milestone | State |
14+
|-----------------------------------|-------|
15+
| Scaffolding (linker, startup) | done |
16+
| Boot + clocks + UART console | done, hardware-proven |
17+
| gSPI/PIO transport + 32-bit mode | done, hardware-proven |
18+
| Backplane + ALP + firmware load | done, hardware-proven (firmware RUNNING) |
19+
| SDPCM/CDC ioctl control plane | done, hardware-proven (WLC_UP + STA MAC read) |
20+
| Join + event-driven assoc state | done, hardware-proven (`cyw43_join_psk` associates to a real AP; `cyw43_poll` decodes `WLC_E_AUTH`/`ASSOC`/`PSK_SUP`) |
21+
| WPA2-PSK firmware 4-way (offload) | done, hardware-proven on a keyed boot (`WLC_E_PSK_SUP` fires) |
22+
| BDC 802.3 TX/RX data path | done, hardware-proven (DHCP exchange + bidirectional ICMP) |
23+
| DHCP lease on real AP | done, hardware-proven (lease bound, e.g. `10.0.4.164`) |
24+
| Bidirectional IP | done, hardware-proven (ARP replies + ICMP echo 5/5, ~9 ms RTT) |
25+
| `wolfIP_wifi_ops` impl | done (scan still a stub) |
26+
| Link robustness (sustained uptime) | **partial - intermittent stall + boot-to-boot keying variance** (see Open items) |
27+
| UDP echo round-trip demo | blocked on a keyed live window (not a wolfIP bug; see Open items) |
28+
29+
The control plane (boot -> firmware -> ioctl), the **join + firmware 4-way**, **DHCP**, and **bidirectional IP** are proven on a real Pico 2 W against a WPA2 AP: on a keyed boot the radio authenticates, `WLC_E_PSK_SUP` fires, DHCP binds a lease, and ICMP round-trips 5/5. What remains is link *robustness* - see "Open items" below.
30+
31+
Hardware validation runs against a real AP on the desk - hwsim does not validate this port (see `tools/hostapd/README.md` for the FullMAC limitation).
32+
33+
## Build
34+
35+
Requires:
36+
37+
- `arm-none-eabi-gcc` (M33 path) and/or `riscv32-unknown-elf-gcc` (Hazard3 path)
38+
- `picotool` on PATH (for UF2 conversion + flash)
39+
- A wolfSSL install with `WOLFSSL_PUBLIC_MP` if you enable SAE
40+
41+
```sh
42+
# Cortex-M33 build (default)
43+
make
44+
45+
# Hazard3 RISC-V build
46+
make CORE=hazard3
47+
48+
# Override the SSID / PSK baked into the binary
49+
make WIFI_SSID="my-ap" WIFI_PSK="my-passphrase"
50+
```
51+
52+
## Flash and run
53+
54+
```sh
55+
# Hold BOOTSEL on the Pico 2 W, plug USB, then:
56+
make flash
57+
# or copy app.uf2 to the RPI-RP2 mass-storage drive.
58+
59+
# Watch the UART console (GP0/GP1, 115200 8N1):
60+
stty -F /dev/ttyACM0 115200 raw -echo
61+
cat /dev/ttyACM0
62+
```
63+
64+
A Picoprobe (CMSIS-DAP) attached over SWD gives you live GDB:
65+
66+
```sh
67+
openocd -f interface/cmsis-dap.cfg -c "transport select swd" \
68+
-f target/rp2350.cfg -c "init"
69+
gdb-multiarch app.elf -ex 'target remote localhost:3333'
70+
```
71+
72+
## Pin map
73+
74+
| Function | RP2350 GPIO | Notes |
75+
|-------------------|------------:|------------------------------------------------|
76+
| UART0 TX | GP0 | console out |
77+
| UART0 RX | GP1 | console in |
78+
| CYW43 WL_REG_ON | GP23 | active high; pulses radio power |
79+
| CYW43 SPI DATA | GP24 | shared MOSI/MISO via 470 ohm series resistor; PIO-driven; also the chip's host-IRQ line when idle |
80+
| CYW43 SPI CS | GP25 | active low; CPU-driven |
81+
| CYW43 SPI CLK | GP29 | PIO side-set clock |
82+
83+
## Memory budget
84+
85+
| Region | Size | Notes |
86+
|----------|------|---------------------------------------------------------|
87+
| Flash | 4 MB | XIP from QSPI. ~225 KB consumed by CYW43439 blob. |
88+
| SRAM | 520 KB | Generous; wolfIP + supplicant + 8 TCP + driver < 200 KB|
89+
| Stack | 16 KB | Reserved at top of SRAM by `target_*.ld`. |
90+
91+
## Known constraints
92+
93+
- The CYW43439 gSPI bus is single-data-line and shares MOSI/MISO via a 470 ohm series resistor on the Pico 2 W carrier. The clean-room driver in `cyw43439_driver.c` accounts for this (PIO transport in `rp2350_pio.c`).
94+
- The DATA line (GP24) is owned by the PIO state machine, so the chip's host-IRQ-when-idle signal cannot be read via SIO. `cyw43_poll()` therefore polls `SPI_STATUS` (F2-packet-available) rather than a GPIO; IRQ-driven RX is deferred (RP2350 erratum E9 also makes edge-IRQ GPIO modes risky).
95+
- Bring-up logging is gated by `DEBUG_BRINGUP` (default 1 in `cyw43439_driver.h`). Build with `EXTRA_CFLAGS=-DDEBUG_BRINGUP=0` to compile out the gSPI/firmware/ioctl progress prints for a production image.
96+
- The supplicant defaults to WPA2-PSK with `mfp_capable=1`. For WPA3-SAE targets, build with `WOLFIP_ENABLE_SAE=1 WOLFSSL_PUBLIC_MP` and set `cfg.auth_mode=WOLFIP_AUTH_SAE`.
97+
98+
## Open items / not yet validated
99+
100+
Validated end-to-end on real silicon (a WPA2 AP on the desk): on a keyed boot the radio authenticates, the firmware 4-way completes (`WLC_E_PSK_SUP`), DHCP binds a lease, and ICMP round-trips both ways. The data path (BDC 802.3 TX/RX, inbound `data_offset` handling) is exercised by the DHCP + ICMP traffic. Note: `cyw43_rsn_ie_wpa2_psk[]` MUST match the firmware's expectation (WPA2-PSK/CCMP, MFP off).
101+
102+
Fixes landed this pass (all hardware-validated to the point noted):
103+
104+
- **UDP bind to the leased IP, not `INADDR_ANY`**: wolfIP only matches a 0-bound UDP socket while DHCP is running; once the lease binds, the match needs `local_ip == dst_ip`, so the echo socket binds the actual address (`main.c`).
105+
- **Patient DHCP, no data-path re-join**: re-issuing the radio join (SET_WSEC / sup_wpa / SET_SSID) while already associated desyncs the firmware immediately. Once associated the link is held and only the DHCP client is re-kicked (`run_dhcp_echo`).
106+
- **gSPI interrupt servicing** (`gspi_service_irq`): the firmware gates F2 RX until latched FIFO error bits are W1C-acknowledged at register `0x04`; on a FIFO over/underflow the corrupt in-flight frame is also aborted via `SPI_FRAME_CONTROL`. Without this the RX path wedged after a burst (`[irq] cleared 0x04` confirms overflows occur).
107+
108+
Open robustness milestone (the real remaining work):
109+
110+
1. **Boot-to-boot 4-way keying variance**: `WLC_E_PSK_SUP` fires on roughly half of boots. On a non-keyed boot the firmware still associates (`WLC_E_ASSOC`) but never keys, so no data flows (`rx=0`) and DHCP spins. Candidate: gate "associated" on `PSK_SUP` (type 46) rather than `ASSOC` (type 7) and fail/retry cleanly - but a full re-join wedges the firmware after a couple of cycles, so the retry has to be careful (likely a clean DISASSOC + settle, not a bare SET_SSID).
111+
2. **Intermittent RX stall on keyed boots**: RX freezes after a few hundred frames. The W1C-ack + F2-abort recovery pushed the stall out (98 -> 373+ frames) but did not eliminate it. WiFi power-save (`cyw43_set_powersave`, `WLC_SET_PM=0`/CAM) is a candidate cause, but the ioctl cannot be applied cleanly in the data path - it races the SDPCM control/data stream and returns `rc=-1`. Disabling power-save likely needs a control/data sequencing rework (deliver inbound frames while awaiting an ioctl response).
112+
3. **UDP echo demo**: the round-trip is blocked only by catching a keyed live window before a stall - the bind fix above is in place and the wolfIP UDP-socket match path is verified. `tcpdump` on the host confirms both ICMP and UDP-to-port-7 egress with the correct Pico dest MAC, so the host side is not the issue.
113+
114+
The manual BOOTSEL-per-boot loop is the iteration bottleneck for the above - an automated BOOTSEL + reset rig (host GPIO -> the BOOTSEL test point TP6 and the RUN pin) is the recommended next investment so the keying/stall variance can be characterized over many fast cycles.
115+
116+
Other gaps: `op_scan` is a stub (join-by-known-SSID only); the `now_ms()` time source in `main.c` is a DWT cycle counter (fixed 12000 cyc/ms) and should move to a real RP2350 timer; the PMKSA-cache reuse path (PSK re-init) is exercised only by construction, not by a dedicated unit test; SAE-on-hardware stays software-validated this pass (the supplicant's `src/supplicant/` SAE/EAP paths are the next hardware target - see the testing note below).

src/port/rp2350_cyw43439/board.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/* board.h - Pi Pico 2 W (RP2350 + CYW43439) board definitions
2+
*
3+
* Copyright (C) 2026 wolfSSL Inc.
4+
*
5+
* This file is part of wolfIP TCP/IP stack.
6+
*
7+
* wolfIP is free software; you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation; either version 3 of the License, or
10+
* (at your option) any later version.
11+
*/
12+
13+
#ifndef WOLFIP_RP2350_CYW43439_BOARD_H
14+
#define WOLFIP_RP2350_CYW43439_BOARD_H
15+
16+
/* RP2350 base addresses (RP2350 datasheet 2.2). */
17+
#define RP2350_ROM_BASE 0x00000000UL
18+
#define RP2350_XIP_BASE 0x10000000UL
19+
#define RP2350_SRAM_BASE 0x20000000UL
20+
#define RP2350_SRAM_SIZE 0x00082000UL /* 520 KB */
21+
#define RP2350_APB_BASE 0x40000000UL
22+
#define RP2350_AHB_BASE 0x50000000UL
23+
24+
/* SIO (single-cycle IO) - GPIO mailbox/atomic regs for both cores. */
25+
#define RP2350_SIO_BASE 0xD0000000UL
26+
27+
/* Pi Pico W and Pico 2 W carrier: the CYW43439 is attached to RP2350 via
28+
* a constrained gSPI bus (1-bit data line, shared MOSI/MISO through a
29+
* 470 ohm series resistor). Pin assignment is fixed on the Pico 2 W
30+
* carrier - see datasheet "Raspberry Pi Pico 2 W" Schematic v0.4.
31+
*
32+
* GP23 = WL_REG_ON (power enable; active high)
33+
* GP24 = SPI data (shared MOSI/MISO via 470 R; doubles as the
34+
* host-wake IRQ from CYW43 when SPI is idle)
35+
* GP25 = SPI CS (active low)
36+
* GP29 = SPI clock
37+
*
38+
* The clean-room driver polls GP24 for data-ready; an IRQ path can be
39+
* added once the polled bringup proves stable (RP2350 erratum E9: edge
40+
* IRQ on some pin modes can deadlock the core, prefer poll first).
41+
* These match the pico-sdk cyw43 pin config (WL_CLOCK=29, WL_DATA=24,
42+
* WL_CS=25, WL_REG_ON=23, WL_HOST_WAKE=24).
43+
*/
44+
#define CYW43_PIN_WL_REG_ON 23
45+
#define CYW43_PIN_SPI_DATA 24
46+
#define CYW43_PIN_SPI_CS 25
47+
#define CYW43_PIN_SPI_CLK 29
48+
#define CYW43_PIN_HOST_IRQ 24
49+
50+
/* UART0 for stdout console. Pi Pico 2 W exposes UART0 on GP0/GP1 by
51+
* default. The pico-sdk uses these and so do we. */
52+
#define UART0_PIN_TX 0
53+
#define UART0_PIN_RX 1
54+
#define UART0_BAUD 115200
55+
56+
#endif /* WOLFIP_RP2350_CYW43439_BOARD_H */

0 commit comments

Comments
 (0)