uboot笔记(一):概括/移植等

embedded/2024/12/23 4:33:21/

目录

    • 前言
    • 一、下载地址
    • 二、目录介绍
    • 三、编译
    • 四、移植/适配
    • 五、启动流程

前言

本笔记以u-boot-2024.10-rc4代码、在arm64平台运行为例对uboot的介绍、编译、适配移植、运行过程的关键流程等;

一、下载地址

https://ftp.denx.de/pub/u-boot/
下载自己想要使用的版本即可

二、目录介绍

目录或文件说明备 注
apiapi接口函数的封装,可以不用
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架构相关的处理,可以不用
scriptspc端对于编译过程的一些处理
test测试程序
toolsx86下的一些工具函数实现文件

三、编译

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->内核->文件系统;


http://www.ppmy.cn/embedded/120173.html

相关文章

C++STL--------string

文章目录 一、STL介绍二、string1、constructor构造函数2、operator[]方括号运算符重载3、iterator迭代器4、reverse_iterator反向迭代器5、size和length6、capacity7、clear8、shrink_to_fit9、at10、push_back11、append 二、auto类型(C11)1、使用2、真正的价值 三、范围for(…

Go语言匿名字段使用与注意事项

1. 定义 Go语言支持一种特殊的字段只需要提供类型而不需要写字段名的字段,称之为匿名字段或者嵌套字段。 所谓匿名字段实际上是一种结构体嵌套的方式,所以也可以称作嵌套字段。 这种方式可以实现组合复用,即通过匿名字段,结构体…

JUC高并发编程5:多线程锁

1 锁的八个问题演示 标准访问,先打印短信还是邮件 class Phone{public synchronized void sendSMS() throws InterruptedException {System.out.println("----------sendSMS");}public synchronized void sendEmail(){System.out.println("-------…

Java入门3——操作符+String

在入门2中忘了提 String 的事情了,所以这篇就放在开头啦,很有用 话不多说,开始正题~ 一、String 引用数据类型之——String 1.字符串的拼接 在Java中,如果要把两句话合并到一句话的时候,其实是很简单的,…

【以图搜图代码实现2】--faiss工具实现犬类以图搜图

第一篇:【以图搜图代码实现】–犬类以图搜图示例 使用保存成h5文件,使用向量积来度量相似性,实现了以图搜图,说明了可以优化的点。 第二篇:【使用resnet18训练自己的数据集】 准对模型问题进行了优化,取得了…

LSTM模型改进实现多步预测未来30天销售额

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

ant design vue做表单验证及form表单外验证、父子嵌套多个表单校验

1、form表单验证(若有时遇到输入框有值但是还是触发验证规则了&#xff0c;请检查form表单绑定正确吗、校验规则正确吗、表格数据字段名正确吗) <a-form:model"formState":label-col"{ span: 8 }":wrapper-col"{ span: 16 }":rules"rul…

spring模块都有哪些

Spring 框架是一个庞大而灵活的生态系统&#xff0c;它包含了多个模块&#xff0c;每个模块都提供了特定的功能和服务。以下是一些主要的 Spring 模块&#xff1a; Spring Core&#xff1a; 核心容器&#xff0c;提供了 IoC&#xff08;控制反转&#xff09;和 DI&#xff08;…