summaryrefslogtreecommitdiff
path: root/firmware/kernel.c
diff options
context:
space:
mode:
authorWill Robertson <aliask@rockbox.org>2007-09-21 15:51:53 +0000
committerWill Robertson <aliask@rockbox.org>2007-09-21 15:51:53 +0000
commit590501cfe404b5463adecc70628e5bc7c8f142a2 (patch)
tree3b038f90c9c3bbef8cf0b84f5a4ea338f9599851 /firmware/kernel.c
parenta26110c52dff9bc15d20146462d52d07f61bd238 (diff)
downloadrockbox-590501cfe404b5463adecc70628e5bc7c8f142a2.zip
rockbox-590501cfe404b5463adecc70628e5bc7c8f142a2.tar.gz
rockbox-590501cfe404b5463adecc70628e5bc7c8f142a2.tar.bz2
rockbox-590501cfe404b5463adecc70628e5bc7c8f142a2.tar.xz
Merge the Gigabeat S branch back into trunk. Fingers crossed nothing breaks.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14805 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r--firmware/kernel.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c
index bb67ced..11b10e2 100644
--- a/firmware/kernel.c
+++ b/firmware/kernel.c
@@ -24,8 +24,11 @@
#include "cpu.h"
#include "system.h"
#include "panic.h"
+#if CONFIG_CPU == IMX31L
+#include "avic-imx31.h"
+#endif
-#if !defined(CPU_PP) || !defined(BOOTLOADER)
+#if (!defined(CPU_PP) && (CONFIG_CPU != IMX31L)) || !defined(BOOTLOADER)
volatile long current_tick NOCACHEDATA_ATTR = 0;
#endif
@@ -83,7 +86,7 @@ void sleep(int ticks)
void yield(void)
{
-#if ((CONFIG_CPU == S3C2440 || defined(ELIO_TPJ1022)) && defined(BOOTLOADER))
+#if ((CONFIG_CPU == S3C2440 || defined(ELIO_TPJ1022) || CONFIG_CPU == IMX31L) && defined(BOOTLOADER))
/* Some targets don't like yielding in the bootloader */
#else
switch_thread(true, NULL);
@@ -708,6 +711,48 @@ void tick_start(unsigned int interval_in_ms)
TIMER0.ctrl |= 0x80; /* Enable the counter */
}
+#elif CONFIG_CPU == IMX31L
+void tick_start(unsigned int interval_in_ms)
+{
+ EPITCR1 &= ~0x1; /* Disable the counter */
+
+ EPITCR1 &= ~0xE; /* Disable interrupt, count down from 0xFFFFFFFF */
+ EPITCR1 &= ~0xFFF0; /* Clear prescaler */
+#ifdef BOOTLOADER
+ EPITCR1 |= (2700 << 2); /* Prescaler = 2700 */
+#endif
+ EPITCR1 &= ~(0x3 << 24);
+ EPITCR1 |= (0x2 << 24); /* Set clock source to external clock (27mhz) */
+ EPITSR1 = 1; /* Clear the interrupt request */
+#ifndef BOOTLOADER
+ EPITLR1 = 27000000 * interval_in_ms / 1000;
+ EPITCMPR1 = 27000000 * interval_in_ms / 1000;
+#else
+ (void)interval_in_ms;
+#endif
+
+ //avic_enable_int(EPIT1, IRQ, EPIT_HANDLER);
+
+ EPITCR1 |= 0x1; /* Enable the counter */
+}
+
+#ifndef BOOTLOADER
+void EPIT_HANDLER(void) __attribute__((interrupt("IRQ")));
+void EPIT_HANDLER(void) {
+ int i;
+
+ /* Run through the list of tick tasks */
+ for(i = 0;i < MAX_NUM_TICK_TASKS;i++)
+ {
+ if(tick_funcs[i])
+ tick_funcs[i]();
+ }
+
+ current_tick++;
+
+ EPITSR1 = 1; /* Clear the interrupt request */
+}
+#endif
#endif
int tick_add_task(void (*f)(void))