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.

[参考译文] AM3354:在 U-boot 中设置600MHz MPU 频率

Guru**** 2589280 points
Other Parts Discussed in Thread: AM3354, TPS65217

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/641050/am3354-setting-600mhz-mpu-frequency-in-u-boot

器件型号:AM3354
主题中讨论的其他器件: TPS65217

您好!

SDK: ti-processor-sdk-linux-am335x-evm-03.03.00.04-Linux-x86-Install.bin  

编译文件: AM335x_boneblack_defconfig

电源芯片: TPS65217DRSL

am3354硬件电压值: VDDS_DDR 1.35V,  VDD_MPU 1.01V, VDD_CORE 1.101V, 时钟晶体:24MHZ

目的是在 Uboot 期间将 VDDS_DDR 配置为1.35V、1.01V 至 VDD_MPU、1.101V 至 VDD_CORE 配置为600M。

AM3354运行至以下位置卡将断电:  

该测试发现 uboot 级断电芯片电源卡。  

DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev); //读取 DPLL_MPU_opp100.m 为1000MHz

DPLL_MPU_opp100.m = MPUPLL_M_600; // DPLL_MPU_opp100.m 为600MHz

do_setup_DPLL (&DPLL_MPU_regs、&DPLL_MPU_opp100);  

DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev); //设置后读取 DPLL_MPU_opp100.m 值仍然为1000MHz

如何将 MPU 频率设置为600M ??

代码显示如下(board/ti/AM335x/board.c)。 AM3354的名称是 board_is_Bone_lt () :

void am33xx_spl_board_init (void)

INT MPU_VDD;

/*获取频率*/
DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);
printf ("clk =%d\n"、DPLL_MPU_opp100.m);      //printf clk = 1000

