PXA270 - Sleep & Wake
- From: "Jim Merkle" <jimmerkle@xxxxxxxxxxx>
- Date: Fri, 29 Apr 2005 16:05:26 -0700
I'm having difficulty putting my PXA270 to sleep and then waking it via
GPIO_0.
In order to more rapidly test this, I put the following module into my
loader, which can be invoked as a command:
No attempt is being made in this example to preserve any specific state,
conserve power, or preserve SDRAM. Should the processor wake from sleep,
the loader will display the reset cause and the values of the PSSR and RCSR
registers.
// Prototype assembly function that pokes R0 into CP14, register 7
extern "C" void WritePWRMODE(DWORD dwSleepMode);
#define PWRMODE_SLEEP 0x00000003 // Value for cp14: Reg7 to induce sleep.
// Perform minimal steps necessary to configure the PXA270 for sleep and
// wake up from the Philips, then initiate a sleep.
STATUS CmdSleep(int argc, char * argv[])
{
volatile PMRC_REGS * pPmrcRegs = (PMRC_REGS *)PWR_BASE_U_VIRTUAL;
// Configure the state of the GPIO outputs during sleep
/*
; PGSR0: 0 .. 31
PGSR_nEnCF33V GPIO_13 ; 0: enable 3.3V to User CF card, 1:
turn off 3.3V
PGSR_nEnCF50V GPIO_14 ; 0: enable 5.0V to User CF card, 1:
turn off 5.0V
PGSR_nEnUtilPwr GPIO_22 ; 0: enable 5V supply, 1: dissable 5V
supply
PGSR_FF_nRTS GPIO_27 ; For "normal" RS-232, we want this line
high, for RS-485, we want this low
; PGSR1 32 .. 63
nFFUART_RS422 GPIO_32 ; If we want the RS-232 transceiver
enabled, raise this line
PGSR_nPOE GPIO_48
PGSR_nPWE GPIO_49
PGSR_nPIOR GPIO_50
PGSR_nPIOW GPIO_51
PGSR_nPCE2 GPIO_54
; PGSR2 64 .. 95
PGSR_FF_nDTR GPIO_82
PGSR_nPCE1 GPIO_85 ; another PCMCIA bit
; PGSR3 96 .. 120
PGSR_EnCoreLow GPIO_100 ; 1: 1.0V core voltage
*/
pPmrcRegs->pgsr0 = GPIO_13 | GPIO_14 | GPIO_22 | GPIO_27;
pPmrcRegs->pgsr1 = GPIO_48 | GPIO_49 | GPIO_50 | GPIO_51 | GPIO_54;
//pPmrcRegs->pgsr1 = GPIO_32 | GPIO_48 | GPIO_49 | GPIO_50 | GPIO_51 |
GPIO_54;
pPmrcRegs->pgsr2 = GPIO_82 | GPIO_85;
//pPmrcRegs->pgsr3 = GPIO_100;
pPmrcRegs->pgsr3 = 0;
// Configure the wake-up event
pPmrcRegs->prer = GPIO_0; // (GPIO_0 rising edge) 0x00000001
pPmrcRegs->pfer = GPIO_0; // (GPIO_0 falling edge) 0x00000001
pPmrcRegs->pwer = GPIO_0; // (GPIO_0 event) 0x00000001
// Configure the PCMCIA output drive, 13Mhz oscillator during sleep
pPmrcRegs->pcfr=0;
// Sleep Configuration register
// Set Ramp up for power domains, ignore VDD_FAULT, Keep P1 domain
powered with clocks running
//pPmrcRegs->pslr = BIT_31|BIT_30|BIT_27|BIT_26|BIT_22|BIT_3;
pPmrcRegs->pslr = 0xCC400008;
printf("CmdSleep: Going to sleep...\r\n");
// Wait for the last character in the above line to get out
msWait(1); // wait one millisecond
WritePWRMODE(PWRMODE_SLEEP); // Initate SLEEP (0x03 - regular sleep)
// Do not return!!!
while(1);
return STATUS_SUCCESS;
} // CmdSleep
The processor appears to be sleeping peacefully, but it refuses to wake when
pulsed on GPIO_0. I can tell the processor has entered sleep since the
settings in PGSRx have taken effect, driving each of the GPIOs to its
requested state. (There's still the possibility we have a hardware
problem...)
Any ideas?
Thank you,
Jim Merkle
.
- Prev by Date: RE: HELP!!!-Unable to Scan BlueTooth-USB dongle on WInce 5.0
- Next by Date: What feature are added to translate Hostname to IP ?
- Previous by thread: In CEPB 4.2, Target -> Run, never gets activated.
- Next by thread: What feature are added to translate Hostname to IP ?
- Index(es):
Relevant Pages
|
|