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.

[参考译文] AM6442:EMMC 热复位如何生效

Guru**** 2831025 points

Other Parts Discussed in Thread: AM6442, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1603212/am6442-how-does-emmc-warm-reset-take-effect

器件型号: AM6442
主题: SysConfig 中讨论的其他器件

您好、TI 专家、

我正在实现从 eMMC 进行热复位引导。 然而,在调用后 SoC_generateSwWarmResetMainDomain() 、eMMC 无法正确复位。

 在我的理解下、正常重置应该会打印以下消息、以指示在我调用此函数后立即重新启动:

[bootloader_profile]引导介质   :未定义
[bootloader_profile]引导映像大小 :175 KB
[bootloader_profile]存在内核  :
m4f0-0
r5f1-0
r5f1-1.
A530-0
r5f0-0
r5f0-1
【引导加载程序配置文件】SYSFW 初始化            :   12483us
【引导加载程序配置文件】System_init            :  5368613us
【引导加载程序配置文件】Drivers_open           :   39467us
【引导加载程序配置文件】Board_drivers 打开         :      0us
【引导加载程序配置文件】Sciclient Get Version       :   9892us
【引导加载程序配置文件】CPU 负载             :  2311966us
[bootloader_profile] SBL 所用的总时间       :  2373714us
 
图像加载完成、切换到应用程序...

但是、没有打印信息。 我想问是否需要执行任何其他操作才能完成 EMMC 引导的热复位。

谢谢、

