diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2009-06-29 14:29:35 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2009-06-29 14:29:35 +0000 |
commit | b955dff268005d3d55ee3f38af0875718ab6021a (patch) | |
tree | 7c8c1eb5ec2ab0d0a7d874e10092cab8ba1d5985 /firmware/target/arm | |
parent | b3ed33d04aec20568b8bb9616349e6d7e4c71882 (diff) | |
download | rockbox-b955dff268005d3d55ee3f38af0875718ab6021a.tar.gz rockbox-b955dff268005d3d55ee3f38af0875718ab6021a.zip |
Move PP (last target) timer code in target tree
Put warnings in timer.h for incomplete targets (TIMER_FREQ not defined and/or timer-target.h inexistant)
Correct TIMER_STOP & TIMER_START macros arguments for target without timers
TIMER_START takes an extra argument in multicore builds (macro in macro doesn't work fine..)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21557 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/timer-pp.c | 87 | ||||
-rw-r--r-- | firmware/target/arm/timer-target.h | 52 |
2 files changed, 139 insertions, 0 deletions
diff --git a/firmware/target/arm/timer-pp.c b/firmware/target/arm/timer-pp.c new file mode 100644 index 0000000000..01c691f79e --- /dev/null +++ b/firmware/target/arm/timer-pp.c @@ -0,0 +1,87 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2006 Thom Johansen +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ + +#include "cpu.h" +#include "system.h" +#include "timer.h" +#include "timer-target.h" + +static long SHAREDBSS_ATTR cycles_new = 0; + +void TIMER2(void) +{ + TIMER2_VAL; /* ACK interrupt */ + if (cycles_new > 0) + { + TIMER2_CFG = 0xc0000000 | (cycles_new - 1); + cycles_new = 0; + } + if (pfn_timer != NULL) + { + cycles_new = -1; + /* "lock" the variable, in case timer_set_period() + * is called within pfn_timer() */ + pfn_timer(); + cycles_new = 0; + } +} + +bool __timer_set(long cycles, bool start) +{ + if (cycles > 0x20000000 || cycles < 2) + return false; + + if (start) + { + if (pfn_unregister != NULL) + { + pfn_unregister(); + pfn_unregister = NULL; + } + CPU_INT_DIS = TIMER2_MASK; + COP_INT_DIS = TIMER2_MASK; + } + if (start || (cycles_new == -1)) /* within isr, cycles_new is "locked" */ + TIMER2_CFG = 0xc0000000 | (cycles - 1); /* enable timer */ + else + cycles_new = cycles; + + return true; +} + +bool __timer_start(IF_COP_VOID(int core)) +{ + /* unmask interrupt source */ +#if NUM_CORES > 1 + if (core == COP) + COP_INT_EN = TIMER2_MASK; + else +#endif + CPU_INT_EN = TIMER2_MASK; + return true; +} + +void __timer_stop(void) +{ + TIMER2_CFG = 0; /* stop timer 2 */ + CPU_INT_DIS = TIMER2_MASK; + COP_INT_DIS = TIMER2_MASK; +} diff --git a/firmware/target/arm/timer-target.h b/firmware/target/arm/timer-target.h new file mode 100644 index 0000000000..6801cfe783 --- /dev/null +++ b/firmware/target/arm/timer-target.h @@ -0,0 +1,52 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2006 Thom Johansen +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ +#ifndef TIMER_TARGET_H +#define TIMER_TARGET_H + +#include "config.h" + +/* FIXME : this header is PP specific */ +#ifndef CPU_PP +#error "PP specific header" +#endif + +bool __timer_set(long cycles, bool start); +bool __timer_start(IF_COP_VOID(int core)); +void __timer_stop(void); + +/* Portalplayer chips use a microsecond timer. */ +#define TIMER_FREQ 1000000 + +#define __TIMER_SET(cycles, set) \ + __timer_set(cycles, set) + +#if NUM_CORES > 1 +#define __TIMER_START(int_prio, core) \ + __timer_start(core) +#else +#define __TIMER_START(int_prio) \ + __timer_start() +#endif + +#define __TIMER_STOP(...) \ + __timer_stop() + +#endif /* TIMER_TARGET_H */ |