forked from jappel/VersaMCU
Add end-to-end USB flashing for the app firmware via UF2
Adds uf2conv.py (minimal, dependency-free .bin -> .uf2 converter matching bootloader/inc/uf2format.h's block layout) and upload_uf2.py, a PlatformIO upload hook for env:versapad_usb that finds the mounted VERSABOOT volume and copies the converted firmware onto it. env:versapad_usb previously used upload_protocol=sam-ba, the classic Arduino/Atmel protocol -- the actual bootloader speaks UF2/mass storage, not SAM-BA, so that upload path never worked. Switched to upload_protocol=custom with the new hook, and cleaned the now-unused SAM-BA-specific fields out of boards/versapad.json. Verified end to end on real hardware: pio run -e versapad_usb --target upload builds, converts, copies to the VERSABOOT drive, and the bootloader jumps into the freshly written app on its own. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
f60a29137c
commit
d325297063
7 changed files with 210 additions and 32 deletions
|
|
@ -6,11 +6,9 @@ lässt sich die App-Firmware ohne SWD über USB aktualisieren: Bootloader-Modus
|
|||
aktivieren, Board erscheint als USB-Laufwerk `VERSABOOT`, `.uf2`-Datei drauf
|
||||
kopieren.
|
||||
|
||||
Der Bootloader selbst (Flash, USB-Enumeration, Massenspeicher-Modus,
|
||||
Rücksprung in die App) ist auf echter Hardware verifiziert, siehe
|
||||
[Hardwaretest](#hardwaretest-2026-08-05). Der App-seitige `.uf2`-Schreibweg
|
||||
(Firmware tatsächlich über das Laufwerk aktualisieren) ist noch nicht gebaut,
|
||||
siehe [Bekannte Einschränkungen](#bekannte-einschränkungen).
|
||||
Der komplette Weg — Bootloader-Einstieg, `.uf2`-Erzeugung, Kopieren aufs
|
||||
Laufwerk, automatischer Rücksprung in die neu geschriebene App — ist auf
|
||||
echter Hardware verifiziert, siehe [Hardwaretest](#hardwaretest-2026-08-05).
|
||||
|
||||
Diese Platine hat keinen dedizierten Reset-/Boot-Taster. Bootloader-Modus
|
||||
aktivieren heißt hier: unterste rechte Cherry-MX-Taste (key_id 24) beim
|
||||
|
|
@ -34,6 +32,12 @@ und das Node-/Makefile-basierte Build-System — stattdessen ein eigenständiges
|
|||
PlatformIO-Environment, damit dasselbe Tooling wie für die App-Firmware
|
||||
ausreicht.
|
||||
|
||||
Für die App-Seite (nicht diesen Bootloader-Build) gibt es unter
|
||||
[`../uf2conv.py`](../uf2conv.py) eine eigene, minimale Python-3-Neuimplemen-
|
||||
tierung des `.bin`→`.uf2`-Konverters (kein Upstream-Code, passendes
|
||||
Blockformat zu `inc/uf2format.h`), eingebunden über
|
||||
[`../upload_uf2.py`](../upload_uf2.py) als `env:versapad_usb`-Upload-Hook.
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
|
|
@ -73,6 +77,17 @@ Bedienung: USB-Kabel ziehen, unterste rechte Taste gedrückt halten, Kabel
|
|||
wieder einstecken (Taste dabei weiter halten) → Board bootet direkt in
|
||||
`VERSABOOT`. Ohne gehaltene Taste startet die App normal.
|
||||
|
||||
## App-Firmware per USB flashen (nach dem einmaligen Bootloader-Flash)
|
||||
|
||||
```bash
|
||||
# Board zuerst in den Bootloader-Modus versetzen: USB ziehen, unterste
|
||||
# rechte Taste halten, wieder einstecken (siehe oben)
|
||||
pio run -e versapad_usb --target upload
|
||||
```
|
||||
|
||||
Baut die App-Firmware (Repo-Root, nicht `bootloader/`), erzeugt `firmware.uf2`
|
||||
und kopiert es aufs `VERSABOOT`-Laufwerk. Kein Atmel-ICE mehr nötig.
|
||||
|
||||
## Hardwaretest (2026-08-05)
|
||||
|
||||
Erster vollständiger Hardwaretest auf einem echten VersaPad-v2-Board über
|
||||
|
|
@ -94,6 +109,14 @@ Atmel-ICE/SWD. Ergebnisse:
|
|||
für genau dieses Bootloader-Pattern vorgeschrieben, hat im vendorten Code
|
||||
gefehlt. Nach dem Fix bootet die App-Firmware zuverlässig, mit und ohne
|
||||
angeschlossenen Debugger.
|
||||
- **Kompletter USB-Flashweg getestet:** `pio run -e versapad_usb --target
|
||||
upload` (App-Firmware, Repo-Root) baut `firmware.bin`, wandelt es über
|
||||
[`../uf2conv.py`](../uf2conv.py) in `firmware.uf2` und kopiert es über
|
||||
[`../upload_uf2.py`](../upload_uf2.py) automatisch aufs erkannte
|
||||
`VERSABOOT`-Laufwerk. Der Bootloader erkennt den Schreibzugriff und
|
||||
springt danach selbständig in die neue App — kein manuelles Auswerfen
|
||||
oder Reset nötig. Voraussetzung: Board zuvor per gehaltener Taste (siehe
|
||||
oben) in den Bootloader-Modus versetzt.
|
||||
|
||||
## Bekannte Einschränkungen
|
||||
|
||||
|
|
@ -109,11 +132,7 @@ Atmel-ICE/SWD. Ergebnisse:
|
|||
(kein offiziell zugeteilter PID unter Adafruits VID); ein sauber eigener
|
||||
VID (z. B. über pid.codes) wäre die langfristig korrekte Lösung, ist aber
|
||||
nicht Teil dieses Branches.
|
||||
- Die App-Firmware erzeugt noch keine `.uf2`-Datei, nur `.bin`/`.elf`
|
||||
(SWD-Weg). Der geplante Weg über das `VERSABOOT`-Laufwerk ist damit noch
|
||||
nicht nutzbar.
|
||||
- `env:versapad_usb` in der Haupt-`platformio.ini` verwendet
|
||||
`upload_protocol = sam-ba` — das klassische Arduino/Atmel-SAM-BA-Protokoll,
|
||||
nicht das UF2/Massenspeicher-Verfahren dieses Bootloaders. Für echtes
|
||||
USB-Flashen wird stattdessen ein `.bin`→`.uf2`-Konvertierungsschritt plus
|
||||
einfaches Kopieren aufs Laufwerk benötigt, kein spezielles Upload-Protokoll.
|
||||
- [`../upload_uf2.py`](../upload_uf2.py) sucht das `VERSABOOT`-Laufwerk aktuell
|
||||
nur über die Windows-API (`GetVolumeInformationW`) — passend zur bisherigen
|
||||
Dev-Umgebung dieses Projekts, aber nicht plattformübergreifend. Für
|
||||
macOS/Linux müsste die Laufwerkssuche noch ergänzt werden.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue