6、STM32MP157a-u-boot移植(BaseMode)

1、获取源码

ST官方TF-A、uboot、kernel 等源码下载链接为:Downloads | GNU-A Downloads – Arm Developer

下载好的uboot

mkdir FS_MP1A
cd FS_MP1A/
// 拖入虚拟机源码压缩包
mv '/var/run/vmblock-fuse/blockdir/aiIxZb/en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz' .
tar -xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz 
cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/
cd sources/
cd arm-ostl-linux-gnueabi/ 
cd u-boot-stm32mp-2020.01-r0/
tar -xvf u-boot-stm32mp-2020.01-r0.tar.gz 
cd u-boot-stm32mp-2020.01/
// 将 ST 官方补丁文件打到 u-boot 源码中:
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done

在这里插入图片描述

2、搭建编译平台

方法一

我们直接下载ST官方的交叉编译工具 : 本地下载好的

cd ~/FS_MP1A
mkdir tools
cd tools
// 拖入虚拟机源码压缩包到tools文件夹
tar -xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz
cd ./stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk
./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
/* 运行之后会提示输入安装位置,直接按回车键默认即可:
继续询问是否安装 SDK,输入 Y,回车
默认安装路径安装在 opt 目录下,这个目录需要有 root 权限,所以安装时需要使用 sudo安装,过程中需要输入用户的 sudo 密码(如果当前用户 sudo 功能已经授权,这个密码就是用户的登录密码),输入密码后开始进行安装。*/

在这里插入图片描述

导入交叉编译工具链(每次重启虚拟机需要重新导入一次)

source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
// 验证开发工具是否安装正确,显示版本信息如下图所示。
$CC --version

在这里插入图片描述

方法二(参考正点原子)

点击此链接直接下载:https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz?rev=302e8e98351048d18b6f5b45d472f406&hash=95ED9EEB24EAEEA5C1B11BBA864519B2

我们要先将交叉编译工具拷贝到 Ubuntu 中,
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令
“ cd ” 进 入 到 存 放 有 交 叉 编 译 器 的 目 录 , 比 我 前 面 将 交 叉 编 译 器 拷 贝 到 了 目 录
“/home/liu/linux/tool”中,然后使用如下命令将交叉编译器复制到/usr/local/arm 中:
sudo cp gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz /usr/local/arm/ -f
拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,解压命令如下:
sudo tar -vxf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz
等待解压完成,解压完成以后会生成一个名为“gcc-arm-9.2-2019.12-x86_64-arm-none-linux
gnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
修改环境变量,使用打开/etc/profile 文件,命令如下:
sudo vi /etc/profile
打开/etc/profile 以后,在最后面输入如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
添加完成以后的/etc/profile 如图所示:

在这里插入图片描述

修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。

验证:arm-none-linux-gnueabihf-gcc -v

3、增加板级支持文件

进入uboot源码路径

cd ~/FS_MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01

添加属于自己的默认配置文件

cp configs/stm32mp15_basic_defconfig configs/stm32mp15_fsmp1a_basic_defconfig

添加设备树文件

cp arch/arm/dts/stm32mp15xx-dkx.dtsi arch/arm/dts/stm32mp15xx-fsmp1x.dtsi
cp arch/arm/dts/stm32mp157a-dk1.dts arch/arm/dts/stm32mp157a-fsmp1a.dts
cp arch/arm/dts/stm32mp157a-dk1-u-boot.dtsi arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi

修改设备树:

打开/home/liu/FS_MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01/arch/arm/dts/stm32mp157a-fsmp1a.dts
#include "stm32mp15xx-dkx.dtsi"
修改为:
#include "stm32mp15xx-fsmp1x.dtsi"
修改 arch/arm/dts/Makefile,在 stm32mp157a-dk1.dtb 下添加 stm32mp157a-fsmp1a 的内容:

在这里插入图片描述

(1)配置u-boot

使用新添加的默认配置

使用basic方式配置u-boot源码(更新.config)

make stm32mp15_fsmp1a_basic_defconfig

在这里插入图片描述

make menuconfig 进行图形化配置

