本文将从零开始通过一步一步操作来实现将主线U-Boot最新代码移植到orange Pi 3(全志H6)开发板上并正常运行起来。本文从通用移植思路的角度,展现是思考的过程,通过这种方式希望能让读者一通百通,授之以渔,一定要读完!后续持续更新系统移植系列文章,欢迎关注、点赞、收藏。
这里从零开始移植的意思主要是指从Das uboot官方网站或者代码库下载写这篇文章时的最新版本(2023.10-rc4-00031-gc0c08be546-dirty)代码,开始构建编译环境,配置,编译,TF安装,到最后在Orange Pi 3硬件板子上run起来。
移植前思考主控芯片的启动流程我们知道uboot属于系统启动过程中加载操作系统内核,运行内核代码的作用,所以我们知道CPU肯定会在系统启动的某一个阶段会执行uboot固件代码,uboot再引导linux内核,但是因为不同的主控芯片不同的CPU核启动也会流程也会不一样。
所以在移植之前,我们一定要弄清楚CPU的启动流程以及分多少个阶段,需要多少个bin文件,uboot属于哪个启动阶段,必须要从启动流程宏观上了解清楚。
全志H6属于ArmV8 64位体系结构,armv8 体系结构相较于之前的armv7都有很大不同,下图是ARMV8的一个总的启动流程:
启动流程1
Arm启动流程
- armv8-a 一般最先运行bl1阶段固件,也即是boot rom,这个一般固化在cpu的 rom里面,这是上电之后执行的第一段代码,主要是加载bl2阶段代码到iram执行
- bl2阶段代码放在存储媒介,比如emmc中,由bl1负责 运行起来,因为bl1代码并未初始化DDR,所以加载到片内SRAM中执行,在这个阶段完成外部DDR的初始化,并加载bl31到DDR运行
- bl31一般称为EL3 Service,属于runtime,负责切换non secure和secure两个世界环境,运行一些服务,比如PSCI,SCMI等,同时负责把bl32和bl33代码加载运行起来
- bl32属于trusted OS,如果不需要这个或者硬件不支持,可以去掉bl32,这个是可选的
- bl33一般是bootlaoder,负责引导后面的操作系统内核
在这里我们h6芯片的启动流程我们选择的就是下面这种比较流行的方式:
启动流程2