Skip to content

Commit c4b2c29

Browse files
committed
Product universal payload UF2 in process_ipl.py
1 parent 7ca4f5e commit c4b2c29

File tree

2 files changed

+30
-29
lines changed

2 files changed

+30
-29
lines changed

tools/build.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ if [ ! -f "payload.dol" ]; then
3434
fi
3535

3636
echo -e "${BLUE}##########################################################${NC}"
37-
echo -e "🚀 ${YELLOW}Generating payload uf2 files:${NC}"
37+
echo -e "🚀 ${YELLOW}Generating payload UF2 files:${NC}"
3838
echo -e "📂 ${YELLOW}Input file:${NC} ${GREEN}payload.dol${NC}"
3939
echo -e "${BLUE}##########################################################${NC}"
4040

@@ -48,8 +48,8 @@ tools/process_ipl.py dist/payload_pico.uf2 payload.dol rp2040
4848
echo -e "\n🔨 ${YELLOW}Building payload uf2 file for Pico 2...${NC}"
4949
tools/process_ipl.py dist/payload_pico2.uf2 payload.dol rp2350
5050

51-
echo -e "\n🔨 ${YELLOW}Building universal payload uf2 file...${NC}"
52-
cat dist/payload_pico.uf2 dist/payload_pico2.uf2 > dist/payload_universal.uf2
51+
echo -e "\n🔨 ${YELLOW}Building universal payload UF2 file...${NC}"
52+
tools/process_ipl.py dist/payload_universal.uf2 payload.dol
5353

5454
for (( i=0; i<num_configs; i++ )); do
5555
platform="${platforms[i]}"

tools/process_ipl.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,7 @@ def flatten_dol(data):
6969
# Entry point, load address, memory image
7070
return entry, dol_min, img
7171

72-
def pack_uf2(data, base_address, family):
73-
if family == "rp2040":
74-
family_id = 0xE48BFF56 # RP2040
75-
elif family == "rp2350":
76-
family_id = 0xE48BFF59 # RP2350-ARM-S
77-
elif family == "data":
78-
family_id = 0xE48BFF58 # DATA family ID compatible with RP2350
79-
else:
80-
raise ValueError(f"Unknown family: {family}")
81-
72+
def pack_uf2(data, base_address, family_ids):
8273
ret = bytearray()
8374

8475
seq = 0
@@ -89,19 +80,20 @@ def pack_uf2(data, base_address, family):
8980
chunk = data[:chunk_size]
9081
data = data[chunk_size:]
9182

92-
ret += struct.pack(
93-
"< 8I 476B I",
94-
0x0A324655, # Magic 1 "UF2\n"
95-
0x9E5D5157, # Magic 2
96-
0x00002000, # Flags (family ID present)
97-
addr,
98-
chunk_size,
99-
seq,
100-
total_chunks,
101-
family_id, # Board family: Raspberry Pi RP2040
102-
*chunk.ljust(476, b"\x00"),
103-
0x0AB16F30, # Final magic
104-
)
83+
for family_id in family_ids:
84+
ret += struct.pack(
85+
"< 8I 476s I",
86+
0x0A324655, # Magic 1 "UF2\n"
87+
0x9E5D5157, # Magic 2
88+
0x00002000, # Flags (family ID present)
89+
addr,
90+
chunk_size,
91+
seq,
92+
total_chunks,
93+
family_id,
94+
chunk,
95+
0x0AB16F30, # Final magic
96+
)
10597

10698
seq += 1
10799
addr += chunk_size
@@ -110,12 +102,11 @@ def pack_uf2(data, base_address, family):
110102

111103
def main():
112104
if len(sys.argv) not in range(3, 4 + 1):
113-
print(f"Usage: {sys.argv[0]} <output> <executable> [<uf2_family>]")
105+
print(f"Usage: {sys.argv[0]} <output> <executable>")
114106
return 1
115107

116108
output = sys.argv[1]
117109
executable = sys.argv[2]
118-
family = sys.argv[3]
119110

120111
with open(executable, "rb") as f:
121112
exe = bytearray(f.read())
@@ -161,7 +152,17 @@ def main():
161152
out = header + img
162153

163154
elif output.endswith(".uf2"):
164-
out = pack_uf2(header + img, 0x10080000, family)
155+
if len(sys.argv) > 3:
156+
if sys.argv[3] == "rp2040":
157+
family_ids = [0xE48BFF56]
158+
elif sys.argv[3] == "rp2350":
159+
family_ids = [0xE48BFF59]
160+
else:
161+
raise ValueError(f"Unknown family: {sys.argv[3]}")
162+
else:
163+
family_ids = [0xE48BFF56, 0xE48BFF59]
164+
165+
out = pack_uf2(header + img, 0x10080000, family_ids)
165166

166167
else:
167168
print("Unknown output format")

0 commit comments

Comments
 (0)