目录
- 前言
- 一、下载地址
- 二、目录介绍
- 三、编译
- 四、移植/适配
- 五、启动流程
前言
本笔记以u-boot-2024.10-rc4代码、在arm64平台运行为例对uboot的介绍、编译、适配移植、运行过程的关键流程等;
一、下载地址
https://ftp.denx.de/pub/u-boot/
下载自己想要使用的版本即可
二、目录介绍
目录或文件 | 说明 | 备 注 |
---|---|---|
api | api接口函数的封装,可以不用 | |
arch | 架构相关的目录,移植时在相应架构下添加架构下的具体芯片驱动目录mach-xxx,设备树文件也在此目录,芯片寄存器头文件也在此目录 | |
board | 板级驱动移植,对具体芯片的不同配置的板卡板载硬件的驱动 | |
boot | 相对旧版本如2018版本将common中的部分文件移到此目录,是关于uboot启动内核相关的处理 | |
cmd | 对uboot命令的支持实现 | |
common | 公共接口函数,main.c 位于此目录 | |
configs | 包含板级config文件 | |
disk | 对存储设备分区的管理 | |
doc | 说明文档 | |
drivers | 驱动的主要目录 | |
dts | 对dts编译的管理,实际编译arch下的dts文件 | |
env | 对环境变量读写、存储的管理 | |
examples | 一些demo | |
fs | 文件系统的接口 | |
include | 公共头文件目录 | |
Kbuild | 顶层Kbuild | |
Kconfig | 顶层Kconfig | |
lib | 工具函数的目录如crc、md5计算等 | |
Makefile | 顶层Makefile,内部包含uboot版本信息 | |
net | 包括网络协议处理相关实现文件,如ping ,icmp,tcp,udp等 | |
post | 大概是powerpc架构相关的处理,可以不用 | |
scripts | pc端对于编译过程的一些处理 | |
test | 测试程序 | |
tools | x86下的一些工具函数实现文件 |
三、编译
1、以rk3308为例,配置文件configs/evb-rk3308_defconfig, 生成配置文件.config
解压 tar xvf u-boot-2024.10-rc4.tar.bz2
cd u-boot-2024.10-rc4
make CROSS_COMPILE=aarch64-linux-gnu- arch=arm64 evb-rk3308_defconfig
2、编译
make CROSS_COMPILE=aarch64-linux-gnu- arch=arm64;
编译过程中会出现一些缺失工具等的报错,可以根据具体情况安装后编译;
四、移植/适配
移植、适配需要处理以下几方面内容,假设我们的芯片厂商为ideachip
1、arch目录处理
添加设备树文件:
arch/arm/dts/目录增加设备树文件ideachip-chipname-boardname.dts,从大到小范围命名,厂商到具体芯片到以此芯片设计的板卡;
对于可以抽象出的公共部分可以创建一个芯片名称.dtsi 文件;
uboot下的设备树命名字符串中间普遍使用中间划线-,可能是为了和内核设备树区分;
对于设备树文件的编译指定在configs/xxxx配置文件中会通过CONFIG_DEFAULT_DEVICE_TREE=ideachip-chipname-boardname 指定;
添加寄存器头文件
arch/arm/include/asm/目录下增加arch-ideachip目录,并添加需要的外设寄存器头文件;
arch//arm/include/asm/mach-types.h,增加一个匹配id的宏,作为bdinfo成员的bi_arch_number的值;
修改支持厂商目录
修改arch/arm/Kconfig文件,添加配置项,config ARCH_厂商,及其它配置;
修改arch/arm/Makefile文件, 根据厂商配置增加厂商文件夹,文件中会自动加上前缀mach-去找mach-厂商目录;
添加驱动文件和目录
arch/arm/下增加mach-ideachip目录;
在mach-ideachip目录中增加Kconfig文件,根据配置source子目录的Kconfig;
在mach-ideachip目录中增加Makefile文件,根据配置控制子目录编译;
在mach-ideachip目录中增加芯片型号名目录,如chipname;
arch/arm/mach-ideachip/chipname/目录中增加Kconfig文件,根据配置source板级目录中的具体芯片下的Kconfig;
arch/arm/mach-ideachip/chipname/目录中增加Makefile文件,管理目录下的文件编译;
arch/arm/mach-ideachip/chipname/目录中增加具体的源文件、头文件,此部分文件可以选择性的初始化芯片的时钟实现board_postclk_init函数(由board_f.c 中调用)等;
Kconfig和Makefile的内核可以参考同级目录的写法,遵循架构到厂商到具体芯片型号的思路;
2、board目录处理
增加板级目录board/厂商/具体芯片/
board/厂商/具体芯片/,目录中增加Makefile文件;
board/厂商/具体芯片/,目录中增加Kconfig文件;
board/厂商/具体芯片/,目录中增加驱动文件,这里主要是实现ddr初始化的驱动,实现dram_init函数(由board_f.c中调用);
3、configs目录处理
增加配置文件, 厂商芯片型号_板卡_defconfig,用于对各级Kconfig中的配置项进行赋值或者屏蔽;
4、include/configs目录处理
增加配置文件xxx.h,主要定义环境变量等;
5、drivers目录处理
对于设备树中添加的设备节点,此部分驱动要进行对应开发和适配;
五、启动流程
1、启动分为带spl和不带spl启动两种情况
uboot源码编译时,可以增加配置去编译spl或者不编译spl;
不带spl时由bootrom直接将uboot加载到sram中,uboot在sram中运行做ddr、其它硬件初始化等操作,代码重定向到ddr中,加载内核,启动内核等操作;
适用于芯片内部sram容量较大能放下uboot运行的情况;
带spl时由bootrom直接将spl加载到sram中运行,spl主要对ddr做初始化,随后加载uboot到ddr中,uboot在ddr中运行做除ddr初始化外的其它硬件初始化等操作,代码重定向,加载内核,启动内核等操作;
适用于芯片内部sram容量较小不能直接放下uboot运行的情况;
2、不带spl时启动流程示意图
略
3、带spl时启动流程示意图
略
4、启动流程差异
不同厂家的芯片在uboot启动细节上会有不同,比如有的为安全boot、对内存初始化的方式或者时机有所不同,具体情况具体分析;
整体必要的启动流程主要就是bootroom->uboot->内核->文件系统;