Linux第28步_编译“正点原子的TF-A源码”

编译“正点原子的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回车”,列出当前目录下所有的文件和文件夹

见下图:

Linux第28步_编译“正点原子的TF-A源码”_第1张图片

3、双击“FileZilla Client.exe”,打开FTP客户端,点击01、程序源码\01、正点原子Linux出厂系统源码\tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2。

Linux第28步_编译“正点原子的TF-A源码”_第2张图片

4、将“tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2”拖到“alientek_tf-a”目录下。

Linux第28步_编译“正点原子的TF-A源码”_第3张图片

5、输入“cd alientek_tf-a回车”,切换到“alientek_tf-a”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹

见下图: 

Linux第28步_编译“正点原子的TF-A源码”_第4张图片

6、输入“tar -xvf tf-a-stm32mp-2.2.r1-g212d381-v1.4.tar.bz2回车”,解压

Linux第28步_编译“正点原子的TF-A源码”_第5张图片

7、输入“ls回车”,列出当前目录下所有的文件和文件夹 ,发现有一个“Makefile.sdk”,这是编译TF-A将要用到的Makefile文件。

Linux第28步_编译“正点原子的TF-A源码”_第6张图片 8、输入“vim Makefile.sdk回车”,使用vim命令打开已有的“Makefile.sdk”文件

 Linux第28步_编译“正点原子的TF-A源码”_第7张图片

9、将“arm-ostl-linux-gnueabi-”改为“arm-none-linux-gnueabihf-”,见下图: 

Linux第28步_编译“正点原子的TF-A源码”_第8张图片

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线程编译

Linux第28步_编译“正点原子的TF-A源码”_第9张图片12、等待编译完成。

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回车”,列出当前目录下所有的文件和文件夹

见下图:

Linux第28步_编译“正点原子的TF-A源码”_第10张图片

Linux第28步_编译“正点原子的TF-A源码”_第11张图片 正点原子STM32MP157开发板使用的主控型号是STM32MP157DAA1,所以我们在移植的时候,需要参考的对象就是stm32mp157d-ev1

tf-a-stm32mp157d-ev1.stm32和“tf-a-stm32mp157d-ev1-trusted.stm32”的内容完全相同,后者是由前者重命名得到的,因此,我们在烧写的时候使用tf-a-stm32mp157d-ev1-trusted.stm32即可

Linux第28步_编译“正点原子的TF-A源码”_第12张图片

二、复制正点原子的“设备树文件”和“设备树头文件 

 打开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回车”,列出当前目录下所有的文件和文件夹;

Linux第28步_编译“正点原子的TF-A源码”_第13张图片由于设备树文件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回车”,列出当前目录下所有的文件和文件夹;

见下图:

Linux第28步_编译“正点原子的TF-A源码”_第14张图片由于设备树头文件“stm32mp15xx-edx.dtsi”是edx系列开发板的设备树通用头文件,它和板子有关,不同的板子,对应的板子头文件也不同,所以我们必须以stm32mp15xx-edx.dtsi为蓝本,创建我们自己开发板的“设备树文件的头文件”

4、输入“cp stm32mp15xx-edx.dtsi   stm32mp157d-atk.dtsi回车”,以stm32mp15xx-edx.dtsi为蓝本,创建我们自己开发板的设备树文件的头文件stm32mp157d-atk.dtsi

输入“ls回车”,列出当前目录下所有的文件和文件夹;

见下图:

Linux第28步_编译“正点原子的TF-A源码”_第15张图片

三、修改正点原子的“设备树文件stm32mp157d-atk.dts 

1、在Ubuntu中,使用VSCode打开文件“stm32mp157d-atk.dts”,准备修改设备树文件“stm32mp157d-atk.dts”。

将第12行改为: #include "stm32mp157d-atk.dtsi"。

Linux第28步_编译“正点原子的TF-A源码”_第16张图片

2、双击设备树文件“stm32mp157d-atk.dts”,打开这个文件

Linux第28步_编译“正点原子的TF-A源码”_第17张图片3、将设备树头文件“stm32mp15xx-edx.dtsi”修改为“stm32mp157d-atk.dtsi”后,点击“文件”,然后点击“保存”,如下图:

Linux第28步_编译“正点原子的TF-A源码”_第18张图片4、输入“cd ..回车”,回到“tf-a-stm32mp-2.2.r1”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹;

输入“cd ..回车”,回到“alientek_tf-a”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹;

