Skip to content

Commit 2ef15df

Browse files
authored
Merge pull request #98 from norandomtechie/feature/picosdk-support
Support RP2350 in builder/picosdk, added custom board for testing
2 parents bf1f7b6 + f346c3a commit 2ef15df

File tree

2 files changed

+104
-37
lines changed

2 files changed

+104
-37
lines changed

boards/db_rp2350.json

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"build": {
3+
"arduino": {
4+
"earlephilhower": {
5+
"boot2_source": "none.S",
6+
"usb_vid": "0x2E8A",
7+
"usb_pid": "0xF00F"
8+
}
9+
},
10+
"core": "earlephilhower",
11+
"cpu": "cortex-m33",
12+
"extra_flags": " ",
13+
"f_cpu": "150000000L",
14+
"hwids": [
15+
[
16+
"0x2E8A",
17+
"0x00C0"
18+
],
19+
[
20+
"0x2E8A",
21+
"0xF00F"
22+
]
23+
],
24+
"mcu": "rp2350",
25+
"variant": "db_rp2350"
26+
},
27+
"debug": {
28+
"jlink_device": "RP2350_0",
29+
"openocd_target": "rp2350.cfg",
30+
"svd_path": "rp2350.svd"
31+
},
32+
"frameworks": [
33+
"picosdk"
34+
],
35+
"name": "RP2350",
36+
"upload": {
37+
"maximum_ram_size": 524288,
38+
"maximum_size": 16777216,
39+
"require_upload_port": true,
40+
"native_usb": true,
41+
"use_1200bps_touch": true,
42+
"wait_for_upload_port": false,
43+
"protocol": "picoprobe",
44+
"protocols": [
45+
"blackmagic",
46+
"cmsis-dap",
47+
"jlink",
48+
"raspberrypi-swd",
49+
"picotool",
50+
"picoprobe"
51+
]
52+
},
53+
"url": "https://github.com/ece362-purdue",
54+
"vendor": "DB-RP2350"
55+
}

builder/frameworks/picosdk.py

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from os.path import isdir, join
1+
from os.path import isdir, isfile, join
22
from os import makedirs
33
from pathlib import Path
44
import sys
@@ -11,11 +11,14 @@
1111
FRAMEWORK_DIR = platform.get_package_dir("framework-picosdk")
1212
assert isdir(FRAMEWORK_DIR)
1313

14-
# hardcoded for now
15-
rp2_variant_dir = join(FRAMEWORK_DIR, "src", "rp2040")
16-
# todo: try to better guess the board header name based from the board definition name
17-
# instead of requiring them to explicitly include it
18-
rp2_board_header = board.get("build.picosdk.board_header", "pico.h")
14+
mcu = "rp2350" if board.get('build.mcu') == "rp2350" else "rp2040"
15+
rp2_variant_dir = join(FRAMEWORK_DIR, "src", mcu)
16+
header = "%s.h" % board.get("build.variant")
17+
# try to find the board header in the common directory
18+
if isfile(join(FRAMEWORK_DIR, "src", "boards", "include", "boards", header)):
19+
rp2_board_header = board.get("build.picosdk.board_header", header)
20+
else:
21+
rp2_board_header = board.get("build.picosdk.board_header", "pico.h")
1922

