STM32MP157内核移植相关bug

STM32MP157 官方Linux5.15内核移植相关bug


一、主频问题

  在初学STM32MP157驱动开发时,笔者曾对官方最新版的Linux内核进行了移植,但是因为一些问题,导致移植后的系统存在一些bug。最近笔者又重新对这部分做了一些了解,发现了一些问题,有兴趣的可以一起探讨。
  首先是主频问题,按照相关教程对TF-A和U-Boot进行移植后,在U-Boot中显示的芯片主频为650MHz。笔者使用了很多方法尝试修复,比如在U-Boot的设备树中修改 PLL 倍频、去除U-Boot中的pmic电源芯片验证、ADC和DAC验证等,但是并没有修复。最后笔者使用非验证方式的U-Boot进行烧写,也就是将U-Boot编译产生的u-boot-spl.stm32作为fsbl,直接作为引导,将u-boot.stm32直接作为启动文件,发现可以正确识别芯片并可以使用800MHz工作频率。然后将TF-A重新加到U-Boot的头部之后就又回到650MHz。(这里也使用了多种方式进行头部验证,包括Makefile.sdk直接编译出fip和metadata、使用fiptool手动合成等等),所以笔者猜测在TF-A中还是存在某些验证方式,例如pmic芯片验证、ADC输入电压采样验证等,导致芯片无法正确工作。
  后续笔者又采取了一些方式尝试修复:

  • 1.使用旧版本的TF-A编译出BL32,作为新版本U-Boot的头部验证
    这种方式会出现BL32无法正确引导BL33(也就是U-Boot)的现象,具体表现为开机进入BL32(SP_MIN方式)后一直重启,无法正确加载U-Boot。
  • 2.按照官方手册,将新版U-Boot的xxxx-fw-config.dts编译出.dtb设备树文件,作为TF-A的配置文件,然后编译出头部信息添加。
    这种方式也没法修复主频bug。

最后将正点原子官方的出厂镜像进行烧录,发现该镜像在启动时直接跳过了头部信息验证。
在这里插入图片描述
这里就要提一下V2.6版本的官方移植包问题,此版本在官方的开发手册中,原则上应该先对U-Boot进行编译,得到u-boot-nodtb.bin文件和u-boot.dtb文件,然后再生成u-boot-trusted.dtb,作为TF-A的输入配置,之后再编译TF-A,得到fip-tf-a-trusted.bin文件和metadata.bin文件,其中fip-tf-a-trusted.bin就是SP_MIN验证信息和U-Boot的结合,metadata.bin则是对此文件的验证。

所以这里笔者猜测,如果想要修复U-Boot中的主频bug,应该使用以下方法:
1.使用原子哥的方式,直接跳过头部信息验证,也就是将TF-A与U-Boot分离开来。
这种方式也存在一些问题:其一,TF-A无法再起到验证作用,那么这部分的开发就失去了设计的意义。其二,需要对TF-A内部进行修改,目前对笔者来说难度较大。
2.修改TF-A内部的验证方式
笔者猜测,在ST提供的源码中,TF-A内部应该存在某种对外设的验证,当外部没有此设备时,就自动降频到安全一点的工作模式。比如前面提到的pmic芯片、ADC采样某个管脚的电压值验证等。仅是猜测,还有待验证。
3.使用官方推荐的pmic电源芯片。注:这部分仅为笔者猜测,因为国产的一些第三方的开发板与官方的板子最大的差别就是在这里,所以如果想自己做板子并移植最新版的内核,目前来看还是复刻一下最好。之后有新版本的移植方式再替换。

二、驱动开发时的头文件缺失问题

  在基于Linux-5.15的源码包进行开发时,会出现头文件缺失问题,例如<linux/ide.h>、<linux/module.h>问题,这里笔者在源码包下进行了查找,并没有查询到相关的头文件,也找不到能够兼容和替代的类似头文件。所以笔者猜测,可能是在新版本的内核中,相关的驱动开发方式有了新的变化。(也可能是官方还没移植完善就上架了,哈哈)。
  不过笔者尝试,将原子哥教程中的相关头文件,拷贝到新版本的对应目录中,编译出来的驱动也能够在5.15内核中运行,所以如果确实想用新版本开发驱动,可以暂时尝试一下此方法,之后再等待各大厂商教程的跟进。

三、结语

  笔者原以为学习完了相关教程,就能够对这些bug进行修复,结果发现还是能力不足,学海无涯,诸君共勉。以上的bug原因也仅是笔者的猜测,欢迎有兴趣的大佬们一起探讨。笔者对于Linux驱动开发的学习也到此告一段落,之后也许会找一些新的方向进行学习。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于STM32MP157的系统移植,以下是一个大致的步骤: 1. 了解硬件平台:熟悉STM32MP157的硬件特性和主要组件,包括处理器核心、外设、存储器等。 2. 准备开发环境:安装交叉编译工具链和相关开发工具,例如GCC编译器、Make工具等。 3. 获取源代码:从STMicroelectronics官方网站下载适用于STM32MP157的Linux发行版源代码。这些源代码包含了内核、设备树、驱动程序等。 4. 配置内核:根据目标应用需求,对内核进行配置。可以通过make menuconfig命令进入配置界面,选择所需的内核功能和驱动程序。 5. 编译内核:使用交叉编译工具链编译内核源代码。可以通过make命令进行编译,并生成内核镜像文件。 6. 配置设备树:设备树描述了硬件平台的信息,包括外设的连接和配置。根据实际硬件情况,编辑设备树文件。 7. 编译设备树:使用设备树编译器(DTC)将设备树文件编译为二进制格式。 8. 准备启动介质:准备启动介质,例如SD卡或eMMC闪存。将编译好的内核镜像和设备树文件拷贝到启动介质中。 9. 配置启动参数:通过在启动介质的引导配置文件中指定内核镜像和设备树文件的路径,配置启动参数。 10. 启动系统:将启动介质插入目标硬件平台,启动系统。系统会加载内核镜像和设备树文件,完成系统初始化。 以上是一个简要的步骤概述,实际的系统移植过程中可能还涉及到其他细节和配置。具体步骤和操作可以参考STMicroelectronics官方提供的文档和开发者社区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值