美文网首页
试运行armbian(一)

试运行armbian(一)

作者: 叶迎宪 | 来源:发表于2023-03-27 20:33 被阅读0次

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

相关文章

网友评论

      本文标题:试运行armbian(一)

      本文链接:https://www.haomeiwen.com/subject/gmbmrdtx.html