尝试移植TF-A
解压补丁文件
将压缩包解压后,查找发现没有“stm32mp15xx-dkx.dtsi”这个设备树头文件,将官方提供的压缩包使用补丁使用“for p in `ls -1 ../*.patch`; do patch -p1 < $p; done”命令解压后该文件出现。
![](https://i-blog.csdnimg.cn/blog_migrate/6d6f87cc3ef7bcb9757537561cb7b98f.png)
图1
生成副本文件
将stm32mp15xx-dkx.dtsi 和 stm32mp157a-dk1.dts 文件生成副本 stm32mp15xx-fsmp1x.dtsi 和 stm32mp157a-fsmp1a.dts;然后打开 stm32mp157a-fsmp1a.dts 将头文件修改成 stm32mp15xx-fsmp1x.dtsi 。
![](https://i-blog.csdnimg.cn/blog_migrate/45d51afabcade76bd0a740524a8e132d.png)
图2
配置交叉编译工具链
通过阅读README帮助文档可以得知需要把交叉编译工具链设置为自己所需要的,由于本次实验平台是ARM内核所以配置成arm的编译工具链,打开下载的文件顶层目录的Makefile.sdk,可以找到CROSS_COMPILE相关内容,修改为如图3所示。
![](https://i-blog.csdnimg.cn/blog_migrate/bde417cd67b7506a976ecf25a4053acf.png)
图3
配置Makefile.sdk文件
修改上层目录下的 Makefile.sdk 编译脚本在 TFA_DEVICETREE 配置项中添加 stm32mp157a-fsmp1a
![](https://i-blog.csdnimg.cn/blog_migrate/219927b64a20c41acc01731a8419203c.png)
图4
编译
通过阅读README帮助文档可以得知编译的命令为“make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157c-ev1 TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all“ 需要将
“TFA_DEVICETREE=stm32mp157c-ev1“修改为”TFA_DEVICETREE=stm32mp157a-fsmp1a“;注意一定要检查空格情况否则会出现如图5所示错误信息。
![](https://i-blog.csdnimg.cn/blog_migrate/d72140a70933242527985efc760bba7f.png)
图5
继续编译会发现出现如图6所示错误。
![](https://i-blog.csdnimg.cn/blog_migrate/5274606fb172fb710f266146c1935615.png)
图6
既然这个错误是Makefile编译的时候产生的,那么就尝试在Makefile.sdk这个文件中查找错误信息。打开tf-a源码顶层目录打开Makefile.sdk,搜索”stm32wrapper4dbg”如图7,8所示。
![](https://i-blog.csdnimg.cn/blog_migrate/7274a4c2d54ffde13dc42148e7f87f69.png)
图7
![](https://i-blog.csdnimg.cn/blog_migrate/f12e8d6288340e4ddf065d90260d11a9.png)
图8
虽然不明白是什么但是有一个共同的地方就是都有一个判断条件“$(TF_A_ENABLE_DEBUG_WRAPPER)”= ”1”,搜索变量TF_A_ENABLE_DEBUG_WRAPPER如图9所示。
![](https://i-blog.csdnimg.cn/blog_migrate/b767f3069679acfd7a22e8dcab998233.png)
可以发现这个变量被默认赋值为1,通过”'1' to generate tf-a for debugging“这句话可以得知1是设置tf-a调试的,那么我设置0是不是就不调试了,尝试修改为0再次编译,结果如图9所示。发现没有了刚才的报错,先尝试烧写到SD卡中看看现象。
![](https://i-blog.csdnimg.cn/blog_migrate/94e04095a24b50394ebda5fa4fb641ad.png)
图9
烧录
和之前移植U-BOOT相同,这里依旧使用shell脚本来实现TF卡的格式化分区以及文件的烧录;我们知道安全启动模式下是TF-A作为FSBL来引导U-BOOT(trusted版本)来完成SSBL启动,所以需要将生成的U-BOOT镜像文件也烧录进SD卡中。相关命令为
"sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb1 conv=fdatasync"
"sudo dd if=tf-a-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb2 conv=fdatasync"
"sudo dd if=u-boot-stm32mp157a-fsmp1a-trusted.stm32 of=/dev/sdb3 conv=fdatasync"
修改shell脚本如图10所示。
![](https://i-blog.csdnimg.cn/blog_migrate/3cf34d96c49b7ce6eb2222792d3cafde.png)
图10
下载到开发板串口助手打印的结果如图11所示。该错误为公版开发板电源和实验所用的电源不相匹配,接下来需要分析电源相关结点。
![](https://i-blog.csdnimg.cn/blog_migrate/59c96d746a14b9cde2211b9d0a42e933.png)
图11
修改电源相关内容
首先分析公版开发板和实验所用开发板设计电路的区别;如图12所示公版开发板采用电源管理芯片做电源管理,而本次实验采用分离电路作为电源管理,所以需要将文件中原有电源管理芯片相关内容去掉,增加上固定电源相关内容。
![](https://i-blog.csdnimg.cn/blog_migrate/4c4075b17945e92598169c5944cd297f.png)
图12(公版电源相关电路图)
打开设备树头文件 stm32mp15xx-fsmp1x.dtsi ,如图公版电源管理芯片由I2C4控制,所以需要将该文件中的I2C4相关结点全部删除,以及将电源相关结点 cpu0 cpu1全部删除,如图13,14所示。
![](https://i-blog.csdnimg.cn/blog_migrate/36b86805620cc7642f0b61a208a328e2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b19f87ee74539374b2c6092d7dfe1271.png)
图13
![](https://i-blog.csdnimg.cn/blog_migrate/86df265a163730789d9759f27281cb3a.png)
图14
添加上该实验板所需要的设备树结点,如图15所示。
![](https://i-blog.csdnimg.cn/blog_migrate/b69209d671ca690584cad742276e0b0d.png)
图15
测试
最后烧写进SD卡,实验结果如图16所示。可以发现可以正常启动U-BOOT,移植成功。
![](https://i-blog.csdnimg.cn/blog_migrate/a0971dec467fd5c8ff8e404415a71ba0.png)
图16