在这里插入图片描述

两下ESC退出

(2)编译源码

make

在这里插入图片描述

在这里插入图片描述

FSBL : SPL bl1

SSBL : uboot bl2

编译成功生成以上两个文件。需要制作TF卡启动盘,进行测试。

(3)TF制作分区

​ 虚拟机插入读卡器 输入: ls /dev/sd*

在这里插入图片描述

我的SD卡之前使用过,正常只有一个sdb1

首先删除原有分区

sudo parted -s /dev/sdb mklabel msdos

如果显示如下内容,则表示设备已经被挂载,需要卸载掉设备再删除分区。

mount查看被挂载的设备

在这里插入图片描述

卸载设备 umount /dev/sdbX

在这里插入图片描述

卸载完成后重新执行删除分区命令

sudo parted -s /dev/sdb mklabel msdos

对 tf 进行重新分区(未探明此处与上面指令先后关系的影响)

sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g

在这里插入图片描述

在这里插入图片描述

注意:最后-p /dev/sdb 参数中的/dev/sdb 需要按照实际 ubuntu 中的 tf 节点为准,否则可能发生不可预料的后果。

(4) 固件烧写

TF卡启动

执行如下指令烧写 u-boot:
sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync

if ---> input file 
of ---> output file 
conv=fdatasync : 数据对齐

SD卡插入开发板

调整拨码1 0 1

串口打印如下:

在这里插入图片描述

(5)调整设备树电源配置:

DK1 参考板电源管理芯片挂在 I2C4 上,而 FS-MP1A 并未使用 I2C4 总线,所以直接将I2C4 相关内容完全删除即可。

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件

将文件中 i2c4 节点相关内容整体删除

&i2c4 {
}

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件,删除如下内容:

dk1开发板给PMIC 给cpu供电配置,开发板由电源直接供电,所以删除

&cpu0{
    cpu-supply = <&vddcore>;
};
&cpu1{
    cpu-supply = <&vddcore>;
};

删除PMIC相关内容

arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi

&pmic {
    u-boot,dm-pre-reloc;
};

由于官方参考板 DK1 I2C4 总线上有个 USB type C 的控制器,上文删除 I2C4 节点的同时

将 type C 控制器的描述删除,所以需要将引用 type C 控制器的内容删掉。开发板无typeC控制器。

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件,删除节点部分内容:

&usbotg_hs 
    (删除此节点)port{
            
    }
(6)添加固定电源配置

调整电源域配置

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件

固定电源配置通常添加在根节点下,在根节点末尾位置添加如下内容

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;
};

mv arch/arm/dts/stm32mp157a-fsmp1a-uboot.dtsi arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi

(7)配置uboot
make menuconfig
去掉 PMIC 的配置选项,按空格将方括号内*号去掉
Device Drivers --->
    Power --->
        [ ] Enable support for STMicroelectronics STPMIC1 PMIC
更新配置文件
cp .config configs/stm32mp15_fsmp1a_basic_defconfig
重新编译源码
make DEVICE_TREE=stm32mp157a-fsmp1a all
(8)格式化SD卡并烧录
sudo rm /dev/sdx*
umount  /dev/sdX*
sudo parted -s /dev/sdb mklabel msdos
sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g
解析: 
--resize-table=128 -a 1    : 对齐
-n 1:34:545 -c 1:fsbl1  
-n(创建分区表) 第一个:34(起始块):545(终止块) -c(分区命名) 1:fsbl1(分区名)
-n 2:546:1057 -c 2:fsbl2 
-n 3:1058:5153 -c 3:ssbl 
-n 4:5154:136225 -c 4:bootfs 
-n 5:136226 -c 5:rootfs    到TF卡的剩余的空间都属于rootfs 
-A 4:set:2  : 设置分区表的属性
-p /dev/sdb -g : 打印分区表
flash按照块进行访问,一块是512字节
执行如下指令烧写 u-boot:
sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync

拨码: 1 0 1

上电接串口:

在这里插入图片描述

提示显示 TF 卡未被检测到。

(9)TF 卡支持

