diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-12-22 10:14:10 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-01-09 14:03:35 +0100 |
commit | 691cc202897213a1b16cee609e0bf8416d11a476 (patch) | |
tree | 874748028a423b8fb4a15ba338bd87589e9cf31c /c | |
parent | bsp/qoriq: Increase MAS0[ESEL] width (diff) | |
download | rtems-691cc202897213a1b16cee609e0bf8416d11a476.tar.bz2 |
bsp/qoriq: Fix nanoseconds extension
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c index 80f6426658..039edde46e 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c +++ b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c @@ -29,6 +29,8 @@ /* This is defined in clockdrv_shell.h */ static rtems_isr Clock_isr(void *arg); +static uint32_t qoriq_clock_last_ccr; + static uint32_t qoriq_clock_nanoseconds_per_timer_tick; static volatile qoriq_pic_global_timer *const qoriq_clock = @@ -86,6 +88,7 @@ static void qoriq_clock_initialize(void) nanoseconds_per_second / timer_frequency; qoriq_clock->bcr = GTBCR_COUNT(interval); + qoriq_clock_last_ccr = qoriq_clock->ccr; } static void qoriq_clock_cleanup(void) @@ -104,15 +107,25 @@ static void qoriq_clock_cleanup(void) } } +static void qoriq_clock_at_tick(void) +{ + qoriq_clock_last_ccr = qoriq_clock->ccr; +} + static uint32_t qoriq_clock_nanoseconds_since_last_tick(void) { - uint32_t current = GTCCR_COUNT_GET(qoriq_clock->ccr); - uint32_t base = qoriq_clock->bcr; + uint32_t ccr = qoriq_clock->ccr; + uint32_t bcr = qoriq_clock->bcr; + + if ((ccr & GTCCR_TOG) != (qoriq_clock_last_ccr & GTCCR_TOG)) { + bcr += bcr; + } - return (base - current) * qoriq_clock_nanoseconds_per_timer_tick; + return (bcr - GTCCR_COUNT_GET(ccr)) * qoriq_clock_nanoseconds_per_timer_tick; } -#define Clock_driver_support_at_tick() +#define Clock_driver_support_at_tick() \ + qoriq_clock_at_tick() #define Clock_driver_support_initialize_hardware() \ qoriq_clock_initialize() #define Clock_driver_support_install_isr(clock_isr, old_isr) \ |