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.

DEVOFF event of TPS65950 will result Restart of the system instead of power off

Other Parts Discussed in Thread: TPS65950

Hi all,

I am using Beagle board rev C4 with android 2.0 .to shut down (power off ) the omap +tps completly  i used the following piece of code,

err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, PWR_P1_SW_EVENTS);

if (err)

{

printk(KERN_WARNING "I2C error %d while reading TWL4030" "PM_MASTER P1_SW_EVENTS\n", err);

}

val |= PWR_DEVOFF;

err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, PWR_P1_SW_EVENTS);

if (err)

{

printk(KERN_WARNING "I2C error %d while writing TWL4030" "PM_MASTER P1_SW_EVENTS\n", err);

}

 

it seems above piece of code works. instead of power OFF omap restarts.

1.do i have to setup some other registers in tps65950 before do the above SW device off?

2.Other electrical design consideration i have look in to?

 

Thanks!


  • Ultimately i found the cause of the problem. This Restart happens in the Beagle board because VBUS is always powerd by 5V supply. So when tps65950 enter WAIT-ON mode. it dtectet that VBUS is high and switch -on the omap again.This can be avoid by set CFG_Px_TRANSITION  STARTON_VBUS to logic 0.

  • Hi,

    I know it's been a while since this question came up.

    I'm experiencing the same problem with a Beagleboard xM, where VBUS is also always powered by 5V supply, and I have tried to follow dilan's advice, disabling VBUS wakeup with the following code:

                   /* Set STARTON_VBUS to logic 0 in CFG_P1_TRANSITION  */
                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P1_TRANSITION);
               val &= ~0x20;
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P1_TRANSITION);

                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P2_TRANSITION);
               val &= ~0x20;
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P2_TRANSITION);

                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P3_TRANSITION);
               val &= ~0x20;
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P3_TRANSITION);

                 /* Activate DEVOFF bit of P1_SW_EVENTS */
                  twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_P1_SW_EVENTS);
               val |= 0x01;
                 twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_P1_SW_EVENTS);

    However, I still have the problem, when I enter the last I2C command, the board restarts instead of being powered off.

    Am I missing something here?

    Thank you.

     

  • Please read the config register to check if you can read back the correct value. 

  • No, I can't.

    [  241.225982] setting TWL4030_PM_MASTER_CFG_P1_TRANSITION: 0xdf
    [  241.232238] TWL4030_PM_MASTER_CFG_P1_TRANSITION: 0xff
    [  241.237701] setting TWL4030_PM_MASTER_CFG_P2_TRANSITION: 0xdf
    [  241.243927] TWL4030_PM_MASTER_CFG_P2_TRANSITION: 0xff
    [  241.249328] setting TWL4030_PM_MASTER_CFG_P3_TRANSITION: 0xdf
    [  241.255584] TWL4030_PM_MASTER_CFG_P3_TRANSITION: 0xff

    I try to write 0xdf but I readback 0xff.

    I used the following code:

     

                   /* Set STARTON_VBUS to logic 0 in CFG_P1_TRANSITION  */
                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P1_TRANSITION);
               val &= ~0x20;
            printk("setting TWL4030_PM_MASTER_CFG_P1_TRANSITION: 0x%02x\n", val);
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P1_TRANSITION);
                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P1_TRANSITION);
               printk("TWL4030_PM_MASTER_CFG_P1_TRANSITION: 0x%02x\n", val);

                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P2_TRANSITION);
               val &= ~0x20;
            printk("setting TWL4030_PM_MASTER_CFG_P2_TRANSITION: 0x%02x\n", val);
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P2_TRANSITION);
                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P2_TRANSITION);
               printk("TWL4030_PM_MASTER_CFG_P2_TRANSITION: 0x%02x\n", val);

                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P3_TRANSITION);
               val &= ~0x20;
            printk("setting TWL4030_PM_MASTER_CFG_P3_TRANSITION: 0x%02x\n", val);
                   twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_CFG_P3_TRANSITION);
                   twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_CFG_P3_TRANSITION);
               printk("TWL4030_PM_MASTER_CFG_P3_TRANSITION: 0x%02x\n", val);

                 /* Activate DEVOFF bit of P1_SW_EVENTS */
                  twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &val, TWL4030_PM_MASTER_P1_SW_EVENTS);
               val |= 0x01;
                 twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, val, TWL4030_PM_MASTER_P1_SW_EVENTS);
             while(1);

     

    This way I can assure that setting DEVOFF to 1 is working since the board is getting reset instead of getting stuck.

    However, writing to CFG registers does not work. What can be the reason?

    Thank you.

  • OK,

    that registers are write protected.

    I had to write 0xc0 + 0x0c to KEY_CONFIG register and now it works fine.

    Thank you.