From 590501cfe404b5463adecc70628e5bc7c8f142a2 Mon Sep 17 00:00:00 2001 From: Will Robertson Date: Fri, 21 Sep 2007 15:51:53 +0000 Subject: 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 --- firmware/kernel.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'firmware/kernel.c') diff --git a/firmware/kernel.c b/firmware/kernel.c index bb67ced64d..11b10e287e 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)) -- cgit v1.2.3