从零开始为香橙派orangepi zero 3移植主线linux——1.uboot

本文详细描述了如何为香橙派zero3移植主线Linux,包括环境搭建(NFS和TFTP服务)、软硬件准备(工具链、源码下载)、制作引导文件(BL31、SCPfirmware和uboot)、烧录过程以及初步运行时遇到的问题。
摘要由CSDN通过智能技术生成


0.前言

  之前买了块香橙派zero3,CPU是全志H618,四核cortex-A53,烧录了官方的ubuntu系统后就一直没有再玩过。最近一些其他的学习告一段落,就把这块板子拿出来倒腾倒腾,尝试移植主线linux,最好是能够在linux中把GPU也驱动起来。

一、环境搭建

  在此仅记录一些复杂或较常用的环境,其他的系统库依赖或交叉编译链等在此不再赘述。

NFS服务

ubuntu下安装:

sudo apt-get install nfs-kernel-server rpcbind

打开配置文件,并添加自己的NFS路径:

sudo vim /etc/exports

追加内容:

<path_to _directory> *(rw,sync,no_root_squash)

重启NFS服务:

sudo /etc/init.d/nfs-kernel-server restart

TFTP服务

ubuntu下使用以下命令安装相关工具:

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

创建tftpboot所使用的目录,并赋予权限:

mkdir <path_to _directory>
chmod 777 <directory>

ubuntu下新建文件/etc/xinetd.d/tftp,并写入如下内容:

server tftp
{
	socket_type = dgram
	protocol = udp
	wait = yes
	user = root
	server = /usr/sbin/in.tftpd
	server_args = -s <path_to _directory>
	disable = no
	per_source = 11
	cps = 100 2
	flags = IPv4
}

打开/etc/default/tftpd-hpa文件,将其修改为如下所示内容:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="<path_to _directory>"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"

最后重启tftp服务:

sudo service tftpd-hpa restart

二、软硬件准备

需要准备的设备如下:

  • PC:windows + ubuntu22.04(可用虚拟机)
  • 香橙派zero3 + TF卡、读卡器

需要准备的软件环境:

  • ubuntu中,编译uboot、kernel等需要的系统依赖库这里就不多赘述,编译过程如有报错可根据提示自行查找安装。
  • 交叉编译链:
    1.gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu,用于编译tf-a、uboot、kernel等
    下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads/11-2-2022-02
    2.or1k-linux-musl-cross,用于编译crust
    下载地址:https://github.com/stffrdhrn/gcc/releases

软件源码:

  • TF-A,arm可信固件
    下载地址:https://github.com/ARM-software/arm-trusted-firmware
  • crust,全志电源管理固件
    下载地址:https://github.com/crust-firmware/crust
  • uboot
    下载地址:https://github.com/u-boot/u-boot
  • linux kernel
    下载地址:https://github.com/torvalds/linux
  • buildroot
    下载地址:https://github.com/buildroot/buildroot

在ubuntu中创建两个目录,一个用于存放编译工具链,另一个用于存放相关源码。nfs目录为虚拟网络文件系统,后续可以使用tftp更加方便的验证一些系统功能。
在这里插入图片描述

在这里插入图片描述

三、制作引导文件

参考文章:uboot源码中的 README.sunxi64

1.BL31

  BL31为Arm可信固件的编译产物,用于对uboot、 kernel进行校验和鉴权,相关原理部分可以参考一些开源教程中的描述。
  在arm-trusted-firmware源码的plat\allwinner目录中,存放了全志相关soc的可信固件校验源码,有兴趣的可以深入研究。
在这里插入图片描述

在源码目录下,使用以下命令:

export PATH=$PATH:<path_to_toolchain>/aarch64-none-linux-gnu/bin
export CROSS_COMPILE=aarch64-none-linux-gnu-
make PLAT=sun50i_h616 DEBUG=1 bl31

