diff options
Diffstat (limited to 'bsps/lm32/shared/clock/ckinit.c')
-rw-r--r-- | bsps/lm32/shared/clock/ckinit.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/bsps/lm32/shared/clock/ckinit.c b/bsps/lm32/shared/clock/ckinit.c new file mode 100644 index 0000000000..4d235e744f --- /dev/null +++ b/bsps/lm32/shared/clock/ckinit.c @@ -0,0 +1,78 @@ +/* + * Clock device driver for Lattice Mico32 (lm32). + */ + +/* + * COPYRIGHT (c) 1989-2009. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + * + * Jukka Pietarinen <jukka.pietarinen@mrf.fi>, 2008, + * Micro-Research Finland Oy + */ + +#include <bsp.h> +#include "../include/system_conf.h" +#include "clock.h" +#include "bspopts.h" + +#if LM32_ON_SIMULATOR +#define CLOCK_DRIVER_USE_FAST_IDLE 1 +#endif + +static inline int clockread(unsigned int reg) +{ + return *((int*)(TIMER0_BASE_ADDRESS + reg)); +} + +static inline void clockwrite(unsigned int reg, int value) +{ + *((int*)(TIMER0_BASE_ADDRESS + reg)) = value; +} + +/* + * The interrupt vector number associated with the clock tick device + * driver. + */ +#define CLOCK_VECTOR ( TIMER0_IRQ ) +#define CLOCK_IRQMASK ( 1 << CLOCK_VECTOR ) + +#define Clock_driver_support_at_tick() \ + do { \ + /* Clear overflow flag */ \ + clockwrite(LM32_CLOCK_SR, 0); \ + lm32_interrupt_ack(CLOCK_IRQMASK); \ + } while (0) + +#define Clock_driver_support_install_isr(_new ) \ + set_vector( _new, CLOCK_VECTOR, 1 ) + +static void Clock_driver_support_initialize_hardware(void) +{ + /* Set clock period */ + clockwrite(LM32_CLOCK_PERIOD, + (CPU_FREQUENCY / + (1000000 / rtems_configuration_get_microseconds_per_tick()))); + + /* Enable clock interrupts and start in continuous mode */ + clockwrite(LM32_CLOCK_CR, LM32_CLOCK_CR_ITO | + LM32_CLOCK_CR_CONT | + LM32_CLOCK_CR_START); + + lm32_interrupt_unmask(CLOCK_IRQMASK); +} + +#define Clock_driver_support_shutdown_hardware() \ + do { \ + /* Disable clock interrupts and stop */ \ + lm32_interrupt_unmask(CLOCK_IRQMASK); \ + clockwrite(LM32_CLOCK_CR, LM32_CLOCK_CR_STOP); \ + } while (0) + +#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER + +#include "../../../shared/dev/clock/clockimpl.h" + |