2023
# include basic settings
2124
env.SConscript("_bare.py")
@@ -32,7 +35,6 @@ def gen_config_autogen(target_base_dir, board_hdr):
3235
env.Exit(-1)
3336
autogen_content_paths = [
3437
join(FRAMEWORK_DIR, "src", "boards", "include", "boards", board_hdr),
35-
# only for ARM based RP2040
3638
join(FRAMEWORK_DIR, "src" , "rp2_common", "cmsis", "include", "cmsis", "rename_exceptions.h")
3739
]
3840
# read content
@@ -55,11 +57,12 @@ def gen_config_autogen(target_base_dir, board_hdr):
5557
#CFLAGS=sorted(list(cflags - ccflags)),
5658
#CCFLAGS=sorted(list(ccflags)),
5759
CPPDEFINES=[
58-
("PICO_RP2040", 1),
59-
("PICO_RP2350", 0),
60+
# BUG: defining PICO_RP2040 in any way will force compilation for 2040 only.
61+
# FIX: add RP2350 only if board requested was 2350
62+
("PICO_RP2350" if board.get('build.mcu') == "rp2350" else "PICO_RP2040", 1),
6063
("PICO_RISCV", 0),
6164
("PICO_ARM", 1),
62-
("PICO_CMSIS_DEVICE", "\"RP2040\""),
65+
("PICO_CMSIS_DEVICE", "\"%s\"" % mcu.upper()),
6366
("PICO_DEFAULT_FLASH_SIZE_BYTES", 2 * 1024 * 1024),
6467
# default SDK defines for on-hardware build
6568
("PICO_ON_DEVICE", "1"),
@@ -98,8 +101,9 @@ def gen_config_autogen(target_base_dir, board_hdr):
98101
join(rp2_variant_dir, "boot_stage2", "include"),
99102

100103
# common for rp2040, rp2350
101-
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_base", "include"),
104+
join(FRAMEWORK_DIR, "src", "rp2_common", "boot_bootrom_headers", "include"),
102105
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_adc", "include"),
106+
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_base", "include"),
103107
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_boot_lock", "include"),
104108
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_clocks", "include"),
105109
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_divider", "include"),
@@ -116,41 +120,41 @@ def gen_config_autogen(target_base_dir, board_hdr):
116120
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_resets", "include"),
117121
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_rtc", "include"),
118122
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_spi", "include"),
119-
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_sync", "include"),
120123
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_sync_spin_lock", "include"),
124+
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_sync", "include"),
121125
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_ticks", "include"),
122126
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_timer", "include"),
123127
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_uart", "include"),
124128
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_vreg", "include"),
125129
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_watchdog", "include"),
126130
join(FRAMEWORK_DIR, "src", "rp2_common", "hardware_xosc", "include"),
127131

128-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_bootrom", "include"),
129-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_compiler", "include"),
130-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_sections", "include"),
131-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_panic", "include"),
132132
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_aon_timer", "include"),
133-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_bootsel_via_double_reset", "include"),
134-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_multicore", "include"),
135-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_unique_id", "include"),
136133
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_atomic", "include"),
137134
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_bit_ops", "include"),
135+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_bootrom", "include"),
136+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_bootsel_via_double_reset", "include"),
138137
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_divider", "include"),
139138
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_double", "include"),
140-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_int64_ops", "include"),
141139
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_flash", "include"),
142140
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_float", "include"),
143-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_mem_ops", "include"),
141+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_int64_ops", "include"),
144142
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_malloc", "include"),
143+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_mem_ops", "include"),
144+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_multicore", "include"),
145+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_compiler", "include"),
146+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_panic", "include"),
147+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_platform_sections", "include"),
145148
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_printf", "include"),
146149
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_rand", "include"),
150+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio_rtt", "include"),
147151
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio_semihosting", "include"),
148152
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio_uart", "include"),
149-
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio_rtt", "include"),
153+
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_unique_id", "include"),
150154
# CMSIS only for ARM
151155
join(FRAMEWORK_DIR, "src", "rp2_common", "cmsis", "include"),
152156
join(FRAMEWORK_DIR, "src", "rp2_common", "cmsis", "stub", "CMSIS", "Core", "Include"),
153-
join(FRAMEWORK_DIR, "src", "rp2_common", "cmsis", "stub", "CMSIS", "Device", "RP2040", "Include"),
157+
join(FRAMEWORK_DIR, "src", "rp2_common", "cmsis", "stub", "CMSIS", "Device", mcu.upper(), "Include"),
154158

155159
join(FRAMEWORK_DIR, "src", "rp2_common", "tinyusb", "include"),
156160
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio_usb", "include"),
@@ -177,7 +181,7 @@ def gen_config_autogen(target_base_dir, board_hdr):
177181
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdio", "include"),
178182
join(FRAMEWORK_DIR, "src", "rp2_common", "pico_stdlib", "include"),
179183

180-
join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "asminclude"),
184+
join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "asminclude"),
181185
],
182186
#CXXFLAGS=sorted(list(cxxflags - ccflags)),
183187
LIBPATH=[
@@ -205,6 +209,9 @@ def gen_config_autogen(target_base_dir, board_hdr):
205209
pass
206210
if not "PIO_NO_STDIO_UART" in cpp_defines:
207211
flags.append(("PICO_STDIO_UART", 1))
212+
# SDK C code specifies it as LIB_... so do that too
213+
flags.append(("LIB_PICO_STDIO", 1))
214+
flags.append(("LIB_PICO_STDIO_UART", 1))
208215
if not "PIO_NO_MULTICORE" in cpp_defines:
209216
flags.append(("PICO_MULTICORE_ENABLED", 1))
210217
# check selected double implementation
@@ -266,7 +273,7 @@ def configure_printf_impl():
266273
flash_region = "FLASH(rx) : ORIGIN = 0x10000000, LENGTH = %s\n" % str(board.get("upload.maximum_size"))
267274
Path(join(genned_dir, "pico_flash_region.ld")).write_text(flash_region)
268275

269-
env.Replace(LDSCRIPT_PATH=join(FRAMEWORK_DIR, "src", "rp2_common", "pico_crt0", "rp2040", "memmap_default.ld"))
276+
env.Replace(LDSCRIPT_PATH=join(FRAMEWORK_DIR, "src", "rp2_common", "pico_crt0", mcu, "memmap_default.ld"))
270277

271278
# build base files
272279
# system_RP2040.c
@@ -277,7 +284,7 @@ def configure_printf_impl():
277284

278285
gen_boot2_cmd = env.Command(
279286
join("$BUILD_DIR", "boot2.S"), # $TARGET
280-
join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "compile_time_choice.S"), # $SOURCE
287+
join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "compile_time_choice.S"), # $SOURCE
281288
env.VerboseAction(" ".join([
282289
"$CC",
283290
"$ASPPFLAGS",
@@ -286,8 +293,8 @@ def configure_printf_impl():
286293
]
287294
+ ["-D%s=%s" % (flag[0], str(flag[1])) for flag in env["CPPDEFINES"]]
288295
+ [
289-
"-I\"%s\"" % join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "asminclude"),
290-
"-I\"%s\"" % join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "include"),
296+
"-I\"%s\"" % join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "asminclude"),
297+
"-I\"%s\"" % join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "include"),
291298
"-I\"%s\"" % join(FRAMEWORK_DIR, "src", "common", "pico_base_headers", "include"),
292299
"-I\"%s\"" % join(FRAMEWORK_DIR, "generated"),
293300
"-I", "$PROJECT_BUILD_DIR/$PIOENV/generated",
@@ -301,7 +308,7 @@ def configure_printf_impl():
301308
"-nostdlib",
302309
"--specs=nosys.specs",
303310
"-nostartfiles",
304-
"-Wl,-T,\"%s\"" % join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "boot_stage2.ld"),
311+
"-Wl,-T,\"%s\"" % join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "boot_stage2.ld"),
305312
"$SOURCE"
306313
] + [ " && "] + [
307314
"$OBJCOPY",
@@ -310,7 +317,7 @@ def configure_printf_impl():
310317
join("$BUILD_DIR", "boot2.bin")
311318
] + [ " && "] + [
312319
"$PYTHONEXE",
313-
join(FRAMEWORK_DIR, "src", "rp2040", "boot_stage2", "pad_checksum"),
320+
join(FRAMEWORK_DIR, "src", mcu, "boot_stage2", "pad_checksum"),
314321
"-s 0xffffffff",
315322
join("$BUILD_DIR", "boot2.bin"),
316323
join("$BUILD_DIR", "boot2.S"),
@@ -320,21 +327,26 @@ def configure_printf_impl():
320327

321328
# default compontents
322329
default_common_rp2_components = [
323-
("pico_runtime_init", "+<*>"),
324330
("hardware_adc", "+<*>"),
325331
("hardware_boot_lock", "+<*>"),
326332
("hardware_clocks", "+<*>"),
327-
("hardware_xosc", "+<*>"),
328-
("hardware_pll", "+<*>"),
329-
("hardware_ticks", "+<*>"),
330-
("pico_clib_interface", "-<*> +<newlib_interface.c>"),
331333
("hardware_gpio", "+<*>"),
332-
("hardware_timer", "+<*>"),
333334
("hardware_irq", "+<*>"),
335+
("hardware_pll", "+<*>"),
334336
("hardware_sync", "+<*>"),
335337
("hardware_sync_spin_lock", "+<*>"),
338+
("hardware_ticks", "+<*>"),
339+
("hardware_timer", "+<*>"),
340+
("hardware_uart", "+<*>"),
341+
("hardware_xosc", "+<*>"),
342+
("pico_bootrom", "+<*>"),
343+
("pico_clib_interface", "-<*> +<newlib_interface.c>"),
336344
("pico_platform_panic", "+<*>"),
337345
("pico_runtime", "+<*>"),
346+
("pico_runtime_init", "+<*>"),
347+
("pico_stdlib", "+<*>"),
348+
("pico_stdio", "+<*>"),
349+
("pico_stdio_uart", "+<*>"),
338350
]
339351

340352
for component, src_filter in default_common_rp2_components:
@@ -362,4 +374,4 @@ def configure_printf_impl():
362374
join("$BUILD_DIR", "PicoSDKCommon%s" % component),
363375
join(FRAMEWORK_DIR, "src", "common", component),
364376
src_filter
365-
)
377+
)

0 commit comments

Comments
 (0)