STM32MP157开发板调试笔记

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

作者:zzssdd2
E-mail:zzssdd2@foxmail.com

一、前言

​ 最近在ODYSSEY-STM32MP157C板子上移植arm-trusted-firmwareu-boot以及linux(其实这个开发板官方是有提供完整的系统镜像的,重新移植的原因主要是官方镜像没有使用TF-A,而是使用Uboot-SPL替代TF-A作为FSBL启动)。本以为之前在另一块stm32mp157板子上面移植过这些东西所以应该问题不大,但是由于硬件设计的差异仍然是遇到了一些问题。最后还是花费了些时间解决问题,故写这篇笔记用来记录各环节遇到的问题及解决过程。

二、Trusted Firmware A (TF-A)

版本:arm-trusted-firmware-2.2-stm32mp-r2.3

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

版本:u-boot-2020.01-stm32mp-r2.2

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) >;
	};
    .....
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值