diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-11-09 00:54:43 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-11-09 00:54:43 +0000 |
commit | 0b00108c3eab73420c5b03cbe603b865276e13e8 (patch) | |
tree | 4259ba1fbdb86de800249b38b124ac87342e7f59 | |
parent | 219944f6a306ced75b3a59b47afef90885e73d22 (diff) |
SH1: Changed UIE() to use the same reset method as on coldfire, using the watchdog timer. Should be more reliable this way. Disabled LED handling and added reboot-with-on for Ondio. * All: #ifdef cleanup in panicf(), added reboot-with-on for Ondio.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7799 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/export/sh7034.h | 9 | ||||
-rw-r--r-- | firmware/panic.c | 27 | ||||
-rw-r--r-- | firmware/system.c | 18 |
3 files changed, 34 insertions, 20 deletions
diff --git a/firmware/export/sh7034.h b/firmware/export/sh7034.h index c15ee2a88f..242e5687f1 100644 --- a/firmware/export/sh7034.h +++ b/firmware/export/sh7034.h @@ -294,9 +294,12 @@ #define RTCNT (*((volatile unsigned short*)RTCNT_ADDR)) #define RTCOR (*((volatile unsigned short*)RTCOR_ADDR)) -#define TCSR (*((volatile unsigned char*)TCSR_ADDR)) -#define TCNT (*((volatile unsigned char*)TCNT_ADDR)) -#define RSTCSR (*((volatile unsigned char*)RSTCSR_ADDR)) +#define TCSR_R (*((volatile unsigned char*)TCSR_ADDR)) +#define TCSR_W (*((volatile unsigned short*)(TCSR_ADDR & ~1))) +#define TCNT_R (*((volatile unsigned char*)TCNT_ADDR)) +#define TCNT_W (*((volatile unsigned short*)(TCNT_ADDR & ~1))) +#define RSTCSR_R (*((volatile unsigned char*)RSTCSR_ADDR)) +#define RSTCSR_W (*((volatile unsigned short*)(RSTCSR_ADDR & ~1))) #define SBYCR (*((volatile unsigned char*)SBYCR_ADDR)) diff --git a/firmware/panic.c b/firmware/panic.c index 2132402254..9226146a48 100644 --- a/firmware/panic.c +++ b/firmware/panic.c @@ -40,7 +40,7 @@ void panicf( const char *fmt, ...) #ifndef SIMULATOR #if CONFIG_LED == LED_REAL - bool state = false; + bool state = true; #endif /* Disable interrupts */ @@ -88,31 +88,32 @@ void panicf( const char *fmt, ...) while (1) { -#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR) +#ifndef SIMULATOR +#if CONFIG_LED == LED_REAL volatile long i; led (state); - state = state?false:true; + state = !state; for (i = 0; i < 240000; ++i); #endif -#ifndef SIMULATOR + + /* try to restart firmware if ON is pressed */ #ifdef IRIVER_H100_SERIES - /* check for the ON button (and !hold) */ - if ((GPIO1_READ & 0x22) == 0) - system_reboot(); + if ((GPIO1_READ & 0x22) == 0) /* check for ON button and !hold */ #elif CONFIG_CPU == SH7034 - /* try to restart firmware if ON is pressed */ #if CONFIG_KEYPAD == PLAYER_PAD - if (!(PADR & 0x0020)) + if (!(PADRL & 0x20)) #elif CONFIG_KEYPAD == RECORDER_PAD #ifdef HAVE_FMADC if (!(PCDR & 0x0008)) #else - if (!(PBDR & 0x0100)) -#endif + if (!(PBDRH & 0x01)) #endif +#elif CONFIG_KEYPAD == ONDIO_PAD + if (!(PCDR & 0x0008)) +#endif /* CONFIG_KEYPAD */ +#endif /* CPU */ system_reboot(); -#endif -#endif +#endif /* !SIMULATOR */ } } diff --git a/firmware/system.c b/firmware/system.c index 7da1034739..cc4a5f0c85 100644 --- a/firmware/system.c +++ b/firmware/system.c @@ -852,7 +852,9 @@ void (*vbr[]) (void) __attribute__ ((section (".vectors"))) = void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */ { +#if CONFIG_LED == LED_REAL bool state = true; +#endif unsigned int n; char str[32]; @@ -876,23 +878,31 @@ void UIE (unsigned int pc) /* Unexpected Interrupt or Exception */ while (1) { +#if CONFIG_LED == LED_REAL volatile int i; led (state); - state = state?false:true; + state = !state; for (i = 0; i < 240000; ++i); +#endif /* try to restart firmware if ON is pressed */ #if CONFIG_KEYPAD == PLAYER_PAD - if (!(PADR & 0x0020)) + if (!(PADRL & 0x20)) #elif CONFIG_KEYPAD == RECORDER_PAD #ifdef HAVE_FMADC if (!(PCDR & 0x0008)) #else - if (!(PBDR & 0x0100)) + if (!(PBDRH & 0x01)) #endif +#elif CONFIG_KEYPAD == ONDIO_PAD + if (!(PCDR & 0x0008)) #endif - system_reboot(); + { + /* enable the watchguard timer, but don't service it */ + RSTCSR_W = 0x5a40; /* Reset enabled, power-on reset */ + TCSR_W = 0xa560; /* Watchdog timer mode, timer enabled, sysclk/2 */ + } } } |