系统移植(四)u-boot移植 ② basic版本

news2024/9/22 15:28:19

文章目录

  • 一、u-boot移植
    • (一)生成u-boot源码
      • 1. 配置交叉编译器,修改u-boot源码目录下的MAKEFILE文件
      • 4. 执行make <board_name>_defconfig命令,配置u-boot源码
      • 5. make menuconfig---图形化界面配置
      • 6. 根据DK1板子的设备树文件拷贝生成FSMP1A板子的设备树文件
      • 7. 编译u-boot源码
    • (二)部署u-boot的镜像文件到TF卡中
  • 二、烧录过程的错误
    • (一)PMIC初始化错误
      • 1. 分析
        • (1)DK1板电源管理单元电路图
        • (2)FSMP1A板电源电路图
      • 2. 解决方法
        • 1. 删除i2c4节点
        • 2. 删除cpu0和cpu1
        • 3. 删除usbotg_hs节点中的子节点port节点
        • 4. 添加固定电源对应的设备树节点信息
        • 5. 修改arch/arm/dts/目录下的stm32mp157a-fsmp1a-u-boot.dtsi文件,删除pmic设备树节点
        • (6)执行make menuconfig命令,对u-boot源码进行配置,删除pmic驱动代码
    • (二)DRAM初始化失败问题
      • 1. 分析两个板子的DRAM电路图
        • (1)DK1板内存电路图
        • (2)FSMP1A板的电路图
      • 2. 检查编译时编译的设备树文件
      • 3. 解决方法
    • (三)u-boot启动错误---没有检测到TF卡
      • 1. DK1板的YF卡电路图
      • 2. 分析FSMP1A板的TF卡电路图
      • 3. 解决方法
    • (四)将更改后的u-boot写入TF卡中

一、u-boot移植

使用FSMP1A板子,该板子是基于DK1进行裁剪得到的

(一)生成u-boot源码

1. 配置交叉编译器,修改u-boot源码目录下的MAKEFILE文件

在这里插入图片描述

  • 注:CROSS_COMPILE变量用于指定交叉编译器的前缀

4. 执行make <board_name>_defconfig命令,配置u-boot源码

移植u-boot源码的basic版本
make stm32mp157_basic_defconfig
在这里插入图片描述

5. make menuconfig—图形化界面配置

6. 根据DK1板子的设备树文件拷贝生成FSMP1A板子的设备树文件

  1. FSMP1A板子是基于DK1板子进行硬件裁剪设计,因此可以根据DK1板子和FSMP1A 板子的硬件差异性,针对FSMP1A板子的设备树文件进行修改,最终适配自己的FSMP1A开发板
  2. 使用ls arch/arm/dts/stm32mp15*dk*命令,查看DK1板子相关的设备树文件
	arch/arm/dts/stm32mp157a-dk1.dts          
	arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi   
	arch/arm/dts/stm32mp15xx-dkx.dtsi
  • 注:
  • arch/arm/dts/stm32mp157a-dk1.dts
    这个文件是STM32MP157A-DK1开发板的设备树源文件(Device Tree Source,DTS)。专门用于描述STM32MP157A-DK1开发板的硬件配置信息,包括CPU、内存、外设等的详细配置
  • arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi
    这个文件是一个设备树包含文件(Device Tree Include,DTSI),专门用于U-Boot启动加载器。包含STM32MP157A-DK1开发板在U-Boot启动阶段需要的特定配置信息,如启动参数、时钟设置等。这些配置信息有助于U-Boot正确地初始化硬件,以便后续加载和启动Linux内核。
  • arch/arm/dts/stm32mp15xx-dkx.dtsi
    提供STM32MP15系列(包括STM32MP157A)多个开发套件共有的硬件配置信息
  1. 拷贝生成FSMP1A板子的设备树文件
cd arch/arm/dts
cp stm32mp157a-dk1.dts  stm32mp157a-fsmp1a.dts
cp stm32mp157a-dk1-u-boot.dtsi   stm32mp157a-fsmp1a-u-boot.dtsi 
cp stm32mp15xx-dkx.dtsi stm32mp15xx-fsmp1x.dtsi
cd ../../../
  1. 修改arch/arm/dts/stm32mp157a-fsmp1a.dts文件
