From 9ec55e633e30ac9b59c6bd26166c790befc13b09 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 4 Mar 2011 14:07:17 +0000 Subject: 2011-03-04 Joel Sherrill PR 1748/bsps * clock/ckinit.c: 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. --- c/src/lib/libbsp/sparc/erc32/ChangeLog | 7 +++++++ c/src/lib/libbsp/sparc/erc32/clock/ckinit.c | 10 ++++++++-- c/src/lib/libbsp/sparc/leon2/ChangeLog | 7 +++++++ c/src/lib/libbsp/sparc/leon2/clock/ckinit.c | 17 +++++++++++------ 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/c/src/lib/libbsp/sparc/erc32/ChangeLog b/c/src/lib/libbsp/sparc/erc32/ChangeLog index 77857183ef..1515fc1e58 100644 --- a/c/src/lib/libbsp/sparc/erc32/ChangeLog +++ b/c/src/lib/libbsp/sparc/erc32/ChangeLog @@ -1,3 +1,10 @@ +2011-03-04 Joel Sherrill + + PR 1748/bsps + * clock/ckinit.c: 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 PR 1391/bsps diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c index 7163ac3363..8d9ca91e86 100644 --- a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c @@ -49,11 +49,17 @@ extern int CLOCK_SPEED; uint32_t bsp_clock_nanoseconds_since_last_tick(void) { uint32_t clicks; + uint32_t usecs; clicks = ERC32_MEC.Real_Time_Clock_Counter; - return (uint32_t) - (rtems_configuration_get_microseconds_per_tick() - clicks) * 1000; + if ( ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK ) ) { + clicks = ERC32_MEC.Real_Time_Clock_Counter; + 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 \ diff --git a/c/src/lib/libbsp/sparc/leon2/ChangeLog b/c/src/lib/libbsp/sparc/leon2/ChangeLog index 6a9f1cc3ba..25b398773a 100644 --- a/c/src/lib/libbsp/sparc/leon2/ChangeLog +++ b/c/src/lib/libbsp/sparc/leon2/ChangeLog @@ -1,3 +1,10 @@ +2011-03-04 Joel Sherrill + + PR 1748/bsps + * clock/ckinit.c: 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 PR 1391/bsps diff --git a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c index 9f7cdcb31f..8b68f9e421 100644 --- a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c @@ -59,17 +59,22 @@ extern int CLOCK_SPEED; LEON_REG.Timer_Control_1 = 0; \ } while (0) + uint32_t bsp_clock_nanoseconds_since_last_tick(void) { uint32_t clicks; + uint32_t usecs; - clicks = LEON_REG.Timer_Counter_1; - - /* Down counter */ - return (uint32_t) - (rtems_configuration_get_microseconds_per_tick() - clicks) * 1000; + 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" -- cgit v1.2.3