输入“vim Makefile.sdk回车”,使用vim打开Makefile.sdk。

Linux第28步_编译“正点原子的TF-A源码”_第19张图片5、在打开Makefile.sdk文件中, 在TFA_DEVICETREE配置项中添加“stm32mp157d-atk”,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第20张图片

6、按“ESC键”+“:wq键”,保存退出。

7、输入“cd tf-a-stm32mp-2.2.r1/回车”,进入到 tf-a源码目录下

输入“make -f ../Makefile.sdk all回车”, 执行编译 '-f'的意思是重新指定Makefile。

Linux第28步_编译“正点原子的TF-A源码”_第21张图片8、输入“cd ..回车”,回到“alientek_tf-a”目录下

输入“ls回车”,列出当前目录下所有的文件和文件夹;

输入“cd build/回车”,切换到“build”目录下;

输入“ls回车,列出当前目录下所有的文件和文件夹;

输入“cd trusted/回车”,切换到“trusted”目录下;

输入“ls回车”,查看“trusted”目录中是否生成“tf-a-stm32mp157d-atk.bin

Linux第28步_编译“正点原子的TF-A源码”_第22张图片

在下图中,我们发现生成“tf-a-stm32mp157d-atk.bin”,真的很开心。

Linux第28步_编译“正点原子的TF-A源码”_第23张图片

 四、修改正点原子的“设备树头文件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下。见下图:

Linux第28步_编译“正点原子的TF-A源码”_第24张图片

2)、删除“第 54~281行的全部内容”,即删除STPMIC1A芯片的相关描述。 

Linux第28步_编译“正点原子的TF-A源码”_第25张图片

删除后,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第26张图片

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个节点,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第27张图片

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”这个节点,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第28张图片

2)、将usbotg_hs节点改为如下:

&usbotg_hs {

phys = <&usbphyc_port1 0>;

phy-names = "usb2-phy";

usb-role-switch;

status = "okay";

};

Linux第28步_编译“正点原子的TF-A源码”_第29张图片

3)、添加一个名为“usbphyc”的节点,内容如下:

&usbphyc {

status = "okay";

};

见下图:

Linux第28步_编译“正点原子的TF-A源码”_第30张图片

、编译

Makefile.sdk是编译TF-A要用到的Makefile。

1)、输入“vim Makefile.sdk回车”,打开Makefile.sdk文件,找到“TFA_DEVICETREE”,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第31张图片

 2)、将 TFA_DEVICETREE修改为“stm32mp157d-atk”,也就是正点原子开发板对应的设备树。见下图:

Linux第28步_编译“正点原子的TF-A源码”_第32张图片

3)、按“ESC键”+“:wq键”,保存退出。

4)、使用终端进入/linux/atk-mp1/alientek_tf-a/tf-a-stm32mp-2.2.r1目录

5)、输入“make -f ../Makefile.sdk all回车”, 执行编译 '-f'的意思是重新指定Makefile。编译后见下图:

Linux第28步_编译“正点原子的TF-A源码”_第33张图片 6)、检查生成的bin文件

输入“cd ..回车”,返回到“alientek_tf-a”目录

输入“ls回车”,列出当前目录下所有的文件和文件夹;

输入“cd build/回车”,切换到“build”目录下;

输入“ls回车”,列出当前目录下所有的文件和文件夹;

输入“cd trusted/回车”,切换到“trusted”目录下;

输入“ls -l回车”,查看是否生成tf-a-stm32mp157d-atk-trusted.stm32文件,也就是TF-A文件

Linux第28步_编译“正点原子的TF-A源码”_第34张图片

7)、找到tf-a-stm32mp157d-atk-trusted.stm32文件,即TF-A文件,见下图:

Linux第28步_编译“正点原子的TF-A源码”_第35张图片

为了将TF-A文件tf-a-stm32mp157d-atk-trusted.stm32烧写到EMMC、NAND、SD卡里,还需要tf-a-stm32mp157d-atk-serialboot.stm32u-boot.stm32这两个文件。

tf-a-stm32mp157d-atk-serialboot.stm32用来初始化USBDDR等外设,然后才可运行ubootuboot会初始化EMMCNAND等外设,同时还可以提供强大的EMMC操作指令。

 至此,我们完成编译“正点原子的TF-A源码”,得到了我们想得到TF-A文件,即“tf-a-stm32mp157d-atk-trusted.stm32”。

你可能感兴趣的:(产品研发,linux,经验分享,STM32MP157,设备树,TF-A)