This application note explain how to run M kernel PFE master and A kernel PFE slave demo without bootloader support. chinese version:
在真实的产品中,一般会使用一个基于M7_0核的bootloader来启动M和A核,这个bootloader负责所有M核和A核资源的初始化,解决M核和A核的资源冲突,并且启动M和A核。所以理论上运行M PFE Master Mcal驱动加A PFE Slave Linux驱动也是需要一个bootloader的。参考文档《S32G_Bootloader_V*》,Johnli,可以在公开community上搜索获得。
本文讨论一种简易的办法,就是:
总结:以上办法实际上是把bootloader应该做的PFE相关硬件初始化工作由Linux来完成,以便快速搭建Demo,这样客户在做真实的产品开发时,可以做为一个NXP release的标准参考。
Hello,
Is there an English version of this Demo?
updated eng. version
Hi john,
我在参考文档《S32G_Bootloader_V*》的指导下,在bootloader里添加了PFE MAC2的时钟初始化,PFE MAC2相关引脚的初始化,并在bootloader源文件中时钟初始化之前设置了RGMII模式,并且在PFE MCAL层驱动中把时钟初始化和引脚初始化相关代码注释了,上电启动代码后,通过打印能看到PFE初始化通过,但是网口就是ping不通。
在PFE MCAL层驱动中,clock初始化保留,程序启动后PFE MAC2口能ping通,可以定位到应该是时钟问题吧,但是我不知道具体是哪个时钟没有配好,下面是我在bootloader中的相关配置,您可否提供一点建议
1:你在bootloader中将PFE时钟的根源配置后,PFE自己的时钟由他自己来配置即可。
2: 在pfe自己的sample中:
在Demo代码中的调用顺序是:
\example_application\src\sample_app_ethswt_initialization.c
SampleAppInitTask
|-> Eth_43_PFE_PreInit
|-> Mcu_InitClock
|-> Serdes_Init
|-> SampleAppEthInit
| |-> Eth_43_PFE_Init
所以Eth_43_PFE_PreInit是先于Mcu_InitClock调用的,在集成文档:C:\NXP\SW32G_RTD_4.4_3.0.2\eclipse\plugins\Eth_43_PFE_TS_T40D11M09I7R0\doc\ AUTOSAR_MCAL_ETH_43_PFE_IM.pdf说明如下:
Eth_43_PFE_PreInit->Eth_PFE_LLD_InitInterfaces->
*(uint32_t *)(uintptr_t)(S32G_GPR_BASE + PFE_EMACX_INTF_SEL_OFF) |= PFE_EMACX_SET(u8EmacIdx, u8MiiMode);
当0x460a411高四位为“0000”时,表示接口为GMII or MII, “0001”时表示接口为RGMII,“0010”表示接口为SGMII。
因为大部分量产产品,会将clock初始化在bootloader中一次完成,所以相当于函数Eth_43_PFE_PreInit的实现需要由PFE驱动移植到bootloader中的Mcu_InitClock调用前,请注意。
hi john,
感谢您能回复!
PFE_PreInit是指把 *(uint32_t *)(uintptr_t)(S32G_GPR_BASE + PFE_EMACX_INTF_SEL_OFF) |= PFE_EMACX_SET(u8EmacIdx, u8MiiMode);这句话放在bootloader 程序中的Mcu_InitClock调用前对吗?“PFE自己的时钟由他自己来配置即可”具体是啥意思?应该不用在PFE应用中再去调用Mcu_InitClock了吧
这个函数的执行,需要在pfe clock inital之前执行。
hi john,
还是不行,我用的是s32g2 rdb开发板,目前没有头绪。我还有其它需要注意的地方吗
我的意思是:
你的回复“在PFE MCAL层驱动中,clock初始化保留,程序启动后PFE MAC2口能ping通”
我的回复:“1:你在bootloader中将PFE时钟的根源配置后,PFE自己的时钟由他自己来配置即可。”
这样也行,就是bootloader不需要去配置pfe mcal时钟,只保证他的源时钟配置正确就可以了。
然后pfe自己去初始化自己的时钟,在他的代码里,PFE_PreInit是在时钟初始化之前的。
hi john,
如何去配置pfe mcal时钟呢?如果在pfe程序中调用Clock_Ip_Init()这个API函数去配置时钟,相当于对整个soc的时钟树又初始化了一遍吧,当boot A核Linux镜像时,是否会发生时钟冲突?
你只要保证bootloader, pfe sample, linux中的clock配置是一模一样的,就不会冲突,后面的配置时钟函数会先读,后配置,如果读出来的值和配置值是一样的,就会直接返回,不会再操作硬件。
john,
明白了,多谢大佬宝贵时间!