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.

[参考译文] LP-AM243X:用于禁用 MCU-PLUS-SDK 和 PLL 的 API

Guru**** 2523370 points
Other Parts Discussed in Thread: AM6421, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1412858/mcu-plus-sdk-am243x-api-to-disable-lpscs-and-plls

器件型号:MCU-PLUS-SDK AM243X
主题中讨论的其他器件:AM6421SysConfig

工具与软件:

您好!

我当前在 R5s 仅运行 RTOS 的情况下使用 AM6421。  当我检查 A53集群和 Core0的 PSC 状态时、状态返回已启用。  我正在尝试确定适当的方法来禁用 LPSC 和 PLL 以及与 A53和其他未使用的子系统相关的 HSDIV。

在 soc Plus SDK 中、我在 mcu_get 和_setPSCState 中看到。  这似乎是在 A53和其他 LPSC 上关闭电源的方法。  但是、获取/设置 PSC 用法的唯一示例可在 RESET_ISOLATION_IPC_MCU_DOMAIN.中找到。  不确定这是否是适用于 A53的有效方法。

我还尝试了解了 DMSC 和 TISCI 在禁用 LPSC、PLL、HSDIV 方面如何适应这种情况。  您能不能举个具体示例来说明如何从 RTOS 应用程序中关闭这些器件?

谢谢!

