【树莓派4b的uboot编译移植】

news2025/2/4 2:26:37

树莓派4b的uboot编译移植

引言

0.1、什么是uboot

  1. OS跑起来前,需要的一段引导程序
  2. 负责部署整个计算机系统,引导操作系统内核启动并给内核传参
  3. 提供一个命令行界面供人操作
  4. 是一个开源项目,uboot就是universal bootloader(通用的启动代码)
  5. 命令行用的行缓存,linux终端设计有3种缓冲机制:无缓冲、行缓冲、全缓冲

0.2、uboot命令

  1. printenv/print 打印出系统中所有的环境变量
  2. setenv/set 设置环境变量
    set 环境变量 值
  3. saveenv/save 保存环境变量到flash
  4. ping 网络测试指令

一、原理图

1.1、树莓派4b引脚图

树莓派4B Raspberry Pi 4B 8G开发板

1.2、串口接线

USB转串口接在TXD和RXD,交叉接线,也就是GPIO14和GPIO15

二、uboot 编译

2.1、uboot源码下载

官网下载地址:

GitHub - u-boot/u-boot: "Das U-Boot" Source Tree 国外

u-boot: UBoot 是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot 国内

安装下载:

版本使用2022.01版本:

Release v2022.01 · u-boot/u-boot · GitHub

  1. .gitignore:git工具的文件
  2. config.mk:是一个Makefile文件
  3. MAINTAINERS:维护者
  4. Makefile:uboot源代码的主Makefile
  5. README:所有的软件都有README,简单的使用说明书。

  1. api: 硬件无关的功能函数的API
  2. board:文件夹下每一个文件都代表一个开发板
  3. common:放的是一些与具体硬件无关的普遍适用的一些代码
  4. disk:磁盘有关的
  5. doc:文档目录,里面存放了很多uboot相关文档
  6. drivers:驱动,这里面放的就是从linux源代码中的linux设备驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动
  7. examples:示例代码
  8. fs:filesystem,文件系统
  9. include:头文件目录
  10. lib:(典型的lib_arm和lib_generic)架构相关的库文件
  11. net:网络相关的代码
  12. tools:里面是一些工具类的代码
  13. arch:这个目录是SoC相关的,里面存放的代码都是SoC相关初始化和控制代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S也在这里)

2.2、主Makefile

2.2.1、Makefile配置编译

  1. u-boot.lds,就是uboot的链接脚本
  2. configs文件夹,uboot 配置文件,xxx_defconfig

安装依赖项

  1. sudo apt-get install libssl-dev
  2. sudo apt-get install bison
  3. sudo apt-get install flex

编译生成u-boot.bin

  1. export CROSS_COMPILE=aarch64-linux-gnu- #export 设置环境变量
  2. cd u-boot
  1. make distclean  # 清除上次的make命令所产生文件以及配置文件
  2. make rpi_4_defconfig # 使用树莓派4的配置文件,执行完这步会生成.config文件
  3. 生成.config文件
  4. make  # 编译uboot

三、启动uboot

3.1、格式化SD卡

Windows上直接格式化FAT32

Linux上:删除分区、新建分区、挂载、格式化、挂载分区

  1. sudo fdisk /dev/sdb 根据提示进行即可
  2. sudo mkfs.vfat /dev/sdb1 格式化FAT32
  3. sudo mount /dev/sdb1 /mnt 挂载分区

3.2、树莓派4b的启动流程

