I have already posted this in the PMU forum (http://e2e.ti.com/support/power_management/pmu/f/43/t/84913.aspx), but was not able to get help there.
I have a working OMAP3530+TPS65950 system that uses the MUSB USB (OTG) port paired with the TPS65950's USB PHY in an embedded host-only mode:
- ID signal tied to ground
- VBUS tied only to a capacitor -- attached-embedded USB device separately powered (can switch on/off)
- Nothing else connected to the PHY
I want to be able to have the MUSB (and hence all of CORE domain) go idle so I can reach lower power states. I have it working fairly well. I can power on and off the attached USB device and power up and down MUSB (and the TPS65950's PHY) as needed. However, I learned (TPS TRM 15.4.11.3) that since we have a non-zero DC voltage on the ADCIN5 pin of the TPS65950 I risk chip damage if I don't keep VUSB3V1 powered on.
So I made a small change to keep VUSB3V1 powered on. I set the VUSB3V1_REMAP register to 0xee, which I believe will keep it on always. However, with that change the USB device isn't recognized anymore after I power down and power back up the MUSB and PHY. The only difference between the working and non-working is the chagne to the VUSB3V1_REMAP register.
The sequence steps in the power transitions is shown below
Power down:
- Set OTG_FORCESTDBY to enable forced standby
- Set OTG_SYSCONFIG to force standby/force idle/wakeup-enable
- Save MUSB PHY context (i.e. registers)
- Turn off PHY power by setting PHYPWD bit in PHY_PWR_CTRL
- Disable VUSB regulators in this order: 1v5, 1v8, 3v1.
- Disable MUSB clocks
Power Up:
- Enable MUSB clocks
- Set OTG_FORCESTDBY to disable forced standby
- Set OTG_SYSCONFIG to no-standby/no-idle
- Enable VUSB regulators: 3v1, 1v8, 1v5
- Turn on PHY power by clearing PHYPWD bit in PHY_PWR_CTRL
- Set CLOCKGATING_EN & CLK32K_EN bits in PHY_CLK_CTRL
- Restore MUSB context (i.e. registers)
Comparing the working versus not-working cases (VUSB3V1_REMAP = 0x08 and 0xee respectively) with some debugging enabled I find that between steps 6 and 7 of the powerup steps that the MUSB DEVCTL register is read and in the working case it is 0x80, but in the non-working case it is 0x90. This appears to be a VBUS valid error in the non-working case, as opposed to a Session End error in the working case.
In the working case I get another interrupt and it reads 0x5d from MUSB_DEVCTL, but no other interrupts are received in the non-working case.
I have tried enabling the VBUS charge pump before step 4 in the powerup sequence, but that didn't make any difference.
Any suggestions?
Thanks in advance,
Chris