Update #2502.
---
.../arm/shared/armv7m/clock/armv7m-clock-config.c | 51 --
c/src/lib/libbsp/m68k/mcf52235/clock/clock.c | 19
c/src/lib/libbsp/m68k/mcf5225x/clock/clock.c | 19
c/src/lib/libbsp/m68k/mcf5329/clock/clock.c| 19
c/src/lib/libbsp/m68k/uC5282/clock/clock.c | 29 ++--
.../libbsp/powerpc/mpc55xxevb/clock/clock-config.c | 34 +--
c/src/lib/libbsp/shared/clockdrv_shell.h | 16 ++-
c/src/lib/libbsp/sparc/erc32/clock/ckinit.c| 10 +++--
c/src/lib/libbsp/sparc/leon2/clock/ckinit.c| 13 --
c/src/lib/libbsp/sparc/leon3/clock/ckinit.c| 31 +++--
c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c | 9 +++-
c/src/lib/libcpu/arm/lpc22xx/clock/clockdrv.c | 32 --
cpukit/rtems/src/clocktick.c | 6 ++-
cpukit/sapi/include/rtems/timecounter.h| 35 ---
cpukit/score/include/rtems/score/timecounter.h | 27 +++-
cpukit/score/src/kern_tc.c | 16 +++
doc/bsp_howto/clock.t | 13 +-
17 files changed, 256 insertions(+), 123 deletions(-)
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 e78684c..d481c44 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
@@ -23,7 +23,12 @@
/* This is defined in clockdrv_shell.h */
static void Clock_isr(void *arg);
-static rtems_timecounter_simple _ARMV7M_TC;
+typedef struct {
+ rtems_timecounter_simple base;
+ bool countflag;
+} ARMV7M_Timecounter;
+
+static ARMV7M_Timecounter _ARMV7M_TC;
static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
{
@@ -32,11 +37,25 @@ static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc)
return systick->cvr;
}
-static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc)
+static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *base)
{
- volatile ARMV7M_SCB *scb = _ARMV7M_SCB;
+ ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
+ rtems_interrupt_level level;
+ bool countflag;
+
+ rtems_interrupt_disable(level);
+
+ countflag = tc->countflag;
+ if (!countflag) {
+volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+
+countflag = ((systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != 0);
+tc->countflag = countflag;
+ }
+
+ rtems_interrupt_enable(level);
- return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0);
+ return countflag;
}
static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc)
@@ -48,19 +67,26 @@ static uint32_t _ARMV7M_TC_get_timecount(struct timecounter
*tc)
);
}
-static void _ARMV7M_TC_tick(void)
-{
- rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, _ARMV7M_TC_get);
-}
-
-static void _ARMV7M_Systick_at_tick(void)
+static void _ARMV7M_TC_at_tick(rtems_timecounter_simple *base)
{
+ ARMV7M_Timecounter *tc = (ARMV7M_Timecounter *) base;
volatile ARMV7M_Systick *systick = _ARMV7M_Systick;
+ tc->countflag = false;
+
/* Clear COUNTFLAG */
systick->csr;
}
+static void _ARMV7M_TC_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+&_ARMV7M_TC.base,
+_ARMV7M_TC_get,
+_ARMV7M_TC_at_tick
+ );
+}
+
static void _ARMV7M_Systick_handler(void)
{
_ARMV7M_Interrupt_service_enter();
@@ -95,7 +121,7 @@ static void _ARMV7M_Systick_initialize(void)
| ARMV7M_SYSTICK_CSR_CLKSOURCE;
rtems_timecounter_simple_install(
-&_ARMV7M_TC,
+&_ARMV7M_TC.base,
freq,
interval,
_ARMV7M_TC_get_timecount
@@ -111,9 +137,6 @@ static void _ARMV7M_Systick_cleanup(void)
#define Clock_driver_timecounter_tick() _ARMV7M_TC_tick()
-#define Clock_driver_support_at_tick() \
- _ARMV7M_Systick_at_tick()
-
#define Clock_driver_support_initialize_hardware() \
_ARMV7M_Systick_initialize()
diff --git a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
index fdc1ed6..4b5f4af 100644
--- a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
+++ b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c
@@ -32,18 +32,19 @@ static uint32_t mcf52235_tc_get_timecount(struct
timecounter *tc)
);
}
-static void mcf52235_tc_tick(void)
+static void mcf52235_tc_at_tick(rtems_timecounter_simple *tc)
{
- rtems_timecounter_simple_downcounter_tick(&mcf52235_tc, mcf52235_tc_get);
+ MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
}
-/*
- * Periodic interval timer interrupt handler
- */
-#define Clock_driver_support_at_tick() \
-do { \
-MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF; \
-} while (0)\
+static void mcf52235_tc_tick(void)
+{
+ rtems_timecounter_simple_downcounter_tick(
+&mcf52235_tc,
+mcf52235_tc_get,
+mcf52235_tc_at_tick
+ );
+}
/