summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm
diff options
context:
space:
mode:
authorAlexander Krutwig <alexander.krutwig@embedded-brains.de>2015-04-01 15:33:25 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-05-20 08:40:34 +0200
commit75acd9e69f906cbd880a17ee4ca705ad7caa92c0 (patch)
tree71529028154cb323286b02392def2e5277eed312 /c/src/lib/libbsp/arm
parenttimecounter: Use in RTEMS (diff)
downloadrtems-75acd9e69f906cbd880a17ee4ca705ad7caa92c0.tar.bz2
bsps: Convert clock drivers to use a timecounter
Update #2271.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/arm/beagle/clock.c35
-rw-r--r--c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c2
-rw-r--r--c/src/lib/libbsp/arm/gba/clock/clockdrv.c2
-rw-r--r--c/src/lib/libbsp/arm/lpc176x/include/lpc-clock-config.h1
-rw-r--r--c/src/lib/libbsp/arm/lpc24xx/include/lpc-clock-config.h2
-rw-r--r--c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h2
-rw-r--r--c/src/lib/libbsp/arm/nds/clock/clock.c2
-rw-r--r--c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c12
-rw-r--r--c/src/lib/libbsp/arm/shared/arm-a9mpcore-clock-config.c48
-rw-r--r--c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c65
-rw-r--r--c/src/lib/libbsp/arm/shared/lpc/clock/lpc-clock-config.c37
-rw-r--r--c/src/lib/libbsp/arm/tms570/clock/clock.c40
12 files changed, 110 insertions, 138 deletions
diff --git a/c/src/lib/libbsp/arm/beagle/clock.c b/c/src/lib/libbsp/arm/beagle/clock.c
index 66aba1b84b..912d904197 100644
--- a/c/src/lib/libbsp/arm/beagle/clock.c
+++ b/c/src/lib/libbsp/arm/beagle/clock.c
@@ -15,11 +15,12 @@
*/
#include <rtems.h>
+#include <rtems/timecounter.h>
#include <bsp.h>
#include <libcpu/omap_timer.h>
-#ifdef ARM_MULTILIB_ARCH_V4
+static struct timecounter beagle_clock_tc;
static omap_timer_registers_t regs_v1 = {
.TIDR = OMAP3_TIMER_TIDR,
@@ -115,8 +116,6 @@ static struct omap_timer *timer = &am335x_timer;
#endif
-static int done = 0;
-
#if IS_AM335X
#define FRCLOCK_HZ (16*1500000)
#endif
@@ -181,20 +180,14 @@ omap3_frclock_init(void)
/* Start timer, without prescaler */
mmio_set(fr_timer->base + fr_timer->regs->TCLR,
OMAP3_TCLR_OVF_TRG | OMAP3_TCLR_AR | OMAP3_TCLR_ST);
- done = 1;
}
-static inline uint32_t
-read_frc(void)
+static uint32_t
+beagle_clock_get_timecount(struct timecounter *tc)
{
- if (done == 0) {
- return 0;
- }
return mmio_read(fr_timer->base + fr_timer->regs->TCRR);
}
-static uint32_t last_tick_nanoseconds;
-
static void
beagle_clock_initialize(void)
{
@@ -262,12 +255,16 @@ beagle_clock_initialize(void)
while(mmio_read(AM335X_WDT_BASE+AM335X_WDT_WWPS) != 0) ;
#endif
+ /* Install timecounter */ \
+ beagle_clock_tc.tc_get_timecount = beagle_clock_get_timecount;
+ beagle_clock_tc.tc_counter_mask = 0xffffffff;
+ beagle_clock_tc.tc_frequency = FRCLOCK_HZ;
+ beagle_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&beagle_clock_tc);
}
static void beagle_clock_at_tick(void)
{
- last_tick_nanoseconds = read_frc();
-
mmio_write(timer->base + timer->regs->TISR,
OMAP3_TISR_MAT_IT_FLAG | OMAP3_TISR_OVF_IT_FLAG |
OMAP3_TISR_TCAR_IT_FLAG);
@@ -315,14 +312,6 @@ static void beagle_clock_cleanup(void)
mmio_clear(fr_timer->base + fr_timer->regs->TCLR, OMAP3_TCLR_ST);
}
-static inline uint32_t beagle_clock_nanoseconds_since_last_tick(void)
-{
- /* this arithmetic also works if read_frc() wraps around, as long
- * as the subtraction wraps around too
- */
- return (read_frc() - (uint64_t) last_tick_nanoseconds) * 1000000000 / FRCLOCK_HZ;
-}
-
#define Clock_driver_support_at_tick() beagle_clock_at_tick()
#define Clock_driver_support_initialize_hardware() beagle_clock_initialize()
#define Clock_driver_support_install_isr(isr, old_isr) \
@@ -332,10 +321,6 @@ static inline uint32_t beagle_clock_nanoseconds_since_last_tick(void)
} while (0)
#define Clock_driver_support_shutdown_hardware() beagle_clock_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- beagle_clock_nanoseconds_since_last_tick
/* Include shared source clock driver code */
#include "../../shared/clockdrv_shell.h"
-
-#endif /* ARM_MULTILIB_ARCH_V4 */
diff --git a/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c b/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c
index 499a27904c..121b2c9d32 100644
--- a/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c
+++ b/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c
@@ -68,4 +68,6 @@ void Clock_isr(void * arg);
assert(status == RTEMS_SUCCESSFUL); \
} while (0)
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/gba/clock/clockdrv.c b/c/src/lib/libbsp/arm/gba/clock/clockdrv.c
index 72d0b81e32..ff171110b9 100644
--- a/c/src/lib/libbsp/arm/gba/clock/clockdrv.c
+++ b/c/src/lib/libbsp/arm/gba/clock/clockdrv.c
@@ -92,4 +92,6 @@ void Clock_driver_support_initialize_hardware(void)
GBA_REG_TM3CNT = (0x00c0|GBA_TMCNT_PS);
}
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/lpc176x/include/lpc-clock-config.h b/c/src/lib/libbsp/arm/lpc176x/include/lpc-clock-config.h
index c72575f719..3eef02152e 100644
--- a/c/src/lib/libbsp/arm/lpc176x/include/lpc-clock-config.h
+++ b/c/src/lib/libbsp/arm/lpc176x/include/lpc-clock-config.h
@@ -33,6 +33,7 @@ extern "C" {
#define LPC_CLOCK_INTERRUPT LPC176X_IRQ_TIMER_0
#define LPC_CLOCK_TIMER_BASE TMR0_BASE_ADDR
+#define LPC_CLOCK_TIMECOUNTER_BASE TMR1_BASE_ADDR
#define LPC_CLOCK_REFERENCE LPC176X_PCLK
#define LPC_CLOCK_MODULE_ENABLE() \
lpc176x_module_enable( LPC176X_MODULE_TIMER_0, LPC176X_MODULE_PCLK_DEFAULT )
diff --git a/c/src/lib/libbsp/arm/lpc24xx/include/lpc-clock-config.h b/c/src/lib/libbsp/arm/lpc24xx/include/lpc-clock-config.h
index 1edab4eb02..5e6b469e0f 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/include/lpc-clock-config.h
+++ b/c/src/lib/libbsp/arm/lpc24xx/include/lpc-clock-config.h
@@ -35,6 +35,8 @@ extern "C" {
#define LPC_CLOCK_TIMER_BASE TMR0_BASE_ADDR
+#define LPC_CLOCK_TIMECOUNTER_BASE TMR1_BASE_ADDR
+
#define LPC_CLOCK_REFERENCE LPC24XX_PCLK
#define LPC_CLOCK_MODULE_ENABLE() \
diff --git a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
index accd0d256a..2b676b433f 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
+++ b/c/src/lib/libbsp/arm/lpc32xx/include/lpc-clock-config.h
@@ -44,6 +44,8 @@ extern "C" {
#define LPC_CLOCK_TIMER_BASE LPC32XX_BASE_TIMER_0
+#define LPC_CLOCK_TIMECOUNTER_BASE LPC32XX_BASE_TIMER_1
+
#define LPC_CLOCK_REFERENCE LPC32XX_PERIPH_CLK
#define LPC_CLOCK_MODULE_ENABLE()
diff --git a/c/src/lib/libbsp/arm/nds/clock/clock.c b/c/src/lib/libbsp/arm/nds/clock/clock.c
index a24f8cc788..1e239d44d9 100644
--- a/c/src/lib/libbsp/arm/nds/clock/clock.c
+++ b/c/src/lib/libbsp/arm/nds/clock/clock.c
@@ -81,4 +81,6 @@ void Clock_driver_support_initialize_hardware (void)
TIMER_DATA (0) = TIMER_FREQ_64 ((uint16_t) freq);
}
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
+
#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c b/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c
index 533873cf19..f765485570 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c
+++ b/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c
@@ -72,14 +72,6 @@ static void raspberrypi_clock_cleanup(void)
}
}
-/*
- * Return the nanoseconds since last tick
- */
-static uint32_t raspberrypi_clock_nanoseconds_since_last_tick(void)
-{
- return 0;
-}
-
#define Clock_driver_support_at_tick() raspberrypi_clock_at_tick()
#define Clock_driver_support_initialize_hardware() raspberrypi_clock_initialize()
@@ -92,8 +84,6 @@ static uint32_t raspberrypi_clock_nanoseconds_since_last_tick(void)
#define Clock_driver_support_shutdown_hardware() raspberrypi_clock_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- raspberrypi_clock_nanoseconds_since_last_tick
-
+#define CLOCK_DRIVER_USE_DUMMY_TIMECOUNTER
#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/shared/arm-a9mpcore-clock-config.c b/c/src/lib/libbsp/arm/shared/arm-a9mpcore-clock-config.c
index f2ce07e3b6..8e2e153b46 100644
--- a/c/src/lib/libbsp/arm/shared/arm-a9mpcore-clock-config.c
+++ b/c/src/lib/libbsp/arm/shared/arm-a9mpcore-clock-config.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013-2015 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -17,14 +17,11 @@
#include <bsp/irq.h>
#include <bsp/arm-a9mpcore-regs.h>
#include <bsp/arm-a9mpcore-clock.h>
+#include <rtems/timecounter.h>
#define A9MPCORE_GT ((volatile a9mpcore_gt *) BSP_ARM_A9MPCORE_GT_BASE)
-static uint64_t a9mpcore_clock_last_tick_k;
-
-static uint32_t a9mpcore_clock_last_tick_cmpvallower;
-
-static uint32_t a9mpcore_clock_autoinc;
+static struct timecounter a9mpcore_tc;
/* This is defined in clockdrv_shell.h */
void Clock_isr(rtems_irq_hdl_param arg);
@@ -39,13 +36,6 @@ static void a9mpcore_clock_at_tick(void)
{
volatile a9mpcore_gt *gt = A9MPCORE_GT;
- /*
- * FIXME: Now the _TOD_Get_with_nanoseconds() yields wrong values until
- * _TOD_Tickle_ticks() managed to update the uptime. See also PR2180.
- */
- a9mpcore_clock_last_tick_cmpvallower =
- gt->cmpvallower - a9mpcore_clock_autoinc;
-
gt->irqst = A9MPCORE_GT_IRQST_EFLG;
}
@@ -80,6 +70,13 @@ static uint64_t a9mpcore_clock_get_counter(volatile a9mpcore_gt *gt)
return ((uint64_t) cu2 << 32) | cl;
}
+static uint32_t a9mpcore_clock_get_timecount(struct timecounter *tc)
+{
+ volatile a9mpcore_gt *gt = A9MPCORE_GT;
+
+ return gt->cntrlower;
+}
+
static void a9mpcore_clock_initialize(void)
{
volatile a9mpcore_gt *gt = A9MPCORE_GT;
@@ -98,14 +95,16 @@ static void a9mpcore_clock_initialize(void)
gt->cmpvalupper = (uint32_t) (cmpval >> 32);
gt->autoinc = interval;
- a9mpcore_clock_last_tick_k = (UINT64_C(1000000000) << 32) / periphclk;
- a9mpcore_clock_last_tick_cmpvallower = (uint32_t) cmpval - interval;
- a9mpcore_clock_autoinc = interval;
-
gt->ctrl = A9MPCORE_GT_CTRL_AUTOINC_EN
| A9MPCORE_GT_CTRL_IRQ_EN
| A9MPCORE_GT_CTRL_COMP_EN
| A9MPCORE_GT_CTRL_TMR_EN;
+
+ a9mpcore_tc.tc_get_timecount = a9mpcore_clock_get_timecount;
+ a9mpcore_tc.tc_counter_mask = 0xffffffff;
+ a9mpcore_tc.tc_frequency = periphclk;
+ a9mpcore_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&a9mpcore_tc);
}
CPU_Counter_ticks _CPU_Counter_read(void)
@@ -147,16 +146,6 @@ static void a9mpcore_clock_cleanup(void)
}
}
-static uint32_t a9mpcore_clock_nanoseconds_since_last_tick(void)
-{
- volatile a9mpcore_gt *gt = A9MPCORE_GT;
- uint64_t k = a9mpcore_clock_last_tick_k;
- uint32_t n = a9mpcore_clock_last_tick_cmpvallower;
- uint32_t c = gt->cntrlower;
-
- return (uint32_t) (((c - n) * k) >> 32);
-}
-
#define Clock_driver_support_at_tick() \
a9mpcore_clock_at_tick()
@@ -165,15 +154,12 @@ static uint32_t a9mpcore_clock_nanoseconds_since_last_tick(void)
#define Clock_driver_support_install_isr(isr, old_isr) \
do { \
- a9mpcore_clock_handler_install(); \
+ a9mpcore_clock_handler_install(); \
old_isr = NULL; \
} while (0)
#define Clock_driver_support_shutdown_hardware() \
a9mpcore_clock_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- a9mpcore_clock_nanoseconds_since_last_tick
-
/* Include shared source clock driver code */
#include "../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
index 8e4ae338f8..e78684c8d2 100644
--- a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
+++ b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c
@@ -13,6 +13,7 @@
*/
#include <rtems.h>
+#include <rtems/timecounter.h>
#include <rtems/score/armv7m.h>
#include <bsp.h>
@@ -22,15 +23,35 @@
/* This is defined in clockdrv_shell.h */
static void Clock_isr(void *arg);
-#define _ARMV7M_Systick_get_factor(freq) \
- ((1000000000ULL << 32) / (freq))
+static rtems_timecounter_simple _ARMV7M_TC;
-#ifdef BSP_ARMV7M_SYSTICK_FREQUENCY
- #define _ARMV7M_Systick_factor \
- _ARMV7M_Systick_get_factor(BSP_ARMV7M_SYSTICK_FREQUENCY)
-#else
- static uint64_t _ARMV7M_Systick_factor;
-#endif
+static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
+{
+ volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+
+ return systick->cvr;
+}
+
+static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc)
+{
+ volatile ARMV7M_SCB *scb = _ARMV7M_SCB;
+
+ return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0);
+}
+
+static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)
+{
+ return rtems_timecounter_simple_downcounter_get(
+ tc,
+ _ARMV7M_TC_get,
+ _ARMV7M_TC_is_pending
+ );
+}
+
+static void _ARMV7M_TC_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, _ARMV7M_TC_get);
+}
static void _ARMV7M_Systick_at_tick(void)
{
@@ -67,15 +88,18 @@ static void _ARMV7M_Systick_initialize(void)
uint64_t us_per_tick = rtems_configuration_get_microseconds_per_tick();
uint64_t interval = (freq * us_per_tick) / 1000000ULL;
- #ifndef BSP_ARMV7M_SYSTICK_FREQUENCY
- _ARMV7M_Systick_factor = _ARMV7M_Systick_get_factor(freq);
- #endif
-
systick->rvr = (uint32_t) interval;
systick->cvr = 0;
systick->csr = ARMV7M_SYSTICK_CSR_ENABLE
| ARMV7M_SYSTICK_CSR_TICKINT
| ARMV7M_SYSTICK_CSR_CLKSOURCE;
+
+ rtems_timecounter_simple_install(
+ &_ARMV7M_TC,
+ freq,
+ interval,
+ _ARMV7M_TC_get_timecount
+ );
}
static void _ARMV7M_Systick_cleanup(void)
@@ -85,19 +109,7 @@ static void _ARMV7M_Systick_cleanup(void)
systick->csr = 0;
}
-static uint32_t _ARMV7M_Systick_nanoseconds_since_last_tick(void)
-{
- volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
- volatile ARMV7M_SCB *scb = _ARMV7M_SCB;
- uint32_t rvr = systick->rvr;
- uint32_t c = rvr - systick->cvr;
-
- if ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0) {
- c = rvr - systick->cvr + rvr;
- }
-
- return (uint32_t) ((c * _ARMV7M_Systick_factor) >> 32);
-}
+#define Clock_driver_timecounter_tick() _ARMV7M_TC_tick()
#define Clock_driver_support_at_tick() \
_ARMV7M_Systick_at_tick()
@@ -114,9 +126,6 @@ static uint32_t _ARMV7M_Systick_nanoseconds_since_last_tick(void)
#define Clock_driver_support_shutdown_hardware() \
_ARMV7M_Systick_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- _ARMV7M_Systick_nanoseconds_since_last_tick
-
/* Include shared source clock driver code */
#include "../../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/shared/lpc/clock/lpc-clock-config.c b/c/src/lib/libbsp/arm/shared/lpc/clock/lpc-clock-config.c
index 05c94a6b2c..a55ba0e33c 100644
--- a/c/src/lib/libbsp/arm/shared/lpc/clock/lpc-clock-config.c
+++ b/c/src/lib/libbsp/arm/shared/lpc/clock/lpc-clock-config.c
@@ -7,10 +7,10 @@
*/
/*
- * Copyright (c) 2009-2012 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2009-2015 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
- * Obere Lagerstr. 30
+ * Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
@@ -21,6 +21,7 @@
*/
#include <rtems.h>
+#include <rtems/timecounter.h>
#include <bsp/lpc-clock-config.h>
#include <bsp/lpc-timer.h>
@@ -33,6 +34,16 @@ void Clock_isr(rtems_irq_hdl_param arg);
static volatile lpc_timer *const lpc_clock =
(volatile lpc_timer *) LPC_CLOCK_TIMER_BASE;
+static volatile lpc_timer *const lpc_timecounter =
+ (volatile lpc_timer *) LPC_CLOCK_TIMECOUNTER_BASE;
+
+static struct timecounter lpc_clock_tc;
+
+static uint32_t lpc_clock_tc_get_timecount(struct timecounter *tc)
+{
+ return lpc_timecounter->tc;
+}
+
static void lpc_clock_at_tick(void)
{
lpc_clock->ir = LPC_TIMER_IR_MR0;
@@ -56,6 +67,7 @@ static void lpc_clock_handler_install(void)
static void lpc_clock_initialize(void)
{
+ uint32_t mask;
uint64_t interval = ((uint64_t) LPC_CLOCK_REFERENCE
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
@@ -85,6 +97,13 @@ static void lpc_clock_initialize(void)
/* Enable timer */
lpc_clock->tcr = LPC_TIMER_TCR_EN;
+
+ /* Install timecounter */
+ lpc_clock_tc.tc_get_timecount = lpc_clock_tc_get_timecount;
+ lpc_clock_tc.tc_counter_mask = 0xffffffff;
+ lpc_clock_tc.tc_frequency = LPC_CLOCK_REFERENCE;
+ lpc_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&lpc_clock_tc);
}
static void lpc_clock_cleanup(void)
@@ -105,18 +124,6 @@ static void lpc_clock_cleanup(void)
}
}
-static uint32_t lpc_clock_nanoseconds_since_last_tick(void)
-{
- uint64_t k = (1000000000ULL << 32) / LPC_CLOCK_REFERENCE;
- uint64_t c = lpc_clock->tc;
-
- if ((lpc_clock->ir & LPC_TIMER_IR_MR0) != 0) {
- c = lpc_clock->tc + lpc_clock->mr0;
- }
-
- return (uint32_t) ((c * k) >> 32);
-}
-
#define Clock_driver_support_at_tick() lpc_clock_at_tick()
#define Clock_driver_support_initialize_hardware() lpc_clock_initialize()
#define Clock_driver_support_install_isr(isr, old_isr) \
@@ -126,8 +133,6 @@ static uint32_t lpc_clock_nanoseconds_since_last_tick(void)
} while (0)
#define Clock_driver_support_shutdown_hardware() lpc_clock_cleanup()
-#define Clock_driver_nanoseconds_since_last_tick \
- lpc_clock_nanoseconds_since_last_tick
/* Include shared source clock driver code */
#include "../../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/arm/tms570/clock/clock.c b/c/src/lib/libbsp/arm/tms570/clock/clock.c
index 4dba949c86..d438a3da34 100644
--- a/c/src/lib/libbsp/arm/tms570/clock/clock.c
+++ b/c/src/lib/libbsp/arm/tms570/clock/clock.c
@@ -30,13 +30,14 @@
#include <bsp/irq.h>
#include <bsp/tms570-rti.h>
#include <rtems/counter.h>
+#include <rtems/timecounter.h>
-/**
- * holds HW counter value since last interrupt event
- * sets in tms570_clock_driver_support_at_tick
- * used in tms570_clock_driver_nanoseconds_since_last_tick
- */
-static uint32_t tms570_rti_last_tick_fcr0;
+static struct timecounter tms570_rti_tc;
+
+static uint32_t tms570_rti_get_timecount(struct timecounter tc)
+{
+ return TMS570_RTI.RTIFRC0;
+}
/**
* @brief Initialize the HW peripheral for clock driver
@@ -72,6 +73,12 @@ static void tms570_clock_driver_support_initialize_hardware( void )
TMS570_RTI.RTISETINTENA = 0x1;
/* enable timer */
TMS570_RTI.RTIGCTRL = 1;
+ /* set timecounter */
+ tms570_rti_tc.tc_get_timecount = tms570_rti_get_timecount;
+ tms570_rti_tc.tc_counter_mask = 0xffffffff;
+ tms570_rti_tc.tc_frequency = BSP_PLL_OUT_CLOCK;
+ tms570_rti_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
+ rtems_timecounter_install(&tms570_rti_tc);
}
/**
@@ -82,7 +89,6 @@ static void tms570_clock_driver_support_initialize_hardware( void )
static void tms570_clock_driver_support_at_tick( void )
{
TMS570_RTI.RTIINTFLAG = 0x00000001;
- tms570_rti_last_tick_fcr0 = TMS570_RTI.RTICOMP0 - TMS570_RTI.RTIUDCP0;
}
/**
@@ -124,24 +130,6 @@ static void tms570_clock_driver_support_shutdown_hardware( void )
TMS570_RTI.RTICLEARINTENA = 0x20000;
}
-/**
- * @brief returns the nanoseconds since last tick
- *
- * Return the nanoseconds since last tick
- *
- * @retval x nanoseconds
- *
- */
-static uint32_t tms570_clock_driver_nanoseconds_since_last_tick( void )
-{
- uint32_t actual_fcr0 = TMS570_RTI.RTIFRC0;
- uint32_t usec_since_tick;
-
- usec_since_tick = actual_fcr0 - tms570_rti_last_tick_fcr0;
-
- return usec_since_tick * 1000;
-}
-
#define Clock_driver_support_initialize_hardware \
tms570_clock_driver_support_initialize_hardware
#define Clock_driver_support_at_tick \
@@ -150,8 +138,6 @@ static uint32_t tms570_clock_driver_nanoseconds_since_last_tick( void )
tms570_clock_driver_support_initialize_hardware
#define Clock_driver_support_shutdown_hardware \
tms570_clock_driver_support_shutdown_hardware
-#define Clock_driver_nanoseconds_since_last_tick \
- tms570_clock_driver_nanoseconds_since_last_tick
#define Clock_driver_support_install_isr(Clock_isr, Old_ticker ) \
tms570_clock_driver_support_install_isr( Clock_isr )