orangepi3_lts的u-boot编译与烧写
orangepi3_lts的u-boot编译有两种方法,一种方法是使用官方的SDK进行编译,运行build.sh脚本通过图形化的界面选择u-boot就可以完成u-boot编译,这具体步骤官方手册都有,这里就不再赘述。下面介绍另外一种方法:
为了方便移植u-boot,我们可以把u-boot和交叉编译工具链单独拿出来编译,也可以去github下载u-boot使用,网址为:GitHub - orangepi-xunlong/u-boot-orangepi,交叉编译工具链也可以单独去下载,网址为:Index of /armbian-releases/_toolchain/
这里我是用的u-boot版本为2020.04,交叉编译工具链为gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu
之后我们把u-boot和交叉编译工具链存到一个新的文件夹里(toolchain里面存放的是交叉编译工具链,另外三个压缩包可以忽略):
进入toolchain文件内对交叉编译工具链进行解压:
sudo tar -vxf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
解压完成之后进入u-boot对应的文件夹内,执行以下命令清理工程,注意交叉编译工具链的路径要和自己的对应。
make -j4 ARCH=arm CROSS_COMPILE=/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- distclean
执行以下命令编译生成.config文件。
make -j4 ARCH=arm CROSS_COMPILE=/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- orangepi_3_lts_defconfig
注意这里交叉编译工具链的路径要和自己的对应,同时如果时orangepi的其他板子,对应的defconfig文件是不同的,贴一张图,不同板子对应的defconfig文件。
最后通过命令编译u-boot(V=1表示显示编译的详细信息):
make -j4 ARCH=arm CROSS_COMPILE=/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- V=1
至此,u-boot编译完成,最后输出信息如下:
可以烧写到SD卡的文件,spl/sunxi-spl.bin,u-boot.itb或者u-boot-sunxi-with-spl.bin,首先检查自己的ubuntu是否识别到了SD卡设备,输入ls /dev/sd* -l查看是否识别到了SD卡。
图中的sdb和sdb1表示识别到的SD卡设备,若插入之后识别不到,可能是虚拟机的问题,解决方法是打开虚拟机源文件夹下的.vmx文件,用记事本打开,把里面的usb.restrictions.defaultAllow = "TRUE"改为TRUE就可以了。
识别到之后用以下命令烧写到SD卡
sudo dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8
sudo dd if=u-boot.itb of=/dev/sdb bs=1024 seek=40
或者使用如下命令也可
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
这里直接烧录会发现系统启动卡在trying to boot from MMC1,这里是因为基于64位的SOC的主板需要bl31阶段的Arm Trusted Firmware-A固件,这为Armv8-A提供了安全软件环境,并提供PSCL和SMCCC服务。
输入以下命令下载bl31.bin
git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
之后进入目录编译
make CROSS_COMPILE=/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- PLAT=sun50i_h6 DEBUG=1 bl31
之后再对应文件夹下就可以看到bl31.bin文件了
由于scp.bin文件是可选的,我们这里没用,所以需要指定其SCP=/dev/null,之后输入以下命令编译。
make -j4 ARCH=arm CROSS_COMPILE=/home/chuan-plus/my_orangepi3_lts/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- BL31=/home/chuan-plus/my_orangepi3_lts/trusted-firmware-a/build/sun50i_h6/debug/bl31.bin SCP=/dev/null
得到u-boot-sunxi-with-spl.bin文件按照上述步骤烧录到SD卡里就可以正常启动了