diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-04 14:07:19 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-04 14:07:19 +0000 |
commit | d209d9bbccb39bde70101f0609dacc29d402a037 (patch) | |
tree | 7b1e1a0f87e4cab837216598aa9db0b0c8251d30 | |
parent | 2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-d209d9bbccb39bde70101f0609dacc29d402a037.tar.bz2 |
2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1748/bsps
* clock/ckinit.c, include/leon.h: When the clock tick generates an
interrupt WHILE we have interrupts disabled doing a get TOD or
uptime, the get nanoseconds handler was returning a bogusly large
number.
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/ChangeLog | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 20 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/include/leon.h | 4 |
3 files changed, 21 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog index a924bb95dd..17a96ad316 100644 --- a/c/src/lib/libbsp/sparc/leon3/ChangeLog +++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog @@ -1,3 +1,11 @@ +2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> + + PR 1748/bsps + * clock/ckinit.c, include/leon.h: When the clock tick generates an + interrupt WHILE we have interrupts disabled doing a get TOD or + uptime, the get nanoseconds handler was returning a bogusly large + number. + 2009-03-09 Antoine Lacroix <antoine.lacroix at sodern.fr> PR 1391/bsps diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c index 977b9d887a..59eb10c4d7 100644 --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c @@ -97,16 +97,18 @@ static int clkirq; uint32_t bsp_clock_nanoseconds_since_last_tick(void) { uint32_t clicks; - if ( !LEON3_Timer_Regs ) - return 0; - - clicks = LEON3_Timer_Regs->timer[0].value; - - /* Down counter */ - return (uint32_t) - (rtems_configuration_get_microseconds_per_tick() - clicks) * 1000; + uint32_t usecs; + + if ( LEON_Is_interrupt_pending( LEON_INTERRUPT_TIMER1 ) ) { + clicks = LEON_REG.Timer_Counter_1; + usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks); + } else { + usecs = (rtems_configuration_get_microseconds_per_tick() - clicks); + } + return usecs * 1000; } -#define Clock_driver_nanoseconds_since_last_tick bsp_clock_nanoseconds_since_last_tick +#define Clock_driver_nanoseconds_since_last_tick \ + bsp_clock_nanoseconds_since_last_tick #include "../../../shared/clockdrv_shell.c" diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h index 8c130ad6cc..8f817ebf72 100644 --- a/c/src/lib/libbsp/sparc/leon3/include/leon.h +++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h @@ -245,11 +245,11 @@ extern int LEON3_Cpu_Index; } while (0) #define LEON_Is_interrupt_pending( _source ) \ - (LEON3_IrqCtrl_Regs.ipend & (1 << (_source))) + (LEON3_IrqCtrl_Regs->ipend & (1 << (_source))) #define LEON_Is_interrupt_masked( _source ) \ do {\ - (LEON3_IrqCtrl_Regs.mask[LEON3_Cpu_Index] & (1 << (_source))); \ + (LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] & (1 << (_source))); \ } while (0) |