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

树莓派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.mzph.cn/news/579298.shtml

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

相关文章

orangepi——蜂鸣器简单应用和首行缩进设置

1.修改缩进 命令:sudo vi /etc/vim/vimrc:用超级用户进入修改页面 修改: set tabstop4 set shifwidth4 set nu 再重新打开vi界面,可以看到有了行显示,缩进为4字符 2.蜂鸣器 进入到解压的wiringOP-next中&#xf…

词法语法语义分析程序设计及实现,包含出错提示和错误恢复

词法说明 (1)关键字 main, int, char, if, else, for, while, void (2)运算符 - * / < < > > ! (3)界符 ; ( ) { } (4)标识符 ID letter(letter|digit)* (5)整型常数 NUM digit digit* (6)空格 ‘ ‘ ‘\n’ ‘\r’ ‘\t’ 空格用来分隔ID,NUM,运算符,界…

Matlab实时读取串口数据并实时画图方法

** Matlab实时读取串口数据并实时画图方法 ** 按照数据串口协议如&#xff1a;$KT2,1.80,88.18,39.54,42.86,LO[0.72,-1.04,0.35]&#xff0c;举例。 s serialport("COM12",115200,"Timeout",5); poszeros(100000,3); j1; data1 read(s,1,"uint8&…

正则表达式:元字符

一、什么事元字符 正则是由一系列的元字符组成的&#xff0c;所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符&#xff0c;元字符是构成正则表达式的基本元件。 二、元字符的分类 1.特殊单字符 表达式含义\d匹配任意一个数字\D匹配任意非数字\w匹配任意一个字母、…

面试经典150题(50-53)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第二十二天&#xff09;完成了4道(50-53)150&#xff1a; 50.&#xff08;141. 环形链表&#xff09;题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个…

算法练习Day20 (Leetcode/Python-回溯算法)

虽然看似进入了一个新章节&#xff0c;但其实还是前几天二叉树章节的延续。。 回溯算法 &#xff08;以下内容摘抄自代码随想录&#xff09;&#xff1a; 回溯法解决的问题都可以抽象为树形结构&#xff0c;是的&#xff0c;我指的是所有回溯法的问题都可以抽象为树形结构&…

云原生Kubernetes:K8S集群版本升级(v1.22.14 - v1.23.14)

目录 一、理论 1.K8S集群升级 2.环境 3.升级集群&#xff08;v1.23.14&#xff09; 4.验证集群&#xff08;v1.23.14&#xff09; 二、实验 1. 环境 2.升级集群&#xff08;v1.23.14&#xff09; 2.验证集群&#xff08;v1.23.14&#xff09; 一、理论 1.K8S集群升级 …

详解视频美颜SDK:算法优化与性能提升

众所周知&#xff0c;视频美颜SDK的算法优化和性能提升至关重要。下文小编将与大家深度探讨视频美颜SDK的算法原理&#xff0c;以及近期的性能优化措施。 一、常见用法 视频美颜SDK对人脸进行识别&#xff0c;并附加适当的美颜效果。例如&#xff1a; 1.识别、关键点 2.肤色…

modbus-tcp-rtu协议图表

MODBUS TCP 读寄存器 请求 序号 意义 所占字节 字节存放格式 1 事务处理标识 2个字节 高字节在前 2 协议标识 2个字节 高字节在前 3 长度 2个字节 高字节在前 4 单元标识 1个字节 0x00-0xff 5 功能码 1个字节 0x03 6 起始寄存器地址 2个字节 高字节…

flutter项目从创建到运行,以及一些常用的命令

# 创建项目 命令行 flutter create flutter_app &#xff08;这种vsCode软件可用&#xff09; 按下ctrlshiftp&#xff0c; 输入 Flutter: New Project 选择 Application 选择项目存放位置 输入项目名字 点击 enter 完成创建 # 运行项目 1、命令行中运行&#xff1a; cd flutte…

GLES学习笔记---OpenGL绘制到ImageReader

一、ImageReader简介 ImageReader 之前经常使用在camera应用里面&#xff0c;创建一个ImageReader&#xff0c;然后获取surface&#xff0c;配流和下发request时候将surface下发给framework&#xff0c;中间具体对ImageReader做了什么没有具体研究过&#xff0c;等到Hal层came…

MYSQL数据库的备份与恢复-数据库实验七

一、实验目的 1. 了解备份和恢复的基本概念。 2. 掌握使用MySQL命令进行数据库备份的操作方法。 3. 掌握使用MySQL命令进行数据库恢复的操作方法。 二、实验内容 1. 使用mysqldump命令备份数据库studentsdb的所有表&#xff0c;存于D:\下&#xff0c;文件名为all_tables.s…

C#与php自定义数据流传输

C#与php自定义数据流传输 介绍一、客户端与服务器数据传输流程图客户端发送数据给服务器&#xff1a;服务器返回数据给客户端&#xff1a; 二、自定义数据流C#版本数据流PHP版本数据流 三、数据传输测试1.在Unity中创建一个C#脚本NetWorkManager.cs2.服务器www目录创建StreamTe…

Java基础知识:单元测试和调试技巧

在Java编程中&#xff0c;单元测试和调试是提高代码质量和开发效率的重要环节。通过单元测试&#xff0c;我们可以验证代码的正确性&#xff0c;而调试则帮助我们找出并修复代码中的错误。本文将介绍Java中的单元测试和调试技巧&#xff0c;并提供相关示例代码&#xff0c;帮助…

华清远见嵌入式学习——ARM——作业4

作业要求&#xff1a; 代码运行效果图&#xff1a; 代码&#xff1a; do_irq.c: #include "key_it.h" extern void printf(const char *fmt, ...); unsigned int i 0;//延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j);} }void do_i…

基于AR+地图导航的景区智慧导览设计

随着科技的飞速发展&#xff0c;智慧旅游已经成为现代旅游业的一个重要趋势。在这个背景下&#xff0c;景区智慧导览作为智慧旅游的核心组成部分&#xff0c;正逐渐受到越来越多游客的青睐。本文将深入探讨地图导航软件在景区智慧导览中的应用&#xff0c;并分析其为游客和景区…

【JavaWeb学习笔记】18 - 文件上传下载

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/fileupdown 目录 文件上传 一、基本介绍 二、文件上传的基本原理 ​编辑 三、文件上传应用实例 四、文件上传的注意细节 1.解决中文乱码问题 2.分割文件夹 3.防止重名 4.百度WebUploader 5.空…

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

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

常用API:Object

Object Object类的作用&#xff1a; Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有的对象都可以直接使用Object类中提供的一些方法。 Object类的常见方法 方法名说明public String toString&#xff08;&#xff09;返回对象的字符串表示形式publi…

Vue 3 表单处理精讲:打造响应式注册表单的艺术

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…