编译“正点原子的TF-A源码”,目的是想得到TF-A文件,即“tf-a-stm32mp157d-atk-trusted.stm32”。
在前27步的基础上,才可以学习本节内容,学习步骤如下:
1、创建“alientek_tf-a”目录;
2、复制正点原子的“设备树文件”和“设备树头文件” :
3、修改正点原子的“设备树文件stm32mp157d-atk.dts”:
4、修改正点原子的“设备树头文件stm32mp157d-atk.dtsi”:
1)修改“电源管理”设备树
2)修改“TF卡和EMMC设备树”
3)修改“USB OTG设备树”
5、编译
一、创建“alientek_tf-a”目录,用来存放“正点原子的TF-A源码”
记得我们在前面已经创建过的目录如下:
1)、在根目录下,创建一个“linux”目录
2)、在“linux” 目录下,创建一个“nfs”的文件夹,用来供nfs服务器使用,便于”我们的开发板“上通过”网络文件系统“来访问这个”nfs“文件夹。
3)、在linux目录下,创建一个”tool“文件夹,用来存放“Ubutun交叉编译工具链”,Linux系统中VSCode软件“code_1.50.1-1602600906_amd64”和“ ST公司提供的stm32wrapper4dbg工具”。
4)、在“linux”目录下创建“atk-mp1”目录;
5)、在“/linux/atk-mp1/”目录下创建“tf-a”目录;
6)、在“/linux/atk-mp1/”目录下,创建“my-tfa”目录,用来保存“ST官方的TF-A源码”;
现在我们还需要在“linux/atk-mp1/”目录下创建“alientek_tf-a”目录,用来存放正点原子修改好的TF-A源码。
1、打开终端
2、输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd linux回车”,切换到“linux”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd atk-mp1/回车”,切换到“atk-mp1”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“mkdir alientek_tf-a回车”, 在“linux/atk-mp1/”目录下新建一个名为“alientek_tf-a”目录,用来存放正点原子修改好的TF-A源码。
输入“ls回车”,列出当前目录下所有的文件和文件夹
见下图:
3、双击“FileZilla Client.exe”,打开FTP客户端,点击01、程序源码\01、正点原子Linux出厂系统源码\tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2。
4、将“tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2”拖到“alientek_tf-a”目录下。
5、输入“cd alientek_tf-a回车”,切换到“alientek_tf-a”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
见下图:
6、输入“tar -xvf tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2回车”,解压
7、输入“ls回车”,列出当前目录下所有的文件和文件夹 ,发现有一个“Makefile.sdk”,这是编译TF-A将要用到的Makefile文件。
8、输入“vim Makefile.sdk回车”,使用vim命令打开已有的“Makefile.sdk”文件
9、将“arm-ostl-linux-gnueabi-”改为“arm-none-linux-gnueabihf-”,见下图:
10、按“ESC键”+“:wq键”,保存退出。
11、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到 tf-a源码目录tf-a-stm32mp-2.2.r1下
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
如果需要加快编译速度,可是使用多线程编译,线程数量最好和自己给虚拟机分配的物理核心保持一致,使用-j来指定线程数,命令如下:
make -f ../Makefile.sdk -j8 all //使用8线程编译
13、重新打开终端,查询“atk-mp1/alientek_tf-a/build/trusted”目录下有哪些文件,按照下图输入命令。
打开新的终端
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd linux/回车”,切换到“linux”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd atk-mp1/回车”,切换到“atk-mp1”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd alientek_tf-a/回车”,切换到“alientek_tf-a”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd build/回车”,切换到“build”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd trusted/回车”,切换到“trusted”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
见下图:
正点原子STM32MP157开发板使用的主控型号是STM32MP157DAA1,所以我们在移植的时候,需要参考的对象就是stm32mp157d-ev1。
“tf-a-stm32mp157d-ev1.stm32”和“tf-a-stm32mp157d-ev1-trusted.stm32”的内容完全相同,后者是由前者重命名得到的,因此,我们在烧写的时候使用tf-a-stm32mp157d-ev1-trusted.stm32即可。
二、复制正点原子的“设备树文件”和“设备树头文件”
打开linux\atk-mp1\alientek_tf-a\tf-a-stm32mp-2.2.r1\fdts目录, fdts目录下保存的就是所有开发板设备树文件,其中就包括了STM32MP1系列的。
1、重新打开终端
2、 输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd linux/回车”,切换到“linux”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd atk-mp1/回车”,切换到“atk-mp1”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd alientek_tf-a/回车”,切换到“alientek_tf-a”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd tf-a-stm32mp-2.2.r1/回车”,切换到“tf-a-stm32mp-2.2.r1”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹
输入“cd fdts/回车”,切换到“fdts”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹;
由于设备树文件stm32mp157d-ev1.dts引用了“stm32mp157d-ed1.dts”,其主要工作是由 stm32mp157d-ed1.dts文件来完成的。因此,我们以stm32mp157d-ed1.dts为蓝本,复制一份stm32mp157d-ed1.dts,并命名为stm32mp157d-atk.dts,这就是我们为开发板准备的“设备树文件”。
3、输入“cp stm32mp157d-ed1.dts stm32mp157d-atk.dts回车”,以stm32mp157d-ed1.dts为蓝本,复制一份stm32mp157d-ed1.dts,并命名为stm32mp157d-atk.dts,这就是我们为开发板准备的“设备树文件”。
输入“ls回车”,列出当前目录下所有的文件和文件夹;
见下图:
由于设备树头文件“stm32mp15xx-edx.dtsi”是edx系列开发板的设备树通用头文件,它和板子有关,不同的板子,对应的板子头文件也不同,所以我们必须以stm32mp15xx-edx.dtsi为蓝本,创建我们自己开发板的“设备树文件的头文件”。
4、输入“cp stm32mp15xx-edx.dtsi stm32mp157d-atk.dtsi回车”,以stm32mp15xx-edx.dtsi为蓝本,创建我们自己开发板的设备树文件的头文件stm32mp157d-atk.dtsi。
输入“ls回车”,列出当前目录下所有的文件和文件夹;
见下图:
三、修改正点原子的“设备树文件”stm32mp157d-atk.dts:
1、在Ubuntu中,使用VSCode打开文件“stm32mp157d-atk.dts”,准备修改设备树文件“stm32mp157d-atk.dts”。
将第12行改为: #include "stm32mp157d-atk.dtsi"。
2、双击设备树文件“stm32mp157d-atk.dts”,打开这个文件
3、将设备树头文件“stm32mp15xx-edx.dtsi”修改为“stm32mp157d-atk.dtsi”后,点击“文件”,然后点击“保存”,如下图:
4、输入“cd ..回车”,回到“tf-a-stm32mp-2.2.r1”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹;
输入“cd ..回车”,回到“alientek_tf-a”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹;
输入“vim Makefile.sdk回车”,使用vim打开Makefile.sdk。
5、在打开Makefile.sdk文件中, 在TFA_DEVICETREE配置项中添加“stm32mp157d-atk”,见下图:
6、按“ESC键”+“:wq键”,保存退出。
7、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到 tf-a源码目录下
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
8、输入“cd ..回车”,回到“alientek_tf-a”目录下
输入“ls回车”,列出当前目录下所有的文件和文件夹;
输入“cd build/回车”,切换到“build”目录下;
输入“ls回车,列出当前目录下所有的文件和文件夹;
输入“cd trusted/回车”,切换到“trusted”目录下;
输入“ls回车”,查看“trusted”目录中是否生成“tf-a-stm32mp157d-atk.bin”
在下图中,我们发现生成“tf-a-stm32mp157d-atk.bin”,真的很开心。
四、修改正点原子的“设备树头文件stm32mp157d-atk.dtsi”:
1、修改“电源管理”设备树
ST官方 STM32MP157开发板用到了一颗PMIC芯片,型号为STPMIC1A,PMIC全称为 全称为 Power Management IC,也就是集成电源管理芯片。
Cortex-A系列芯片主电源一般要求3.3V,但是芯片内核电压可能需要1.2V,而外扩的DDR3L芯片工作电压是1.35V,DDR3L芯片的端接电压要求0.65V,USB工作电压又要求5V等,也就是说随着SOC功能越来强大,所需要的电源要求也越来越高,最直观就是源种类很多。
STPMIC1A是ST专门为专门为 STM32MP1系列设计的专用PMIC,此 PMIC芯片性能非常强大:
· 输入电压2.8V~5.5V。
· 4路可调的通用LDO输出。
· 1路DDR3端接LDO电源。
· 1路USB PHY所使用的LDO电源。
· 1路 DDR参考电压LDO电源。
· 4路可调的BUCK开关电源。
· 1路 5.2V/1.1A的 BOOST开关电源。
· 1路 500mA的 USB OTG电源。
· 1路 500mA/1000mA的通用电源。
· 此芯片有一个IIC接口,主控通过IIC接口来配置电源芯片,设每一路输出电源的输出电压,开启时间等。
STPMIC1A是一个IIC器件,因此就涉及到驱动问题,需要主控通过IIC接口来配置各路电源,所以ST官方提供的TF-A、uboot、linux kernel等都会有PMIC驱动。 但是正点原子的开发板并没有采用这个PMIC芯片,所以TF-A默认的电源配置就会出问题,这里就需要我们修改相关的文件,取消掉这个PMIC的相关配置。
1)、在Ubuntu中,使用VSCode打开“设备树头文件”stm32mp157d-atk.dtsi。
ST官方的STM32MP157开发板将STPMIC1A这个 PMIC芯片挂到了I2C4下。见下图:
2)、删除“第 54~281行的全部内容”,即删除STPMIC1A芯片的相关描述。
删除后,见下图:
3)、删除“vin节点的全部内容”,也就是将 17~23行代码删除掉,替换为下面的代码:
vddcore: regulator-vddcore {
compatible = "regulator-fixed";
regulator-name = "vddcore";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1350000>;
regulator-off-in-suspend;
regulator-always-on;
};
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: 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: 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;
};
至此,“电源管理设备树”修改完成了,此时不要编译,会报错。因为USB OTG节点是引用的以前相关电源设置,所以编译会报错。等修改好USB OTG设备节点以后,就可编译了。
2、修改“TF卡和EMMC设备树”
1)、找到“sdmmc1”和“sdmmc2”这 2个节点,见下图:
2)、将sdmmc1和 sdmmc2节点改为如下:
&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节点是引用的以前相关电源设置,所以编译会报错。等修改好USB OTG设备节点以后,就可编译了。
3、修改“USB OTG设备树”
1)、找到“usbotg_hs”这个节点,见下图:
2)、将usbotg_hs节点改为如下:
&usbotg_hs {
phys = <&usbphyc_port1 0>;
phy-names = "usb2-phy";
usb-role-switch;
status = "okay";
};
3)、添加一个名为“usbphyc”的节点,内容如下:
&usbphyc {
status = "okay";
};
见下图:
五、编译
Makefile.sdk是编译TF-A要用到的Makefile。
1)、输入“vim Makefile.sdk回车”,打开Makefile.sdk文件,找到“TFA_DEVICETREE”,见下图:
2)、将 TFA_DEVICETREE修改为“stm32mp157d-atk”,也就是正点原子开发板对应的设备树。见下图:
3)、按“ESC键”+“:wq键”,保存退出。
4)、使用终端进入/linux/atk-mp1/alientek_tf-a/tf-a-stm32mp-2.2.r1目录
5)、输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。编译后见下图:
输入“cd ..回车”,返回到“alientek_tf-a”目录
输入“ls回车”,列出当前目录下所有的文件和文件夹;
输入“cd build/回车”,切换到“build”目录下;
输入“ls回车”,列出当前目录下所有的文件和文件夹;
输入“cd trusted/回车”,切换到“trusted”目录下;
输入“ls -l回车”,查看是否生成tf-a-stm32mp157d-atk-trusted.stm32文件,也就是TF-A文件。
7)、找到tf-a-stm32mp157d-atk-trusted.stm32文件,即TF-A文件,见下图:
为了将TF-A文件“tf-a-stm32mp157d-atk-trusted.stm32”烧写到EMMC、NAND、SD卡里,还需要tf-a-stm32mp157d-atk-serialboot.stm32和 u-boot.stm32这两个文件。
tf-a-stm32mp157d-atk-serialboot.stm32用来初始化USB、DDR等外设,然后才可运行uboot。uboot会初始化EMMC、NAND等外设,同时还可以提供强大的EMMC操作指令。
至此,我们完成编译“正点原子的TF-A源码”,得到了我们想得到TF-A文件,即“tf-a-stm32mp157d-atk-trusted.stm32”。