armbian编译出来的img镜像,不能用Amlogic的USB burning tool直接烧录到板子。除了众所周知的balenaEtcher可以烧录到tf卡,Win32DiskImager也可以烧录到tf卡中。
目标板S905D3,已经烧录了基于buildroot的linux镜像。直接把tf卡插入目标板,并没有启动armbian,肯定是uboot中还没有从tf卡启动的相关配置。参考 https://www.shuzhiduo.com/A/8Bz8Q17yJx/ ,想起来之前注释掉了 "run upgrade_key;" 这一行,因此少执行了run usb_burning 、recovery_from_udisk几步。于是乎进入uboot,手动执行run upgrade_key。结果还是没进入armbian。可以看到uboot中有几个报错
Starting the controller
USB XHCI 1.10
scanning bus 0 for devices... 3 USB Device(s) found
scanning usb for storage devices... init_part() 282: PART_TYPE_DOS
1 Storage Device(s) found
** Unrecognized filesystem type **
** Unrecognized filesystem type **
认不出来文件系统。在PC下,可以确认armbian烧录出来的tf卡,只有一个ext4的分区。刚开始怀疑是uboot没有支持ext4,但是查了uboot的配置,已经打开了 CONFIG_FS_EXT4。google搜索到
"Unrecognized filesystem type" is not an error, it's result of trying "fatload" on ext4 filesystem
回到uboot中,看recovery_from_udisk
recovery_from_udisk=if fatload usb 0 ${loadaddr} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload usb 0
${loadaddr} recovery.img; then if fatload usb 0 ${dtb_mem_addr} dtb.img; then echo udisk dtb.img loaded;
fi;wipeisb; setenv bootargs ${bootargs} ${fs_type};bootm ${loadaddr};fi;
果然是使用fatload加载的。记得n1盒子,无论是emuelec,还是armbian的镜像,都会有两个分区。其中第一个分区是fat32的,在windows上可以直接修改dtb配置
继续搜索,找到了类似配置的vim3使用armbian的方法
https://www.armbian.com/khadas-vim3/
下载了 https://dl.khadas.com/Firmware/Krescue/dump/VIM3L.krescue.sd.img.gz,把它烧录到tf卡。可以看到,烧录完的tf卡,仅有一个fat16分区。根目录下有aml_autoscript、s905_autoscript,就是为了对于不同的uboot配置,这些脚本都能被加载到和被执行。很显然把这张卡插入我们的板子,在uboot中执行run update,可以加载这个krescue的内核的。只是由于dtb不对,内核一跑就挂了。或者可以试试换个dtb来跑跑?
回头看了armbian编译出来的镜像,里面sm1系列的,除了khadas-vim3l,还有bananapi-m5、x96-air、odroid-c4等型号。网上查了一下配置,其他盒子cpu都是s905x3的。s905x3和s905d3的区别就是少了npu,应该也能用吧。于是乎用armbian中的 meson-sm1-odroid-c4.dtb,替换了 krescue系统中的 /rescue/fdt.kresq/amlogic/meson-sm1-khadas-vim3l.dtb。再次回到uboot,执行 run update,居然可以成功进入 Krescue啦!按照armbian的指南,输入krescue进入图形界面,Advanced -> eMMC -> Fast erase清空eMMC,然后重启。结果悲剧了,无法从tf卡启动armbian
Cfg max: 12, cur: 5. Board id: 0. not match..skip..
Cfg max: 12, cur: 6. Board id: 0. not match..skip..
Cfg max: 12, cur: 7. Board id: 0. not match..skip..
Cfg max: 12, cur: 8. Board id: 0. not match..skip..
Cfg max: 12, cur: 9. Board id: 0. not match..skip..
Cfg max: 12, cur: 10. Board id: 0. not match..skip..
Cfg max: 12, cur: 11. Board id: 0. not match..skip..
Cfg max: 12, cur: 12. Board id: 0. not match..skip..
All ddr config failed...
Reset...
无奈,只能重新刷回buildroot的固件。那就尝试换种思路,直接看armbian中对应的uboot代码,看它是怎样启动linux内核的?但是mainline的uboot跟buildroot 2015年版本的uboot差异很大,一下子没找到环境变量是如何设置的。
然后又尝试,在可以运行的buildroot uboot中,通过usb_update bootloader u-boot.bin命令,烧入armbian编译的主线uboot。结果,系统仍然无法启动,启动报错跟从tf启动时是一样的!说明了:一、清空emmc后,确实会从tf卡尝试启动;二、uboot无法启动可能是内存配置错了
开始猜测是bl2错了
https://forum.khadas.com/t/vim3l-booloader-fail-ddr-training-error/6240
于是尝试换个bl2。在armbian的BOARD配置中,改成"odroidc4"。在armbian中单独编译uboot,并取出u-boot.bin,用usb_update bootloader u-boot.bin命令烧录到板子上。这次armbian的新uboot终于可以启动了,虽然网卡什么的还是有点问题。
可以导出这个新版uboot的启动脚本
bootcmd=run distro_bootcmd
boot_targets=romusb mmc0 mmc1 mmc2 usb0 pxe dhcp
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_usb0=devnum=0; run usb_boot
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
usb_boot=usb start; if usb dev ${devnum}; then devtype=usb; run scan_dev_for_boot_part; fi
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists
devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype
${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot;
fi; done; setenv devplist
boot_prefixes=/ /boot/
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for
prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts;
done;run scan_dev_for_efi;
boot_syslinux_conf=extlinux/extlinux.conf
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart}
${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf};
run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr}${prefix}${boot_syslinux_conf}
boot_scripts=boot.scr.uimg boot.scr
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype}
${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script
${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x08000000
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr}
${prefix}${script}; source ${scriptaddr}
在armbian u盘中,是存在/boot/boot.scr的。新版uboot是通过执行它启动armbian的
PS:armbian脚本是如何将amlogic预编译的bl2、bl30、bl31等打包到u-boot.bin中的
config/sources/families/meson-sm1.conf
uboot_custom_postprocess() {
# FIP trees for C4 and HC4 are identical as of 30/06/2021
if [[ $BOARD == odroidc4 ]]; then
uboot_g12_postprocess $SRC/cache/sources/amlogic-boot-fip/odroid-c4 g12a
elif [[ $BOARD == odroidhc4 ]]; then
uboot_g12_postprocess $SRC/cache/sources/amlogic-boot-fip/odroid-hc4 g12a
elif [[ $BOARD == khadas-vim3l ]]; then
uboot_g12_postprocess $SRC/cache/sources/amlogic-boot-fip/khadas-vim3l g12a
elif [[ $BOARD == bananapim5 ]]; then
uboot_g12_postprocess $SRC/cache/sources/amlogic-boot-fip/bananapi-m5 g12a
else
display_alert "uboot_custom_postprocess meson-sm1" "Unknown BOARD: $BOARD - not using FIP trees" "wrn"
fi
}
config/sources/families/include/meson64_common.inc
# this helper function includes postprocess for u200 and its variants.
# $1 PATH for uboot blob repo
# $2 family g12a or g12b
uboot_g12_postprocess() {
mv u-boot.bin bl33.bin
$1/blx_fix.sh $1/bl30.bin \
zero_tmp \
bl30_zero.bin \
$1/bl301.bin \
bl301_zero.bin \
bl30_new.bin bl30
$1/blx_fix.sh $1/bl2.bin \
zero_tmp \
bl2_zero.bin \
$1/acs.bin \
bl21_zero.bin \
bl2_new.bin bl2
$PKG_PREFIX$1/aml_encrypt_$2 --bl30sig \
--input bl30_new.bin \
--output bl30_new.bin.g12.enc \
--level v3
$PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \
--input bl30_new.bin.g12.enc \
--output bl30_new.bin.enc \
--level v3 --type bl30
$PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \
--input $1/bl31.img \
--output bl31.img.enc \
--level v3 --type bl31
$PKG_PREFIX$1/aml_encrypt_$2 --bl3sig \
--input bl33.bin \
--compress lz4 \
--output bl33.bin.enc \
--level v3 --type bl33
$PKG_PREFIX$1/aml_encrypt_$2 --bl2sig \
--input bl2_new.bin \
--output bl2.n.bin.sig
if [ -e $1/lpddr3_1d.fw ]; then
$PKG_PREFIX$1/aml_encrypt_$2 --bootmk --output u-boot.bin \
--bl2 bl2.n.bin.sig \
--bl30 bl30_new.bin.enc \
--bl31 bl31.img.enc \
--bl33 bl33.bin.enc \
--ddrfw1 $1/ddr4_1d.fw \
--ddrfw2 $1/ddr4_2d.fw \
--ddrfw3 $1/ddr3_1d.fw \
--ddrfw4 $1/piei.fw \
--ddrfw5 $1/lpddr4_1d.fw \
--ddrfw6 $1/lpddr4_2d.fw \
--ddrfw7 $1/diag_lpddr4.fw \
--ddrfw8 $1/aml_ddr.fw \
--ddrfw9 $1/lpddr3_1d.fw \
--level v3
else
$PKG_PREFIX$1/aml_encrypt_$2 --bootmk --output u-boot.bin \
--bl2 bl2.n.bin.sig \
--bl30 bl30_new.bin.enc \
--bl31 bl31.img.enc \
--bl33 bl33.bin.enc \
--ddrfw1 $1/ddr4_1d.fw \
--ddrfw2 $1/ddr4_2d.fw \
--ddrfw3 $1/ddr3_1d.fw \
--ddrfw4 $1/piei.fw \
--ddrfw5 $1/lpddr4_1d.fw \
--ddrfw6 $1/lpddr4_2d.fw \
--ddrfw7 $1/diag_lpddr4.fw \
--ddrfw8 $1/aml_ddr.fw \
--level v3
fi










网友评论