From c6309633a1b33c85b1920c61126ad03f262ab215 Mon Sep 17 00:00:00 2001 From: Rob Purchase Date: Sun, 26 Jul 2009 19:41:24 +0000 Subject: Re-work D2 power off behaviour. * Inhibit PCF timeout during shutdown and while charging * Power off the player using the same mechanism as the OF (GPIO) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22056 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/pcf50606.c | 7 +++++++ firmware/export/pcf50606.h | 2 +- firmware/powermgmt.c | 9 ++++++--- .../target/arm/tcc780x/cowond2/power-cowond2.c | 22 ++++++++++++++-------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/firmware/drivers/pcf50606.c b/firmware/drivers/pcf50606.c index 6fb2840bca..6a98b0d021 100644 --- a/firmware/drivers/pcf50606.c +++ b/firmware/drivers/pcf50606.c @@ -55,3 +55,10 @@ void pcf50606_init(void) { // TODO } + +void pcf50606_reset_timeout(void) +{ + int level = disable_irq_save(); + pcf50606_write(PCF5060X_OOCC1, pcf50606_read(PCF5060X_OOCC1) | TOTRST); + restore_irq(level); +} diff --git a/firmware/export/pcf50606.h b/firmware/export/pcf50606.h index 88b7d67a13..8e01346028 100644 --- a/firmware/export/pcf50606.h +++ b/firmware/export/pcf50606.h @@ -48,7 +48,7 @@ void pcf50606_i2c_outb(unsigned char byte); unsigned char pcf50606_i2c_inb(bool ack); #endif -#if (defined(IAUDIO_X5) || defined(IAUDIO_M5)) && !defined (SIMULATOR) +#if (defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(COWON_D2)) && !defined (SIMULATOR) void pcf50606_reset_timeout(void); #endif diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c index 64aa5c0637..6ec0307ae5 100644 --- a/firmware/powermgmt.c +++ b/firmware/powermgmt.c @@ -49,9 +49,12 @@ #endif #if (defined(IAUDIO_X5) || defined(IAUDIO_M5)) && !defined (SIMULATOR) -#include "pcf50606.h" #include "lcd-remote-target.h" #endif +#if (defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(COWON_D2)) \ + && !defined (SIMULATOR) +#include "pcf50606.h" +#endif /** Shared by sim **/ int last_sent_battery_level = 100; @@ -788,7 +791,7 @@ void sys_poweroff(void) /* If the main thread fails to shut down the system, we will force a power off after an 20 second timeout - 28 seconds if recording */ if (shutdown_timeout == 0) { -#if defined(IAUDIO_X5) || defined(IAUDIO_M5) +#if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(COWON_D2) pcf50606_reset_timeout(); /* Reset timer on first attempt only */ #endif #ifdef HAVE_RECORDING @@ -806,7 +809,7 @@ void cancel_shutdown(void) { logf("cancel_shutdown()"); -#if defined(IAUDIO_X5) || defined(IAUDIO_M5) +#if defined(IAUDIO_X5) || defined(IAUDIO_M5) || defined(COWON_D2) /* TODO: Move some things to target/ tree */ if (shutdown_timeout) pcf50606_reset_timeout(); diff --git a/firmware/target/arm/tcc780x/cowond2/power-cowond2.c b/firmware/target/arm/tcc780x/cowond2/power-cowond2.c index aed6a1911b..5897370735 100644 --- a/firmware/target/arm/tcc780x/cowond2/power-cowond2.c +++ b/firmware/target/arm/tcc780x/cowond2/power-cowond2.c @@ -25,6 +25,8 @@ #include "pcf50606.h" #include "button-target.h" #include "tuner.h" +#include "backlight-target.h" +#include "powermgmt.h" void power_init(void) { @@ -50,8 +52,13 @@ void power_init(void) void power_off(void) { - /* Forcibly cut power to SoC & peripherals by putting the PCF to sleep */ - pcf50606_write(PCF5060X_OOCC1, GOSTDBY | CHGWAK | EXTONWAK); + /* Turn the backlight off first to avoid a bright stripe on power-off */ + _backlight_off(); + sleep(HZ/10); + + /* Power off the player using the same mechanism as the OF */ + GPIOA_CLEAR = (1<<7); + while(true); } #ifndef BOOTLOADER @@ -64,12 +71,11 @@ void EXT3(void) if (data[0] & 0x04) { - /* ONKEY1S: don't reset the timeout, because we want a way to power off - the player in the event of a crashed plugin or UIE/panic, etc. */ -#if 0 - /* ONKEY1S: reset timeout as we're using SW poweroff */ - pcf50606_write(0x08, pcf50606_read(0x08) | 0x02); /* OOCC1: TOTRST=1 */ -#endif + /* ONKEY1S */ + if (!charger_inserted()) + sys_poweroff(); + else + pcf50606_reset_timeout(); } if (data[2] & 0x08) -- cgit v1.2.3