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.

[参考译文] Linux/AM5726:在 RT 修补内核中设置频率

Guru**** 2544130 points
Other Parts Discussed in Thread: AM5728, BEAGLEBOARD-X15

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597484/linux-am5726-set-frequency-in-rt-patched-kernel

器件型号:AM5726
主题中讨论的其他器件:DRA752AM5728BeagleBoard-X15

工具/软件:Linux

大家好、

我有一个 AM572x IDK、并从 http://software-dl.ti.com/processor-sdk-linux-rt/esd/AM57X/latest/exports/am57xx-evm-linux-rt-sdk-src-03.03.00.04.tar.xz 获取最新的 Linux 源代码

由于 DVFS 不是确定性行为、因此我禁用了 CONFIG_CPU_FREQ 和 CONFIG_CPU_IDLE。 据我了解、CPU 频率由引导加载程序设置、不会再次更改。 在 bootloader menuconfig 中、我看到 MPU 电压域参数设置为 OPP_NOM、我假设频率也是从该操作获取的。

我想将频率设置为1.176GHz、因此我将 器件树中 opp_nom 的行从

opp_table0{
compatible ="操作点-v2";
opp-shared;
linux、phandle =<0x3>;
phandle =<0x3>;

opp_nom@1000000000{
opp-Hz =<0x0 0x3b9aca00>;
opp-microsuspend =<0x102ca0 0x1850>
;opp-0x850-off>;opp-off>支持0x1850>



 (笑声) };

更改为

opp_table0{
compatible ="operating points-v2";
opp-shared;
linux、phandle =<0x3>;
phandle =<0x3>;

opp_nom@1100000000{
opp-Hz =<0x0 0x46185600>;
opp-microvolt =<0x11b340 0xd8108 0x11b340>;
opp-support-HW =<0xff 0x1>;
opp-suspend;
};

...
}; 


我使用 PERT 工具测量频率。

但遗憾的是、我的 Sitara CPU 仍在1.0GHz 上运行。 我出了什么问题? 设置频率的正确方法是什么?

此致、

家伙

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

    在 OPP_NOM 中、Cortex-A15的运行频率不能高于1GHz。 如果您需要1.176GHz、则应切换到 OPP_OD。

    请参阅 AM572x DM、表5-8。 支持的 OPP 与最大频率间的关系

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

    感谢您的回答。
    是否有方法使用禁用的 CONFIG_CPU_FREQ 参数将频率切换到 OPP_OD?

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

    首先在 u-boot 中设置1GHz OPP_NOM。 您可能会尝试将 u-boot 从 OPP_NOM 更改为 OPP_OD、因此默认情况下、您将在内核中具有 OPP_OD。 您可以从 menuconfig 中禁用 DVFS/cpufreq。

    u-boot-2016.05/arch/arm/include/asm/arch-omap5/clock.h -定义 CONFIG_DRA7_MPU_OPP_OD

    u-boot-2016.05/board/ti/am57xx/board.c -检查 get_voltraine_opp ()和 am572x_idk_volvel

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

    您好、Pavel、

    再次感谢:-)

    因此我设置 CONFIG_DRA7_MPU_OPP_OD。 并向 board/ti/am57xx/board.c:get_voltraine_opp ()添加了一个 debug ()函数、该函数被调用三次、因为我假设它是 arch/arm/cpU/armv7/omap5/fdt.c:ft_opp_clock_fixups。 但绝不会调用 VOLT_MPU。 我是否还需要调整其他源文件?

    -无论如何,我在 u-boot 的第一行上也得到了奇怪的输出:

    U-Boot 2016.05-00319-ge811b89-m脏(2017年6月06日- 17:50:47 +0200)
    
    initcall:8080f1fd
    U-Boot 代码:80800000 -> 80864F50 BSS:-> 808B4554
    initcall:80b31
    CPU:DRA752-inittle ES2.0
    call:80800000-> 80864F50 BSS:-> 808B4554未知
    
    电路板(电路板) 版本未知
    initcall:8080f221
    DRAM: initcall: 80800af5>>SDRAM_init()
    

    因此、似乎未正确设置"Board Parameter"。 您知道我可以在哪里更改它吗?
    仅仅在 board.c 的第76行对它进行硬编码对我来说似乎不是正确的解决方案。

    -还会打印 u-boot:

    绑定节点 CPU
    设备'CPU'没有兼容字符串 

    这可能是个问题吗?

    -是否需要其它配置? 时钟驱动器? 我的配置基于 am57xx_evm_defconfig。

    此致、

    家伙

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

    大家好、

    [引用 USER="Guy Bilgerig">所以我设置 CONFIG_DRA7_MPU_OPP_OD。 并向 board/ti/am57xx/board.c:get_voltraine_opp ()添加了一个 debug ()函数、该函数被调用三次、因为我假设它是 arch/arm/cpU/armv7/omap5/fdt.c:ft_opp_clock_fixups。 但绝不会调用 VOLT_MPU。 我是否还需要调整其他源文件?

    实际上、我看到在 u-boot 中没有设置 OPP_OD (或 OPP_HIGH)的选项。 要设置 OPP_OD、我们应使用 CTRL_CORE_STD_FUSE_OPP_VMIN_MPU_3/0x4A003B24寄存器、但在 u-boot 中看不到该寄存器的用法。 我们只有 OPP_NOM:

    /* STD_FUSE_OPP_Vmin_MPU_2 *
    #define STD_FUSE_OPP_Vmin_MPU_NOM   (DRA752_EFUSE_BASE + 0x1B20)

    #define VDD_MPU_DRA7_NOM   1150

     struct vcores_data am572x_idk_vv ={
       .mpu.value[OPP_NOM]   = VDD_MPU_DRA7_NOM、
       .mpu.efuse.reg[OPP_NOM]   = STD_FUSE_OPP_Vmin_MPU_NOM、
       .mpu.efuse.reg_bits    = DRA752_EFUSE_REGBITS、

    这是因为我们在 AM572x DM 中有以下要求:

    5.5.2电压和内核时钟规范 - OPP_OD 和 OPP_HIGH 在引导期间(在启用 AVS 之前)不适用。 启用 AVS 后、可选择 OP_OD 和 OPP_HIGH。 对于所有 OPS、必须启用 AVS、以避免影响器件可靠性、寿命 POH (通电小时数)和器件功耗。

    Linux 内核中启用了 AVS、因此您应该在 Linux 内核(启用 AVS 后)或用户空间中切换到 OPP_OD。


    另请注意、高度需要使用 AVS/SmartReflex、请参阅以下 e2e 线程:

    我还将检查您的其他问题、并在我有问题时返回给您。

    此致、
    帕维尔

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

    在 u-boot 中、在以下文件和函数的 DPLL_MPU 寄存器中设置 Cortex-A15 MPU 时钟频率(1000MHz):

    u-boot/arch/arm/cpU/armv7/omap-common/clocks-common.c -> configure_mpu_DPLL ()

    与该1000MHz 频率和 OPP (OPP_NOM)相对应的电压设置在以下文件和函数中:

    u-boot/arch/arm/cpU/armv7/omap-common/clocks-common.c -> scale_vcores ()

    opp = get_voltrain_opp (VOLT_MPU);
    调试("MPU:%d\n"、vcores->mpu.value[opp]);
    do_scale_vCORE (vcores->mpu.addr、vcores->mpu.value[opp]、vcores->mpu.PMIC);
    /*按比例配置 MPU ABB LDO */
    abb_setup (vcores->mpu.efuse.reg[opp]、
    (* Ctrl)->control_wkup_ldovbb_MPU_VOLTGE_CTRL、
    (* prcm)->PRM_abbldo MPU_setup、
    (* prcm)->PRM_abbldo MPU_Ctrl、
    (* prcm)->PRM_irqstatus_MPU_2、
    vcores->MPU.ABB_TX_DONE_MASK、
    OMAP-ABB_FAST_OPP);

    您可以在 Linux 内核和/或用户空间中重复使用该方法。 我认为在用户空间中使用 omapconf 工具更容易应用这些设置(将 DPLL_MPU 寄存器更改为1176MHz、将 PMIC 更改为 OPP_OD)。 有关 omapconf 工具的更多信息、请参阅以下 wiki:

    github.com/.../wiki

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

    [引用用户="Guy Bilgerig"]

    -无论如何,我在 u-boot 的第一行上也得到了奇怪的输出:

    U-Boot 2016.05-00319-ge811b89-m脏(2017年6月06日- 17:50:47 +0200)
    
    initcall:8080f1fd
    U-Boot 代码:80800000 -> 80864F50 BSS:-> 808B4554
    initcall:80b31
    CPU:DRA752-inittle ES2.0
    call:80800000-> 80864F50 BSS:-> 808B4554未知
    
    电路板(电路板) 版本未知
    initcall:8080f221
    DRAM: initcall: 80800af5>>SDRAM_init()
    

    因此、似乎未正确设置"Board Parameter"。 您知道我可以在哪里更改它吗?
    仅仅在 board.c 的第76行对它进行硬编码对我来说似乎不是正确的解决方案。

    [/报价]

    AM572x GP EVM 和 IDK EVM 的 I2C 上连接了 EEPROM 存储器。 每个 AM572x IDK EVM 都具有唯一的序列号。 此序列号打印在 IDK 的贴纸上、并编程到通过 I2C 总线连接到 AM5728处理器的 SEEPROM 存储器件中。 SEEPROM 还包含电路板详细信息、例如电路板类型、版本、配置等。

    在 AM572x GP EVM 中、我具有:

    U-Boot 2016.05-g6c5519b6fc (2016年12月14日- 20:19:24 -0500)

    CPU :DRA752-GP ES1.1
    型号:TI AM5728 BeagleBoard-X15
    电路板:AM572x EVM 修订版 A.20

    如果您的定制板上没有 EEPROM、请删除该功能、请参阅 board.c do _board_detect () function。 另请参阅以下 e2e 线程:

    此致、
    帕维尔

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

    [引用用户="Guy Bilgerig"]

    -还会打印 u-boot:

    绑定节点 CPU
    设备'CPU'没有兼容字符串 

    [/报价]

    您能否提供完整的 u-boot 启动日志? 我需要在哪个阶段准确地看到这条消息。

    [引用 user="Guy Bilgerig"]-是否需要任何其他配置? 时钟驱动器? 我的配置基于 am57xx_evm_defconfig。

    对于构建 u-boot、am57xx_evm_defconfig 是正确的。

    此致、
    帕维尔

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

    您好!

    因此、omapconf 工具在验证和操作用户空间中的值时看起来非常酷。 我可以评估该工具。 我只需 通过 omapconf 写入0x4A00516C 0x81F409、即可从用户空间更改频率。  它实际上非常脏、因为我没有检查锁定程序。

    当我在 clocks-common.c 中更改 CM_CLKSEL_DPLL_MPU 并启用 DCC_en 以获得高于1.4GHz 的频率时 、内核不再启动。 设置 DCC_EN 是否需要之前的一些额外配置?

    此致、Guy

    (关于另一个问题。 我可以解决电路板检测问题、这也解决了绑定节点 CPU 问题。)

    omapconf 写入0x4A00516C

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

    对于高于1.4GHz (也高于1.176GHz)的 Cortex-A15频率、您应该切换到 OPP_HIGH。

    另请注意、当 DCC_EN = 1时、DPLL 输出时钟公式不同:

    Fdpll =频率 x (M/(N+1))

    当 DCC_EN = 0时:

    Fdpll =频率 x 2 x M /(N+1)


    您还可以看到如何在 GEL 文件中处理 DCC_EN:

    ccsv6/ccs_base/emulation/boards/am572x/gel/am572x_prcm_config.gel

    /*********
    * DPLL_a15_opp_config():Cortex A15 DPLL OPP 配置
    秘书长的报告 /
    DPLL_a15_opp_config (uint32_t opp、uint32_t device_type)

    uint32_t DPLL_m、DPLL_n、divm2、DCC_en;
    DCC_EN = 0;

    GEL_TextOut ("\tCortex A15 DPLL OPP %d 时钟配置正在进行中...\n"、、、、 OPP);

    IF (OPP_HIGH =OPP)

    //1500MHz、20MHz SYS_clk
    DPLL_m = 600;
    DPLL_n = 7;
    DIM2 = 1;
    DCC_EN = 1;




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

    您好、Pavel、

    当然。 我必须切换 OPP_HIGH。 感谢您的所有帮助。

    希望了解最终解决方案的人的理想选择。 我修改了 u-boot/arch/arm/cpu/armv7/omap-common/clocks-common.c–scale_vcore 函数(MPU 起始部分):

    …μ A
    //对于 MPU 强制 OPP 为高电平
    //opp = get_voltrain_opp (volt_MPU);
    OPP = OPP_HIGH;
    调试("MPU:%d\n"、vcores->mpu.value[opp]);
    do_scale_vCORE (vcores->mpu.addr、vcores->mpu.value[opp]、
    vcores->MPU.PMIC);
    …
    

    和 u-boot/arch/arm/cpu/armv7/omap-common/clocks-common.c–configure_mpu_DPLL 函数:

    …μ A
    void configure_mpu_DPLL (void)
    {
    struct DPLL_params params;
    struct DPLL_regs * mpu_DPLL_regs;
    
    u32 omap_rev;
    omap_rev = omap_revision ();
    调试("OMAP 版本:%u\n",OMA_rev);
    
    //激活旁路模式
    BYPASS_DPLL (((*prcm)->cm_clkmode_DPLL_MPU);
    
    //在 CM_CLKSEL_DPLL_MPU 中设置 DCC_EN
    MPU_DPLL_regs =(struct DPLL_regs *)((* prcm)->cm_clkmode_DPLL_MPU);
    setbits_le32 (&MPU_DPLL_regs->cm_clksel_DPLL、CM_CLKSEL_DCC_EN_MASK);
    
    //将 fdpll 设置为1.5GHz = 20MHz * 600/(7+1)
    //params =(DPLL_params){600、7、1、1、-1、 -1、-1、-1、-1、-1、-1、 -1、-1};
    params.m = 600;
    params.n = 7;
    params.m2 = 1;
    Params.m3 = 1;
    params.M4_H11 =-1;
    params.m5_h12 =-1;
    params.m6_h13 =-1;
    params.m7_h14 =-1;
    params.h21 =-1;
    params.h22 =-1;
    params.h23 =-1;
    params.h24 =-1;
    
    do_setup_DPLL (((*prcm)->cm_clkmode_DPLL_MPU、&params、DPLL_LOCK、"MPU");
    调试("MPU DPLL 锁定\n");
    
    }
    …
    

    此致、

    家伙