60 lines
1.6 KiB
Bash
Executable File
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."
|