summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorRob Purchase <shotofadds@rockbox.org>2009-07-26 19:41:24 +0000
committerRob Purchase <shotofadds@rockbox.org>2009-07-26 19:41:24 +0000
commitc6309633a1b33c85b1920c61126ad03f262ab215 (patch)
treee33b3855c02f2ae601d231330ca9cabdfd7beba4 /firmware
parenta8d1cfdec8f62f976ba03713da07b88bd927fce5 (diff)
downloadrockbox-c6309633a1b33c85b1920c61126ad03f262ab215.tar.gz
rockbox-c6309633a1b33c85b1920c61126ad03f262ab215.tar.bz2
rockbox-c6309633a1b33c85b1920c61126ad03f262ab215.zip
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
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/pcf50606.c7
-rw-r--r--firmware/export/pcf50606.h2
-rw-r--r--firmware/powermgmt.c9
-rw-r--r--firmware/target/arm/tcc780x/cowond2/power-cowond2.c22
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)