树莓派uboot配置编译
目录
一、什么是uboot
- OS跑起来前,需要的一段引导程序
- 负责部署整个计算机系统,引导操作系统内核启动并给内核传参
- 提供一个命令行界面供人操作
- 是一个开源项目,uboot就是universal bootloader(通用的启动代码)
- 命令行用的行缓存,linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲
二、uboot命令
- printenv/print 打印出系统中所有的环境变量
- setenv/set 设置环境变量
set 环境变量 值 - saveenv/save 保存环境变量到flash
- ping 网络测试指令
ping ip地址
网段的概念:一个IP地址分为2部分,一部分是网段地址,另一部分是网段内的主机地址(由子网掩码来区分哪一部分是网段地址,哪一部分是IP地址)。在子网掩码是255.255.255.0的情况下,192.168.1.10这个IP地址的前三部分(192.168.1.)属于网段地址,第4部分(10)属于主机地址。
- tftp下载指令:tftp
- SD卡/iNand操作指令movi(movi是命令集,有很多子命令,具体用法可以help movi查看)
movi read u-boot 0x30000000,意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。
- NandFlash操作指令nand
- 内存操作指令:mm(批量的逐个单元的修改内存,用mm最合适)、mw(将内容写到内存中)、md(显示内存中的内容)
- 启动内核指令:bootm、go
- 环境变量
1.ipaddr是开发板的本地IP地址
2.serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
3.gatewayip是开发板的本地网关地址
4.netmask是子网掩码
5.ethaddr是开发板的本地网卡的MAC地址。
6.bootcmd自动运行命令(set bootcmd 'movi read kernel 30008000; bootm 30008000')
7.bootargs启动参数
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
console=ttySAC2,115200 控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可 读可写的
init=/linuxrc linux的进程1(init进程)的路径
rootfstype=ext3 根文件系统的类型是ext3
三、uboot的源码目录
使用的是2022.01版
3.1、文件
- .gitignore:git工具的文件
- config.mk:是一个Makefile文件
- MAINTAINERS:维护者
- Makefile:uboot源代码的主Makefile
- README:所有的软件都有README,简单的使用说明书。
3.2、文件夹
- api: 硬件无关的功能函数的API
- board:文件夹下每一个文件都代表一个开发板
- common:放的是一些与具体硬件无关的普遍适用的一些代码
- disk:磁盘有关的
- doc:文档目录,里面存放了很多uboot相关文档
- drivers:驱动,这里面放的就是从linux源代码中的linux设备驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动
- examples:示例代码
- fs:filesystem,文件系统
- include:头文件目录
- lib:(典型的lib_arm和lib_generic)架构相关的库文件
- net:网络相关的代码
- tools:里面是一些工具类的代码
- arch:这个目录是SoC相关的,里面存放的代码都是SoC相关初始化和控制代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S也在这里)
四、主Makefile
4.1、Makefile配置编译
u-boot.lds,就是uboot的链接脚本
configs文件夹,uboot 配置文件,xxx_defconfig
安装依赖项
sudo apt-get install libssl-dev
sudo apt-get install bison
sudo apt-get install flex
make distclean # 清除上次的make命令所产生文件以及配置文件
make rpi_3_defconfig# 使用树莓派3的配置文件,执行完这步会生成.config文件
生成.config文件
make CROSS_COMPILE=aarch64-linux-gnu- # 编译uboot
:
4.2、uboot version版本号确定
1.这4个共同构成了最终的版本号
VERSION:主板本号
PATCHLEVEL:次版本号
SUBLEVEL:再次版本号
EXTRAVERSION:另外附加的版本信息
2.Makefile中版本号最终生成了一个变量UBOOTVERSION,这个变量记录了Makefile中配置的版本号
3.include/config/uboot.release文件是编译过程中自动生成的一个文件,内容是一个宏定义,宏定义的值内容就是我们在Makefile中配置的uboot的版本号。
4.3、HOSTARCH和HOSTOS
这两个环境变量是主机的操作系统和主机的CPU架构
- HOSTARCH:x86_64
- HOSTOS:Linux
4.4、静默编译&原地编译和单独输出文件夹编译
- 静默编译:后台编译,使用方法就是编译时make -s
- 单独输出文件夹编译:make O=输出目录,环境变量export KBUILD_OUTPUT=设置
4.5、其他
- OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录。
- SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
五、运行树莓派uboot
5.1、树莓派启动流程
- 树莓派上电后,SoC 中的 bootloader 首先被执行,其作用是挂载 SD 卡上的 FAT32 分区,从而加载下一阶段的 bootloader。这部分程序被固化在 SoC 的 ROM 中,用户无法修改。
- 这个阶段的 bootloader (bootcode.bin) 会从 SD 卡上检索 GPU 固件,将固件写入 GPU,随后启动 GPU。
- 本阶段中 (start.elf),GPU 启动后会检索附加配置文件(config.txt、fixup.dat),根据其内容设置 CPU 运行参数及内存分配情况,随后将用户代码加载至内存,启动 CPU。
- 通常情况下,CPU 启动后便开始执行 kernel7.img 中的指令,初始化操作系统内核,在某些情况下,也可以被 U-BOOT 代替,由 U-BOOT 来加载内核。
5.2、运行uboot
- SD卡2个分区:
FAT32:这个分区里存放启动文件和内核
EXT4:文件系统,放Linux操作系统文件
可以使用 fdisk 新建分区,也可以在可以启动的SD卡上改动: - FAT32分区:start4.elf、fixup4.dat、bcm2711-rpi-4-b.dtb、config.txt、u-boot.bin
config.txt 文件,在原有的基础上进行修改
- 插入SD卡树莓派,上电运行,使用SecureCRT
- 点赞
- 收藏
- 关注作者
评论(0)