这里的PLAT即为plat目录下所声明的那些类型,选择与自己的板型相近的配置即可,如果没有就使用common类型。全志H618可以理解为H616的超频版,或者使用H6也没有问题。
编译完成后,生成的BL31.bin存放在源码目录的build\<plat>\debug\目录下。

2.SCP firmware (Crust)

  crust固件为全志系列SoC的电源管理,如果没有板载PMIC电源管理芯片,则用来控制系统的poweroff和reboot命令。此固件通常运行在AR100微控制器上,所以需要的交叉编译链与其他不同。
在configs目录下存放了相关板卡所需的配置文件:
在这里插入图片描述
在crust源码下,使用以下命令进行编译:

export PATH=$PATH:<path_to_toolchain>/or1k-linux-musl/bin
export CROSS_COMPILE=or1k-linux-musl-
make orangepi_3_defconfig && make -j5 scp

如果没有自己的板卡所对应的配置文件,就选择与相近的即可。例如orangepi 3和orangepi zero 3都是H6系列的芯片。编译结果存放在build\scp\scp.bin

3.uboot

由于暂时不对uboot下的相关配置文件进行修改,所以这里直接尝试编译。
使用的配置文件为configs\orangepi_zero3_defconfig,对应的设备树文件为arch\arm\dts\sun50i-h618-orangepi-zero3.dts。使用一下命令进行编译:

# 声明BL31文件路径
export BL31=<path_to_tfa>/arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin
# 声明SCP文件路径
export SCP=<path_to_crust>/crust/build/scp/scp.bin
export PATH=$PATH:<path_to_toolchain>/aarch64-none-linux-gnu/bin

make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- orangepi_zero3_defconfig
make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- menuconfig
make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- -j20

注:官方文档中有说明,如果不想使用crust的电源管理功能,可以使用export SCP=/dev/null命令进行代替。
编译结果为存放在uboot源码根目录下的u-boot-sunxi-with-spl.bin文件。

四、烧录

首先使用读卡器将TF卡接到PC设备上,并进行格式化。然后接入ubuntu设备,进行分区。
刚介入ubuntu中,应该是下面这种情况:
在这里插入图片描述
会默认存在一个分区,这应该是windows格式化出来的。使用fdisk工具进行分区:

sudo fdisk /dev/sdb 

欢迎使用 fdisk (util-linux 2.31.1)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

命令(输入 m 获取帮助): d			//删除windows中创建的一个分区
已选择分区 1
分区 1 已删除。

命令(输入 m 获取帮助): n			//创建新分区
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p): 

将使用默认回应 p。
分区号 (1-4, 默认  1):  						//使用默认
第一个扇区 (2048-7761886, 默认 2048): 		//使用默认
上个扇区,+sectors 或 +size{K,M,G,T,P} (2048-7761886, 默认 7761886): +200M  //第一个分区为200M大小

创建了一个新分区 1,类型为“Linux”,大小为 200 MiB。

命令(输入 m 获取帮助): n
分区类型
   p   主分区 (1个主分区,0个扩展分区,3空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p): 

将使用默认回应 p。
分区号 (2-4, 默认  2): 						//使用默认
第一个扇区 (411648-7761886, 默认 411648): 	//使用默认
Last sector, +/-sectors or +/-size{K,M,G,T,P} (411648-7761886, 默认 7761886):   //直接回车

创建了一个新分区 2,类型为“Linux”,大小为 3.5 GiB。

命令(输入 m 获取帮助): w			//保存
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。

然后对创建的分区进行格式化:

sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2

格式化完成后应该是以下结果:
在这里插入图片描述
之后就可以按照uboot源码中的README文档所述指令进行烧录:

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

五、运行

将TF卡插入开发板,并连接串口和电源,串口提示如下:
在这里插入图片描述
从uboot和BL31的编译时间来看,应该是成功加载了,不过比较奇怪的是为什么uboot会加载两遍,而且从打印信息来看,貌似有一些功能没有正常启动,CPU的识别也有点问题,还有待继续研究。

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值