将以下内容:
	 12 #include "stm32mp15xx-dkx.dtsi"  //引用的头文件必须更改
     13 
     14 / {  //以下是一些设备提示信息
     15     model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
     16     compatible = "st,stm32mp157a-dk1", "st,stm32mp157";

	修改为:
	 12 #include "stm32mp15xx-fsmp1x.dtsi"
     13 
     14 / {
     15     model = "STMicroelectronics STM32MP157A-FSMP1A Discovery Board";
     16     compatible = "st,stm32mp157a-fsmp1a", "st,stm32mp157";
  1. 修改arch/arm/dts/目录下的Makefile文件,添加FSMP1A板子的设备树的编译的信息
	1061 dtb-$(CONFIG_STM32MP15x) += \
    1062     stm32mp157a-dk1.dtb \
    1063     stm32mp157a-fsmp1a.dtb \ 
  • 注: \ 的前面可以有空格,但是后面不可以有空格:

7. 编译u-boot源码

需要返回源码的主目录进行编译

make all
make -j4 all
time make -j4 all

编译成功后,会在u-boot的源码目录下生成对应的镜像文件
u-boot-spl.stm32:第一级引导程序,引导u-boot.img,部署到FSBL1和FSBL2分区
u-boot.img :第二级引导程序,部署到SSBL分区

(二)部署u-boot的镜像文件到TF卡中

1》将TF卡插到读卡器上,然后将读卡器在插到电脑的USB接口之上,将读卡器被ubuntu系统识别
如何查看TF卡被ubuntu系统识别:

方式1:通过虚拟机—> 可移动设备进行 查看

image-20231205164628250

方式2:查看TF卡对应的设备文件

image-20240422164922068

2》在ubuntu系统中创建一个sdtools文件夹,然后将u-boot-spl.stm32和u-boot.img文件拷贝到sdtools目录下

mkdir ~/sdtools
cp u-boot-spl.stm32 u-boot.img ~/sdtools

3》拷贝sdtools.sh脚本文件到sdtools目录下

4》使用sdtools.sh脚本文件进行u-boot镜像的部署
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5》将TF卡重新插到开发板的TF卡槽中,然后设置拨码开关,调整启动方式为SD卡启动。
在这里插入图片描述

二、烧录过程的错误

(一)PMIC初始化错误

1. 分析

在这里插入图片描述
PMIC:Power Manager IC,电源管理集成IC芯片
这是因为FSMP1A板子的设备树文件是根据DK1板子的设备树文件进行拷贝的,出现该错误说明与DK1板子的电源管理芯片的电路图不同,导致电源管理集成芯片初始化失败

(1)DK1板电源管理单元电路图

在这里插入图片描述

(2)FSMP1A板电源电路图

在这里插入图片描述

2. 解决方法

移除STPMIC电源管理芯片相关的驱动代码

1. 删除i2c4节点

修改arch/arm/dts目录下的stm32mp15xx-fsmp1x.dtsi设备树文件,删除I2C4设备树节点,由电路图可知STPMIC芯片挂到I2C4控制器上。

2. 删除cpu0和cpu1

因为vddcore节点在I2c4节点中已经被删除,因此将使用vddcore的cpu0和cpu1也删除

3. 删除usbotg_hs节点中的子节点port节点

I2c4控制器还接到TYPE-C驱动芯片,FSMP1A板子没有设计这个功能。

4. 添加固定电源对应的设备树节点信息

在vin节点的下边,添加以下内容

   v3v3: regulator-3p3v {
       compatible = "regulator-fixed";
       regulator-name = "v3v3";
       regulator-min-microvolt = <3300000>;
       regulator-max-microvolt = <3300000>;
       regulator-always-on;
       regulator-boot-on;
   };
   v1v8_audio: regulator-v1v8-audio {
       compatible = "regulator-fixed";
       regulator-name = "v1v8_audio";
       regulator-min-microvolt = <1800000>;
       regulator-max-microvolt = <1800000>;
       regulator-always-on;
       regulator-boot-on;
   };
   v3v3_hdmi: regulator-v3v3-hdmi {
       compatible = "regulator-fixed";
       regulator-name = "v3v3_hdmi";
       regulator-min-microvolt = <3300000>;
       regulator-max-microvolt = <3300000>;
       regulator-always-on;
       regulator-boot-on;
   };
   v1v2_hdmi: regulator-v1v2-hdmi {
       compatible = "regulator-fixed";
       regulator-name = "v1v2_hdmi";
       regulator-min-microvolt = <1200000>;
       regulator-max-microvolt = <1200000>;
       regulator-always-on;
       regulator-boot-on;
   };
   vdd: regulator-vdd {
       compatible = "regulator-fixed";
       regulator-name = "vdd";
       regulator-min-microvolt = <3300000>;
       regulator-max-microvolt = <3300000>;
       regulator-always-on;
       regulator-boot-on;
   };
   vdd_usb: regulator-vdd-usb {
       compatible = "regulator-fixed";
       regulator-name = "vdd_usb";
       regulator-min-microvolt = <3300000>;
       regulator-max-microvolt = <3300000>;
       regulator-always-on;
       regulator-boot-on;
   };
5. 修改arch/arm/dts/目录下的stm32mp157a-fsmp1a-u-boot.dtsi文件,删除pmic设备树节点
(6)执行make menuconfig命令,对u-boot源码进行配置,删除pmic驱动代码
Device Drivers  --->
		Power  ---> 
			[ ] Enable support for STMicroelectronics STPMIC1 PMIC
			 |--> 去掉*
	
保存退出。

(二)DRAM初始化失败问题

1. 分析两个板子的DRAM电路图

(1)DK1板内存电路图

在这里插入图片描述

(2)FSMP1A板的电路图

在这里插入图片描述

两个板子使用的内存芯片相同,因此导致DRAM初始化失败的错误不是内存电路的问题;
猜测导致DRAM初始化失败的原因是设备树编译的问题

2. 检查编译时编译的设备树文件

  1. 修改u-boot源码目录下的dts/Makefile文件,进行以下修改
	 43 arch-dtbs:
     44     echo $(DEVICE_TREE)
     45     $(Q)$(MAKE) $(build)=arch/$(ARCH)/dts dtbs
  1. 重新执行make all命令,查看终端回显的信息可知,设备树文件不正确
  • 注:变量DEVICE_TREE变量,专门用来指定u_boot源码编译的默认的设备树文件

3. 解决方法

方式1:执行make all命令时,给DEVICE_TREE变量赋值指定设备树文件的名字

make DEVICE_TREE=stm32mp157a-fsmp1a  all
缺点:每次执行make all命令时,都需要指定设备树文件

方式2:执行make menuconfig命令,配置u-boot源码使用的默认的设备树文件

Device Tree Control  ---> 
	(stm32mp157a-fsmp1a) Default Device Tree for DT control 
		|---> 回车进入编辑界面,修改设备树文件的名字
保存退出

(三)u-boot启动错误—没有检测到TF卡

根据错误信息分析可知,没有检测到TF卡,mmc初始化失败。
对比DK1板子和FSMP1A板子的TF卡的电路图

1. DK1板的YF卡电路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 分析FSMP1A板的TF卡电路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据DK1板子和FSMP1A板子的TF卡的电路图分析对比可知,
DK1板子的TF卡的检测引脚接到PB7,而FSMP1A板子的TF卡的检测引脚接到PH3,
因此需要对u-boot源码进行修改,修改TF卡的检测引脚。

3. 解决方法

修改arch/arm/dts/目录下的stm32mp15xx-fsmp1x.dtsi文件,
修改sdmmc1设备树节点。

	411 &sdmmc1 {
    412     pinctrl-names = "default", "opendrain", "sleep";
    413     pinctrl-0 = <&sdmmc1_b4_pins_a>;
    414     pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
    415     pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
    416     cd-gpios = <&gpioh 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
    						|---> 修改TF卡的检测引脚
    417     disable-wp;
    418     st,neg-edge;
    419     bus-width = <4>;
    420     vmmc-supply = <&v3v3>;
    421     status = "okay";
    422 };

(四)将更改后的u-boot写入TF卡中

操作与前述相同,此时可以正常启动u-boot,但是仍存在一些问题
在这里插入图片描述

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

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

相关文章

ISP 代理提供商:互联网安全的关键参与者

简介&#xff1a;互联网安全的演变态势 互联网改变了我们互动、工作和开展业务的方式&#xff0c;但也带来了与安全性和可访问性相关的重大挑战。在这个数字时代&#xff0c;互联网服务提供商 (ISP) 代理提供商在解决这些问题方面发挥着关键作用。他们提供的基本服务不仅可以增…

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com

LVGL使用上一个不方便的问题记录

slider这个控件&#xff0c;应该画在蓝色框的里面&#xff0c;源码实现将中心画在蓝色框上&#xff0c;导致总会有两边超出的情况出现&#xff0c;真想修改源码&#xff0c;作者不知道咋想的&#xff1f;&#xff1f;&#xff1f;

vue3 Router 点击index中的按钮,查看相应的详情信息,并且传递id,及其路由的定义方法。

1、路由的定义 结构如下: 2、路由定义代码&#xff1a; {path: tabs,name: TabsDemo,component: () > import(/views/demo/feat/tabs/index.vue),meta: {title: t(routes.demo.feat.tabs),hideChildrenInMenu: true,},children: [{path: detail/:id,name: TabDetail,compon…

封装和桥接Unity 协程体系

简介 协程&#xff08;Coroutine&#xff09;在C#中是一种特殊的函数&#xff0c;它允许开发者编写可以暂停执行并在未来某个时刻恢复执行的代码块。协程通常用于实现异步操作&#xff0c;如延时执行、等待某个事件发生、或者分段执行复杂的任务。在Unity游戏引擎中&#xff0c…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

【C++】选择结构案例-三只小猪称体重

案例问题 假设有三只小猪A、B、C&#xff0c;在输入三者体重后希望能输出他们各自的体重并测出谁最重 思路 先让A与B相比较&#xff0c;如果A重&#xff0c;则让A和C相比较&#xff0c;如果A重则输出A最重&#xff0c;否则输出C最重 在最开始的条件&#xff08;AB相比较&am…

JQuery简单实现ul li点击菜单项被选中的菜单项保持高亮状态(导航ul li点击切换样式)

效果&#xff1a; JS&#xff1a; $(function () {//遍历list&#xff08;一般为ul li&#xff09;$("#menu a").each(function () {//给当前项添加点击事件&#xff08;点击后切换样式&#xff09;$(this).bind(click,function () {// 移除其他所有项的active类$(&…

Sokit(TCP/UDP调试工具)

下载&#xff1a;http://www.winwin7.com/soft/56522.html#xiazai Sokit中文版是一款免费开源的TCP / UDP 测试&#xff08;调试&#xff09;工具&#xff0c;它主要可以用于接收和发送TCP/UDP数据包&#xff0c;让你更深的了解网络状况&#xff0c;能够有效地接收、发送、转…

Linux中的进程1

进程的概念 程序&#xff1a;二进制文件 进程&#xff1a;启动的程序 所有的数据都在内存中 需要占据更多的系统资源 cpu&#xff0c;物理内存&#xff08;RAM&#xff09; 并行和并发 并发&#xff1a;在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动…

干货讲解 | 在线教育行业如何搭建帮助中心

引言 随着互联网技术的飞速发展&#xff0c;在线教育已成为教育领域不可或缺的一部分&#xff0c;它打破了传统教育的时空限制&#xff0c;让知识传播更加高效、便捷。然而&#xff0c;在享受在线教育带来的便利时&#xff0c;用户也面临着操作复杂、功能理解不透彻、遇到问题…

Java语言程序设计——篇七(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 封装性与多态 封装性与访问修饰符类的访问权限类成员的访问权限 &#x1f320;防止类扩展和方法覆盖实战演练 抽象类实战演练 对象转换实战演练…

github的Codespaces是什么

目录 github的Codespaces是什么 一、定义与功能 二、特点与优势 三、工作原理 四、使用场景与限制 github的Codespaces是什么 GitHub的Codespaces是一个基于云的即时开发环境,它利用容器技术为开发者提供一个完全配置好的开发环境,以便他们能够直接在浏览器或通过Visua…

《中国数据库前世今生》观影——认识1980年起步阶段

引出 中国数据库的前世今生观影——认识1980年的起步阶段 20 世纪 60 年代国外就有了商业数据库&#xff0c;20 世纪 80 年代我国才有了第一批数据库专业人才。不要小看这 20 年的差距&#xff0c;它可能需要几代数据库人用一生去追。2024 年了&#xff0c;中国跨过数据库这座大…

【Android】Fragment的数据传递

碎片和活动之间的通信 Activity向Fragment 通过方法传递 构造方法 将碎片动态地加载到活动当中&#xff0c;先得到一个碎片&#xff0c;再将其放到活动当中。就想到碎片的替代方法&#xff0c;将我们所要传输的数据直接放到新创建的碎片里面&#xff0c;替换到原来的碎片。…

【C++】C++应用案例-大整数相加

实际应用中&#xff0c;有时会遇到非常大的整数&#xff0c;可能会超过long、甚至long long的范围。这时就需要用不限长度的字符串保存数据&#xff0c;然后进行计算。 最简单的需求就是“大整数相加”&#xff0c;即给定两个字符串形式的非负大整数 num1 和num2 &#xff0c;计…

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…

【YOLOv5/v7改进系列】引入中心化特征金字塔的EVC模块

一、导言 现有的特征金字塔方法过于关注层间特征交互而忽视了层内特征的调控。尽管有些方法尝试通过注意力机制或视觉变换器来学习紧凑的层内特征表示&#xff0c;但这些方法往往忽略了对密集预测任务非常重要的被忽视的角落区域。 为了解决这个问题&#xff0c;作者提出了CF…

day05 Router、vuex、axios

配置 router和vuex需要在创建vue项目的时候&#xff0c;开始的时候选择Manually select features&#xff0c;于是就可以在下一个创建配置讯问中选择router和vuex。 axios则需要执行命令行&#xff1a; npm install axios -S 之后再在需要发送请求的view导入即可。 router…

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;squeeze和unsqueeze是Tensor的一个重要方法&#xff0c;同时它们也是torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.…