summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:06:54 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:06:54 +0000
commitb3559ee9f5b7b490568039dabc72aee5fe75b8e0 (patch)
treecc59c220b2fee2c9d479102f3eee55e2b0866a13 /c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
parent2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-b3559ee9f5b7b490568039dabc72aee5fe75b8e0.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.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 071265a30e..86a968fea8 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -97,16 +97,23 @@ static int clkirq;
uint32_t bsp_clock_nanoseconds_since_last_tick(void)
{
uint32_t clicks;
+ uint32_t usecs;
+
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;
+ if ( LEON_Is_interrupt_pending( clkirq ) ) {
+ clicks = LEON3_Timer_Regs->timer[0].value;
+ 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.h"