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.

AM3352若在u-boot默认CORE和MPU均默认以1.1V电源供电,后导致后续linux内核调度异常?

Other Parts Discussed in Thread: TPS65218, AM3352, TPS65217

Ti的工程师,你们好!我们这边有一个奇怪电源的问题请教你们。

      我们板子CPU是AM3352, PMIC是TPS65218。早前我们板子在u-boot的board\ti\am335x\board.c的am33xx_spl_board_init()内缺少了像Beaglebone板或是EVM板一样做初始化PMIC。从该函数的Beagleboned分支if (board_is_bone(&header) || board_is_bone_lt(&header)) 可以看到u-boot将MPU电压设置为1.275V,CORE电压设置为1.125V。 而 我们的板子PMIC在u-boot由于没做这部分初始化默认给CORE和MPU均供电1.10V。  从手册上来说1.1V也是在合理范围内的。而且在这种条件下我们板子启动linux一切正常。但是板子连续工作个一、两天后会出现看门狗溢出重启,而且是必然的,出现时间不固定,但均不超过两天。 若关掉看门狗挂机,两天后就可以看到以下异常情况:

1、在cat /proc/interrupts中的gp_timer中断计数不再增加

2、使用date命令查看时间会出现时间倒退 (两次查看时间 后者比前者时间更早)

3、用户程序log信息不再输出,原先一直有输出,应该是无法调度了. 但控制台正常.

4、使用top命令查看各线程的cpu使用率均是0%

我认为以上的这些异常都有归结为作为clockevent的gp_timer(与系统调度有关的DMTime2)工作异常了。gp_timer中断计数不再增加不增加可以印证。

期间试了很多方法均无法解决该问题。

最近对比发现我们再u-boot的board\ti\am335x\board.c的am33xx_spl_board_init()内缺少了像Beaglebone板或是EVM板一样做初始化PMIC。当我们模仿Beaglebone将PMIC TPS65218给PMU电压设置为1.270V(TPS65218没有1.275V档位)给CORE电压设置为1.120V(TPS65218没有1.125V档位),目前工作了约6天没再出现看门狗溢出重启的情况。

请问工程师们在u-boot阶段修改PMU和CORE电压,是有什么要求吗?如有 能否提供一些文档依据? 使用1.1V有什么不妥?

我的修改如下:

u-boot/board\ti\am335x\board.c

