Improve UF2 bootloader detection
This commit is contained in:
parent
25b8f7ca72
commit
c7da7bf4f7
3 changed files with 98 additions and 3 deletions
|
|
@ -6,3 +6,5 @@
|
||||||
{"id":"int-fd7690f3","kind":"field_change","created_at":"2026-04-15T15:44:48.605669713Z","actor":"w1n5t0n","issue_id":"meml-zbbs","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Prompt variant selection now uses /dev/tty so interactive shells are detected correctly"}}
|
{"id":"int-fd7690f3","kind":"field_change","created_at":"2026-04-15T15:44:48.605669713Z","actor":"w1n5t0n","issue_id":"meml-zbbs","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Prompt variant selection now uses /dev/tty so interactive shells are detected correctly"}}
|
||||||
{"id":"int-672df751","kind":"field_change","created_at":"2026-04-15T15:45:23.772401653Z","actor":"w1n5t0n","issue_id":"meml-oq1q","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
|
{"id":"int-672df751","kind":"field_change","created_at":"2026-04-15T15:45:23.772401653Z","actor":"w1n5t0n","issue_id":"meml-oq1q","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
|
||||||
{"id":"int-d96e5dc8","kind":"field_change","created_at":"2026-04-15T15:46:03.317834458Z","actor":"w1n5t0n","issue_id":"meml-oq1q","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Preserved canonical firmware variant capitalization in prompts and docs"}}
|
{"id":"int-d96e5dc8","kind":"field_change","created_at":"2026-04-15T15:46:03.317834458Z","actor":"w1n5t0n","issue_id":"meml-oq1q","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Preserved canonical firmware variant capitalization in prompts and docs"}}
|
||||||
|
{"id":"int-24228f3d","kind":"field_change","created_at":"2026-04-15T15:51:08.349410622Z","actor":"w1n5t0n","issue_id":"meml-9hla","extra":{"field":"status","new_value":"in_progress","old_value":"open"}}
|
||||||
|
{"id":"int-ea04e4b0","kind":"field_change","created_at":"2026-04-15T15:52:36.360908976Z","actor":"w1n5t0n","issue_id":"meml-9hla","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Expanded UF2 detection to find labeled block devices and resolve mounted boot volumes reliably"}}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ UF2_PATH_DEFAULT="${MEMLNAUT_FIRMWARE_UF2:-$BUILD_DIR/${SKETCH_NAME}.uf2}"
|
||||||
|
|
||||||
FQBN="${MEMLNAUT_FIRMWARE_FQBN:-rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3}"
|
FQBN="${MEMLNAUT_FIRMWARE_FQBN:-rp2040:rp2040:solderparty_rp2350_stamp_xl:opt=Optimize3}"
|
||||||
CXX20_BUILD_PROPERTY="${MEMLNAUT_FIRMWARE_CXX20_PROPERTY:-compiler.cpp.extra_flags=-std=gnu++20}"
|
CXX20_BUILD_PROPERTY="${MEMLNAUT_FIRMWARE_CXX20_PROPERTY:-compiler.cpp.extra_flags=-std=gnu++20}"
|
||||||
|
UF2_LABEL_CANDIDATES=("${MEMLNAUT_FIRMWARE_UF2_LABEL_1:-RP2350}" "${MEMLNAUT_FIRMWARE_UF2_LABEL_2:-RPI-RP2}" "${MEMLNAUT_FIRMWARE_UF2_LABEL_3:-RP2040}")
|
||||||
|
|
||||||
FIRMWARE_VARIANTS=()
|
FIRMWARE_VARIANTS=()
|
||||||
ACTIVE_FIRMWARE_VARIANT=""
|
ACTIVE_FIRMWARE_VARIANT=""
|
||||||
|
|
@ -82,6 +83,98 @@ find_boot_mount() {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_known_uf2_label() {
|
||||||
|
local label="$1"
|
||||||
|
local candidate
|
||||||
|
|
||||||
|
for candidate in "${UF2_LABEL_CANDIDATES[@]}"; do
|
||||||
|
if [[ -n "$candidate" && "$label" == "$candidate" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
find_boot_block_device() {
|
||||||
|
local line
|
||||||
|
local dev_path=""
|
||||||
|
local dev_fstype=""
|
||||||
|
local dev_label=""
|
||||||
|
local dev_mountpoints=""
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
dev_path=""
|
||||||
|
dev_fstype=""
|
||||||
|
dev_label=""
|
||||||
|
dev_mountpoints=""
|
||||||
|
eval "$(
|
||||||
|
sed -E \
|
||||||
|
-e 's/(^|[[:space:]])PATH=/\1dev_path=/' \
|
||||||
|
-e 's/(^|[[:space:]])FSTYPE=/\1dev_fstype=/' \
|
||||||
|
-e 's/(^|[[:space:]])LABEL=/\1dev_label=/' \
|
||||||
|
-e 's/(^|[[:space:]])MOUNTPOINTS=/\1dev_mountpoints=/' \
|
||||||
|
<<<"$line"
|
||||||
|
)"
|
||||||
|
|
||||||
|
[[ -n "$dev_path" ]] || continue
|
||||||
|
[[ "$dev_fstype" == "vfat" || "$dev_fstype" == "msdos" || "$dev_fstype" == "fat" ]] || continue
|
||||||
|
is_known_uf2_label "$dev_label" || continue
|
||||||
|
|
||||||
|
printf '%s\n' "$dev_path"
|
||||||
|
return 0
|
||||||
|
done < <(lsblk -P -o PATH,FSTYPE,LABEL,MOUNTPOINTS 2>/dev/null || true)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
mount_boot_block_device() {
|
||||||
|
local device_path="$1"
|
||||||
|
local mount_output=""
|
||||||
|
local mounted_path=""
|
||||||
|
|
||||||
|
if command -v udisksctl >/dev/null 2>&1; then
|
||||||
|
mount_output="$(udisksctl mount -b "$device_path" 2>/dev/null || true)"
|
||||||
|
mounted_path="$(sed -nE "s#.* at (.+)\.?#\1#p" <<<"$mount_output" | tail -n 1)"
|
||||||
|
if [[ -n "$mounted_path" && -d "$mounted_path" ]]; then
|
||||||
|
printf '%s\n' "$mounted_path"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_boot_mount() {
|
||||||
|
local mountpoint=""
|
||||||
|
local device_path=""
|
||||||
|
|
||||||
|
mountpoint="$(find_boot_mount || true)"
|
||||||
|
if [[ -n "$mountpoint" ]]; then
|
||||||
|
printf '%s\n' "$mountpoint"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
device_path="$(find_boot_block_device || true)"
|
||||||
|
if [[ -z "$device_path" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mountpoint="$(mount_boot_block_device "$device_path" || true)"
|
||||||
|
if [[ -n "$mountpoint" ]]; then
|
||||||
|
printf '%s\n' "$mountpoint"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
mountpoint="$(find_boot_mount || true)"
|
||||||
|
if [[ -n "$mountpoint" ]]; then
|
||||||
|
printf '%s\n' "$mountpoint"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
assert_boot_mount() {
|
assert_boot_mount() {
|
||||||
local mountpoint="$1"
|
local mountpoint="$1"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,12 +54,12 @@ if [[ ! -f "$uf2_path" ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z "$mountpoint" ]]; then
|
if [[ -z "$mountpoint" ]]; then
|
||||||
mountpoint="$(find_boot_mount || true)"
|
mountpoint="$(ensure_boot_mount || true)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z "$mountpoint" ]]; then
|
if [[ -z "$mountpoint" ]]; then
|
||||||
echo "error: could not find a mounted UF2 bootloader volume" >&2
|
echo "error: could not find or mount a UF2 bootloader volume" >&2
|
||||||
echo "put the board in bootloader mode or pass the mountpoint explicitly" >&2
|
echo "put the board in bootloader mode, or pass the mountpoint explicitly" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue