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);
}