diff options
author | Daniel Cederman <cederman@gaisler.com> | 2014-08-21 09:49:42 +0200 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-03-09 12:44:49 +0100 |
commit | 3ec4d9c54af0975576a177f6adba1a23b05583a5 (patch) | |
tree | cc516b07f5ff4b41b3da7161d7c79807554a008f | |
parent | cdd2bcfa9f29615e456ad747c17bcbbcced2ca42 (diff) |
LEON3: Clear timer pending bit together with tick update in critical section
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 15 | ||||
-rw-r--r-- | cpukit/score/src/coretodtickle.c | 10 |
2 files changed, 24 insertions, 1 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c index f382f1abc6..afc9292fde 100644 --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c @@ -35,6 +35,7 @@ volatile struct gptimer_regs *LEON3_Timer_Regs = 0; static int clkirq; +static unsigned char irq_ack_mask; static void leon3_clock_profiling_interrupt_delay(void) { @@ -126,6 +127,11 @@ static void bsp_clock_handler_install(rtems_isr *new) #define Clock_driver_support_initialize_hardware() \ do { \ + LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = GPTIMER_TIMER_CTRL_IP; \ + if ((LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl & GPTIMER_TIMER_CTRL_IP) != 0) \ + irq_ack_mask = (unsigned char)~GPTIMER_TIMER_CTRL_IP; \ + else \ + irq_ack_mask = (unsigned char)~0; \ LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].reload = \ rtems_configuration_get_microseconds_per_tick() - 1; \ \ @@ -140,6 +146,13 @@ static void bsp_clock_handler_install(rtems_isr *new) LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = 0; \ } while (0) +void leon3_clear_timer_interrupt_pending_bit(void); +void leon3_clear_timer_interrupt_pending_bit(void) +{ + unsigned int ctrl = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl; + LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl = ctrl & irq_ack_mask; +} + static uint32_t bsp_clock_nanoseconds_since_last_tick(void) { uint32_t clicks; @@ -150,7 +163,7 @@ static uint32_t bsp_clock_nanoseconds_since_last_tick(void) clicks = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].value; - if ( LEON_Is_interrupt_pending( clkirq ) ) { + if( LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].ctrl & GPTIMER_TIMER_CTRL_IP ) { clicks = LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].value; usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks); } else { diff --git a/cpukit/score/src/coretodtickle.c b/cpukit/score/src/coretodtickle.c index 9116fc1a3b..4adba8f7e0 100644 --- a/cpukit/score/src/coretodtickle.c +++ b/cpukit/score/src/coretodtickle.c @@ -22,6 +22,11 @@ #include <rtems/score/watchdogimpl.h> #include <rtems/config.h> +#ifdef __leon__ + /* Hack used until API has been defined */ + void leon3_clear_timer_interrupt_pending_bit(void); +#endif + void _TOD_Tickle_ticks( void ) { TOD_Control *tod = &_TOD; @@ -39,6 +44,11 @@ void _TOD_Tickle_ticks( void ) _TOD_Acquire( tod, &lock_context ); +#ifdef __leon__ + /* Hack used until API has been defined */ + leon3_clear_timer_interrupt_pending_bit(); +#endif + /* Update the uptime */ _Timestamp_Add_to( &tod->uptime, &tick ); |