本人使用的开发板是华清远见的FS-MP1D,最近在尝试自己做板子,然后移植驱动、固件等代码,把遇到的一些列问题在这里做记录,与大家一起分享交流。
一、我是最近跟着华清远见的教程一步步把所有的固件都重新编译和烧录,最后发现根据源码重新编译的其他固件都可以正常替换华清提供的《系统镜像》,只有tf-a-stm32mp157a-fsmp1d-serialboot.stm32这个固件替换后,在用STM32 Cube Prog烧录时,串口会报错。错误如下:
ERROR: Boot interface 6 not supported
![](https://i-blog.csdnimg.cn/blog_migrate/7ab0d643d4d03a8f5cd614c96fbd30e1.jpeg)
补充下我的平台:
开发板:华清远见FS-MP1D
主机:Ubuntu18.04(win11下虚拟机)
交叉编译器:3.1-openstlinux-5.4-dunfell-mp1-20-06-24
3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17
试过两个版本都可以
tf-A源码版本:fsmp1x-trusted-firmware-2.2
二、网上可供参考的解决方案很少。我先是在ST官网上看到如下的说法,
![](https://i-blog.csdnimg.cn/blog_migrate/34e0862ebc0447f02c6b3f3d064088d3.png)
然后,我去看了TF-A源码目录下的Makefile.sdk,发现确实有这个参数,而且是已经配置好了的,如下图,看上去没什么问题。
EXTRA_OEMAKE_SERIAL= STM32MP_UART_PROGRAMMER=1 STM32MP_USB_PROGRAMMER=1
![](https://i-blog.csdnimg.cn/blog_migrate/c534e2f84e4d1196ff8f74426b9a9a55.png)
在make -f$PWD/../Makefile.sdk all -j的时候,也不会报错,能够正常编译出stm32mp157a-fsmp1d-serialboot.stm32固件,问题是无法用于烧录。
三、到这里没有新的思路了,又去查找相关资料,皇天不负有心人,最终我在原子的教程中找到有效的解决办法,下面展开说明一下。
![](https://i-blog.csdnimg.cn/blog_migrate/5c25e5c870c2ce1f7a571f598d0accae.png)
按照原子的说法,修改Makefile.sdk中EXTRA_OEMAKE_SERIAL的配置如下。
![](https://i-blog.csdnimg.cn/blog_migrate/b6b9433454cd08b84344a87093995d85.png)
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
四、一开始,我是用的make -f$PWD/../Makefile.sdk all -j指令去编译的,然后发现编译出的serialboot.stm32固件在烧录时还是会报错。。。抱着死马当活马医的想法,用原子的指令试了一下,发现竟然可以了!看来serialboot.stm32这个固件需要单独编译才可以。
cd tf-a-stm32mp-2.2.r1/ //进入到 tf-a 源码目录下
make -f ../Makefile.sdk clean //清除以前的编译
make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1d TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all -j//编译
总结:
(1)tf-a-xxxx-serialboot.stm32固件是一个串行启动固件,只在通过STM32 Cube Prog烧录镜像的时候会用到。原理如下:STM32CubeProgrammer 首先通过 USB 或串口向开发板下载serialboot.stm32,名字里面有个“serialboot”,翻译过来就是串行启动,此镜像主要用于初始化 DDR,并且提供 USB 或串口功能,目的是为了进一步将 uboot 镜像下载到 DDR的指定位置,最终通过 uboot 来向外部 flash 设备烧写整个系统镜像。
(2)tf-a-xxxx-serialboot.stm32和tf-a-xxxx-trusted.stm32还有uboot-xxxx-trusted.stm32在修改或移植后一般需要同步更新,但是经测试,发现serialboot.stm32需要clean后单独编译,不然会报错!
用上面的方法编译出的serialboot.stm32固件如下,
![](https://i-blog.csdnimg.cn/blog_migrate/b641a10122d519a964321663ddb583d9.png)
五、烧录测试,STM32 Cube Prog更新tf-a-xxxx-serialboot.stm32和tf-a-xxxx-trusted.stm32还有uboot-xxxx-trusted.stm32五个分区,烧录成功,串口不再报错。完毕。
![](https://i-blog.csdnimg.cn/blog_migrate/354676de4433a36eb5552d91680bb287.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d518180535efcb0bc162071d20aa85bc.png)
六、参考文献
[1].STM32MP1 bring-up troubleshooting guide
[2].《STM32MP157嵌入式Linux驱动开发指南》第九章 TF-A移植 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)
[3].Building a Linux system for the STM32MP1: implementing factory flashing - Bootlin's blog