diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2009-06-29 14:29:02 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2009-06-29 14:29:02 +0000 |
commit | 15a7f5e5e9495667e204cde8852b33587427911f (patch) | |
tree | bbb3f4f926b3bab2f91b2b07ac23f3634ff12e5e /firmware/target/arm/pnx0101 | |
parent | e0640c3c4b6d238e38155c863e542335ce57a425 (diff) |
Move PNX0101 timer code in the target tree
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21554 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/pnx0101')
-rw-r--r-- | firmware/target/arm/pnx0101/timer-pnx0101.c | 82 | ||||
-rw-r--r-- | firmware/target/arm/pnx0101/timer-target.h | 39 |
2 files changed, 121 insertions, 0 deletions
diff --git a/firmware/target/arm/pnx0101/timer-pnx0101.c b/firmware/target/arm/pnx0101/timer-pnx0101.c new file mode 100644 index 0000000000..6e685aa20f --- /dev/null +++ b/firmware/target/arm/pnx0101/timer-pnx0101.c @@ -0,0 +1,82 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2007 Tomasz Malesinski +* +* 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 "timer-target.h" +#include "system.h" +#include "timer.h" + +static long cycles_new = 0; + +void TIMER1_ISR(void) +{ + if (cycles_new > 0) + { + TIMER1.load = 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; + } + TIMER1.clr = 1; /* clear the interrupt */ +} + +bool __timer_set(long cycles, bool start) +{ + if (start) + { + if (pfn_unregister != NULL) + { + pfn_unregister(); + pfn_unregister = NULL; + } + TIMER1.ctrl &= ~0x80; /* disable the counter */ + TIMER1.ctrl |= 0x40; /* reload after counting down to zero */ + TIMER1.ctrl &= ~0xc; /* no prescaler */ + TIMER1.clr = 1; /* clear an interrupt event */ + } + if (start || (cycles_new == -1)) /* within isr, cycles_new is "locked" */ + { /* enable timer */ + TIMER1.load = cycles - 1; + TIMER1.ctrl |= 0x80; /* enable the counter */ + } + else + cycles_new = cycles; + + return true; +} + +bool __timer_start(void) +{ + irq_set_int_handler(IRQ_TIMER1, TIMER1_ISR); + irq_enable_int(IRQ_TIMER1); + return true; +} + +void __timer_stop(void) +{ + TIMER1.ctrl &= ~0x80; /* disable timer 1 */ + irq_disable_int(IRQ_TIMER1); +} diff --git a/firmware/target/arm/pnx0101/timer-target.h b/firmware/target/arm/pnx0101/timer-target.h new file mode 100644 index 0000000000..853da07838 --- /dev/null +++ b/firmware/target/arm/pnx0101/timer-target.h @@ -0,0 +1,39 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2007 Tomasz Malesinski +* +* 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 + +bool __timer_set(long cycles, bool start); +bool __timer_start(void); +void __timer_stop(void); + +#define TIMER_FREQ 3000000 + +#define __TIMER_SET(cycles, set) \ + __timer_set(cycles, set) + +#define __TIMER_START() \ + __timer_start() + +#define __TIMER_STOP(...) \ + __timer_stop() + +#endif /* TIMER_TARGET_H */ |