Files
2026-07-04 00:45:27 +02:00

60 lines
1.6 KiB
Bash
Executable File

#!/bin/bash
# Flash-Skript fuer Pico 1 W im BOOTSEL-Modus.
# Wartet auf das RPI-RP2 Massenspeichergeraet, mountet es, kopiert die uf2.
#
# Nutzung: ./flash.sh <pfad/zur/firmware.uf2>
set -euo pipefail
if [ $# -lt 1 ]; then
echo "Nutzung: $0 <firmware.uf2>" >&2
exit 1
fi
UF2="$1"
if [ ! -f "$UF2" ]; then
echo "Datei nicht gefunden: $UF2" >&2
exit 1
fi
# Der Bootrom vom RP2040 exponiert eine FAT-Partition mit Label RPI-RP2.
# udev legt bei Erscheinen automatisch diesen Symlink an — unabhaengig davon,
# ob der Kernel das Device als sda, sdb, sdc, ... zaehlt.
BY_LABEL="/dev/disk/by-label/RPI-RP2"
TIMEOUT=30
echo "Warte bis zu ${TIMEOUT}s auf Pico im BOOTSEL-Modus (BOOTSEL druecken, dann einstecken)..."
for ((i = 0; i < TIMEOUT; i++)); do
if [ -e "$BY_LABEL" ]; then
break
fi
sleep 1
done
if [ ! -e "$BY_LABEL" ]; then
echo "Kein RPI-RP2 nach ${TIMEOUT}s gefunden." >&2
echo "Ist BOOTSEL gehalten worden beim Einstecken?" >&2
exit 1
fi
DEV="$(readlink -f "$BY_LABEL")"
echo "Pico gefunden: $DEV"
MNT="$(mktemp -d -t pico-XXXXXX)"
trap 'sudo umount "$MNT" 2>/dev/null || true; rmdir "$MNT" 2>/dev/null || true' EXIT
echo "Mounte nach $MNT ..."
sudo mount -o uid=$(id -u),gid=$(id -g) "$DEV" "$MNT"
echo "Kopiere $(basename "$UF2") ..."
cp "$UF2" "$MNT/"
sync
# Nach dem Schreiben rebootet der Pico von selbst und das FS verschwindet.
# umount kann daher "target is busy" oder "not mounted" liefern — beides okay.
sudo umount "$MNT" 2>/dev/null || true
rmdir "$MNT"
trap - EXIT
echo "Fertig. Pico sollte jetzt in die neue Firmware booten."