diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2011-06-07 09:14:06 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2011-06-07 09:14:06 +0000 |
commit | a44752776dea4478251c6d39ef28ca6704905bc5 (patch) | |
tree | 5b394b849e3ef1f327789f6e7d2bc1ab187be81c /c/src/lib/libbsp/powerpc/mpc55xxevb/clock/clock-config.c | |
parent | 2011-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-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.c | 19 |
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() |