Skip to content

Commit f9d0ab4

Browse files
authored
Merge pull request #293 from stanford-ssi/yiheng/ota-mvp-tbyb
Verified TBYB flag works as intended! We have full end-to-end OTA demo working as we require it for our flight software \o/
2 parents 1686251 + a9f8dec commit f9d0ab4

9 files changed

Lines changed: 3033 additions & 230 deletions

File tree

.bazelrc

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ build --disk_cache=~/.cache/bazel
2727
build:pico --define=profile=pico
2828
build:pico --platforms=//platforms:arm_cortex_m33_platform
2929
build:pico --define=PICO_BOARD=pico
30+
build:pico --copt=-DPICO_CRT0_IMAGE_TYPE_TBYB=0
3031
build:pico --copt=-DPICO=1
3132
build:pico --@pico-sdk//bazel/config:PICO_STDIO_USB=True
32-
build:pico --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect
33-
build:pico --output_groups=+pico_uf2_files
33+
build:pico --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect,//bzl:bin_aspect.bzl%pico_bin_aspect
34+
build:pico --output_groups=+pico_uf2_files,+pico_bin_files
3435

3536
# PiCubed Debug Profile (RP2350 with debug features)
3637
build:picubed-debug --define=profile=picubed-debug
@@ -41,8 +42,8 @@ build:picubed-debug --define=DEBUG=1
4142
build:picubed-debug --copt=-DDEBUG=1
4243
build:picubed-debug --compilation_mode=dbg
4344
build:picubed-debug --@pico-sdk//bazel/config:PICO_STDIO_USB=True
44-
build:picubed-debug --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect
45-
build:picubed-debug --output_groups=+pico_uf2_files
45+
build:picubed-debug --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect,//bzl:bin_aspect.bzl%pico_bin_aspect
46+
build:picubed-debug --output_groups=+pico_uf2_files,+pico_bin_files
4647

4748
# PiCubed Flight Profile (RP2350 optimized for flight)
4849
build:picubed-flight --define=profile=picubed-flight
@@ -54,8 +55,8 @@ build:picubed-flight --copt=-DFLIGHT=1
5455
build:picubed-flight --compilation_mode=opt
5556
build:picubed-flight --copt=-Os # Optimize for size
5657
build:picubed-flight --@pico-sdk//bazel/config:PICO_STDIO_USB=True
57-
build:picubed-flight --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect
58-
build:picubed-flight --output_groups=+pico_uf2_files
58+
build:picubed-flight --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect,//bzl:bin_aspect.bzl%pico_bin_aspect
59+
build:picubed-flight --output_groups=+pico_uf2_files,+pico_bin_files
5960

6061
# PiCubed Bringup Profile (RP2350 for board bring-up testing)
6162
build:picubed-bringup --define=profile=picubed-bringup
@@ -66,12 +67,20 @@ build:picubed-bringup --define=BRINGUP=1
6667
build:picubed-bringup --copt=-DBRINGUP=1
6768
build:picubed-bringup --compilation_mode=dbg
6869
build:picubed-bringup --@pico-sdk//bazel/config:PICO_STDIO_USB=True
69-
build:picubed-bringup --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect
70-
build:picubed-bringup --output_groups=+pico_uf2_files
70+
build:picubed-bringup --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect,//bzl:bin_aspect.bzl%pico_bin_aspect
71+
build:picubed-bringup --output_groups=+pico_uf2_files,+pico_bin_files
7172

7273
# OTA MVP Blink Variant (for testing OTA partition switching)
74+
build:ota-blink --define=PICO_BOARD=samwise_picubed
75+
build:ota-blink --define=PICO_PLATFORM=rp2350
7376
build:ota-blink --define=BLINK=1
7477
build:ota-blink --copt=-DBUILD_BLINK=1
78+
build:ota-blink --copt=-DPICO_CRT0_IMAGE_TYPE_TBYB=1
79+
build:ota-blink --copt=-Os # Optimize for size
80+
build:ota-blink --platforms=//platforms:arm_cortex_m33_platform
81+
build:ota-blink --@pico-sdk//bazel/config:PICO_STDIO_USB=True
82+
build:ota-blink --aspects=@pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect,//bzl:bin_aspect.bzl%pico_bin_aspect
83+
build:ota-blink --output_groups=+pico_uf2_files,+pico_bin_files
7584

7685
# Tests Profile (Host platform with mocked hardware)
7786
build:tests --define=profile=tests

