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

一、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,但是仍存在一些问题
在这里插入图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值