安装虚拟机软件 VMware或者使用WSL。安装 Ubuntu 操作系统,如果使用VMware需要在虚拟机中安装 VMware tools 在Ubuntu 和本地 Windows 之间复制粘贴一些文件。 要安装 VMware Tools。
安装GCC 工具:sudo apt-get install build-essential
.
Ubuntu 和 Windows 文件互传:(1)、开启 Ubuntu 下的 FTP 服务:打开 Ubuntu 的终端窗口,然后执行如下命令来安装 FTP 服务:sudo apt-get install vsftpd
等待软件自动安装,安装完成以后使用如下 VI 命令打开/etc/vsftpd.conf,命令如下:sudo vi /etc/vsftpd.conf
打开以后 vsftpd.conf
文件以后找到如下两行:local_enable=YES``write_enable=YES
确保上面两行前面没有“#”,有的话就取消掉,修改完 vsftpd.conf 以后保存退出,使用如下命令重启 FTP 服务:sudo /etc/init.d/vsftpd restart
。(2)、Windows 下 FTP 客户端安装Windows 下 FTP 客户端我们使用 FileZilla,这是个免费的 FTP 客户端软件,可以在 FileZilla官网下载,下载地址如下:https://www.filezilla.cn/download。
NFS 服务:后面进行 Linux 驱动开发的时候需要 NFS 启动,因此要先安装并开启 Ubuntu 中的 NFS 服务,使用如下命令安装 NFS 服务:sudo apt-get install nfs-kernel-server rpcbind
。配置 nfs,使用如下命令打开 nfs 配置文件/etc/exports:sudo vi /etc/exports
,打开/etc/exports 以后在后面添加如下所示内容:/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)
,重启 NFS 服务,使用命令如下:sudo /etc/init.d/nfs-kernel-server restart
。
SSH 服务:Ubuntu 下使用如下命令开启 SSH 服务:sudo apt-get install openssh-server
,上述命令安装 ssh 服务,ssh 的配置文件为/etc/ssh/sshd_config,使用默认配置即可。
交叉编译工具链安装
推荐了两款通用交叉编译器,一个是 ARM 官方出品的:gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf,一个是 linaro 出品的:gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz,下载 ARM 官方出品的交叉编译器,编译器下载地址如下:https://developer.arm.com/tools-and-software/open-source-software/developertools/gnu-toolchain/gnu-a/downloads. 在 Ubuntu 中创建目录:/usr/local/arm,命令如下:sudo mkdir /usr/local/arm
创建完成以后将刚刚拷贝的交叉编译器复制到/usr/local/arm 这个目录中,在终端使用命令“ cd ” 进 入 到 存 放 有 交 叉 编 译 器 的 目 录 , 然后使用如下命令将交叉编译器复制到/usr/local/arm 中:拷贝完成以后在/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-linuxgnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。修改环境变量,使用打开/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
。修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。在使用交叉编译器之前还需要安装一下其它的库,命令如下:sudo apt-get update //先更新,否则安装库可能会出错
,sudo apt-get install lsb-core lib32stdc++6 //安装库
。首先查看一下交叉编译工具的版本号,输入如下命令:arm-none-linux-gnueabihf-gcc -v
如果交叉编译器安装正确的话就会显示版本号。
CH340 串口驱动安装。
MobaXterm 软件安装:MobaXterm 是一款终端软件,下载地址:https://mobaxterm.mobatek.net/,
STM32CubeProgrammer。
STLink 驱动安装。
stm32wrapper4dbg 工具安装:我们在编译 TF-A 或者 Uboot 的时候需要用到 stm32wrapper4dbg 这个工具,否则编译会报错。ST 提供了这个工具的源码,我们需要在 Ubuntu 下编译并安装这个源码,源码的下载地址为:https://github.com/STMicroelectronics/stm32wrapper4dbg. 将源码压缩包拷贝到 Ubuntu 下,然后进行解压,命令如下:unzip stm32wrapper4dbg-master.zip //解压
,解压完成以后就会得到一个名为“stm32wrapper4dbg-master”的文件夹,进入到此文件夹里面,然后编译并安装,命令如下:cd stm32wrapper4dbg-master //进入到此文件夹
,make //编译
编译完成以后就会得到一个名为“stm32wrapper4dbg”的工具。将编译出来的stm32wrapper4dbg 工具拷贝到 Ubuntu 的/usr/bin 目录下,命令如下:sudo cp stm32wrapper4dbg /usr/bin
拷贝完成以后就可以直接在终端中使用 stm32wrapper4dbg 这个工具了,输入如下命令查看帮助信息:stm32wrapper4dbg -s
。
安装设备树编译相关命令,输入如下命令:sudo apt-get install device-tree-compiler
。
如果windows不经过路由器连接开发板,直连开发板,或者使用WSL,下载hanewin nfs(要破解),Tftpd64,都需要关闭防火墙。
安装U-Boot编译工具:sudo apt-get install libncurses5-dev bison flex
。
安装 tftp-hpa 和 tftpd-hpa,命令如下:
sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd
上创建了一个名为 tftpboot 的目录(文件夹),注意!我们要给 tftpboot 文件夹权限,否则的话 uboot 不能从 tftpboot 文件夹里面下载文件。最后配置 tftp,新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:
server tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/zuozhongkai/linux/tftpboot/ disable = no per_source = 11 cps = 100 2 flags = IPv4 }
完了以后启动 tftp 服务,命令如下:
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY=" " TFTP_ADDRESS=":69" TFTP_OPTIONS="-l -c -s"
TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,并且要给予这些文件相应的权限。
最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
sudo apt-get install build-essential sudo apt-get install libncurses5-dev
sudo apt-get install lzop sudo apt-get install libssl-dev
sudo apt-get install u-boot-tools
ST 官方 TF-A、uboot、kernel 等源码下载链接为:https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1dev.html
登陆后下载即可。STM32MP1Dev 就是官方的源码包,里面包括 TF-A,uboot,kernel 等源码, 点击“Get Software”下载整个系统源码。
解压可得到5个源码文件夹:
文件夹 | 描述 |
---|---|
u-boot-stm32mp-2020.01-r0 | uboot 源码,版本号为 2020.01 |
linux-stm32mp-5.4.31-r0 | linux 源码,版本号为 5.4.31 |
tf-a-stm32mp-2.2.r1-r0 | tf-a 源码,版本号为 2.2,我们用到的 |
tf-a-stm32mp-ssp-2.2.r1-r0 | tf-a 源码,ssp 全称为 secure secret provisioning, 安全相关的内容,用不到。 |
optee-os-stm32mp-3.9.0.r1-r0 | optee 系统源码,版本为 3.9.0,用不到 |
共有 5 个源码,就用到前三个:u-boot-stm32mp-2020.01-r0、linux.stm32mp-5.4.31-r0 和 tf-a-stm32mp-2.2.r1-r0。也就是 TF-A、Uboot 和 Linux Kernel。传统的 linux学习中不需要 TF-A 的,只需要 uboot 和 Linux Kernel,但是 MP1 带有安全硬件,因此加入了TF-A。tf-a-stm32mp-2.2.r1-r0 支持 ST 所有的 MP1 芯片,也支持各种启动方式,例如:EMMC、NAND、NOR FLASH 等等。tf-a-stm32mp-2.2.r1-r0 里面包含了 ST 自家所有的 MP1 评估板。
TF-A 源码还不能直接使用,需要对其打补丁。补丁文件后缀为.patch,0001-st-update-v2.2-r2.0.0.patch 就是 ST 为 TF-A 官方源码做的补丁文件,补丁文件里面描述了修改源码中的哪些文件,应该添加或删除哪些代码或文件,打完补丁后的 TF-A 才是我们真正需要的。因此,打补 丁需要两个文件:
tar -vxf tf-a-stm32mp-2.2.r1-r0.tar.gz
接下来就是给 TF-A 源码打补丁,在解压好的 TF-A 的目录下运行以下命令:
cd tf-a-stm32mp-2.2.r1 //进入 TF-A 源码 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done //打补丁
上面这条命令的意思是把上一层目录下的所有“.patch”后缀的文件都通过 patch 命令打补丁到 TF-A 的源码目录,在这里就是将 001-st-update-v2.2-r2.0.0.patch 这个补丁打入到 TF-A 源码里面。( ST 提供的这个 TF-A 肯定是不能直接在正点原子的STM32MP157 开发板上运行的,需要移植和修改。)
TF-A 是有自己的 Makefile 文件的,而且真正编译的时候也是要用 TF-A自己的 Makefile。Makefile.sdk 是 ST 自己编写的,也是我们一会编译 TF-A 的时候要用到的,Makefile.sdk 里面主要定义了一些编译属性,比如要使用的交叉编译器、编译的一些选项等等,Makefile.sdk 最终会调用 TF-A 内部的 Makefile 来编译 TF-A。默认情况下 Makefile.sdk 里面使用的是 ST 官方的交叉编译器(arm-ostl-linux-gnueabi-gcc),但是我们用的是通用交叉编译器 arm-none-linux-gnueabihf-gcc,因此我们需要 Makefile.sdk,将交叉编译器改为我们目前所使用的。打开 Makefile.sdk,然后找到 CROSS_COMPILE
,将其改为“arm-none-linux-gnueabihf-
”。
准备工作都就绪以后就可以编译TF-A了,进入到目录里面,然后运行执行如下命令编译 TF-A:
cd tf-a-stm32mp-2.2.r1/ //进入 TF-A 的源码目录
make -f ../Makefile.sdk all //编译 TF-A
‘-f’的意思是重新指定 Makefile。
编译完成以后会在上一层目录,也就是 alientek_tf-a 下生成一个名为“build”的目录, build 目录下,一共有三个子目录:optee、serialboot 和 trusted, trusted 目录下就保存了 MP1 所有型号的 TF-A 固件。
文件 | 描述 |
---|---|
tf-a-stm32mp157d-ev1.bin | 使用 STM32MP157D 芯片的 EV1 开发板对应的 TF-A |
tf-a-stm32mp157d-ev1.ld | 连接信息 |
tf-a-stm32mp157d-ev1.map | 内存映射文件。 |
tf-a-stm32mp157d-ev1.stm32 | 添加好头部信息的 bin 文件,可以直接烧写到开发板中。 |
tf-a-stm32mp157d-ev1-trusted.stm32 | 和 tf-a-stm32mp157d-ev1.stm32 文件一模一样,只是重命名了一下,为了和 optee 以及 serialboot 目录下的 tfa 固件进行区分。 |
使用 STM32CubeProgrammer 将 TF-A 烧写到开发板里面,STM32CubeProgrammer 支持通 过 UART、USB、STLINK 来烧写系统。STM32CubeProgrammer 脚本文件后缀为.tsv,ST 官方也叫做 FlashLayout。
域 | 作用 |
---|---|
Opt | 选项字段,可以设置为“-”、“P”、“D”或“E” |
Id | 会根据这个 id 来决定烧写分区 |
Name | 分区名字 |
Type | 制定烧写的类型,仅 uboot 使用。 |
Device | 指定烧写的设备类型与编号,比如 emmc0、emmc1、nand0 等,如果 opt 为‘-’,那么此字段就为 none |
Offset | 分区的起始位置,如果为“boot1”表示 EMMC 的第一个分区,如果为“boot2”就表示 EMMC 第二个分区。如果是数字就表示需要偏移的字节数。 |
Binary | 要烧录的文件 |
Opt 是第一个项,此选项通过‘-’、‘P’、‘D’和‘E’这四个字符定义操作方法,首选的是‘-’和‘P’。
STM32CubeProgrammer 通过 Id 域来确定烧写方法,会通过 Id 域来识别下一个要烧写到设 备里面的二进制文件:
Id | 分区 |
---|---|
0x00 | 内部使用,用户不能使用此 ID! |
0x01 | FSBL(第一阶段拷贝),ROM 代码使用,会加载到 RAM 中 |
0x03 | SSBL,FSBL 使用,加载到 RAM 中 |
0xF1~0xFD | 虚拟分区,内部使用 |
0xF1 | 命令获取阶段。 |
0xF2 | OTP |
0xF3 | SSP |
0xF4 | PMIC NVM |
0xFE | 操作结束 |
0xFF | 复位 |
Name 域为一段字符串,也就是目标内存段的名字。
Type 域仅仅用于 uboot,用来选择需要更新的 Flash 区域:
注:×表示支持。
Type | GPT | GPT | MTD | MTD | MTD |
---|---|---|---|---|---|
SD | EMMC | NAND | NOR | RAM | |
Binary | × | × | × | × | × |
Binary(N) | ssbl | ||||
FileSystem | × | × | × | × | dtb |
System | × | × | UBI | UBI | kernel |
Rawimage | × | user data | × | × |
Device 域指定 Uboot 设备树定义的设备和索引(从 0 开始),不同的设备其设备名字和索引 不同:
首先设置开发板拨码开关,设置为 000,也就是从 USB 启动,然后复位开发板!一切准备就绪,现在可以通过 STM32CubeProgrammer将 TF-A 源码烧写到 EMMC 里面了。
我们自己编译的 TF-A 已经烧写到了开发板中,接下来就是测试一下看能不能运行,打开MobaXterm 软件,设置好与开发板连接的串口,波特率选择 115200。设置开发板拨码开关为 010,也就是从 EMMC 启动,然后复位开发板!
复制一份 stm32mp157d-ed1.dts,并命名为 stm32mp157d-atk.dts,stm32mp157d-atk.dts 就是为正点原子 STM32MP157 开发板准备的设备树。
cd fdts cp stm32mp157d-ed1.dts stm32mp157d-atk.dts //复制
第 8-13 行,头文件引用,其中第 8-11 行引用 STM32MP15X 芯片相关的 dtsi 头文件,这 些全部保留即可。
第 12 行,非常重要,“stm32mp15xx-edx.dtsi”,看名字就知道,是 edx 系列开发板的通用头 文件,适合具体板子有关的,很明显,板子不同其对应的板子头文件也不同。我们同样需要以stm32mp15xx-edx.dtsi 为蓝本,创建正点原子开发板对应的板子头文件,一会再创建。
第 20 行,stdout-path 表示标准输出,也就是设置 TF-A 信息输出路径,这里设置为 serial0,也就是串行接口 0(注意,不是 STM32MP157 的串口 0),波特率为 115200。
第 24 行,设置 serial0 对应 STM32MP157 的串口 4,所以 TF-A 会使用 STM32MP157 的串 口 4 作为信息输出接口,大家在做板子的时候最好选择串口 4 作为通信接口。最后,我们上面说了,需要以 stm32mp15xx-edx.dtsi 为蓝本,制作正点原子开发板对应的头文件,方法很简单,直接复制一份 stm32mp15xx-edx.dtsi,然后将其重命名为“stm32mp157d-atk.dtsi”,命令如下:
cd fdts cp stm32mp15xx-edx.dtsi stm32mp157d-atk.dtsi
拷贝完成以后就需要修改 stm32mp157d-atk.dts,将第 12 行改为:
#include "stm32mp157d-atk.dtsi"
修改以后的 stm32mp157d-atk.dts 文件内容如下(有缩减):
示例代码 9.2.1.1 stm32mp157d-atk.dts 文件内容
c1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2 /*
3 * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
4 * Author: Alexandre Torgue <alexandre.torgue@st.com> for
STMicroelectronics.
5 */
6 /dts-v1/;
7
8 #include "stm32mp157.dtsi"
9 #include "stm32mp15xd.dtsi"
10 #include "stm32mp15-pinctrl.dtsi"
11 #include "stm32mp15xxaa-pinctrl.dtsi"
12 #include "stm32mp157d-atk.dtsi"
13 #include <dt-bindings/soc/st,stm32-etzpc.h>
14
15 / {
16 model = "STMicroelectronics STM32MP157D eval daughter";
17 compatible = "st,stm32mp157d-ed1", "st,stm32mp157";
18
19 chosen {
20 stdout-path = "serial0:115200n8";
21 };
22
23 aliases {
24 serial0 = &uart4;
25 };
26 };
重点是修改后的第 12 行。
因为采用 ST 提供的专用 PMIC 成本太高,因此大部分 STM32MP157 核心板都是采用分离电源设计的。STPMIC1A 是一个 IIC 器件,因此就涉及到驱动问题,需要主控通过IIC 接口来配置各路电源,所以 ST 官方提供的 TF-A、uboot、linux kernel 等都会有 PMIC 驱动。但是正点原子的开发板并没有采用这个 PMIC 芯片,所以 TF-A 默认的电源配置就会出问题,这里就需要我们修改相关的文件,取消掉这个 PMIC 的相关配置。打开 stm32mp157d-atk.dtsi 文件,找到如下所以代码:
45 &i2c4 { 46 pinctrl-names = "default"; 47 pinctrl-0 = <&i2c4_pins_a>; 48 i2c-scl-rising-time-ns = <185>; 49 i2c-scl-falling-time-ns = <20>; 50 clock-frequency = <400000>; 51 status = "okay"; 52 secure-status = "okay"; 53 54 pmic: stpmic@33 { 55 compatible = "st,stpmic1"; 56 reg = <0x33>; 57 interrupts-extended = <&exti_pwr 55 IRQ_TYPE_EDGE_FALLING>; 58 interrupt-controller; 59 #interrupt-cells = <2>; 60 status = "okay"; 61 secure-status = "okay"; 62 63 regulators { 64 compatible = "st,stpmic1-regulators"; 65 buck1-supply = <&vin>; 66 buck2-supply = <&vin>; 67 buck3-supply = <&vin>; 68 buck4-supply = <&vin>; 69 ldo1-supply = <&v3v3>; 70 ldo2-supply = <&v3v3>; 71 ldo3-supply = <&vdd_ddr>; 72 ldo4-supply = <&vin>; 73 ldo5-supply = <&v3v3>; 74 ldo6-supply = <&v3v3>; 75 vref_ddr-supply = <&vin>; 76 boost-supply = <&vin>; 77 pwr_sw1-supply = <&bst_out>; 78 pwr_sw2-supply = <&bst_out>; ...... /* 省略其他内容 */ 271 272 vbus_otg: pwr_sw1 { 273 regulator-name = "vbus_otg"; 274 }; 275 276 vbus_sw: pwr_sw2 { 277 regulator-name = "vbus_sw"; 278 regulator-active-discharge = <1>; 279 }; 280 }; 281 }; 282 };
第 45 行,“i2c4”表示这段代码是和 I2C4 控制器有关的,在设备树中一个 IIC 接口下的所 有设备都“打包”放到一个节点下,在这里就是描述 I2C4 这个 IIC 控制器下的所有 IIC 器件。 ST 官方的 STM32MP157 开发板将 STPMIC1A 这个 PMIC 芯片挂到了 I2C4 下,所以 STPMIC 这个芯片的相关信息就会在“i2c4”这个节点下进行描述。
第 54~281 行,这一大段为 STPMIC1A 这颗芯片的描述信息,第 54 行是“pmic: stpmic@33”, 即使我们没有学习过设备树,但是也能看出这是和 PMIC 有关的。在这一大段代码中,描述了 STPMIC1A 各输出电源应该如何配置,比如电压应该是多少,每路电源的功能是什么等。
将 54~281 行的内容全部删除掉,也就是删除掉 STPMIC1A 芯片的相关描述。
由于我们上面把PMIC相关的信息都删除了,但是其他设备的电源信息还是要有的,只是不通过PMIC来描述了。所以需要我们自己添加一些设备的电源描述信息,大家在stm32mp157d-atk.dtsi文件里面找到“vin”节点。
将vin节点内容全部删除掉,也就是将17~23行代码删除掉,替换为下面的代码:
17 vddcore: regulator-vddcore { 18 compatible = "regulator-fixed"; 19 regulator-name = "vddcore"; 20 regulator-min-microvolt = <1200000>; 21 regulator-max-microvolt = <1350000>; 22 regulator-off-in-suspend; 23 regulator-always-on; 24 }; 25 26 v3v3: regulator-3p3v { 27 compatible = "regulator-fixed"; 28 regulator-name = "v3v3"; 29 regulator-min-microvolt = <3300000>; 30 regulator-max-microvolt = <3300000>; 31 regulator-off-in-suspend; 32 regulator-always-on; 33 }; 34 35 vdd: regulator-vdd { 36 compatible = "regulator-fixed"; 37 regulator-name = "vdd"; 38 regulator-min-microvolt = <3300000>; 39 regulator-max-microvolt = <3300000>; 40 regulator-off-in-suspend; 41 regulator-always-on; 42 }; 43 44 vdd_usb: regulator-vdd-usb { 45 compatible = "regulator-fixed"; 46 regulator-name = "vdd_usb"; 47 regulator-min-microvolt = <3300000>; 48 regulator-max-microvolt = <3300000>; 49 regulator-off-in-suspend; 50 regulator-always-on; 51 };
第 17-24 行,描述 VDDCORE 电源,也就是 STM32MP157 的内核电源,最小为 1.2V,最 大为 1.35V。
第 26~-3 行,描述 3.3V 电源,最小和最大都是 3.3V
第 35-42 行,描述 VDD 电源,这是一个 3.3V 的电源,所以最小和最大都为 3.3V
第 44-51 行,描述 VDD_USB 电源,为 3.3V,所以最小和最大都为 3.3V。
继续操作 stm32mp157d-atk.dtsi 这个文件,找到“sdmmc1”和“sdmmc2”这 2 个节点,将sdmmc1 和 sdmmc2 节点改为如下所示内容:
225 &sdmmc1 { 226 pinctrl-names = "default"; 227 pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>; 228 st,neg-edge; 229 broken-cd; 230 bus-width = <4>; 231 vmmc-supply = <&v3v3>; 232 status = "okay"; 233 }; 234 235 &sdmmc2 { 236 pinctrl-names = "default"; 237 pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>; 238 non-removable; 239 st,neg-edge; 240 bus-width = <8>; 241 vmmc-supply = <&v3v3>; 242 vqmmc-supply = <&v3v3>; 243 status = "okay"; 244 };
最后就是修改一下 USB OTG 对应的设备树节点,继续操作 stm32mp157d-atk.dtsi,找到 “usbotg_hs”这个节点,将 usbotg_hs 节点改为如下所示内容:
259 &usbotg_hs { 260 phys = <&usbphyc_port1 0>; 261 phy-names = "usb2-phy"; 262 usb-role-switch; 263 status = "okay"; 264 };
最后还需要修改“usbphyc”节点里面的“status”属性值,看起来就是向 stm32mp157d-atk.dtsi 文件里面添加了一个名为“usbphyc”的节点,内容如下:
266 &usbphyc { 267 status = "okay"; 268 };
设备树修改完成以后先编译一下 TF-A,但是编译的时候默认会编译很多 STM32MP1 开发板的 TF-A 镜像,我们可以修改 Makefile.sdk 固件,打开 Makefile.sdk 文件,将 TFA_DEVICETREE 修改为自己修改的设备树。
STM32CubeProgrammer 首先通过 USB 或串口向开发板下载stm32mp157d-atk-serialboot.stm32,名字里面有个“serialboot”,翻译过来就是串行启动,此镜像主要用于初始化 DDR,并且提供 USB 或串口功能,目的是为了进一步将 uboot 镜像下载到 DDR的指定位置,最终通过 uboot 来向外部 flash 设备烧写整个系统镜像。掌握自行编译 stm32mp157d-atk-serialboot.stm32 的方法,首先打开 Makefile.sdk,然后将 EXTRA_OEMAKE_SERIAL 改为如下内容:
EXTRA_OEMAKE_SERIAL=$(filter-out STM32MP_SDMMC=1 STM32MP_EMMC=1 STM32MP_ SPI_NOR=1 STM32MP_RAW_NAND=1 STM32MP_SPI_NAND=1,$(EXTRA_OEMAKE)) STM32MP _UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
输入如下命令编译:
cd tf-a-stm32mp-2.2.r1/ //进入到 tf-a 源码目录下 make -f ../Makefile.sdk clean //清除以前的编译 make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all //编译
编译完成以后就会在../build/serialboot 目录下生成 tf-a-stm32mp157d-atk-serialboot.stm32
编 译 生 成 tf-a-stm32mp157d-atk-serialboot.stm32 以后,../build/trusted 和../build/optee 目录就没了,也就是说只能编译 tf-astm32mp157d-atk-serialboot.stm32。一旦编译成功并测试 OK 以后,大家就不要再去修改stm32mp157d-atk-serialboot.stm32 了。如果想重新编译 tf-a-stm32mp157d-atk-trusted.stm32,那么 就按照以前的编译命令即可,不用修改 Makefile.sdk 文件!
本文作者:古月流新
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!