2353044_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2353044_zh-CN

2353044_zh-CN

RW612 TF-M NS:Flexcomm UART 无功能 - 时钟驱动器使用安全 CLKCTL1 地址

您好,

我发现了一个 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

有人遇到过这种情况吗?是否正在进行适当的修复?

谢谢!

Re: RW612 TF-M NS: Flexcomm UART non-functional — clock driver uses secure CLKCTL1 address

你好,@chofmeister

请与我们分享您复制这种行为的步骤。我无法通过 MCUXpresso for VS Code 使用 psa_protected_storage 示例来重现这种行为,该示例使用 TF-M 和 UART 控制台,信息正在打印,因此 UART 外设的时钟是正确的。

此外,对于 FRDM-RW612,时钟初始化是在 soc.c 文件的 clock_init 函数中完成的。

Re: RW612 TF-M NS: Flexcomm UART non-functional — clock driver uses secure CLKCTL1 address

感谢您提供的链接。确认一下 - 我运行的是 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 版本 的已知差距吗,是否有
建议的修复正在进行中?

Re: RW612 TF-M NS: Flexcomm UART non-functional — clock driver uses secure CLKCTL1 address

你好,@chofmeister,希望你一切都好。

我看到您在我们的下游存储库中提交的报告是您在 Zephyr 4.1.0 版本中发现的一个错误、能否请您确认一下,在我们最新的下游版本库(目前为 4.3.0)中是否仍然存在这种行为?

另外,我还建议查看Zephyr 中的时钟配置,因为 Zephyr 时钟管理子系统尚未支持时钟配置和启用。

Re: RW612 TF-M NS: Flexcomm UART non-functional — clock driver uses secure CLKCTL1 address

你好,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)。

希望这有助于澄清根本原因。

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎04-28-2026 04:54 AM
更新者: