文章目录
- 一、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板子的设备树文件
- FSMP1A板子是基于DK1板子进行硬件裁剪设计,因此可以根据DK1板子和FSMP1A 板子的硬件差异性,针对FSMP1A板子的设备树文件进行修改,最终适配自己的FSMP1A开发板
- 使用
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)多个开发套件共有的硬件配置信息
- 拷贝生成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 ../../../
- 修改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";
- 修改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:通过虚拟机—> 可移动设备进行 查看
方式2:查看TF卡对应的设备文件
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. 检查编译时编译的设备树文件
- 修改u-boot源码目录下的dts/Makefile文件,进行以下修改
43 arch-dtbs:
44 echo $(DEVICE_TREE)
45 $(Q)$(MAKE) $(build)=arch/$(ARCH)/dts dtbs
- 重新执行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,但是仍存在一些问题