一、编译烧写u-boot

1.1 源码和工具下载:

香橙派提供了u-boot源码和交叉编译链工具:
(1)u-boot(2020.04)下载地址:https://github.com/orangepi-xunlong/u-boot-orangepi
(2)交叉编译工具链(arm-linux-gnueabihf-)下载地址:https://github.com/orangepi-xunlong/toolchain

1.2 编译烧写u-boot

(1)进入到u-boot源码目录下,先清理一下工程:

make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean

交叉编译工具的路径根据自己实际情况修改

(2)编译生成.config配置文件

make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- orangepi_one_defconfig

注意:需要的defconfig配置信息在u-boot源码的configs文件夹下,我用的是香橙派One开发板,所以make的是orangepi_one_defconfig

编译完成后如下图:
在这里插入图片描述

(3)编译u-boot

make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

编译成功后会在u-boot目录下面生成一个.bin文件,这个文件就是我们要烧写到SD卡的u-boot二进制文件
在这里插入图片描述

(4)烧写u-boot

将SD卡插入读卡器,将读卡器连接电脑,在u-boot目录下,将.bin文件烧写到SD卡中

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

1.3 u-boot启动

将SD卡插入到香橙派开发板,连接开发板串口,启动测试,若输出如下则启动正常
在这里插入图片描述
可以看出u-boot会把版本号、板载硬件信息等都打印出来

二、烧录Linux内核zImage、dtb

2.1 Linux内核源码下载

这里使用香橙派官方提供的linux内核源码,版本为Linux5.4.65:https://github.com/orangepi-xunlong/linux-orangepi

2.2 Linux内核编译

进入linux内核目录,依次输入以下命令,指定交叉编译器和处理器架构:

make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean // 清理工程
make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- sunxi_defconfig // 生成.config配置文件
make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- // 开始编译

编译完成后,我们需要的镜像zImage,设备树文件sun8i-h3-orangepi-pc.dtb都出现了:

  • zImage在/arch/arm/boot目录下
  • sun8i-h3-orangepi-pc.dtb在/arch/arm/boot/dts目录下

2.3 zImage和dtb加载

zImage和dtb烧录有两种办法,一种是通过tftp远程加载,另一种是直接从SD卡加载,在加载之前,需要知道全志H3芯片从内存启动内核和设备树的地址,在u-boot输入命令printenv,查看环境变量,会看到如下两个信息:

fdt_addr_r=0x43000000
kernel_addr_r=0x42000000

可知设备树文件是从内存的0x43000000地址启动,内核是从内存的0x42000000地址启动。

(1)tftp远程加载zImage和dtb

本文所有的开发都是基于Ubuntu18.04虚拟机,所以为了方便传输,直接将zImage和dtb文件拷贝到windows下,建立开发板与windows之间的tftp传输,这里借助Mobaxterm软件直接设置tftp服务,在图中红框部分填写好tftp连接到的本地目录。
在这里插入图片描述

需要先对开发板环境变量进行以下设置:

setenv ipaddr=192.168.1.101 // 设置开发板ip地址
setenv gatewayip=192.168.1.1 // 设置网关
setenv netmask=255.255.255.0 // 设置子网掩码
setenv serverip=192.168.1.104 // 设置tftp主机的ip地址
saveenv // 保存环境变量

注意:开发板的ip地址和主机的ip地址要保存在一个网关下(连接到同一个路由器),开发板的网关和子网掩码与主机设置一致,设置完后重启一下开发板

ping一下主机ip,试一下能不能连接到主机,出现alive就代表可以连接
在这里插入图片描述

接着在开发板u-boot敲入以下命令行,将两个文件加载到内存:

tftp 42000000 zImage // 将zImage加载到内存的0x42000000位置处
tftp 43000000 sun8i-h3-orangepi-pc.dtb // 将设备树加载到内存0x43000000位置处

加载成功的话,会有一个Loading的进度条和done表示完成。

接着启动内核和设备树:

bootz 42000000 - 43000000 // 启动内核和设备树

启动成功的话,会有以下界面,另外开发板上的led灯也会从红色变为绿色:
在这里插入图片描述
由于没有加载根文件系统,所以启动过程会卡在VFS:Unable to mount root f…

(2)从SD卡加载zImage和dtb

有的文章会对SD卡进行分区,然后将两个文件放在不同的分区中,参考文献[2]。本文这里为了方便操作,不对SD卡分区,直接将两个文件拷贝到SD卡中,然后将SD卡插到开发板上。启动u-boot,输入以下命令:

load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc.dtb
load mmc 0:1 0x42000000 zImage
  • 第一个命令解释:从mmc(SD卡)的第0个和第1个分区寻找名字叫做sun8i-h3-orangepi-pc.dtb的文件,然后加载到内存的0x43000000位置上
  • 第二个命令解释:从mmc(SD卡)的第0个和第1个分区寻找名字叫做zImage的文件,然后加载到内存的0x42000000位置上

接着加载内核和设备树:

bootz 42000000 - 43000000

启动成功的话,会有以下界面:另外开发板上的led灯也会从红色变为绿色
在这里插入图片描述
由于没有加载根文件系统,所以启动过程会卡在VFS:Unable to mount root f…

如果不想每次都load加载,可以设置开机环境变量,每次开机都可以自动加载:

setenv bootcmd 'load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc.dtb; load mmc 0:1 0x42000000 zImage; bootz 0x42000000 - 0x43000000'
saveenv

要想真正启动Linux系统,下一步还需要建立根文件系统,敬请期待!

参考文献:

[1] 香橙派全志H3烧录Uboot,远程加载zImage,dtb,rootfs
[2] 香橙派全志H3烧入U-boot和Linux内核以及配置
[3] Orangepi 3 全志H6 uboot的编译与烧写

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