#!/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 set -euo pipefail if [ $# -lt 1 ]; then echo "Nutzung: $0 " >&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."