pureboot: review-pass fixes to the host tool and device runner
pureboot.py: reject an empty image file with a clear error instead of an IndexError deep in the vector-surgery planner; tighten the erase docstring (order is irrelevant there — every target byte is the same value, unlike a real flash where page 0 must go last). pureboot_device.c: the GPIO bridge's bit_cycles used plain truncating division where the firmware computes its own bit period with round-to-nearest (uart.hpp: (Clock.hz + Baud.bd/2)/Baud.bd) — one cycle off per bit on both tinies, harmless in practice but needless drift against a firmware built to a different constant. Matched exactly. Also clear the queued-bytes/decode-in-progress bridge state on the test-only reset signal, so a future reset-mid-transfer scenario can't feed a freshly reset chip bytes queued for its previous life. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -193,6 +193,8 @@ def load_image(path):
|
||||
"""Raw binary, or Intel HEX by extension (.hex/.ihx/.ihex)."""
|
||||
data = open(path, "rb").read()
|
||||
if not path.lower().endswith((".hex", ".ihx", ".ihex")):
|
||||
if not data:
|
||||
raise Error(f"{path}: empty image")
|
||||
return data
|
||||
memory = {}
|
||||
for number, line in enumerate(data.decode("ascii", "replace").splitlines(), 1):
|
||||
@@ -284,8 +286,9 @@ def covered(pages, skip_blank):
|
||||
|
||||
|
||||
def op_erase_flash(loader):
|
||||
"""0xff over the whole application area, page 0 first — an interrupted
|
||||
erase leaves the entry word blank and the chip still boots the loader."""
|
||||
"""0xff over the whole application area. Order does not matter here —
|
||||
every target byte is the same value — and a blank word 0 still falls
|
||||
through to the loader, so an interruption is harmless."""
|
||||
blank = bytes([0xFF] * loader.info.page)
|
||||
for address in range(0, loader.info.base, loader.info.page):
|
||||
loader.write_page(address, blank)
|
||||
|
||||
Reference in New Issue
Block a user