if (board_is_Bone ()|| board_is_Bon_lt ()){
/* BeagleBone PMIC 代码*/
int usb_cur_lim;

/*
*仅在电路板版本> A1时执行 PMIC 配置
BeagleBone White 上的*
*
if (board_is_Bone ()&&!strncmp (board_ti_get_rev ()、"00A1"、4))
返回;

IF (i2c_probe (TPS65217_chip_PM))
返回;

/*
*在 BeagleBone White 上、我们需要确保使用交流电源
*然后再增加频率。
*
if (board_is_Bone ()){
uchar PMIC_STATUS_reg;
IF (tps65217_reg_read (TPS65217_status、
PMIC_STATUS_reg))
返回;
if (!(PMIC_STATUS_REG 和 TPS65217_PWR_SRC_AC_BITMASK)){
放置("无交流电源、禁用频率开关\n");
返回;

/*
*覆盖自我们知道是否有检测到的内容
* BeagleBone Black 支持1GHz。
*
if (board_is_Bone_lt ())
DPLL_MPU_opp100.m = MPUPLL_M_600;

/*
*将 USB 电流限制增加到1300mA 或1800mA 并进行设置
*根据需要使用 MPU 电压控制器。
*
if (DPLL_MPU_opp100.m =MPUPLL_M_600){
USB_cur_lim = TPS65217_USB_input_CUR_limit_1800MA;
MPU_VDD = TPS65217_DCDC_VOLT_SEL_1125MV;
}否则{
USB_cur_lim = TPS65217_USB_input_CUR_limit_1300MA;
MPU_VDD = TPS65217_DCDC_VOLT_SEL_1125MV;

IF (tps65217_reg_write (TPS65217_PROT_level_none、
TPS65217_POWER_PATH、
USB_cur_lim、
TPS65217_USB_INPUT_CUR_LIMIT_MASK))
PUT ("tps65217_reg_write failure\n"\});

/*将 DCDC3 (内核)电压设置为1.125V */
IF (tps65217_VOLTAGE_UPDATE (TPS65217_DEFDCDC3、
TPS65217_DCDC_VOLT_SEL_1125MV){
PUT ("tps65217_VOLTAGE_UPDATE FAILENT\n");
返回;

/*将核心频率设置为 OPP100 */
do_setup_DPLL (&DPLL_CORE_reg、&DPLL_CORE_opp100);

/*设置 DCDC2 (MPU)电压*/
if (tps65217_VOLTAGE_UPDATE (TPS65217_DEFDCDC2、MPU_VDD)){
PUT ("tps65217_VOLTAGE_UPDATE FAILENT\n");
返回;

/*
*将 BeagleBone 的 LDO3、LDO4输出电压设置为3.3V。
*对于 BeagleBone Black、将 LDO3设置为1.8V、将 LDO4设置为3.3V。
*
if (board_is_Bone ()){
IF (tps65217_reg_write (TPS65217_PROT_LEVEL_2、
TPS65217_DEFLS1、
TPS65217_LDO_VOLTGE_OUT_3_3、
TPS65217_LDO_MASK))
PUT ("tps65217_reg_write failure\n"\});
}否则{
IF (tps65217_reg_write (TPS65217_PROT_LEVEL_2、
TPS65217_DEFLS1、
TPS65217_LDO_VOLTGE_OUT_1_8、
TPS65217_LDO_MASK))
PUT ("tps65217_reg_write failure\n"\});

IF (tps65217_reg_write (TPS65217_PROT_LEVEL_2、
TPS65217_DEFLS2、
TPS65217_LDO_VOLTGE_OUT_3_3、
TPS65217_LDO_MASK))
PUT ("tps65217_reg_write failure\n"\});

printf ("写入 be clk =%d\n"、DPLL_MPU_opp100.m);  
/*将 MPU 频率设置为我们现在检测到的值,此时电压已设置*/
do_setup_DPLL (&DPLL_MPU_regs、&DPLL_MPU_opp100);

DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);
printf ("clk =%d\n"、DPLL_MPU_opp100.m);

BR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Andre、

    请浏览下面的 e2e 主题、我们在这里讨论了类似的问题:

    e2e.ti.com/.../2093803

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您发送连接、我看到过它、但它没有太大帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您发送连接、我看到过它、但它没有太大帮助。
    在 board/ti/am335x/board.c:中
    我设置 VDDS_DDR 1.35V,VDD_MPU 1.01V,VDD_CORE 1.101V。 通过读回寄存器、可以正确配置这些电压值。

    但是、MPU 频率设置为600MHz、回读频率设置为1000MHz。

    我按如下方式设置方法:
    DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);//读取 DPLL_MPU_opp100.m 为1000MHz

    DPLL_MPU_opp100.m = MPUPLL_M_600;//将 DPLL_MPU_opp100.m 设置为600MHz

    struct DPLL_params DPLL_MPU_opp100 ={
    600、OSC-1、1、-1、-1、 -1、-1};// OSC 为24
    const 结构 DPLL_params DPLL_CORE_opp100 ={
    600、OSC-1、-1、-1、-10、 8、4};//OSC 为24

    do_setup_DPLL (&DPLL_CORE_reg、&DPLL_CORE_opp100);
    do_setup_DPLL (&DPLL_MPU_regs、&DPLL_MPU_opp100);

    DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);//设置后读取 DPLL_MPU_opp100.m 值仍然为1000MHz

    通过 AM335x_get_efuse_mpu_max_freq (cdev)读取的值仍然为1000MHz。
    我的方法有什么问题?

    这个问题困扰了我好几天,我希望你能帮助我。 谢谢你。
    BR、
    Andre
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andre、

    您使用的 AM335x 器件型号是什么? 例如、我有器件型号为 XAM3359BZCZ100的 AM335x Starterkit EVM。

    [引用用户="Andre feng)]我将方法设置如下:
    DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);//读取 DPLL_MPU_opp100.m 为1000MHz

    DPLL_MPU_opp100.m = MPUPLL_M_600;//将 DPLL_MPU_opp100.m 设置为600MHz

    struct DPLL_params DPLL_MPU_opp100 ={
    600、OSC-1、1、-1、-1、 -1、-1};// OSC 为24
    const 结构 DPLL_params DPLL_CORE_opp100 ={
    600、OSC-1、-1、-1、-10、 8、4};//OSC 为24

    do_setup_DPLL (&DPLL_CORE_reg、&DPLL_CORE_opp100);
    do_setup_DPLL (&DPLL_MPU_regs、&DPLL_MPU_opp100);

    DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);//设置后读取 DPLL_MPU_opp100.m 值仍然为1000MHz

    通过 AM335x_get_efuse_mpu_max_freq (cdev)读取的值仍然为1000MHz。
    我的方法有什么问题?

    AM335x_get_efuse_mpu_max_freq ()函数返回特定器件支持的最大可能 MPU 频率。 此函数位于以下文件中:

    u-boot/arch/arm/cpU/armv7/am33xx/sys_info.c

    由于您不修改该函数、它将始终返回相同的结果(1000MHz -您的器件支持的最大频率)。

    正确的方法是转储 MPU DPLL 寄存器以验证600Mhz 是否正确设置、而不是再次读取 AM335x_get_efuse_mpu_max_freq 返回的值。 这在我提供的 e2e 线程中得到了全面的解释。

    void am33xx_spl_board_init (void)

       INT MPU_VDD;

       /*获取频率*/
       //DPLL_MPU_opp100.m = AM335x_get_efuse_MPU_max_freq (cdev);
      DPLL_MPU_opp100.m = 600;//MPUPLL_M_600

     printf ("DPLL_MPU_opp100.m =%d\n"、DPLL_MPU_opp100.m);

    if (board_is_Bone ()|| board_is_Bon_lt ()){

    printf ("电路板被检测为 Bone\n");

    /*
          *覆盖自我们知道是否有检测到的内容
          * BeagleBone Black 支持1GHz。
          *
          如果(board_is_Bon_lt ()){

               printf ("电路板被检测为 Bone LT\n");
             DPLL_MPU_opp100.m = MPUPLL_M_1000;
                printf ("DPLL_MPU_opp100.m =%d\n"、DPLL_MPU_opp100.m);
           }

     .

    }否则{

    printf ("电路板未被检测为 Bone\n");// EVM、SK、IDK 的情况

    /*将 MPU 频率设置为我们现在检测到的值,此时电压已设置*/

        printf ("DPLL_MPU_opp100.m =%d\n"、DPLL_MPU_opp100.m);
       do_setup_DPLL (&DPLL_MPU_regs、&DPLL_MPU_opp100);

    请如上所示修改 am33xx_spl_board_init()函数并提供您拥有的完整日志。

    此致、
    帕维尔

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

    [引用用户="Andre feng"] VDD_MPU 1.01V[/引用]

    您仍不能按要求提供 AM335x 器件型号、但在所有情况下、要在600MHz/OPP100下工作的 VDD_MPU 的标称电压应为1.100V、最小电压为1.056V。 它不能为1.01V。 请参阅 AM335x 数据表、5.4运行性能点(opps)