# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # static config # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # setenv boot_partition_a 0x02 setenv boot_partition_b 0x03 setenv boot_limit 0x02 setenv boot_partition_base "/dev/mmcblk0p" setenv addr_version 0x10000 setenv addr_boot_counter 0x10001 setenv addr_boot_partition 0x10002 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # load persistence values # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # clear memory mw.b 0x10000 0 0x404 # load uboot file fatload mmc 0:1 0x10000 uboot.dat 0x400 # check CRC crc32 0x10000 0x3FC 0x10400 if itest *0x103FC -ne *0x10400; then echo "invalid CRC -> fallback to default values" # default values mw.b ${addr_version} 0x01 mw.b ${addr_boot_counter} 0x00 mw.b ${addr_boot_partition} ${boot_partition_a} fi # ensure boot partition is valid if itest.b *${addr_boot_partition} -ne ${boot_partition_a} && test.b *${addr_boot_partition} -ne ${boot_partition_b}; then mw.b ${addr_boot_partition} ${boot_partition_a} fi # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # fallback boot # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # echo "Check fallback boot" # switch boot partition if boot count exceed limit if itest.b *${addr_boot_counter} -ge ${boot_limit}; then echo "!!! Boot limit exceed !!!" if itest *${addr_boot_partition} -eq ${boot_partition_a}; then mv.b ${addr_boot_partition} ${boot_partition_b} else mv.b ${addr_boot_partition} ${boot_partition_a} fi mw.b ${addr_boot_counter} 0 setexpr.b boot_partition *${addr_boot_partition} echo "Switch active partition to ${boot_partition_base}${boot_partition}" else # increase boot_count setexpr.b tmp *${addr_boot_counter} + 1 mw.b ${addr_boot_counter} ${tmp} setexpr.b boot_partition *${addr_boot_partition} fi # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # store persistence values # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # overwrite version mw.b 0x10000 0x01 # calculate crc crc32 0x10000 0x3FC 0x103FC # save to uboot file fatwrite mmc 0:1 0x10000 uboot.dat 0x400 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # select kernel # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # echo "select kernel" setenv boot_kernel "/boot/uImage" # only if new pi a new kernel is required setexpr board_new_pi ${board_revision} \& 0x800000 if test ${board_new_pi} > 0; then echo "new board" # get cpu id from revision setexpr board_cpu ${board_revision} \& 0xF000 # at the moment CPU except the oldest need the new kernel if test ${board_cpu} > 0x0000; then setenv boot_kernel "/boot/uImage2" fi else echo "old board" fi echo "Load kernel ${boot_kernel}" # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # boot # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # load bootargs from pi boot loader fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs # overwrite boot partition setexpr bootargs sub " root=[^ ]+" " root=${boot_partition_base}${boot_partition}" "${bootargs}" # load kernel and boot ext4load mmc 0:${boot_partition} ${kernel_addr_r} ${boot_kernel} bootm ${kernel_addr_r} - ${fdt_addr} reset