|
| 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 |
0 commit comments