Joe

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

    Joe、您好!

    我的建议是、我们不要触碰 A53内核的 PLL 设置。 由于 PLL 设置不能被用户修改。

    您只需使用 SCI 客户端 API 关闭 A53内核电源即可。

    最近、  当我们直接调用 SCI 客户端时、我们在控制 A53内核的电源关闭方面遇到了一些问题。

    请使用所有代码调用 SCI API、然后查看您是否能够关闭 A53内核的电源。

    如果无法正常工作、请尝试使用以下代码。  无论 A53内核0的状态如何、此代码都会强制关闭它。

     /* PSC0 MDCTL register for A53_0 (0x400A00 + 4 * 22)*/
        uint32_t mdctrl_addr=0x400A58;
        uint32_t mdctl=HW_RD_REG32(mdctrl_addr);
    
        /* Reset the Module Next Field (4-0) */ 
        mdctl &= ~0x0000001F;
    
        /* Do a Force Sync reset 
         *  Bit 31  : 1 => Force Bit 
         *  Bit 4-0 : 1 => Sync reset */
        uint32_t state=0x80000001;
        mdctl |=state;
        HW_WR_REG32(mdctrl_addr,mdctl);
    
        /* Trigger reset */
        HW_WR_REG32(0x400120,0x2);
        
        /* Wait until the operation is complete */
        while ((HW_RD_REG32(0x400128) & 0x2) != 0) {
            ;
        }
    
        uint32_t moduleId = TISCI_DEV_A53SS0;
    
        status = Sciclient_pmSetModuleState(moduleId,
                                            TISCI_MSG_VALUE_DEVICE_SW_STATE_AUTO_OFF,
                                            TISCI_MSG_FLAG_AOP,
                                            SystemP_WAIT_FOREVER);
        if(status != SystemP_SUCCESS)
        {
            DebugP_logError("CPU power off failed for device %d\r\n", moduleId);
        }
        else {
            DebugP_log("CPU powered off successfully for device %d\r\n", moduleId);
        }
    

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

    Swargam、感谢您提供这个示例!  我会按照您的建议进行试用、并提供结果。   我会在几天前亲自尝试一下。  我看到您要禁用的模块是主模块、而不是每个单独的内核。  我是否理解禁用父 LPSC 也会自动禁用所有子 LPSC、这是正确的?

    谢谢!

    Joe

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

    Joe、您好!

    是的、您的理解是正确的。 在上面的示例中、我将尝试禁用整个群集。

    这会禁用所有 A53内核的电源。

    此致、

    Anil。

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

    尊敬的 Swargam:

    我仅尝试了 SCICclient 和添加的寄存器写入。  在这两种情况下、调试输出均指示器件137已成功断电。  但是、与注释掉的代码相比、功耗没有明显变化。  查询 LPSC 的适当方式是什么?

    我在您提供的代码之前和之后使用过此调用:

    状态= SOC_getPSCState (SOC_PSC_DOMAIN_ID_MAIN、CSL_MAIN_PD_A53_cluster_0、CSL_MAIN_LPSC_A53_cluster_0、&pscDomainState、&pscModuleStateMain2MCU);

    我看到的是在执行代码之前状态= 0、域= 1、模块= 3。  在执行代码后保持不变。

    是否是正确的 API 调用来确定 A53的 LPSC 是否真正关闭?

    谢谢!

    Joe

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

    Joe、您好!

    对不起上面的代码。

    上述代码适用于 AM62X 器件、我认为两种器件的 LPSC 模块 ID 相同。

    我在我这边检查了下面的代码、该代码运行正常。

    使用以下代码、我能够关闭整个 A53集群的电源。 之后、我验证了 LPSC 寄存器并让 SCI 获取调用信息。

    请尝试下面的测试代码、看看它是否起作用。

    发送设置为0的模块以关闭 A53内核。

    此致、

    Anil。

    void Test_code(uint8_t module_state)
    {
    
    
       /* PSC0 MDCTL register for A53_0 (0x400A00 + 4 * 20)*/
       uint32_t mdctrl_addr=0x400A50;
       uint32_t mdctl;//=HW_RD_REG32(mdctrl_addr);
    
       int32_t status;
    
       uint32_t moduleState = TISCI_MSG_VALUE_DEVICE_HW_STATE_OFF;
       uint32_t resetState = 0U;
       uint32_t contextLossState = 0U;
    
    
       status = Sciclient_pmGetModuleState(TISCI_DEV_A53SS0,
                                  &moduleState,
                                  &resetState,
                                  &contextLossState,
                                  SystemP_WAIT_FOREVER);
    
       if(status != SystemP_SUCCESS)
       {
           DebugP_logError("CPU Module state %d\r\n", moduleState);
       }
       else {
           DebugP_log("CPU Module state %d\r\n", moduleState);
       }
    
    
    
       /* Reset the Module Next Field (4-0) */
       //mdctl &= ~0x0000001F;
    
       /* Do a Force Sync reset
        *  Bit 31  : 1 => Force Bit
        *  Bit 4-0 : 1 => Module State   : 0 - > OFF : 1 - > device disable and keep in retention : ON 2 - > ON */
    
    
       mdctl = ( (1<<8U) | (1<<31U) | (module_state & 0x1F) );
       HW_WR_REG32(mdctrl_addr,mdctl);
    
       /*Power domain go transition   */
       HW_WR_REG32(0x400120,0x2);
    
       /* Wait until the power domain operation is complete */
       while ((HW_RD_REG32(0x400128) & 0x2) != 0) {
           ;
       }
    
    
    
       status = Sciclient_pmGetModuleState(TISCI_DEV_A53SS0,
                                  &moduleState,
                                  &resetState,
                                  &contextLossState,
                                  SystemP_WAIT_FOREVER);
    
       if(status != SystemP_SUCCESS)
       {
           DebugP_logError("CPU Module state %d\r\n", moduleState);
       }
       else {
           DebugP_log("CPU Module state %d\r\n", moduleState);
       }
    
    
    
      /* status = Sciclient_pmSetModuleState(TISCI_DEV_A53SS0,
                                           TISCI_MSG_VALUE_DEVICE_SW_STATE_ON,
                                           TISCI_MSG_FLAG_AOP,
                                           SystemP_WAIT_FOREVER);
    
    
    
       status = Sciclient_pmGetModuleState(TISCI_DEV_A53SS0,
                                  &moduleState,
                                  &resetState,
                                  &contextLossState,
                                  SystemP_WAIT_FOREVER);
    
       if(status != SystemP_SUCCESS)
       {
           DebugP_logError("CPU Module state %d\r\n", moduleState);
       }
       else {
           DebugP_log("CPU Module state %d\r\n", moduleState);
       }*/
    
    }
    

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

    尊敬的 Anil:

    我已尝试新代码、现在 moduleState 返回0。  令人惊讶的是、当 A53集群禁用时、我看到功耗略高没有变化。  这也是您看到的吗?

    谢谢!

    Joe

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

    Joe、您好!  

    我没有监控电流消耗,只是验证了软件方面,因为 A53集群被禁用或没有与上述代码.

    如果 A53内核和其他内核上正在运行任何程序、则获取当前读数、然后禁用 A53内核断电并获取当前读数。

    然后、当我们禁用 A53内核情况时、当前读数较小。

    此致、

    Anil。

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

    Anil、您好、在本例中、引导加载程序不会为 A53加载任何二进制文件。  我们仅启动 R5集群。  电流测量是在为电路板供电的直流电源上进行的。  在这一点上、我看到启用或禁用群集没有区别。

    您是否知道 AM64系列中的 LPSC 是否真正切断了 A53仪表组的电源?  

    谢谢!

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨 Anil、在我们的案例中、引导加载程序不会加载 A53的任何二进制文件。  我们仅启动 R5集群。  电流测量是在为电路板供电的直流电源上进行的。  这是我在启用或禁用群集中看不到任何区别的地方。

    Joe、您好!

    在我看来、上述行为是可以的、因为 SBL 不会加载 A53的任何应用映像、因此 A53内核  不会被 SBL 初始化。

    如果您使用上述情况测量电流,电流仅属于 R5F 内核和 M4F 内核,而不属于 A53内核。

    您可以尝试此方法:使用 SBL 空值初始化 SOC ,该空值用于初始化所有内核。

    然后获取电流读数、接下来在 R5F 内核中使用上述代码禁用 A53内核的断电、并获取电流读数。

    如果您已经完成了该方法、那么我可以将线程分配给 硬件专家以进一步提供支持。 请告诉我。

    上述代码真正关闭了 A53内核、许多客户使用相同的方法。

    此致、

    Anil。

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

    Anil:

    感谢您发送编修。  我来试一下、然后报告结果。

    Joe

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

    Joe、您好!

    是肯定的..我会等待你的答复.

    此致、

    Anil。

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

    Anil、您好、我尝试了使用空引导加载程序、并确认 A53消耗在任一模块状态下都没有改变。  我已经能够通过调用 SOC_moduleSetClockFrequency 并将其设置为25MHz 来降低其功耗。  如上所述、用户不能通过 API 直接访问 PLL。  

    以上 SOC_函数是否是尝试在整个器件中更改时钟的正确方法?

    是否会在今年随时启用 CTT SysConfig 修改这些设置?

    谢谢

    Joe

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

    Joe、您好!

    我假设 A53内核上没有负载而只是运行 A53内核、  消耗的电流可能会更小。

    我不确定 A53内核运行时消耗的电流有多大。 如果 uA、则此测试将非常苛刻。

    是的、您可以在 SBL 中更新更改时钟、而不是在应用程序中更改时钟频率、并按照以下步骤操作。

    请查看下面的数组。 在这里、我们需要将-defaultClockHz 变量更新为用户定义的频率并编译 SBL。

    因此、您的内核将以用户定义的频率运行、并且应刷新更新的 SBL 应用映像、而不是预编译 SBL 应用映像。

    我将您的查询路由给了一位低功耗模式专家、看到他可以在这里提供帮助。

    此致、

    Anil。

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

    您好、Joe。

    您能解释一下如何测量功率吗?

    从使用 AM62x 进行实验可以看出、关断一个 A53内核通常可节省~9mW 的内核功耗、具体取决于 ARM 内核的 VDD_CORE 电源。 由于内核仍然连接、即使内核断电、也会消耗一些电流。

    您可以在这些寄存器地址处检查 PSC0_PDSTAT 寄存器中的值吗?

    • 0x00400200 (电源域0、用于通用用途)
    • 0x00400204 (ARM 群集的电源域1)
    • 0x00400208 (A53内核0的电源域2)
    • 0x0040020C (A53内核1的电源域3)

    我想了解电源域的状态是否只是为了确保其处于预期状态。 此寄存器的最后5位表示 PD 的状态。

    我不具备 RTOS 专业知识、因此我不确定如何执行它。 如果您在读取寄存器时需要其他帮助、我将重新分配给 Anil 以提供指导。

    谢谢!

    Anshu

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

    尊敬的 Anshu:

    我将使用与 USB 端口内联连接的 USB PD 功率分析仪测量功率。  

    这些是执行 Anil 提供的代码后的寄存器值。

    谢谢!

    Joe

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

    您好、Joe。

    感谢您提供的信息。  

    我假设 USB 功率分析仪已与该板的电源相连。 如您所知、这将测量整个电路板的功率、而不仅仅是 AM243x SoC 的功率。

    从寄存器输出来看、A53内核的电源域似乎仍然在线、如最后一个十六进制数字中的1所示。  

    已断电的 A53内核的 RTI LPSC 是否已禁用?

    谢谢!

    Anshu

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

    Anshu、您好、对于上述 LPSC 使用 SOC_getPSCState、我看到域状态为1、模块状态为

    LPSC 22是3

    LPSC 23为0。  (我只有单核器件)。  

    A53集群 PD_A53_Cluster_0的模块状态为0。  我相信 Anil 的上述代码的目的是禁用群集。

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

    您好、Joe。

    感谢您提供的信息。 我需要进一步了解这一点。 如果您在星期一之前未收到回复、请 ping 此主题。

    谢谢!

    Anshu

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

    Anshu、您好、根据请求 ping 该线程。

    Joe

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

    您好、Joe。

    感谢您的提醒。 我一时间都不知道该怎么说了。

    据我了解、LPSC_A53_0是对 LPSC_A53_cluster_0的依赖关系。 在上一篇文章中、您说集群已关闭、这将关闭它的依赖项(包括 A53内核 )、但 LPSC_A53_0处于开启状态(status = 3)。

    我想知道其中一个依赖项是否阻止集群本身断电。

    是否可以获取所有这些 LPSC 的状态?

    我还在深入研究 A53功耗本身、但它似乎消耗了过多功率、可能约为10mW。 如果您使用的是插入电源的 USB 电流监视器、我认为您没有看到显著的差异。 提醒一下、这将测量整个电路板、而不仅仅是 SoC。

    此致、

    Anshu

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

    尊敬的 Anshu:

    开始应用程序调试后的初始 PSC 状态(NULL 引导加载程序之后)

    • 20:3 (电源域:1)
    • 21:0 (电源域:1)
    • 22:3 (电源域:1)
    • 23:0 (电源域:1)

    在为 CORE_0、CORE_1、COMPUTE_CLUSTER 调用 Sciclient_pmSetModuleState 后、值为 TISCI_MSG_VALUE_DEVICE_SW_STATE_AUTO_OFF

    然后执行 Anil 的代码以关闭子系统:

    • 20:0 (电源域:1)
    • 21:0 (电源域:1)
    • 22:0 (电源域:0)
    • 23:0 (电源域:0)

    遗憾的是、当我单步执行此代码时、无法检测到功率变化接近百分之一 mW。

    应该注意的是、这使用的是 NULL 引导加载程序。  

    当我将 OSPI 引导加载程序升级为使用 SDK 10.0并运行我的应用程序而不进行上述任何 PSC 更改时、我可以看到功率下降超过100mW。

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

    Joe、您好!

    当您使用 NULL 引导加载程序时、SBL 将初始化所有内核、而不需要任何应用映像。

    如果您使用 SBL OPSI、则 SBL 将根据多核应用映像初始化内核。

    例如、多核应用程序映像具有不同的映像、例如所有内核 R5F、M4F 内核、而不是 A53内核应用程序映像。

    在这种情况下、SBL 将仅初始化 R5F 内核和 M4F 内核、而不会初始化 A53内核。

    因此,与 SBL OSPI 相比,功耗更多地以 SBL NULL 为单位。

    如果您将所有应用映像发送到 SBL OSPI、则 SBL OSPI 将初始化所有内核、然后这两种引导模式下的电流消耗是相同的。

    此致、

    Anil。

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

    Anil、您好、我理解您对 NULL 的看法。  我通过这个过程观察到、我只能通过两种方式显著降低功耗:

    • 使用之前的 SDK 并在 bootloader_soc.c 中将 A53时钟频率设置为25MHz
    • 使用当前 SDK (10.0.0.2)并且不对默认驱动程序配置进行其他更改。

    无论是使用 SBL NULL 还是 SBL OSPI、我都可以看到使用上述两种方法实现了一些可测量的(~100mW)改进。  将 A53 LPSC 与 SCIclient 设置为更低功耗相同。

    这会将我带回到顶部的原始查询。  AM64是否不再提供以任何实质性方式降低功耗的手段?

    谢谢!

    Joe

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

    您好、Joe。

    除了10.0.0.2之外、您还尝试了哪些其他 SDK 版本?

    AM64是否无法再通过任何实质性方式降低功耗?

    遗憾的是、AM64不提供任何 SoC 级低功耗模式(与其他 TI 器件不同)。 唯一的机会是在适用的情况下配置 LPSC 和 PD。 我们还可以查看焊盘/IO 功率、但这不会有显著差异(~5mW)。

    此致、

    Anshu

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

    大家好、Anshu 和 Anil、非常感谢。  我也尝试了9.2.1.5。  我将关闭该主题。