diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2005-09-14 09:08:26 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2005-09-14 09:08:26 +0000 |
| commit | 91216a5edc57431a94eebf7037bc72c5fe1a87dc (patch) | |
| tree | 6bcf24a9f1d271975f44348cb6129ea7fe0ff817 | |
| parent | 74353a7fe46c5d6973bffb2488f7c8276e088e80 (diff) | |
| download | rockbox-91216a5edc57431a94eebf7037bc72c5fe1a87dc.zip rockbox-91216a5edc57431a94eebf7037bc72c5fe1a87dc.tar.gz rockbox-91216a5edc57431a94eebf7037bc72c5fe1a87dc.tar.bz2 rockbox-91216a5edc57431a94eebf7037bc72c5fe1a87dc.tar.xz | |
The power thread now monitors the shutdown process and forces a poweroff if it takes more than 8 seconds.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7517 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | apps/main_menu.c | 2 | ||||
| -rw-r--r-- | apps/screens.c | 2 | ||||
| -rw-r--r-- | firmware/drivers/button.c | 4 | ||||
| -rw-r--r-- | firmware/export/powermgmt.h | 2 | ||||
| -rw-r--r-- | firmware/powermgmt.c | 32 |
5 files changed, 26 insertions, 16 deletions
diff --git a/apps/main_menu.c b/apps/main_menu.c index deaeb9b..d8818a1 100644 --- a/apps/main_menu.c +++ b/apps/main_menu.c @@ -299,7 +299,7 @@ bool info_menu(void) #ifdef HAVE_LCD_CHARCELLS static bool do_shutdown(void) { - sys_poweroff(false); + sys_poweroff(); return false; } #endif diff --git a/apps/screens.c b/apps/screens.c index bba5b27..b28432d 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -1259,7 +1259,7 @@ bool shutdown_screen(void) switch(button) { case BUTTON_OFF: - sys_poweroff(false); + sys_poweroff(); break; default: diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index b0f8aa1..4d16529 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -132,7 +132,9 @@ static void button_tick(void) #endif repeat_count > POWEROFF_COUNT) { - queue_post(&button_queue, SYS_POWEROFF, NULL); + /* Tell the main thread that it's time to + power off */ + sys_poweroff(); /* Safety net for players without hardware poweroff */ diff --git a/firmware/export/powermgmt.h b/firmware/export/powermgmt.h index ecd22f4..3c4a61f 100644 --- a/firmware/export/powermgmt.h +++ b/firmware/export/powermgmt.h @@ -134,6 +134,6 @@ int get_sleep_timer(void); void set_car_adapter_mode(bool setting); void reset_poweroff_timer(void); void shutdown_hw(void); -void sys_poweroff(bool halt); +void sys_poweroff(void); #endif diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c index c3fa8cb..6d6aba5 100644 --- a/firmware/powermgmt.c +++ b/firmware/powermgmt.c @@ -65,6 +65,8 @@ static int wrcount; #define DEBUG_STACK 0 #endif +static int shutdown_timeout = 0; + #ifdef SIMULATOR /***********************************************************/ int battery_level(void) @@ -392,7 +394,7 @@ static void handle_auto_poweroff(void) if(TIME_AFTER(current_tick, last_event_tick + timeout) && TIME_AFTER(current_tick, last_disk_activity + timeout)) { - sys_poweroff(true); + sys_poweroff(); } } else @@ -415,7 +417,7 @@ static void handle_auto_poweroff(void) #endif { DEBUGF("Sleep timer timeout. Shutting off...\n"); - sys_poweroff(true); + sys_poweroff(); } } } @@ -524,6 +526,14 @@ static void power_thread_sleep(int ticks) sleep(small_ticks); ticks -= small_ticks; + /* If the power off timeout expires, the main thread has failed + to shut down the system, and we need to force a power off */ + if(shutdown_timeout) { + shutdown_timeout -= small_ticks; + if(shutdown_timeout <= 0) + power_off(); + } + #ifdef HAVE_ALARM_MOD power_thread_rtc_process(); #endif @@ -568,9 +578,6 @@ static void power_thread(void) { int i; short *phps, *phpd; /* power history rotation pointers */ -#if CONFIG_BATTERY == BATT_LIION2200 - int charging_current; -#endif #ifdef HAVE_CHARGE_CTRL unsigned int target_voltage; /* desired topoff/trickle voltage level */ int charge_max_time_now = 0; /* max. charging duration, calculated at @@ -606,11 +613,10 @@ static void power_thread(void) tells us the charging current from the LTC1734. When DC is connected (either via the external adapter, or via USB), we try to determine if it is actively charging or only maintaining the - charge. My tests show that ADC readings is below about 0x80 means + charge. My tests show that ADC readings below about 0x80 means that the LTC1734 is only maintaining the charge. */ if(charger_inserted()) { - charging_current = adc_read(ADC_EXT_POWER); - if(charging_current < 0x80) { + if(adc_read(ADC_EXT_POWER) < 0x80) { charge_state = TRICKLE; } else { charge_state = CHARGING; @@ -878,12 +884,14 @@ void powermgmt_init(void) #endif /* SIMULATOR */ -void sys_poweroff(bool halt) +void sys_poweroff(void) { - logf("sys_poweroff(%d)", halt); + logf("sys_poweroff()"); + /* If the main thread fails to shut down the system, we will force a + power off after an 8 second timeout */ + shutdown_timeout = HZ*8; + queue_post(&button_queue, SYS_POWEROFF, NULL); - while(halt) - yield(); } /* Various hardware housekeeping tasks relating to shutting down the jukebox */ |