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.

[参考译文] AM3715:AVS/SmartReflex 问题

Guru**** 2574125 points
Other Parts Discussed in Thread: AM3715, TPS65910

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/625572/am3715-avs-smartreflex-questions

器件型号:AM3715
主题中讨论的其他器件: TPS65910

您好、查姆斯、

客户遇到 AM3715和 TPS65910的主要问题、并提出以下问题:

1)    平台 HAST 可在 OPP1G 中运行。 是否可以在未启用 AVS/SmartReflex 的情况下在 OPP1G 中运行 AM3715?

勘误表(http://www.ti.com/lit/er/sprz318f/sprz318f.pdf)使用说明3.4在解决方案2中指出、引导时应允许在 las 时执行此操作。

如果是、TI 是否保证此工作模式稳定?

2)    如果我们更需要用于 OPP1G 的 SmartReflex、我们如何对其进行测试?

由于 SmartReflex 似乎只是控制 VDD,我们假设我们必须这样做
触发压降。 相关信息非常少。 您能否为我们提供有关控制操作的更多背景信息? TI 如何对其进行测试?

3)    Linux 实现(无论哪个内核版本)似乎已经中断和过时、并且似乎依赖于 TWL4030/6030和兼容的 PMIC。
此外、OPP (例如通过 DVFS)更改似乎不会使用新的目标电压重新触发 SmartReflex。 是否有更近期的实施
适用于 AM3715 <-> TPS65910?

同时、我们尝试了解有关 SmartReflex 算法的更多信息。

  1. 在 OPP1G 中:Linux 驱动程序似乎将 CONTROL.CONTROL_FUSE_OPP1G 复制到 NVALUERECIPROCAL。 因此、我们假设两个寄存器共享相同的格式/含义。
  2. 根据 AM3715参考手册、NVALUERECIPROCAL 是错误发生器的参考值。
  3. 我们在以下位置找到了 AM33xx 的 NVALUERECIPROCAL 和传感器 N 以及传感器 P 电压之间的转换计算: https://github.com/Angstrom-distribution/meta-ti/blob/master/recipes-kernel/linux/linux-am335x-3.2.0-psp04.06.00.08/0001-am33xx-Add-SmartReflex-support.patch ,SR_ADJUST_efuse_value (…)。

 

这种计算来自哪里? 是否有任何信息?

该计算是否也适用于 DM3715?

我在我的采样(0xAAC7B6)上使用 JTAG 调试器读取 control.control_fuse OPP1G、并尝试了上述计算:

#include

int main (int argc、char * argv[])

 /*我只需读取 control.control_fuse OPP1G

    Lauterbach 调试器的 AM3715示例中的*

 unsigned int orig_opp_nvalue = 0xAAC7B6;

 unsigned int SENP_GAIN、SENn_GAIN、rnsenp、rnsenn;

 unsigned int senn、SENP、UV_senn、UV_SENP;

 

 /*计算源自: https://github.com/Angstrom-distribution/meta-ti/blob/master/recipes-kernel/linux/linux-am335x-3.2.0-psp04.06.00.08/0001-am33xx-Add-SmartReflex-support.patch */

 /*根据 efuse 值计算 SENn 和 SENP */

 SENP_GAIN =((orig_opp_nvalue >> 20)& 0xF);

 SENn_GAIN =((orig_opp_nvalue >> 16)& 0xF);

 rnsenp =((orig_opp_nvalue >> 8)& 0xff);

 rnsenn =(orig_opp_nvalue & 0xff);

 

 SENP =((1<<(SENP_GAIN+8))/(rnsenp));

 SENn =((1<<(SENn_GAIN+8))/(rnSENn));

 

 UV_SENP = (10 * SENP)/26;

 uV_senn =(senn/3);

 

 printf ("SENP:%d uV\n"、uV_SENP);

 printf ("SENn:%d uV\n"、uV_senn);

 

 返回0;

 

输出:

 

SENP:506uV

SENn:480uV

 

I 预期值 arround 1375uV。

