一、编译烧写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的编译与烧写