文章目录
1、获取源码
ST官方TF-A、uboot、kernel 等源码下载链接为:Downloads | GNU-A Downloads – Arm Developer
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 文件
<dc { // <dc
pinctrl-names = "default", "sleep";
pinctrl-0 = <<dc_pins_a>;
pinctrl-1 = <<dc_pins_sleep_a>;
status = "okay";
修改为:
<dc { // // <dc
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卡连接主机,格式化即可