这些值是否合理? 这些值将如何在误差发生器中使用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在原始帖子中添加了新评论!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已通知工厂团队。 反馈将发布在此处。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >1.) 平台 HAST 可在 OPP1G 中运行。 是否可以在未启用 AVS/SmartReflex 的情况下在 OPP1G 中运行 AM3715?

    是的、AVS 是 AM37x OPP1G 操作的要求、必须在引导后立即启用。

    >2.) 如果我们更需要用于 OPP1G 的 SmartReflex、我们如何对其进行测试?

    我假设您使用的是 Linux。 请参阅以下内容、了解如何从 Linux 中启用它。
    processors.wiki.ti.com/.../AM37x_Power_Management_User_Guide

    >3.) Linux 实现(无论哪个内核版本)似乎已经中断和过时、并且似乎依赖于 TWL4030/6030和兼容的 PMIC。

    SR AVS 驱动程序开发已通过验证并完成。 该问题需要由 Linux 软件专家来解决。 我将介绍系统和硬件。 我将要求我们的软件团队告诉您他们了解了解软件问题所需的信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是客户的回答:

    >>1.) 平台 HAST 可在 OPP1G 中运行。 是否可以在未启用 AVS/SmartReflex 的情况下在 OPP1G 中运行 AM3715?

    >是,AVS 是 AM37x OPP1G 操作的要求,必须在引导后立即启用。

     

    好的。

    >>2.) 如果我们更需要用于 OPP1G 的 SmartReflex、我们如何对其进行测试?

    >我假设您使用的是 Linux。 请参阅以下内容、了解如何从 Linux 中启用它。
    >processors.wiki.ti.com/.../AM37x_Power_Management_User_Guide

    这是用户指南。 我更想验证操作是否正确。 假设我们在 OPP1G 上,CONTROL_FUSE_OPP1G_VDD1和 CONTROL_FUSE_OPP1G_VDD2正确传递到 NVALUERECIPROCAL 和 ERMINIMIT/ERRMAXLIMIT 等。根据代码中的定义设置,电压处理器对‚BMIC‘中断作出反应,生成电压命令到 PMIC。 如何引发动态电压变化以触发电压调节。 我是否必须施加加热/冷/CPU 负载?


    >>3.) Linux 实现(无论哪个内核版本)似乎已经中断和过时、并且似乎依赖于 TWL4030/6030和兼容的 PMIC。

    >SR AVS 驱动程序开发已验证并完成。 该问题需要由 Linux 软件专家来解决。 我将介绍系统和硬件。 我将要求我们的软件团队告诉您 他们了解了解软件问题所需的信息。

     

    以下是我的疑问:

     

    a)由于 DVFS 可以更改目标 OPP、因此如果切换 OPP、SmartReflex 驱动器应更改目标电压。 ‚include/Linux/power/AVS/SmartReflex.h‘中的 API 具有以下 API:

    /* SmartReflex 模块启用/禁用接口*/

    void omap_sr_enable (struct voltagedomain * voltdm);

    void omap_sr_disable (struct voltagedomain * voltdm);

    void omap_sr_disable_reset_volt (struct voltagedomain * voltdm);

     

    当通过调用 First‚OMAP-SR_DISABLE (voltdm)‘然后将‚voltagedm->Nominal ‚v‘更改为新的目标 UV、然后调用 First 来更改 OPP 时、我预计此 API 至少必须有一个调用方

    OMAP_SR_ENABLE (voltdm)‘。  但我找不到任何调用方。

     

    b)在 DM3715上使用的 SmartReflex OPP 为:

     

    /* VDD 1 */

    #define OMAP3630_VDD_MPU_OPP50_UV              1012500

    #define OMAP3630_VDD_MPU_OPP100_UV             1200000

    #define OMAP3630_VDD_MPU_OPP120_UV             1325000

    #define OMAP3630_VDD_MPU_OPP1G_UV              1375000

     

    struct omap36xx_vddmpu_vvolt_data[]={

           VOLT_DATA_define (OMAP3630_VDD_MPU_OPP50_UV、OMAP3630_CONTRAL_FUSE_OPP50_VDD1、0xf4、0x0c)、

           VOLT_DATA_define (OMAP3630_VDD_MPU_OPP100_UV、OMAP3630_CONTRAL_FUSE_OPP100_VDD1、0xf9、0x16)、

           VOLT_DATA_define (OMAP3630_VDD_MPU_OPP120_UV、OMAP3630_CONTRAL_FUSE_OPP120_VDD1、0xfa、0x23)、

           VOLT_DATA_define (OMAP3630_VDD_MPU_OPP1G_UV、OMAP3630_CONTRAL_FUSE_OPP1G_VDD1、0xfa、0x27)、

           VOLT_DATA_define (0、0、0、0)、

    };

    …μ A

     

    /* VDD2 */

    #define OMAP3630_VDD_CORE_OPP50_UV             1000000

    #define OMAP3630_VDD_CORE_OPP100_UV            1200000

     

    struct omap36xx_vddcore_volt_data[]={

           VOLT_DATA_define (OMAP3630_VDD_CORE_OPP50_UV、OMAP3630_CONTRAL_FUSE_OPP50_VDD2、0xf4、0x0c)、

           VOLT_DATA_define (OMAP3630_VDD_CORE_OPP100_UV、OMAP3630_CONTRAL_FUSE_OPP100_VDD2、0xf9、0x16)、

           VOLT_DATA_define (0、0、0、0)、

    };

     

                   OPP 电压与数据表不匹配。 它应该是这样的:

     

                                                  /* VDD1 */

                                                  #define AM3715_VDD_MPU_OPP50_UV                970000

    #define AM3715_VDD_MPU_OPP100_UV               1140000

    #define AM3715_VDD_MPU_OPP130_UV               1270000

    #define AM3715_VDD_MPU_OPP1G_UV                1330000

     

    struct omap_volt_data am3715_vddmpu_vvolt_data[]={

                                                                 VOLT_DATA_define (AM3715_VDD_MPU_OPP50_UV、OMAP3630_CONTRAL_FUSE_OPP50_VDD1、0xf4、0x0c)、

                                                                 VOLT_DATA_define (AM3715_VDD_MPU_OPP100_UV、OMAP3630_CONTRAL_FUSE_OPP100_VDD1、0xf9、0x16)、

                                                                 VOLT_DATA_define (AM3715_VDD_MPU_OPP130_UV、OMAP3630_CONTRAL_FUSE_OPP120_VDD1、0xfa、0x23)、

                                                                 VOLT_DATA_define (AM3715_VDD_MPU_OPP1G_UV、OMAP3630_CONTRAL_FUSE_OPP1G_VDD1、0xfa、0x27)、

                                                                 VOLT_DATA_define (0、0、0、0)、

    };

    …μ A

    #define AM3715_VDD_CORE_OPP50_UV             950000

    #define AM3715_VDD_CORE_OPP100_UV            1140000

     

    struct omap_volt_data am3715_vddcore_volt_data[]={

           VOLT_DATA_define (AM3715_VDD_CORE_OPP50_UV、OMAP3630_CONTRAL_FUSE_OPP50_VDD2、0xf4、0x0c)、

           VOLT_DATA_define (AM3715_VDD_CORE_OPP100_UV、OMAP3630_CONTRAL_FUSE_OPP100_VDD2、0xf9、0x16)、

           VOLT_DATA_define (0、0、0、0)、

    };

                   我无法进一步验证‚errminlimit‘、‚errgain‘的值(宏:#define VOLT_DATA_define (_v_nom、_fefuse_偏移、_errminlimit、_errgain))
       AM3715是正确的。

                   我敢打赌、如果电压不同、它们也应该不同。

     

    c)代码:

      • arch/arm/mach-omap2/omap_twl.c
      • arch/arm/mach-omap2/twL-common.c
      • arch/arm/mach-OMAP2/twl-common.h

                  

    不适用于 TPS65910、因为它针对 TWL4030/6030进行了硬编码、与 TPS65910不兼容:

      • VDD1 (MPU)和 VDD2 (内核)寄存器的 PMIC 电压为0x23和0x26、而不是0x00和0x01
      • 启用 SmartReflex 后、没有用于切换到 I2C-SR 控制的逻辑
      • UV 计算与数据表中的格式不匹配

     

    此外、OMAP3通用平台的平台初始化会强制对 n ü‚drivers/regulator /TWL-reguler.c‘执行硬编码平台初始化、但不适用于该操作

    TPS65910。

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

    您好、查姆斯、

    同时、客户认为、SmartReflex/TPS65910在 WinCE 和 Linux 上的工作方式类似:

    我们仍然不确定这些参数是否正确、因为它们没有很好的记录。

    我们担心平台可能会在未经适当验证的情况下进入辅助状态(MPU/内核电压过低)。

    TI 能否回答以下问题:

    1. 如何根据 SENPVAL 计算 VDD? 请提供公式。
    2. 如何根据 SENNVAL 计算 VDD? 请提供公式。
    3. SENP 参考值如何根据 SENPGAIN 和 RNSENP 进行计算//我们的假设:SENP =((1<<(SENPGAIN+8))/(RNSENP))/ 2.6
    4. SENn 参考值如何根据 SENPGAIN 和 RNSENP 进行计算//我们的假设:SENP =((1<<(SENPGAIN+8))/(RNSENP))/3.0
    5. 如何根据 SENNVAL、SENPVAL 和 SENP/SENn 参考值计算 ist SENERROR? //我们的假设:(SENPVAL–SENP_reference value)+(SENNVAL-SENn_reference_value)/2
    6. SENERROR 是否与 ERRMAXLIMIT 和 ERRMINLIMIT 进行比较以确定是否越过上限/下限?
    7. 而是使用 AVGERROR 进行堆肥?
    8. SENERROR、ERRMAXLIMIT、ERRMINLIMIT 是否已签名/二进制补码?
    9. 在该计算中如何使用 ERRWEIGHT? 请提供公式。
    10. ERRMAXLIMIT = 0x2且 ERRMINLIMIT = 0xFA 和 ERRWEIGHT = 0x4是 AM3715上 OPP1G 的正确值吗? 它们由 WinCE 和 Linux 中的软件设置。 如果没有、请向我们提供正确的答案。
    11. ERRMAXLIMIT = 0x2且 ERRMINLIMIT = 0xFA 和 ERRWEIGHT = 0x4是 AM3715上 OPP130的正确值吗? 它们由 WinCE 和 Linux 中的软件设置。 如果没有、请向我们提供正确的答案。
    12. ERRMAXLIMIT = 0x2且 ERRMINLIMIT = 0xF9和 ERRWEIGHT = 0x4是 AM3715上 OPP100的正确值吗? 它们由 WinCE 和 Linux 中的软件设置。 如果没有、请向我们提供正确的答案。
    13. ERRMAXLIMIT = 0x2且 ERRMINLIMIT = 0xF4和 ERRWEIGHT = 0x4是 AM3715上 OPP50的正确值吗? 它们由 WinCE 和 Linux 中的软件设置。 如果没有、请向我们提供正确的答案。
    14. 电压处理器如何计算 PMIC 的 SMPS 值? 电压处理器不知道 PMIC 的公式(对于 TPS65910,VDD=12,5mV*Vsel +562,6mV)。
    15. 控制器算法中如何使用 ERROROFFSET 和 ERRORGAIN? 请提供公式? //我们的假设:这是一个 P 控制,并且在比例增益为 ERROFFSET 时未使用
    16. 对于所有 OPP,ERROFFSET = 0x0。 是这样吗? 如果未提供正确的值。
    17. EERORGAIN = 0x27是 AM3715上 OPP1G 的正确值吗? 如果未证明值正确?
    18. EERORGAIN = 0x23是 AM3715上 OPP130的正确值吗? 如果未证明值正确?
    19. EERORGAIN = 0x26是 AM3715上 OPP100的正确值吗? 如果未证明值正确?
    20. EERORGAIN = 0x0C 是 AM3715上 OPP50的正确值吗? 如果未证明值正确?
    21. 如何使用 INITVOLTAGE?
    22. INITVOLTAGE 是否必须设置为 AM3715 OPP 电压对应的 SMPS 值?
    23. 请提供 SENP 和 SENn 测量电路的原理图。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dirk、感谢您发布我们的问题。

    同时、我发现内核 SmartReflex Linux 内核 API 已更改(以及其他几个返工)。 更改由 TI 的 Nishanth Menon 维护):

    elinux.org/.../SmartReflex

    (笑声)
    SR_VP_ENABLE_两者
    SR_VP_DISABLE_两者
    SR_VOLTGE_SET
    (笑声)

    我假设修订版4是最新版本:

    marc.info/
    marc.info/
    marc.info/

    我是对的吗? 是否应用了此更改的 TI 内核 arround?

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

    19.有一个排印错误,它必须是:

    19. EERORGAIN = 0x16 是 AM3715上 OPP100的正确值吗? 如果未证明值正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除了'omap36xx_vddmpu_vvol_ddat'和'omap36xx_vddmpu_vvol_ddat'、
    "omap36xx_opp_def_list"也与 AM3715不匹配:

    (笑声)
    静态结构 omap36xx_opp_def __initdata omap36xx_opp_def_list[]={
    /* MPU OPP1 - OPP50 */
    opp_initializer ("MPU"、true、300000000、OMAP3630_VDD_MPU_OPP50_UV)、
    /* MPU OPP2 - OPP100 */
    opp_initializer ("MPU"、true、600000000、OMAP3630_VDD_MPU_OPP100_UV)、
    /* MPU OPP3 - OPP-Turbo */
    opp_initializer ("MPU"、false、8000000、OMAP3630_VDD_MPU_OPP120_UV)、
    /* MPU OPP4 - OPP-SB */
    opp_initializer ("MPU"、false、1000000000、OMAP3630_VDD_MPU_OPP1G_UV)、

    /* L3 OPP1 - OPP50 */
    opp_initializer ("l3_main"、true、100000000、OMAP3630_VDD_CORE_OPP50_UV)、
    /* L3 OPP2 - OPP100、OPP-Turbo、OPP-SB */
    opp_initializer ("l3_main"、true、200000000、OMAP3630_VDD_CORE_OPP100_UV)、

    /* DSP OPP1 - OPP50 */
    opp_initializer ("iva"、true、260000000、OMAP3630_VDD_MPU_OPP50_UV)、
    /* DSP OPP2 - OPP100 */
    opp_initializer ("iva"、true、520000000、OMAP3630_VDD_MPU_OPP100_UV)、
    /* DSP OPP3 - OPP-Turbo */
    opp_initializer ("iva"、false、660000000、OMAP3630_VDD_MPU_OPP120_UV)、
    /* DSP OPP4 - OPP-SB */
    opp_initializer ("iva"、false、8000000、OMAP3630_VDD_MPU_OPP1G_UV)、
    };
    (笑声)
    它必须类似于:
    (笑声)
    /* OPP 数据*/

    静态结构 omap_opp_def __initdata AM3715_opp_def_list[]={
    /* MPU OPP1 - OPP50 */
    opp_initializer ("MPU"、true、300000000、AM3715_VDD_MPU_OPP50_UV)、
    /* MPU OPP2 - OPP100 */
    opp_initializer ("MPU"、true、600000000、AM3715_VDD_MPU_OPP100_UV)、
    /* MPU OPP3 - OPP133 */
    opp_initializer ("MPU"、false、80000000000、AM3715_VDD_MPU_OPP130_UV)、
    /* MPU OPP4 - OPP1G */
    opp_initializer ("MPU"、false、1000000000、AM3715_VDD_MPU_OPP1G_UV)、

    /* L3 OPP1 - OPP50 */
    opp_initializer ("l3_main"、true、100000000、AM3715_VDD_CORE_OPP50_UV)、
    /* L3 OPP2 - OPP100 */
    opp_initializer ("l3_main"、true、200000000、AM3715_VDD_CORE_OPP100_UV)、
    };
    (笑声)

    不确定是否使用 DSP。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    已查看'linux-2.6.37-psp04.02.00.07'、这似乎是 AM3715的最新 TI 官方内核:参数与上述完全相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为 TI Linux 内核在 AM3715上运行、OPP 电压在规格上限。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们检查了 OPP1G 上的25个器件。 我们注意到、某些器件的电压明显低于 MPU 和内核电压的最小电压(例如 VDD_CORE = 0.975V (< 1.08V、VDD_MPU = 1.2125V < 1.28V)。

    根据 OPP 表的脚注,这通常是可以的。

    但是、这也意味着、如果器件在较低的电压限值下运行、则必须确保参数正确、以防止不允许的压降。

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

    Dirk、

    关闭该线程、因为我们已离线解决。

    对于将来要实现此目标的其他人、TI 针对 AM35x/AM37x 器件的最终官方 SDK 版本(包括 SmartReflex 支持)是 EZSDK 6.0、但该内核现在已经很旧了。  可在社区中找到较新内核的补丁、TI 不提供官方支持。

    除了一个例外、该主题中提到的 SmartReflex 值大多是正确的、并且希望为将来查找此主题的人澄清。

     对于 AM3715上的 OPP1G、EERORGAIN = 0x27
     对于 AM3715上的 OPP130、EERORGAIN = 0x23
     对于 AM3715上的 OPP100、EERORGAIN = 0x16
     对于 AM3715上的 OPP50、EERORGAIN = 0x0C

    此致、
    Mike