summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-06-07 09:14:06 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-06-07 09:14:06 +0000
commita44752776dea4478251c6d39ef28ca6704905bc5 (patch)
tree5b394b849e3ef1f327789f6e7d2bc1ab187be81c /c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
parent2011-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-a44752776dea4478251c6d39ef28ca6704905bc5.tar.bz2
2011-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
* clock/clock-config.c: Fixes to pass psnsext01. * startup/bspstart.c: Workaround for GCC 4.6 bug. * include/smsc9218i.h, network/smsc9218i.c, Makefile.am: Changes throughout.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
index 34dd07a888..641bb12047 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c
@@ -43,7 +43,9 @@ rtems_isr Clock_isr( rtems_vector_number vector);
EMIOS.CH [MPC55XX_CLOCK_EMIOS_CHANNEL].CSR.R = csr.R; \
} while (0)
-static void mpc55xx_clock_handler_install( rtems_isr_entry isr,
+static uint64_t mpc55xx_clock_factor;
+
+static void mpc55xx_clock_handler_install( rtems_isr_entry isr,
rtems_isr_entry *old_isr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
@@ -69,6 +71,8 @@ static void mpc55xx_clock_initialize( void)
uint64_t interval = ((uint64_t) bsp_clock_speed
* (uint64_t) rtems_configuration_get_microseconds_per_tick()) / 1000000;
+ mpc55xx_clock_factor = (1000000000ULL << 32) / bsp_clock_speed;
+
/* Apply prescaler */
if (prescaler > 0) {
interval /= (uint64_t) prescaler;
@@ -131,11 +135,16 @@ static void mpc55xx_clock_cleanup( void)
static uint32_t mpc55xx_clock_nanoseconds_since_last_tick( void)
{
- uint64_t clicks = EMIOS.CH [MPC55XX_CLOCK_EMIOS_CHANNEL].CCNTR.R;
- uint64_t clock = bsp_clock_speed;
- uint64_t ns = (clicks * 1000000000) / clock;
+ volatile struct EMIOS_CH_tag *regs = &EMIOS.CH [MPC55XX_CLOCK_EMIOS_CHANNEL];
+ uint64_t c = regs->CCNTR.R;
+ union EMIOS_CSR_tag csr = { .R = regs->CSR.R };
+ uint64_t k = mpc55xx_clock_factor;
+
+ if (csr.B.FLAG != 0) {
+ c = regs->CCNTR.R + regs->CADR.R + 1;
+ }
- return (uint32_t) ns;
+ return (uint32_t) ((c * k) >> 32);
}
#define Clock_driver_support_initialize_hardware() mpc55xx_clock_initialize()