系统检测 TF 卡拔插是通过 CD 脚的状态确认,通过原理图可知,TF 卡对应 MMC1 的CD 脚是与 STM32MP1 的 PH3 连接

在这里插入图片描述

对照设备树中MMC1的描述,发现设备树种原有CD脚的配置与FS-MP1A板子不一致,需调整为 PH3。

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件,调整 MMC1 中 CD 的配置:

在这里插入图片描述

在这里插入图片描述

make DEVICE_TREE=stm32mp157a-fsmp1a all
执行如下指令烧写 u-boot:
sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync

在这里插入图片描述

(10)去掉ADC功能

官方参考板DK1通过ADC检测开机电流,如果供电电流不足3A则启动失败,FS-MP1A没有设计这个功能,所以需要去掉这部分功能,否则就会报上图中显示的错误,由于 u-boot期间 ADC 主要功能是检测开机电流,这里直接去掉 ADC 功能即可。

配置 uboot 去掉 ADC 功能:按空格键去掉[ ]的星号

make menuconfig
    Command line interface --->
        Device access commands --->
            [ ] adc - Access Analog to Digital Converters info and data
    Device Drivers --->
        [ ] Enable ADC drivers using Driver Model
更新配置文件:
cp .config configs/stm32mp15_fsmp1a_basic_defconfig
  • 关闭 ltdc

由于在 u-boot 阶段我们不使用显示设备,因此需要将 ltdc 相关配置关闭。

修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 文件

&ltdc { // &ltdc
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <<dc_pins_a>;
 pinctrl-1 = <<dc_pins_sleep_a>;
 status = "okay";
 修改为:
 <dc { // // &ltdc
 pinctrl-names = "default", "sleep";
 pinctrl-0 = <<dc_pins_a>;
 pinctrl-1 = <<dc_pins_sleep_a>;
 status = "disabled";

在这里插入图片描述

(11)有线网卡的配置

MAE0621A 网卡驱动移植

a) 添加 MAE0621A 网卡驱动

暂无

(12)EMMC移植

参考原理图可知 eMMC 使用的是 SDMMC2 总线,当前所使用的设备树文件中没有SDMMC2 的支持,所以需要增加相关内容才能正常驱动 eMMC。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​ 在 u-boot 中 STM32MP1 默认管脚定义在文件 arch/arm/dts/stm32mp15-pinctrl.dtsi 中,查看文件中是否有需要的管脚定义:查看后确认有 SDMMC2 的管脚定义,且与 FS-MP1A 硬件使用情况一致。

​ 修改 arch/arm/dts/stm32mp15xx-fsmp1x.dtsi 增加 SDMMC2 的信息,在原有 sdmmc1 节点下增加 sdmmc2 的内容,添加内容可参考 arch/arm/dts/stm32mp15xx-edx.dtsi 中 sdmmc2 的写法,内容如下

在这里插入图片描述

增加 mmc 映射

修改 arch/arm/dts/stm32mp157a-fsmp1a-u-boot.dtsi 文件,调整启动通道。

修改如下内容:

在这里插入图片描述

在这里插入图片描述

重新编译烧写后启动信息对比前文多一个 MMC:

在这里插入图片描述

注:如果想pC烧录完整SD卡镜像:

sudo parted -s /dev/sdX mklabel msdos 
sudo fdisk /dev/sdX 
输入“p”查看当前分区
如果没有看到有相关分区,则输入“n”创建一个分区
选择“p”默认选项创建主分区。
分区号选择默认“1”
起始扇区选择默认“2048”
结束扇区直接回车默认即可。
再次输入“p”查看分区
之后输入“w”保存分区
修改格式为FAT32
sudo fdisk /dev/sdX 
输入t   给分区选一个格式,是linux还是FAT32
Selected partition 1  //选择第一个分区,设定格式
Hex code (type L to list codes): l  //显示可以设定的格式  很多这里不列 比如:FAT32-->b  Linux-->83
Hex code (type L to list codes): b   //做FAT32
Command (m for help): w    //好的,将其保存
sudo mkdosfs /dev/sdX1  //格式化FAT32
SD卡连接主机,格式化即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值