void am33xx_spl_board_init(void)
{

...

if (board_is_bone(&header) || board_is_bone_lt(&header)) {
/* BeagleBone PMIC Code */

...

+ } else if (board_is_my-custom-board(&header)) {
+
+ puts("Do my-custom-board tps65218 init ...\n");
+ i2c_set_bus_num(2);
+ //power_tps65218_init(I2C_PMIC);
+ if (i2c_probe(TPS65218_CHIP_PM)) {
+ puts("No tps65218 found!\n");
+ return;
+ }
+
+ /*
+ * Increase USB current limit to 1300mA or 1800mA and set
+ * the MPU voltage controller as needed.
+ */
+ if (dpll_mpu_opp100.m == MPUPLL_M_1000) {
+ mpu_vdd = TPS65218_DCDC_VOLT_SEL_1320MV; //1325MV
+ } else {
+ mpu_vdd = TPS65218_DCDC_VOLT_SEL_1270MV; //1275MV
+ }
+
+ /* Set DCDC1 (CORE) voltage to 1.125V */
+ puts("Set DCDC1 (CORE) voltage to 1.120V!\n");
+ if (tps65218_voltage_update(TPS65218_DCDC1,
+ TPS65218_DCDC_VOLT_SEL_1120MV)) { //1125MV
+ puts("tps65218_voltage_update failure1\n");
+ }
+
+ /* Set CORE Frequencies to OPP100 */
+ puts("Set CORE Frequencies to OPP100!\n");
+ do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
+
+ /* Set DCDC2 (MPU) voltage */
+ printf("Set DCDC2 (MPU) voltage mpu_vdd=0x%x...\n", mpu_vdd);
+ if (tps65218_voltage_update(TPS65218_DCDC2, mpu_vdd)) {
+ puts("tps65218_voltage_update failure2\n");
+ }
+
+ /* Set DCDC3 (DDR3) to 1.35V for eg9041. */
+ puts("Set DCDC3 (DDR3) to 1.35V for my-custom-board.\n");
+ if (tps65218_voltage_update(TPS65218_DCDC3,
+ TPS65218_DCDC3_VOLT_SEL_1350MV)) {
+ puts("tps65218_voltage_update failure3\n");
+ }
+
+ /*
+ * Set LDO1 output voltage to 1.8V for my-custom-board.
+ */
+ puts("Set LDO1 output voltage to 1.8V for eg9041.\n");
+ if (tps65218_reg_write(TPS65218_PROT_LEVEL_2,
+ TPS65218_LDO1,
+ TPS65218_LDO_VOLTAGE_OUT_1_8,
+ TPS65218_LDO_MASK))
+ puts("tps65218_reg_write failure\n");
+
+ puts("Do eg9041 tps65218 init ... done.\n");
+ i2c_set_bus_num(0);
+
} else {
/*
* The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
* MPU frequencies we support we use a CORE voltage of
* 1.1375V. For MPU voltage we need to switch based on
* the frequency we are running at.
*/

...
        /* Set CORE Frequencies to OPP100 */
        do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
}

/* Set MPU Frequency to what we detected now that voltages are set */
do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
}

  • 请问您的AM3352主频是跑到多少MHz? 如果是跑800MHz的话,MPU_VDD需要1.26v供电。不同的opp需要的供电电压不一样。
    5.4 Operating Performance Points (OPPs)
    www.ti.com/.../am3352.pdf
  • 你好 zhang工, 感谢你的回复

    我们的CPU型号最高仅支持800MHz。

      如前面我所说,即便我原先没能像BeagleBone一样在u-boot里能配置PMIC,见am33xx_spl_board_init()内的

            /* Set DCDC3 (CORE) voltage to 1.125V */
            if (tps65217_voltage_update(TPS65217_DEFDCDC3,
                            TPS65217_DCDC_VOLT_SEL_1125MV)) {
                puts("tps65217_voltage_update failure\n");
                return;
            }

    。。。

           mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV

            /* Set DCDC2 (MPU) voltage */
            if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
                puts("tps65217_voltage_update failure\n");
                return;
            }

    但是u-boot的am33xx_spl_board_init()代码里还是对MPU和CORE的PLL配置了,

         /* Set CORE Frequencies to OPP100 */
         do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);

        /* Set MPU Frequency to what we detected now that voltages are set */
        do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);

    如你提供的连接内“5.4 Operating Performance Points (OPPs)”所描述1.10V都是MPU和CORE OPP表里OPP100推荐的NOM电压值。

    同时 我的linux内核和dts都是有DVFS和PMIC的相关的配置的,

    我的问题是:

    只是没在u-boot中初始化PMIC给CORE供1.125V,没给MPU供1.275V, 这两个电压不初始化为什么会导致后续linux系统在运行2天左右后会出现内核异常?(异常参前面所说) 这个问题我们查了很久,因为即使我们u-boot阶段只是提供了1.1V,内核的引导以及后续的系统运行看起来都一切正常,除了上述说的挂机运行一段时间后内核异常。

    同样,这样的一个异常我们也能在BeagleBone Black开发板复现,只有在u-boot代码里am33xx_spl_board_init()里去掉关于BeagleBone Black分支的电源初始化。

    #if 0

        if (board_is_bone(&header) || board_is_bone_lt(&header)) {
            /* BeagleBone PMIC Code */

    。。。

       }

    #endif 

    你那边能否提供一些有说服力的解析或分析 谢谢!

  • 请打印一下主频是多少?确定kernel里没有再配置主频。
  • 我们也遇到了相同的问题。我们是AM3352BZCZA60。我一次测试56台,一天左右会死机差不多8台。表现均为调度器卡死,貌似是DMTimer2停止导致的clockevent 丢失,jiffies停止计数,但是系统时间还能正常累计;如果有中断服务函数还可以响应,但是因为调度器卡死就没有后续了。串口Sysrq还能响应。进行了DDR3的software leveling,能找出最优的参数,修改uboot ddr3 参数还是死机。然后进行内存压力测试,一整天也没有出错,基本可以排除内存故障。测电源纹波也正常。正准备升电压试一下。
  • clockevent 依赖一某个硬件定时器,这个多如果都出现在这个地方先检查一下硬件时钟的稳定性,在你参考的板子的上试试是否有同样的问题