[rtems commit] bsp/qoriq: Fix nanoseconds extension

Sebastian Huber sebh at rtems.org
Fri Jan 9 13:09:38 UTC 2015


Module:    rtems
Branch:    master
Commit:    691cc202897213a1b16cee609e0bf8416d11a476
Changeset: http://git.rtems.org/rtems/commit/?id=691cc202897213a1b16cee609e0bf8416d11a476

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Dec 22 10:14:10 2014 +0100

bsp/qoriq: Fix nanoseconds extension

---

 c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c | 21 +++++++++++++++++----
 1 file 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 80f6426..039edde 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) \




More information about the vc mailing list