bzl/bin_aspect.bzl

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
"""Aspect for generating raw .bin images from ELF binaries.
2+
3+
Mirrors the pico-sdk UF2 aspect but produces raw binary files using
4+
arm-none-eabi-objcopy from the CC toolchain. Wire it up in .bazelrc:
5+
6+
build:picubed-debug --aspects=//bzl:bin_aspect.bzl%pico_bin_aspect
7+
build:picubed-debug --output_groups=+pico_bin_files
8+
"""
9+
10+
_SUPPORTED_BINARY_TYPES = ",".join([
11+
"cc_binary",
12+
"cc_test",
13+
])
14+
15+
def _pico_bin_aspect_impl(target, ctx):
16+
allowed_types = ctx.attr.from_rules.split(",")
17+
if ctx.rule.kind not in allowed_types and "*" not in allowed_types:
18+
return []
19+
20+
cc_toolchain = ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]
21+
22+
binary_to_convert = target[DefaultInfo].files_to_run.executable
23+
bin_output = ctx.actions.declare_file(binary_to_convert.basename + ".bin")
24+
25+
ctx.actions.run_shell(
26+
outputs = [bin_output],
27+
inputs = depset([binary_to_convert], transitive = [cc_toolchain.all_files]),
28+
command = """
29+
OBJCOPY=$(find . -name 'arm-none-eabi-objcopy' 2>/dev/null | head -1)
30+
if [ -z "$OBJCOPY" ]; then
31+
echo "ERROR: Could not find arm-none-eabi-objcopy" >&2
32+
exit 1
33+
fi
34+
"$OBJCOPY" -O binary "$1" "$2"
35+
""",
36+
arguments = [binary_to_convert.path, bin_output.path],
37+
mnemonic = "ElfToBin",
38+
progress_message = "Converting %s to raw binary" % binary_to_convert.basename,
39+
)
40+
return [
41+
OutputGroupInfo(
42+
pico_bin_files = depset([bin_output]),
43+
),
44+
]
45+
46+
pico_bin_aspect = aspect(
47+
implementation = _pico_bin_aspect_impl,
48+
doc = """An aspect for generating raw .bin images from ELF binaries.
49+
50+
Produces raw binary files suitable for flashing with picotool or SWD.
51+
Use alongside the UF2 aspect:
52+
53+
bazel build --config=picubed-debug \\
54+
--aspects=//bzl:bin_aspect.bzl%pico_bin_aspect \\
55+
--output_groups=+pico_bin_files \\
56+
//:samwise
57+
""",
58+
attrs = {
59+
"from_rules": attr.string(
60+
default = _SUPPORTED_BINARY_TYPES,
61+
doc = "Comma-separated list of rule kinds to apply the bin aspect to",
62+
),
63+
"_cc_toolchain": attr.label(
64+
default = "@bazel_tools//tools/cpp:current_cc_toolchain",
65+
),
66+
},
67+
fragments = ["cpp"],
68+
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
69+
)

ota_mvp/BUILD.bazel

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
"""OTA MVP - Over-The-Air update proof of concept for RP2350.
2-
3-
A standalone binary that demonstrates partition table reading and
4-
A/B partition booting on the RP2350. Has a BUILD_BLINK variant
5-
that just blinks the LED.
6-
"""
7-
81
package(default_visibility = ["//visibility:public"])
92

3+
# ==========================================
4+
# 1. MAIN EXECUTABLE (ELF)
5+
# ==========================================
106
cc_binary(
11-
name = "ota",
12-
srcs = ["main.c"],
7+
name = "ota_elf",
8+
srcs = [
9+
"main.c",
10+
"partition_b.h",
11+
],
1312
deps = [
1413
# Board header (for non-PICO builds)
1514
"//boards:samwise_picubed",
@@ -20,6 +19,7 @@ cc_binary(
2019
"@pico-sdk//src/rp2_common/hardware_spi:hardware_spi",
2120
"@pico-sdk//src/rp2_common/hardware_i2c:hardware_i2c",
2221
"@pico-sdk//src/rp2_common/hardware_flash:hardware_flash",
22+
"@pico-sdk//src/rp2_common/hardware_watchdog:hardware_watchdog",
2323
"@pico-sdk//src/rp2_common/pico_bootrom:pico_bootrom",
2424

2525
# Linker script for RP2350
@@ -42,4 +42,44 @@ cc_binary(
4242
"-Wl,--build-id=none",
4343
],
4444
target_compatible_with = ["//platforms:arm_cortex_m33"],
45+
# You can also copy over any specific copts/linkopts from your root
46+
# BUILD file if this specific target requires them.
47+
)
48+
49+
# ==========================================
50+
# 2. RAW BINARY GENERATOR (.bin)
51+
# ==========================================
52+
genrule(
53+
name = "ota_bin_generator",
54+
srcs = [":ota_elf"],
55+
outs = ["ota.bin"],
56+
# Replaced $(OBJCOPY) with the explicit arm-none-eabi-objcopy command
57+
cmd = "arm-none-eabi-objcopy -O binary $(location :ota_elf) $@",
58+
message = "Extracting raw binary for OTA payload...",
59+
)
60+
61+
# ==========================================
62+
# 3. UF2 GENERATOR (.uf2)
63+
# ==========================================
64+
genrule(
65+
name = "ota_uf2_generator",
66+
srcs = [":ota_elf"],
67+
outs = ["ota.uf2"],
68+
# Swapped rp2350 for rp2350-arm-s
69+
cmd = "picotool uf2 convert $(location :ota_elf) -t elf $@ --family rp2350-arm-s",
70+
message = "Packaging ELF into UF2 for RP2350...",
71+
)
72+
73+
# ==========================================
74+
# 4. UMBRELLA FILEGROUP
75+
# ==========================================
76+
# Running `bazel build //ota_mvp:ota --config=pico` will now build
77+
# the ELF, the .bin, and the .uf2 all at once.
78+
filegroup(
79+
name = "ota",
80+
srcs = [
81+
":ota_elf",
82+
":ota_bin_generator",
83+
":ota_uf2_generator",
84+
],
4585
)

0 commit comments

Comments
 (0)