By default ConditionFirstBoot is ankered to the presence of /etc/machine-id. However, in our case /etc/machine-id is a bind mount, which makes the first boot condition non-working. Since machine-id is stored by the bootloader on HAOS, use the boot loaders knowledge and pass the information to systemd.
99 lines
3.4 KiB
Plaintext
99 lines
3.4 KiB
Plaintext
|
|
part start mmc ${devnum} hassos-bootstate mmc_env
|
|
|
|
setenv loadbootstate " \
|
|
echo 'loading env...'; \
|
|
mmc read ${ramdisk_addr_r} ${mmc_env} 0x40; \
|
|
env import -c ${ramdisk_addr_r} 0x8000;"
|
|
|
|
setenv storebootstate " \
|
|
echo 'storing env...'; \
|
|
env export -c -s 0x8000 ${ramdisk_addr_r} BOOT_ORDER BOOT_A_LEFT BOOT_B_LEFT MACHINE_ID; \
|
|
mmc write ${ramdisk_addr_r} ${mmc_env} 0x40;"
|
|
|
|
run loadbootstate
|
|
test -n "${BOOT_ORDER}" || setenv BOOT_ORDER "A B"
|
|
test -n "${BOOT_A_LEFT}" || setenv BOOT_A_LEFT 3
|
|
test -n "${BOOT_B_LEFT}" || setenv BOOT_B_LEFT 3
|
|
|
|
# Allows ConditionFirstBoot=
|
|
test -n "${MACHINE_ID}" || setenv BOOT_CONDITION "systemd.condition-first-boot=true"
|
|
|
|
# HassOS bootargs
|
|
setenv bootargs_hassos "zram.enabled=1 zram.num_devices=3 net.naming-scheme=v250 systemd.machine_id=${MACHINE_ID} fsck.repair=yes ${BOOT_CONDITION}"
|
|
|
|
# HassOS system A/B
|
|
setenv bootargs_a "root=PARTUUID=8d3d53e3-6d49-4c38-8349-aff6859e82fd rootfstype=squashfs ro rootwait"
|
|
setenv bootargs_b "root=PARTUUID=a3ec664e-32ce-4665-95ea-7ae90ce9aa20 rootfstype=squashfs ro rootwait"
|
|
|
|
part number mmc ${devnum} hassos-boot boot_partnum
|
|
|
|
# Load environment from haos-config.txt
|
|
if test -e mmc ${devnum}:${boot_partnum} haos-config.txt; then
|
|
fatload mmc ${devnum}:${boot_partnum} ${ramdisk_addr_r} haos-config.txt
|
|
env import -t ${ramdisk_addr_r} ${filesize}
|
|
fi
|
|
|
|
# Load extraargs
|
|
fileenv mmc ${devnum}:${boot_partnum} ${ramdisk_addr_r} cmdline.txt cmdline
|
|
|
|
# Load device tree
|
|
setenv fdtfile rk3568-odroid-m1.dtb
|
|
echo "Loading standard device tree ${fdtfile}"
|
|
fatload mmc ${devnum}:${boot_partnum} ${fdt_addr_r} ${fdtfile}
|
|
fdt addr ${fdt_addr_r}
|
|
|
|
# load dt overlays
|
|
fdt resize 65536
|
|
for overlay_file in ${overlays}; do
|
|
if fatload mmc ${devnum}:${boot_partnum} ${ramdisk_addr_r} overlays/${overlay_file}.dtbo; then
|
|
echo "Applying kernel provided DT overlay ${overlay_file}.dtbo"
|
|
fdt apply ${ramdisk_addr_r} || setenv overlay_error "true"
|
|
fi
|
|
done
|
|
if test "${overlay_error}" = "true"; then
|
|
echo "Error applying DT overlays, restoring original DT"
|
|
fatload mmc ${devnum}:${boot_partnum} ${fdt_addr_r} ${fdtfile}
|
|
fi
|
|
|
|
setenv bootargs
|
|
for BOOT_SLOT in "${BOOT_ORDER}"; do
|
|
if test "x${bootargs}" != "x"; then
|
|
# skip remaining slots
|
|
elif test "x${BOOT_SLOT}" = "xA"; then
|
|
if test ${BOOT_A_LEFT} -gt 0; then
|
|
setexpr BOOT_A_LEFT ${BOOT_A_LEFT} - 1
|
|
echo "Trying to boot slot A, ${BOOT_A_LEFT} attempts remaining. Loading kernel ..."
|
|
part number mmc ${devnum} hassos-kernel0 kernel_partnum
|
|
if load mmc ${devnum}:${kernel_partnum} ${kernel_addr_r} Image; then
|
|
setenv bootargs "${bootargs_hassos} ${bootargs_a} rauc.slot=A ${cmdline}"
|
|
fi
|
|
fi
|
|
elif test "x${BOOT_SLOT}" = "xB"; then
|
|
if test ${BOOT_B_LEFT} -gt 0; then
|
|
setexpr BOOT_B_LEFT ${BOOT_B_LEFT} - 1
|
|
echo "Trying to boot slot B, ${BOOT_B_LEFT} attempts remaining. Loading kernel ..."
|
|
part number mmc ${devnum} hassos-kernel1 kernel_partnum
|
|
if load mmc ${devnum}:${kernel_partnum} ${kernel_addr_r} Image; then
|
|
setenv bootargs "${bootargs_hassos} ${bootargs_b} rauc.slot=B ${cmdline}"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if test -n "${bootargs}"; then
|
|
run storebootstate
|
|
else
|
|
echo "No valid slot found, resetting tries to 3"
|
|
setenv BOOT_A_LEFT 3
|
|
setenv BOOT_B_LEFT 3
|
|
run storebootstate
|
|
reset
|
|
fi
|
|
|
|
echo "Starting kernel"
|
|
booti ${kernel_addr_r} - ${fdt_addr_r}
|
|
|
|
echo "Boot failed, resetting..."
|
|
reset
|