This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM625:AM62x:HS-SE:SPL 无法写入 MCU_MMR0_RST_CTRL

Guru**** 2457760 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1511852/am625-am62x-hs-se-spl-cannot-write-to-mcu_mmr0_rst_ctrl

器件型号:AM625


工具/软件:

您好、

我们的硬件看门狗在 HS-EMA FS 器件上运行正常、并且在内核崩溃等情况下成功重新启动。 但是、HS-SE 器件上的硬件看门狗不会复位。 调试该问题后、我发现 HS-SE SPL 二进制文件无法修改 MCU_MMR0_RST_CTRL 寄存器以激活来自 MCU ESM 的复位信号。

以下日志来自 HS-SPL 器件上的 FS 引导。 我添加了一些打印内容、如您在第 12 行中所见、SPL 可以从 MCU_MMR0_RST_CTRL 读回正确的值。

U-Boot SPL 2025.04-00051-gdba40dd4eac5-dirty (May 09 2025 - 13:51:41 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.0.7--v11.00.07 (Fancy Rat)')
ESM_K3
cfg: 1
k3_esm esm@420000: ESM probed!!!
k3_esm esm@4100000: ESM probed!!!
Enable MCU_ESM reset
CTRLMMR_MCU_RST_CTRL val: 0x420fff
CTRLMMR_MCU_RST_CTRL reg: 0x4518170
RST_CTRL_ESM_ERROR_RST_EN_Z_MASK mask: 0xfffdffff
write value: 0x400fff
read back: 0x400fff
Changed A53 CPU frequency to 1250000000Hz (T grade) in DT
SPL initial stack usage: 13424 bytes
Trying to boot from MMC2
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Starting ATF on ARM64 core...

接下来、此日志来自 HS-SE 器件上的同一 SPL(仅签名但仍然相同的 defconfig)引导。 第 12 行显示 SPL 无法读回修改后的值。

U-Boot SPL 2025.04-00051-gdba40dd4eac5-dirty (May 09 2025 - 13:51:41 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.0.7--v11.00.07 (Fancy Rat)')
ESM_K3
cfg: 1
k3_esm esm@420000: ESM probed!!!
k3_esm esm@4100000: ESM probed!!!
Enable MCU_ESM reset
CTRLMMR_MCU_RST_CTRL val: 0x420fff
CTRLMMR_MCU_RST_CTRL reg: 0x4518170
RST_CTRL_ESM_ERROR_RST_EN_Z_MASK mask: 0xfffdffff
write value: 0x400fff
read back: 0x420fff
Changed A53 CPU frequency to 1250000000Hz (T grade) in DT
SPL initial stack usage: 13424 bytes
Trying to boot from MMC2
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Starting ATF on ARM64 core...

我目前的权变措施是为 A53 启用 CONFIG_ESM_K3 配置、因为您可以在接下来的日志中看到、A53 能够修改该寄存器。

NOTICE:  BL31: v2.10.4(release):lts-v2.10.4-dirty
NOTICE:  BL31: Built : 16:23:33, Apr 26 2024

U-Boot SPL 2025.04-00051-gdba40dd4eac5-dirty (May 09 2025 - 13:51:41 +0000)
SYSFW ABI: 4.0 (firmware rev 0x000b '11.0.7--v11.00.07 (Fancy Rat)')
ESM_K3
cfg: 1
k3_esm esm@420000: ESM probed!!!
k3_esm esm@4100000: ESM probed!!!
Enable MCU_ESM reset
CTRLMMR_MCU_RST_CTRL val: 0x420fff
CTRLMMR_MCU_RST_CTRL reg: 0x4518170
RST_CTRL_ESM_ERROR_RST_EN_Z_MASK mask: 0xfffdffff
write value: 0x400fff
read back: 0x400fff
SPL initial stack usage: 1952 bytes
Trying to boot from MMC2
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Authentication passed
Authentication passed

您是否有具有 HS-SE 的 TI AM62x 套件、并且可以验证硬件看门狗是否正常工作?

有人能检查防火墙是否不允许在 tiboot3-am62x-hs-phycore-som.bin 中将命令写入此地址吗?

BTW:我仔细检查了 AM64x HS-SE 器件、硬件看门狗按预期工作。

此致、
Daniel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Daniel、

    从 HS FS 器件在 HS SE 器件上运行的软件是否有任何区别? 我尝试了在 HS SE 器件中写入 MCU_RST_CTRL MMR、我能够更新它。 您能分享用于更新此 MMR 的代码吗?  

    此致、

    Nihar Potturu。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    没有除了不同的 tiboot3 二进制文件之外没有区别。

    我还能够通过 U-Boot 提示符在 HS-SE 器件上写入此寄存器。 但是、SPL 无法写入。

    您可以在您的电路板上尝试这些更改吗?

    --- a/arch/arm/mach-k3/am62x/am625_init.c
    +++ b/arch/arm/mach-k3/am62x/am625_init.c
    @@ -80,9 +80,14 @@ static __maybe_unused void enable_mcu_esm_reset(void)
     {
            /* Set CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RST_EN_Z  to '0' (low active) */
            u32 stat = readl(CTRLMMR_MCU_RST_CTRL);
    
    +       printf("CTRLMMR_MCU_RST_CTRL val: 0x%x\n", stat);
    +       printf("CTRLMMR_MCU_RST_CTRL reg: 0x%x\n", CTRLMMR_MCU_RST_CTRL);
    +       printf("RST_CTRL_ESM_ERROR_RST_EN_Z_MASK mask: 0x%x\n", RST_CTRL_ESM_ERROR_RST_EN_Z_MASK);
            stat &= RST_CTRL_ESM_ERROR_RST_EN_Z_MASK;
    +       printf("write value: 0x%x\n", stat);
            writel(stat, CTRLMMR_MCU_RST_CTRL);
    +       printf("read back: 0x%x\n", readl(CTRLMMR_MCU_RST_CTRL));
     }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Daniel、

    从共享的补丁中、我可以看到您在写入之前没有解锁 MCU CTRL MMR 寄存器。 这可能会导致此处出现问题。 我当时使用的是 SBL 流程、我们在 MCU+SDK 中有一个 API 来直接解锁这些 MMR 寄存器。 您是否可以采用以下代码作为参考、并在将 MMR 寄存器写入之前尝试解锁它们。

    /* Reset Ctrl belongs to partition 6 of the CTRL MMR */
        uint32_t     rstPartition = 6U;
        uint32_t    volatile * ctrl_addr ;
        /* Unlock CONTROL MMR registers */
        SOC_controlModuleUnlockMMR(SOC_DOMAIN_ID_MCU, rstPartition);
    
    
        ctrl_addr = (volatile uint32_t *)(0x4518170);
        DebugP_log("Value of RST SRC register = %X\r\n",*ctrl_addr);
        *ctrl_addr &= (~(1<<17));
    
    
        /* Lock CONTROL MMR registers */
        /* Usual Wdg Application continues*/
        SOC_controlModuleLockMMR(SOC_DOMAIN_ID_MCU, rstPartition);
        DebugP_log("Value of RST SRC register after writing = %X\r\n",*ctrl_addr);
    
    

    void SOC_controlModuleLockMMR(uint32_t domainId, uint32_t partition)
    {
        uint32_t            baseAddr;
        volatile uint32_t  *kickAddr;
    
        if(SOC_DOMAIN_ID_MAIN == domainId)
        {
            #if 0 /* in AM62x, main dowmin MMRs are left unlocked since when working with linux kernel, linux kernel assumes MMRs are unlocked */
            baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_CTRL_MMR0_CFG0_BASE);
            kickAddr = (volatile uint32_t *) (baseAddr + CSL_MAIN_CTRL_MMR_LOCKn_KICK0_OFFSET(partition));
            CSL_REG32_WR(kickAddr, KICK_LOCK_VAL);      /* KICK 0 */
            kickAddr++;
            CSL_REG32_WR(kickAddr, KICK_LOCK_VAL);      /* KICK 1 */
            #endif
        }
    
        if(SOC_DOMAIN_ID_MCU == domainId)
        {
            baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_MCU_CTRL_MMR0_CFG0_BASE);
            kickAddr = (volatile uint32_t *) (baseAddr + CSL_MCU_CTRL_MMR_LOCKn_KICK0_OFFSET(partition));
            CSL_REG32_WR(kickAddr, KICK_LOCK_VAL);      /* KICK 0 */
            kickAddr++;
            CSL_REG32_WR(kickAddr, KICK_LOCK_VAL);      /* KICK 1 */
        }
    
        return;
    }
    
    void SOC_controlModuleUnlockMMR(uint32_t domainId, uint32_t partition)
    {
        uint32_t            baseAddr;
        volatile uint32_t  *kickAddr;
    
        if(SOC_DOMAIN_ID_MAIN == domainId)
        {
            baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_CTRL_MMR0_CFG0_BASE);
            kickAddr = (volatile uint32_t *) (baseAddr + CSL_MAIN_CTRL_MMR_LOCKn_KICK0_OFFSET(partition));
            CSL_REG32_WR(kickAddr, KICK0_UNLOCK_VAL);   /* KICK 0 */
            kickAddr++;
            CSL_REG32_WR(kickAddr, KICK1_UNLOCK_VAL);   /* KICK 1 */
        }
    
        if(SOC_DOMAIN_ID_MCU == domainId)
        {
            baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_MCU_CTRL_MMR0_CFG0_BASE);
            kickAddr = (volatile uint32_t *) (baseAddr + CSL_MCU_CTRL_MMR_LOCKn_KICK0_OFFSET(partition));
            CSL_REG32_WR(kickAddr, KICK0_UNLOCK_VAL);   /* KICK 0 */
            kickAddr++;
            CSL_REG32_WR(kickAddr, KICK1_UNLOCK_VAL);   /* KICK 1 */
        }
    
        if(SOC_DOMAIN_ID_WKUP == domainId)
        {
            baseAddr = (uint32_t) AddrTranslateP_getLocalAddr(CSL_WKUP_CTRL_MMR0_CFG0_BASE);
            kickAddr = (volatile uint32_t *) (baseAddr + CSL_MCU_CTRL_MMR_LOCKn_KICK0_OFFSET(partition));
            CSL_REG32_WR(kickAddr, KICK0_UNLOCK_VAL);   /* KICK 0 */
            kickAddr++;
            CSL_REG32_WR(kickAddr, KICK1_UNLOCK_VAL);   /* KICK 1 */
        }
    
        return;
    }
     

    此致、

    Nihar Potturu。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nihar:

    U-Boot 会正确解锁所有分区。 请参阅 https://github.com/phytec/u-boot-phytec/blob/7228051878d7f093457a1a043c28a5231e448862/arch/arm/mach-k3/am62x/am625_init.c#L192https://github.com/phytec/u-boot-phytec/blob/7228051878d7f093457a1a043c28a5231e448862/arch/arm/mach-k3/am62x/am625_init.c#L47

    同样、看门狗在 FS 器件上能够处理相同的 U-Boot 映像。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉、我们将在明天之前分享有关此问题的最新信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Daniel:

    对延迟深表歉意。

    CTRL_MMR_UNLOCK ENABLE_MCU_ESM_RESET 之间的某个函数似乎正在禁用 MMR 写入。 下面的补丁适用于我的目的 请确认是否同样适用于您:

    diff --git a/arch/arm/mach-k3/am62x/am625_init.c b/arch/arm/mach-k3/am62x/am625_init.c
    index 9a5eb6e4..30c98b14 100644
    --- a/arch/arm/mach-k3/am62x/am625_init.c
    +++ b/arch/arm/mach-k3/am62x/am625_init.c
    @@ -85,10 +85,16 @@ static void ctrl_mmr_unlock(void)
     static __maybe_unused void enable_mcu_esm_reset(void)
     {
            /* Set CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RST_EN_Z  to '0' (low active) */
    +    ctrl_mmr_unlock();
            u32 stat = readl(CTRLMMR_MCU_RST_CTRL);
     
    +       printf("CTRLMMR_MCU_RST_CTRL val: 0x%x\n", stat);
    +       printf("CTRLMMR_MCU_RST_CTRL reg: 0x%x\n", CTRLMMR_MCU_RST_CTRL);
    +       printf("RST_CTRL_ESM_ERROR_RST_EN_Z_MASK mask: 0x%x\n", RST_CTRL_ESM_ERROR_RST_EN_Z_MASK);
            stat &= RST_CTRL_ESM_ERROR_RST_EN_Z_MASK;
    +       printf("write value: 0x%x\n", stat);
            writel(stat, CTRLMMR_MCU_RST_CTRL);
    +       printf("read back: 0x%x\n", readl(CTRLMMR_MCU_RST_CTRL));
     }
     
     /*

    此致、

    Jay