rpi4的启动分区依旧是使用FAT32文件系统,并采用如下三阶段启动方式:

  1. 树莓派复位上电时,CPU处于复位状态,由GPU来负责启动系统。
  1. 第一阶段引导程序(ROM程序): GPU首先启动固化在rpi4中的BootRom程序。这一阶段非常简单,BootRom主要支持读取SD中FAT32文件系统中的第二阶段引导程序bootcode.bin;注意:树莓派4B已经把bootcode.bin引导程序固化到SPI Boot EEPROM里。
  2. 第二阶段引导程序(bootcode.bin): GPU加载并执行启动分区中的bootcode.bin。bootcode.bin主要功能是解析elf格式文件,并加载并解析同样位于分区中的start4.elf文件;
  3. 第三阶段引导程序(start4.elf):运行start4.elf,读取并解析config.txt配置文件,并加载执行真正的u-boot程序。start4.elf这是一个包含VideoCore(视频/HDMI模式、内存、控制台帧缓冲区等)和Linux内核(加载地址、设备树、UART/控制台波特率等)的配置参数的文本文件。一旦解析了config.txt文件,第三阶段引导程序将加载cmdline.txt【一个包含要传递给内核的内核命令行参数的文件】和kernel.img【 Linux内核】。两者都加载到分配给ARM处理器的共享内存中。完成后,第三阶段引导程序将释放ARM处理器的复位。您的内核现在应该开始启动。

因此,Linux内核可以在不需要U-Boot的情况下启动。然而,正如所示,U-Boot提供了许多有用的工具,用于开发和调试嵌入式系统,例如通过网络上的TFTP加载新编译的内核进行测试。这消除了在每次微调和编译之间将内核复制到SD卡的缓慢和痛苦的过程。

同时,由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。这里对于rpi来说就是bcm2711-rpi-4-b.dtb文件。

注意:

1、rpi4这里的启动elf文件由start.elf变成了start4.elf,和之前版本的树莓派不同。

2、rpi4b已经把bootcode.bin引导程序固化到板载SPI Boot EEPROM里,没用外部文件。

3、在rpi4上运行过64位u-boot的都知道,如果在config.txt中没有特别指明kernel的位置,那么start.elf(或start4.elf)默认需要并启动的文件是kernel8.img:

kernel8.img:64位的Raspberry Pi 4和Raspberry Pi 4;

kernel7l.img:32位的Raspberry Pi 4(使用LPAE);

kernel7.img:32位的Raspberry Pi 4、Raspberry Pi 3和Raspberry Pi 2(未使用LPAE);

kernel.img:其他版本的树莓派。

3.3、启动文件复制到SD卡

       bootcode.bin:引导程序。树莓派复位上电时,CPU处于复位状态,由GPU来负责启动系统。GPU首先会启动固化在芯片内部的固件(BootROM代码),读取MicroSD卡中的bootcode.bin文件,并装载和运行bootcode.bin中的引导程序。(树莓派4B已经把bootcode.bin引导程序固化到SPI Boot EEPROM里)。

       start4.elf:树莓派4上的GPU固件。bootcode.bin引导程序检索MicroSD卡中的GPU固件,加载固件并启动GPU。

       start.elf:树莓派3上的GPU固件。

       config.txt:配置文件。GPU启动后读取config.txt配置文件,读取Linux内核映像(比如kernel8.img等)以及内核运行参数等,然后把内核映像加载到共享内存中并启动CPU,CPU结束复位状态开始运行Linux内核。如果在config.txt中没有特别指明kernel的位置,那么start.elf(或start4.elf)默认需要并启动的文件是kernel8.img。

       bcm2711-rpi-4-b.dtb: 设备树。由于u-boot中没有预置rpi4的dts文件(device tree source),因此采用了在u-boot运行时动态传入硬件描述dtb(device tree blob)文件的方式,用于u-boot启动时枚举硬件。这里对于rpi4来说就是bcm2711-rpi-4-b.dtb文件。

       fixup4.dat:这些是链接器文件,与 start*.elf 列出的文件配对。

3个文件在线下载地址

sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/bcm2711-rpi-4-b.dtb

sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/start4.elf

sudo wget https://raw.githubusercontent.com/raspberrypi/firmware/master/boot/fixup4.dat

1个文件u-boot是前面生成复制过来即可。

1个文件config.txt创建写入如下内容即可。

