在虚拟机中,使用VSCode打开linux /atk-mp1/atk-mp1/my-tfa/目录下tf-a.code-workspace”;
找到“tf-a-stm32mp-2.2.r1/fdts”目录,就是设备树文件所在的目录。
见下图:
一、修改“stm32mp157d-atk.dts”
修改后,见下图:
二、修改设备树中的电源管理
由于正点原子STM32MP157开发板没有使用“STPMIC1A”这个电源管理芯片,所以,要修改电源管理。ST公司的STM32MP157 EVK开发板将STPMIC1A芯片挂到了I2C4下,在设备树头文件中,我们要修改节点“i2c4”。
1、打开设备树头文件“stm32mp157d-atk.dtsi”,将“54~281行之间的代码”全部删除掉,就相当于删除掉“STPMIC1A”这个芯片的相关描述了。
见下图:
2、在“stm32mp157d-atk.dtsi”文件里,面找到“vin节点”,见下图:
3、删除掉“vin节点”的内容,替换为下面的代码:
//描述VDDCORE电源,也就是STM32MP157的内核电源,最小为为1.2V,最大为1.35V
vddcore: regulator-vddcore {
compatible = "regulator-fixed";
regulator-name = "vddcore";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1350000>;
regulator-off-in-suspend;
regulator-always-on;
};
//描述3.3V电源,最小和大都是3.3V
v3v3: regulator-3p3v {
compatible = "regulator-fixed";
regulator-name = "v3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-off-in-suspend;
regulator-always-on;
};
//描述vdd电源,最小和大都是3.3V
vdd: regulator-vdd {
compatible = "regulator-fixed";
regulator-name = "vdd";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-off-in-suspend;
regulator-always-on;
};
//描述vdd_usb电源,最小和大都是3.3V
vdd_usb: regulator-vdd-usb {
compatible = "regulator-fixed";
regulator-name = "vdd_usb";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-off-in-suspend;
regulator-always-on;
};
见下图:
至此,设备树中的电源管理修改完成了。
三、修改TF卡和EMMC设备树
1、打开设备树头文件“stm32mp157d-atk.dtsi”,找到“sdmmc1”节点和“sdmmc2”节点。
见下图:
2、修改“TF卡和EMMC设备树”后的内容为:
&sdmmc1 {
pinctrl-names = "default";
pinctrl-0 = <&sdmmc1_b4_pins_a &sdmmc1_dir_pins_a>;
st,neg-edge;
broken-cd;
bus-width = <4>;
vmmc-supply = <&v3v3>;
status = "okay";
};
&sdmmc2 {
pinctrl-names = "default";
pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
non-removable;
st,neg-edge;
bus-width = <8>;
vmmc-supply = <&v3v3>;
vqmmc-supply = <&v3v3>;
status = "okay";
};
修改“TF卡和EMMC设备树”后结果,见下图:
四、修改USB OTG设备树
1、打开设备树头文件“stm32mp157d-atk.dtsi”,找到“usbotg_hs”节点。
见下图:
2、修改“usbotg_hs”节点的内容如下:
&usbotg_hs {
phys = <&usbphyc_port1 0>;
phy-names = "usb2-phy";
usb-role-switch;
status = "okay";
};
见下图:
4、添加usbphyc节点,其内容如下:
&usbphyc {
status = "okay";
};
见下图:
五、修改“linux /atk-mp1/atk-mp1/my-tfa/Makefile.sdk”
1、打开终端
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd linux回车”,切换“linux”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd atk-mp1/回车”,切换“atk-mp1”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd my-tfa回车”,切换“my-tfa”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
见下图:
2、输入“vim Makefile.sdk回车”,使用vim命令打开已有的“Makefile.sdk”文件
3、将“TFA_DEVICETREE ?= stm32mp157a-dk1 stm32mp157d-dk1 stm32mp157c-dk2 stm32mp157f-dk2 stm32mp157c-ed1 stm32mp157f-ed1 stm32mp157a-ev1 stm32mp157c-ev1 stm32mp157d-ev1 stm32mp157f-ev1 stm32mp157d-atk”注释掉,只用“TFA_DEVICETREE ?= stm32mp157d-atk”,目的是:关闭多个STM32MP1开发板的TF-A镜像,只保留正点原子的开发板的TF-A镜像。
见下图:
4、按下“ESC”键,输入“:wq”,保存退出。
六、编译TF-A
1、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到“tf-a-stm32mp-2.2.r1”目录下;
输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹;
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
如果需要加快编译速度,可是使用多线程编译,线程数量最好和自己给虚拟机分配的物理核心保持一致,使用-j来指定线程数,命令如下:
make -f ../Makefile.sdk -j8 all //使用8线程编译
见下图:
2、输入“cd ..回车”,返回上层目录“my-tfa”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd build/回车”,切换“build”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd trusted/回车”,切换“trusted”目录下
输入“ls -l回车”,列出当前目录下所有的文件和文件夹
见下图:
可见,还可以看到多个STM32MP1开发板的TF-A镜像,所以要删除“build”目录和“build目录下所有文件”。
3、输入“cd ..回车”,返回上层目录“build”目录下
输入“cd ..回车”,返回上层目录“my-tfa”目录下
输入“rm build -rf回车”,删除“build”目录和“build目录下所有文件”
注意:通常用输入“make -f ../Makefile.sdk clean”,清除以前的编译;
输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到“tf-a-stm32mp-2.2.r1”目录下;
输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹;
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
如果需要加快编译速度,可是使用多线程编译,线程数量最好和自己给虚拟机分配的物理核心保持一致,使用-j来指定线程数,命令如下:
make -f ../Makefile.sdk -j8 all //使用8线程编译
见下图:
4、输入“cd ..回车”,返回上层目录“my-tfa”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd build/回车”,切换“build”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd trusted/回车”,切换“trusted”目录下
输入“ls -l回车”,列出当前目录下所有的文件和文件夹
见下图:
至此,生成了“tf-a-stm32mp157d-atk-trusted.stm32镜像文件”。
七、再次修改“linux /atk-mp1/atk-mp1/my-tfa/Makefile.sdk”
1、打开终端
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd linux回车”,切换“linux”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd atk-mp1/回车”,切换“atk-mp1”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd my-tfa回车”,切换“my-tfa”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
见下图:
2、输入“vim Makefile.sdk回车”,使用vim命令打开已有的“Makefile.sdk”文件
将“EXTRA_OEMAKE_SERIAL= STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1”注释掉
换成下面的语句:
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
见下图:
按下“ESC”键,输入“:wq”,保存退出。
八、再次编译TF-A
1、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到“tf-a-stm32mp-2.2.r1”目录下;
输入“ls回车”,列出“tf-a-stm32mp-2.2.r1”目录下所有的文件和文件夹;
输入“make -f ../Makefile.sdk clean”,清除以前的编译;
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
如果需要加快编译速度,可是使用多线程编译,线程数量最好和自己给虚拟机分配的物理核心保持一致,使用-j来指定线程数,命令如下:
make -f ../Makefile.sdk -j8 all //使用8线程编译
见下图:
2、输入“cd ..回车”,返回上层目录“my-tfa”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd build/回车”,切换“build”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd serialboot/回车”,切换“serialboot”目录下
输入“ls -l回车”,列出当前目录下所有的文件和文件夹
至此,生成了“tf-a-stm32mp157d-atk-serialboot.stm32”。
九、创建新的“tf-a.tsv”文件
1、从以前的拷贝一份“tf-a.tsv”文件,修改为新的“tf-a.tsv”文件。
路径:C:\Program Files\STMicroelectronics\images
见下图:
2、使用“Notepad++”打开“tf-a.tsv”文件
见下图:
3、修改后,见下图:
“PE”:不用更新程序,即“指定的分区”或“指定的设备”不需要烧写固件
十、烧录
打开虚拟机,使用“FileZilla Client”,将tf-a-stm32mp157d-atk-trusted.stm32和tf-a-stm32mp157d-atk-serialboot.stm32传到“C:\Program Files\STMicroelectronics\images”目录下;
1、关闭虚拟机,防止开发板连接到虚拟机
2、将开发板上拨码开关拨到“000”位置
3、将USB导线连接电脑的USB3.0接口,另外一端连接开发板的USB OTG接口;
4、将USB导线连接电脑的USB3.0接口,另外一端连接到开发板的USB TTL接口;
5、双击“STM32CubeProgrammer”图标
6、选择图中的USB,然后点击“Connect”
7、点击“刷新”,直到出现USB1,表示连接成功。
8、点击“Open file”,找到“C:\Program Files\STMicroelectronics\images”目录下“tf-a.tsv”打开。
9、点击“Browse”,打开“C:\Program Files\STMicroelectronics\images”目录。
10、点击“选择文件夹”
11、点击“Download”
12、点击“确定”
13、将拨码开关设置为“010”
14、按下开发板的“复位按钮”,重新启动开发板。
TF-A运行信息,见下图:
uboot运行信息,见下图:
至此,TF-A全部移植完成。