summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-11-09 00:54:43 +0000
committerJens Arnold <amiconn@rockbox.org>2005-11-09 00:54:43 +0000
commit0b00108c3eab73420c5b03cbe603b865276e13e8 (patch)
tree4259ba1fbdb86de800249b38b124ac87342e7f59
parent219944f6a306ced75b3a59b47afef90885e73d22 (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.h9
-rw-r--r--firmware/panic.c27
-rw-r--r--firmware/system.c18
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 */
+ }
}
}