作者:zzssdd2
E-mail:zzssdd2@foxmail.com
一、前言
最近在ODYSSEY-STM32MP157C板子上移植arm-trusted-firmware、u-boot以及linux(其实这个开发板官方是有提供完整的系统镜像的,重新移植的原因主要是官方镜像没有使用TF-A,而是使用Uboot-SPL替代TF-A作为FSBL启动)。本以为之前在另一块stm32mp157板子上面移植过这些东西所以应该问题不大,但是由于硬件设计的差异仍然是遇到了一些问题。最后还是花费了些时间解决问题,故写这篇笔记用来记录各环节遇到的问题及解决过程。
二、Trusted Firmware A (TF-A)
1、问题
ST官方的开发板都是使用芯片的I2C4驱动PMIC,而这块开发板是用的I2C2接口,本以为将设备树中驱动PMIC节点的i2c4部分改为i2c2,然后添加上i2c2的pinctrl信息就可以了。然而并非如此,会报如下错误:
PANIC at PC : 0x2ffeeab3
Exception mode=0x00000016 at: 0x2ffeeab3
2、原因
I2C4或I2C6被定义为安全外设,而I2C2为非安全外设。
在源码drivers/st/pmic/stm32mp_pmic.c中PMIC初始化函数调用如下:
void initialize_pmic(void)
--> initialize_pmic_i2c() //从设备树获取pmic的i2c节点信息并初始化
--> register_non_secure_pmic()
--> stm32mp_register_non_secure_periph_iomem(i2c_handle.i2c_base_addr)
--> register_periph_iomem(base, SHRES_NON_SECURE)
由于在函数register_periph_iomem中没有定义I2C_BASE导致进入panic()函数。
3、解决方法
在文件plat/st/stm32mp1/stm32mp1_def.h中定义I2C2_BASE:
#define I2C2_BASE U(0x40013000)
然后修改文件plat/st/stm32mp1/stm32mp1_shared_resources.c中的函数register_periph_iomem如下:
case UART8_BASE:
case IWDG2_BASE:
case I2C2_BASE: //添加非安全外设I2C2
/* Allow drivers to register some non-secure resources */
VERBOSE("IO for non-secure resource 0x%x\n",
(unsigned int)base);
if (state != SHRES_NON_SECURE) {
panic();
}
return;
default:
panic();
break;
三、U-Boot
1、问题
移植完成第一次进入u-boot首先出现如下提示:
invalid MAC address in OTP 00:00:00:00:00:00
Net:
Error: ethernet@5800a000 address not set.
No ethernet found.
设置ethaddr环境变量即可:
env set ethaddr 14:16:0B:0B:11:31
上面这个倒是不算问题,重点是接下来遇到的问题。在执行dhcp命令时遇到如下错误:
STM32MP> dhcp
EQOS_DMA_MODE_SWR stuckFAILED: -110STM32MP>
这显然是网卡有问题。
2、原因
查看硬件原理图以太网部分发现和ST官方的DK2开发板有些不同。官方开发板的千兆以太网(RGMII)的125MHZ时钟来自PHY芯片,而我手上这块开发板的设计默认是需要由MPU内部RCC提供125MHZ时钟。除此之外,PHY地址硬件设计上也不相同,需要修改。


在STM32MP157参考手册(RM0436)中的Figure 83对以太网时钟有详细的描述

由上图可知若要使用RCC作为125MHZ时钟来源则需要配置SYSCFG寄存器的ETH_CLK_SEL字段,除此之外还需要选择使用RCC的pll4_p_ck或是pll3_q_ck作为具体时钟来源(我选择的是PLL4P)。既然知道了问题所在,接下来就是修改代码适配硬件。
3、解决方法
首先是时钟部分的改动。因为使用了TF-A所以U-Boot配置为trusted模式,修改u-boot源码中的时钟配置是无效的,需要修改TF-A中的时钟配置。主要就是配置PLL4P输出125MHZ时钟,关于PLL的详细信息需要查阅参考手册(RM0436)的 第10章RCC(Reset and clock control) 的PLL章节。

在TF-A源码设备树的rcc节点中添加如下代码配置PLL4时钟频率:
&rcc {
......
/* VCO = 750.0 MHz => P = 125, Q = 62.5, R = 62.5 */
pll4: st,pll@3 {
compatible = "st,stm32mp1-pll";
reg = <3>;
cfg = < 3 124 5 11 11 PQR(1,1,1) >;
};
.....

本文详细记录了在ODYSSEY-STM32MP157C开发板上移植arm-trusted-firmware、u-boot、linux以及解决网络问题的过程。针对TF-A中I2C驱动PMIC问题、U-Boot的以太网初始化错误、Linux内核的PHY连接失败等进行了深入分析,并提供了相应的解决方案。此外,还提及了根文件系统启动时的错误及其修复方法。
最低0.47元/天 解锁文章
2806

被折叠的 条评论
为什么被折叠?