uart_2ndstage

       设置 uart _2ndstage = 1会导致第二阶段加载程序(树莓派 4之前的设备上的 bootcode .bin或树莓派 4设备的 EEPROM 中的启动代码)和主固件(start * .elf) `)将诊断信息输出到 UART0

enable_gic(仅适用于 Pi 4B)

       在树莓派 4B上,如果将此值设置为 0 ,则中断将使用旧版中断控制器而不是通过 GIC -400路由到 ARM 内核。默认值为" 1"。

四、遗留

4.1、感觉uart_2ndstage和enable_gic,设置1或0,或者注释掉打印上没啥区别。

4.2、EEPROM里的固件坏了怎么办?

4.3、裁剪uboot尝试,难道仅通过xxxdeconfig配置宏开关就行了?

4.4、从uboot启动内核尝试?

4.5、从uboot启动网络内核尝试?

4.6、修改自写一份嵌入式驱动,例如:uart串口驱动?

4.7、移植很火的鸿蒙系统到树莓派?

五、参考链接

config.txt中的启动选项 - 树莓派中文文档 (hackpi.fun)

<第2章>树莓派4B上运行 uboot_rpi_4_deconfig和rpi_arm4_deconfig-CSDN博客

如何让树莓派4上固件的debug日志输出到串口? - 知乎 (zhihu.com)

树莓派uboot配置编译-云社区-华为云 (huaweicloud.com)

Linux交叉编译——树莓派工具链安装_gcc-linaro-arm-linux-gnueabihf-raspbian-CSDN博客

树莓派U-Boot编译教程-鸿蒙开发者社区-51CTO.COM

树莓派简单操作系统制作之一:树莓派4B U-boot移植并加载裸机程序_树莓派uboot-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基础篇】四、类加载器ClassLoader

文章目录 1、类加载器2、分类3、启动类加载器4、手动扩展启动类加载器5、扩展类加载器6、应用程序类加载器 1、类加载器 类加载器ClassLoader,是JVM提供给应用程序去获取类和接口的字节码数据的。 上面的类加载器对JVM进行了本地接口调用。本地接口即JNI&#xff0…

MySQL 中 blob 和 text 数据类型

应用场景 日志表中请求参数用的text,公告表中内容详情用的mediumblob。 1. blob 类型 blob(binary large object) 是一个可以存储二进制文件的容器,主要用于存储二进制大对象,例如可以存储图片,音视频等文件。按照可存储容量大小…

redis 从0到1完整学习 (七):ZipList 数据结构

文章目录 1. 引言2. redis 源码下载3. zipList 数据结构3.1 整体3.2 entry 数据结构分析3.3 连锁更新 4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二&am…

Python(五)—— 闭包装饰器

13. 闭包 13.1 闭包的案例 给大家提个需求,然后用函数去实现:完成一个计算不断增加的系列值的平均值的需求 例如:整个历史中的某个商品的平均收盘价。就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值…

SpringBoot源码搭建

文章目录 源码下载搭建项目构建学习博客 源码下载 需要环境 : JDK 1.8Maven 3.5Spring Boot 1.x.x: Gradle 版本建议为2.9或更高版本。Spring Boot 2.x.x: Gradle 版本建议为4.x.x或更高版本。 GitHub 从v2.3.x开始,SpringBoot开始强制用Gradle构建项…

深度解析:CRM、ERP之间的关联和区别以及双系统的联系与集成(附系统架构图)

目录 一、系统简介 1.1 CRM是什么 1.2 ERP是什么 二、发展阶段 2.1 CRM发展阶段 2.2 ERP发展阶段 三、系统架构 3.1 CRM系统架构 3.2 ERP系统架构 四、CRM与ERP的区别 4.1 目标不同 4.2 不同阶段的发展中不同的适用性 4.2.1 刚起步的小公司 4.2.2 对于更大、更成…

数字电子技术 一天速成

文章目录 一、数制与编码1. 数制转换2. BCD编码 二、逻辑代数1. 常见逻辑运算及逻辑门 三、化简逻辑表达式1. 卡诺图 求 表达式2. 表达式 画 卡诺图3. 卡诺图 化简 表达式4. 公式法 化简 表达式 ⭐⭐5. 表达式 求 反函数6. 卡诺图 求 反函数 四、组合逻辑电路的分析和设计1. 逻…

Gin框架之使用 go-ini 加载.ini 配置文件

首先,联想一个问题,我们在部署服务时,通常为了方便,对于需要迭代更新的代码进行修改,但是比对shell,可以搞一个变量将需要修改的,以及修改起来变动处多的,写在变量内,到时候如果需要变更,可以直接变更变量即可; 那么,golang有没有什么方式可以将需要变的东西保存起…

Hexo 部署 Github Pages, Github Actions自动部署

想整个静态的博客部署在github pages 历经两天的折磨终于是摸索成功了,官网的文档太简陋了,很多东西没说清楚。 欢迎大家访问我的博客! Canyue 最终实现的效果,一个项目仓库,main 分支存放源代码,gh-page…

H266/VVC帧间预测编码技术概述

帧间预测编码简述 帧间预测利用视频时间域的相关性,使用邻近已编码图像像素值预测当前图像的像素值,能有效去除视频时域冗余。 目前主要的视频编码标准中,帧间预测都采用基于块的运动补偿技术,不同的编码标准有不同的分块方式。 …

Spring企业开发核心框架

文章目录 Spring企业开发核心框架一、框架前言1. 总体技术体系2. 框架概念和理解 二、Spring Framework简介1. Spring 和 SpringFramework2. SpringFramework主要功能模块3. SpringFramework 主要优势 三、Spring IoC 容器概念1. 组件和组件管理概念2. Spring IoC容器和容器实现…

C# LINQ

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第22章《LINQ》 二、LINQ to XML 我们可以通过LINQ to XML来创造xml文件 如下示例&#xff0c;我们用LINQ to XML来创造。 <Books><CSharp Time"2019"><book>C# 入门经典</book><…

上海亚商投顾:沪指冲高回落 游戏股午后集体重挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数12月22日冲高回落&#xff0c;黄白二线分化严重。游戏股午后大跌&#xff0c;盛天网络、游族网络、巨…

【JAVA】黑马MybatisPlus 学习笔记【终】【插件功能】

4.插件功能 MybatisPlus提供了很多的插件功能&#xff0c;进一步拓展其功能。目前已有的插件有&#xff1a; PaginationInnerInterceptor&#xff1a;自动分页TenantLineInnerInterceptor&#xff1a;多租户DynamicTableNameInnerInterceptor&#xff1a;动态表名OptimisticL…

bootstrap:bootstrapValidator校验数据是否可用(验证账户名是否重复)

目录 1、html内容 2、bootstrap的校验 3、控制层代码&#xff1a; 4、业务层核心代码 5、效果 1、html内容 <form id"jangleEditForm" name"jangleEditForm" class"formJ" ><div class"form-group" ><label for&q…

10个练习Web渗透测试的最佳网站

黑客的最高境界——社会工程学&#xff01;社会工程在网络安全领域充当了关键角色&#xff01;黑客技术如何操纵信息安全&#xff1f;社会工程攻击的多种形式&#xff0c;包括网络钓鱼、电子邮件欺诈、诱饵场景&#xff1b;如何应对黑客利用未提出的问题的策略。防范黑客社会工…

二叉树OJ题——3.翻转二叉树

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 翻转每一棵树的左右子树根节点 */void swap (struct TreeNode**x,struct TreeNode**y) {struct TreeNode*num0;num*x;*x*y;*ynum; }struct TreeNode* invertTree(struct TreeNode* root) { i…

【广州华锐互动】VR科技科普展厅平台:快速、便捷地创建出属于自己的虚拟展馆

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经在许多领域取得了显著的成果。尤其是在展馆设计领域&#xff0c;VR科技科普展厅平台已经实现了许多令人瞩目的新突破。 VR科技科普展厅平台是广州华锐互动专门为企业和机构提供虚拟展馆设计和制作的在线平台。通过这个平台&…

二分查找——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…

LabVIEW在齿轮箱故障诊断中的应用

LabVIEW在齿轮箱故障诊断中的应用 在现代机械工业中&#xff0c;齿轮箱作为重要的传动设备&#xff0c;其性能稳定性对整体机械系统的运行至关重要。故障的及时诊断和处理不仅保障了设备的稳定运行&#xff0c;还减少了维护成本。利用LabVIEW强大数据处理和仿真能力&#xff0…