您好,
我发现了一个 Bug,当出现以下情况时,任何 Flexcomm UART 都会完全失效
为启用 TF-M 的 frdm_rw612/rw612/ns 构建。
根本原因:时钟驱动器使用安全 CLKCTL1 地址 (0x50021000)
启用 Flexcomm 时钟时。从 NS 世界中默默地写下这些文字
被忽视了,让外围没有了防护罩。所有 USART 寄存器的读数均为 0x00000000。
解决方法是在 UART 启动前通过 NS 别名手动启用时钟:
volatile uint32_t *clkctl1_ns = (volatile uint32_t *)0x40021000UL;
clkctl1_ns[0x508/4] = 0x01;
clkctl1_ns[0x40/4] = (1UL<< 8);
我已经在 nxp-zephyr GitHub 上提交了一份错误报告:
https://github.com/nxp-zephyr/nxp-zephyr/issues/35
有人遇到过这种情况吗?是否正在进行适当的修复?
谢谢!
你好,@chofmeister。
请与我们分享您复制这种行为的步骤。我无法通过 MCUXpresso for VS Code 使用 psa_protected_storage 示例来重现这种行为,该示例使用 TF-M 和 UART 控制台,信息正在打印,因此 UART 外设的时钟是正确的。
此外,对于 FRDM-RW612,时钟初始化是在 soc.c 文件的 clock_init 函数中完成的。
感谢您提供的链接。确认一下 - 我运行的是 4.3.0 版来自 nxp-zephyr
下游仓库,那里存在错误。
我阅读了《时钟配置》一文。据我所知,外设
时钟应在 init.c 或 soc.c 中的 board_early_init_hook() 中启用。
查看 frdm_rw612 init.c、我可以看到 Board_early_init_hook() 已在
上实现,但并未启用任何 Flexcomm 时钟。
根本原因特定于 TF-M NS 版本:HAL 时钟函数
(fsl_clock.c)使用安全 CLKCTL1 地址(0x50021000)。在 NS
世界中,对该地址的写入将被静默忽略,从而使 Flexcomm0
完全处于无时钟状态 - 所有 USART 寄存器的读数均为 0x00000000。
我目前的解决方法是在 UART 启动之前,在应用代码中直接写入 CLKCTL1 NS 别名
(0x40021000),这虽然有效,但
显然不是正确的长期解决方案。
根据这篇文章,修复可能属于 init.c 中的 board_early_init_hook()
。在 CONFIG_TRUSTED_EXECUTION_NONSECURE 保护下,使用
NS 别名地址。不过,在尝试公关之前,我想确保这与
团队的方法一致。
这是基于 RW612 的 TF-M NS 版本 的已知差距吗,是否有
建议的修复正在进行中?
你好,@chofmeister,希望你一切都好。
我看到您在我们的下游存储库中提交的报告是您在 Zephyr 4.1.0 版本中发现的一个错误、能否请您确认一下,在我们最新的下游版本库(目前为 4.3.0)中是否仍然存在这种行为?
另外,我还建议查看Zephyr 中的时钟配置,因为 Zephyr 时钟管理子系统尚未支持时钟配置和启用。
你好,RomanVR、
感谢您的回复。我可以在 soc.c 中看到时钟启动代码:
#if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm0), nxp_lpc_usart, okay))&& CONFIG_SERIAL
CLOCK_SetFRGClock(&(const clock_frg_clk_config_t){0, kCLOCK_FrgPllDiv, 255, 0});
CLOCK_AttachClk(kFRG_to_FLEXCOMM0);
#endif
代码是正确的,但底层 HAL 函数
(CLOCK_AttachClk、CLOCK_SetFRGClock)使用的是安全的 CLKCTL1 地址
(0x50021000)。在 NS 世界中,对该地址的写入会被
默默忽略,从而使 Flexcomm0 处于无时钟状态。所有 USART 寄存器的读数均为 0x00000000。
我还在 nxp-zephyr GitHub 仓库(问题 #35)上提交了一个错误,
贡献者 waqar-tahir 证实了这个问题,并指出这个问题已经在即将发布的 4.4 下游版本中得到解决。
目前,我的解决方法是在 UART 启动之前,在应用代码中直接写入 CLKCTL1 NS 别名
(0x40021000)。
希望这有助于澄清根本原因。