当前位置: 首页 > article >正文

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

目录

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

前言

本笔记以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.kler.cn/news/327948.html

相关文章:

  • Lagent 自定义你的 Agent 智能体
  • k8s 部署 prometheus
  • Android中级控件
  • Fivetran+Milvus:AI搜索新时代的数据迁移利器
  • 学习记录:js算法(五十):二叉树的右视图
  • 【Preference Learning】Reasoning with Language Model is Planning with World Model
  • mysql学习教程,从入门到精通,SQL 表、列别名(Aliases)(30)
  • Spring Boot框架在甘肃非遗文化网站设计中的运用
  • ubuntu配置python环境
  • 深度学习基础及技巧
  • Linux性能调优技巧
  • 汽车零部件开发流程关键阶段
  • PowerShell无法执行yarn命令
  • Qt_线程介绍与使用
  • Wpf Image 展示方式 图片处理 显示
  • 828华为云征文|华为云 Flexus X 实例初体验
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • MATLAB在无线通信标准与协议支持中的作用
  • 打造未来社交:区块链社交DAO的颠覆性开发之路
  • 2.1 HuggingFists系统架构(一)
  • Go 项目开发常用设计模式
  • OpenCV图像文件读写(1)检查 OpenCV 是否支持某种图像格式的读取功能函数haveImageReader()的使用
  • Python FFmpeg 安装使用教程
  • SQL第10课挑战题
  • C# 泛型使用案例_C# 泛型使用整理
  • vue 项目打包更新后,界面未刷新时js与css资源加载404,监听资源文件404后自动重新加载页面。
  • 解决 Macos下 Orbstack docker网络问题
  • 【工具-VMware Workstation-ubuntu】
  • UDP通信
  • Linux 如何检测一个程序的最大内存使用值?