薛。

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

    尊敬的 Xue:

    我假设、您的最终目标是对 SoC 执行软件热复位、请确认相同内容。

    您能告诉我什么时候  SoC_generateSwWarmResetMainDomain  在您的系统中调用? 是从在其中一个内核上运行的应用程序调用的吗?

    此致、

    会面。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设、您的最终目标是对 SoC 执行软件热复位、请确认相同内容。

    是的、这是我的最终目标。

    我将在引导后调用此函数并触发计时器 I SET。 目前、它仅在 R5F00 内核上运行。

    此致、

    薛。

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

    您是否可以检查此项并测试它是否有效:  关于:【常见问题解答】AM6442:AM64X:如何使 SOC 复位(热复位)? 

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

    我提到了这种方法并尝试 使用 Sciclient_pmDeviceReset 执行复位、但行为与之前相同。

    我还查看了这篇文章 ((+) AM62A7:eMMC 引导模式无法重新启动电路板、但 SD 卡引导模式可以重新启动 — 处理器论坛-处理器 — TI E2E 支持论坛)、这提到复位 eMMC 需要设置 RST_N 位。 这是否也适用于 AM6442? 如果是、我需要设置哪个寄存器?

    谢谢您、

    薛。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    、其中提到复位 eMMC 需要设置 RST_N 位。 这是否也适用于 AM6442?

    是的、这也适用于 AM64、如共享常见问题解答中所述、您必须 将 ECSD 寄存器字节 162 位[1:0]设置为 0x1 以启用该功能。

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

    SDK 是否提供任何 API 来访问 ECSD 寄存器?

    抱歉、我在 AM6442 TRM 中找不到 ECSD 寄存器、 我想问如何设置 ECSD 寄存器中的特定字节。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SDK 是否提供任何 API 来访问 ECSD 寄存器?

    我将此线程分配给我们的 eMMC 专家来回答这个问题、请等待他的回复。

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

    为方便起见、当使用 U-Boot 启用 RST_n 时、可以遵循以下常见问题解答

    e2e.ti.com/.../faq-am62x-how-to-check-and-configure-emmc-flash-rst_n-signal-to-support-warm_reset-from-emmc-booting-on-am62x-sk-e2

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

    实际上、我没有 Linux 开发环境、因此不能使用 U-Boot 命令行操作来修改寄存器。 是否有办法将其直接集成到应用程序代码中?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有办法将其直接集成到应用程序代码中?

    请允许我抽出一天时间将其集成到 MCU+ SDK 中并与您共享代码。

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

    没问题。 非常感谢。

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

    您好:

    最新 SDK (v11.2) 之上的以下补丁公开了 API“MMCSD_enableRstN",“,以、以启用硬件复位功能。

    diff --git a/source/drivers/mmcsd/v0/lld/mmcsd_lld.h b/source/drivers/mmcsd/v0/lld/mmcsd_lld.h
    index 068cbc97c30..d0bac37c925 100644
    --- a/source/drivers/mmcsd/v0/lld/mmcsd_lld.h
    +++ b/source/drivers/mmcsd/v0/lld/mmcsd_lld.h
    @@ -647,6 +647,19 @@ int32_t MMCSD_lld_enableBootPartition(MMCSDLLD_Handle handle,
      */
     int32_t MMCSD_lld_disableBootPartition(MMCSDLLD_Handle handle);
     
    +/**
    + *  \brief  This function enables the RST_N signal for eMMC device.
    + *
    + *  \pre    MMCSD controller has been initialized using #MMCSD_lld_init().
    + *
    + *  \param  handle         [IN] Handle to the MMCSD instance used.
    + *
    + *  \return #MMCSD_STS_SUCCESS on success; else error on failure.
    + *
    + *  \sa     #MMCSD_lld_init()
    + */
    +int32_t MMCSD_lld_enableRstN(MMCSDLLD_Handle handle);
    +
     /* ========================================================================== */
     /*                        ISR Function Declarations                           */
     /* ========================================================================== */
    diff --git a/source/drivers/mmcsd/v0/lld/mmcsd_v0_lld.c b/source/drivers/mmcsd/v0/lld/mmcsd_v0_lld.c
    index b50bf9adcc6..d5b9f6bb9d7 100644
    --- a/source/drivers/mmcsd/v0/lld/mmcsd_v0_lld.c
    +++ b/source/drivers/mmcsd/v0/lld/mmcsd_v0_lld.c
    @@ -173,6 +173,14 @@ Bit     Device Type
     /** \brief Macros for ECSD Register Indexes */
     #define MMCSD_ECSD_BUS_WIDTH_INDEX                      ((uint32_t) 183U)
     #define MMCSD_ECSD_HS_TIMING_INDEX                      ((uint32_t) 185U)
    +#define MMCSD_ECSD_RST_N_FUNCTION_INDEX                 ((uint32_t) 162U)
    +
    +/** \brief Macros for RST_n_FUNCTION values (7.4.42 RST_n_FUNCTION [162])
    + *  JEDEC Standard No. 84-B51
    + */
    +#define MMCSD_ECSD_RST_N_FUNCTION_TEMP_DISABLED         ((uint32_t) 0x00U)
    +#define MMCSD_ECSD_RST_N_FUNCTION_PERMANENTLY_ENABLED   ((uint32_t) 0x01U)
    +#define MMCSD_ECSD_RST_N_FUNCTION_PERMANENTLY_DISABLED  ((uint32_t) 0x02U)
     
     /** \brief Macros for States Used during the Initialization of SD Device */
     #define MMCSD_SD_INIT_STATE_CONTROLLER_INIT                 ((uint32_t) 0U)
    @@ -1496,6 +1504,50 @@ int32_t MMCSD_lld_disableBootPartition(MMCSDLLD_Handle handle)
         return status;
     }
     
    +int32_t MMCSD_lld_enableRstN(MMCSDLLD_Handle handle)
    +{
    +    int32_t status = MMCSD_STS_SUCCESS;
    +    MMCSDLLD_Object *object = (MMCSDLLD_Object *)handle;
    +    MMCSDLLD_Transaction trans;
    +
    +    if(object != NULL_PTR)
    +    {
    +        /* Check if card type is eMMC */
    +        if(object->initHandle->cardType == MMCSD_CARD_TYPE_EMMC)
    +        {
    +            uint32_t arg;
    +
    +            /* Configure the ECSD register RST_n_FUNCTION to permanently enable
    +             * using CMD6 (SWITCH command)
    +             * Argument format: [31:26]=0 [25:24]=Access [23:16]=Index [15:8]=Value [7:0]=CmdSet
    +             */
    +            arg = (uint32_t)((MMCSD_CMD6_ACCESS_MASK_WRITE_BYTE << 24U)        |
    +                            (MMCSD_ECSD_RST_N_FUNCTION_INDEX << 16U)           |
    +                            (MMCSD_ECSD_RST_N_FUNCTION_PERMANENTLY_ENABLED << 8U));
    +
    +            /* Send CMD6 to enable RST_N */
    +            MMCSD_lld_initTransaction(&trans);
    +            trans.cmd = MMCSD_MMC_CMD(6U);
    +            trans.arg = arg;
    +            status = MMCSD_lld_transferPoll(handle, &trans);
    +
    +            /* Delay for 5 ms for the change to take effect in the device */
    +            ClockP_usleep(5000);
    +        }
    +        else
    +        {
    +            /* RST_N is only applicable for eMMC devices */
    +            status = MMCSD_STS_ERR;
    +        }
    +    }
    +    else
    +    {
    +        status = MMCSD_STS_ERR_INVALID_PARAM;
    +    }
    +
    +    return status;
    +}
    +
     /* ========================================================================== */
     /*                     API ISR Function Definitions                           */
     /* ========================================================================== */
    diff --git a/source/drivers/mmcsd/v0/mmcsd.h b/source/drivers/mmcsd/v0/mmcsd.h
    index 4314ed06fc6..c543a184425 100644
    --- a/source/drivers/mmcsd/v0/mmcsd.h
    +++ b/source/drivers/mmcsd/v0/mmcsd.h
    @@ -418,6 +418,20 @@ int32_t MMCSD_enableBootPartition(MMCSD_Handle handle, uint32_t partitionNum);
      */
     int32_t MMCSD_disableBootPartition(MMCSD_Handle handle);
     
    +/**
    + *  \brief  This function enables the RST_N signal for eMMC device
    + *
    + *  \pre    MMCSD controller has been opened using #MMCSD_open()
    + *
    + *  \param  handle         #MMCSD_Handle returned from #MMCSD_open()
    + *
    + *  \return #SystemP_SUCCESS on successful enable; else error on failure
    + *
    + *  \sa     #MMCSD_init()
    + *  \sa     #MMCSD_open()
    + */
    +int32_t MMCSD_enableRstN(MMCSD_Handle handle);
    +
     /** @} */
     
     #ifdef __cplusplus
    diff --git a/source/drivers/mmcsd/v0/mmcsd_v0.c b/source/drivers/mmcsd/v0/mmcsd_v0.c
    index 40a98a821ff..cc43073d832 100644
    --- a/source/drivers/mmcsd/v0/mmcsd_v0.c
    +++ b/source/drivers/mmcsd/v0/mmcsd_v0.c
    @@ -658,6 +658,28 @@ int32_t MMCSD_disableBootPartition(MMCSD_Handle handle)
         return status;
     }
     
    +int32_t MMCSD_enableRstN(MMCSD_Handle handle)
    +{
    +    int32_t status = SystemP_SUCCESS;
    +    MMCSD_Object *object = ((MMCSD_Config *)handle)->object;
    +    MMCSDLLD_Handle mmcsdLldHandle = object->mmcsdLldHandle;
    +
    +    status = SemaphoreP_pend(&object->mutex, SystemP_WAIT_FOREVER);
    +
    +    if(status == SystemP_SUCCESS)
    +    {
    +        /* Call LLD function to enable RST_N */
    +        status = MMCSD_lld_enableRstN(mmcsdLldHandle);
    +        (void)SemaphoreP_post(&object->mutex);
    +    }
    +    else
    +    {
    +        /* Mutex not Available */
    +    }
    +
    +    return status;
    +}
    +
     /* ========================================================================== */
     /*                       ISR Function Definitions                             */
     /* ========================================================================== */

    可以从 SysConfig 中启用了 eMMC 的任何应用程序调用此 API、例如 MMCSD_RAW_IO 示例。 请注意、这仅是一次性操作。 成功启用该功能后、无需再次执行该操作。

    我只有一个已启用此功能的 EVM、因此我无法测试已实现的代码。 希望它能起作用。

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

    该补丁可以成功 使 EMMC 复位。 非常感谢。