diff options
author | Alexander Krutwig <alexander.krutwig@embedded-brains.de> | 2015-04-01 15:33:25 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-05-20 08:40:34 +0200 |
commit | 75acd9e69f906cbd880a17ee4ca705ad7caa92c0 (patch) | |
tree | 71529028154cb323286b02392def2e5277eed312 /c/src/lib/libbsp/or1k | |
parent | timecounter: Use in RTEMS (diff) | |
download | rtems-75acd9e69f906cbd880a17ee4ca705ad7caa92c0.tar.bz2 |
bsps: Convert clock drivers to use a timecounter
Update #2271.
Diffstat (limited to 'c/src/lib/libbsp/or1k')
-rw-r--r-- | c/src/lib/libbsp/or1k/generic_or1k/clock/clockdrv.c | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/c/src/lib/libbsp/or1k/generic_or1k/clock/clockdrv.c b/c/src/lib/libbsp/or1k/generic_or1k/clock/clockdrv.c index 57e46c1897..e01d2e506d 100644 --- a/c/src/lib/libbsp/or1k/generic_or1k/clock/clockdrv.c +++ b/c/src/lib/libbsp/or1k/generic_or1k/clock/clockdrv.c @@ -22,11 +22,14 @@ #include <bsp/generic_or1k.h> #include <rtems/score/cpu.h> #include <rtems/score/or1k-utility.h> +#include <rtems/timecounter.h> /* The number of clock cycles before generating a tick timer interrupt. */ #define TTMR_NUM_OF_CLOCK_TICKS_INTERRUPT 0x09ED9 #define OR1K_CLOCK_CYCLE_TIME_NANOSECONDS 10 +static struct timecounter or1ksim_tc; + /* CPU counter */ static CPU_Counter_ticks cpu_counter_ticks; @@ -69,8 +72,23 @@ static void generic_or1k_clock_handler_install( } } +static uint32_t or1ksim_get_timecount(struct timecounter *tc) +{ + uint32_t ticks_since_last_timer_interrupt; + + ticks_since_last_timer_interrupt = _OR1K_mfspr(CPU_OR1K_SPR_TTCR); + + return cpu_counter_ticks + ticks_since_last_timer_interrupt; +} + +CPU_Counter_ticks _CPU_Counter_read(void) +{ + return or1ksim_get_timecount(NULL); +} + static void generic_or1k_clock_initialize(void) { + uint64_t frequency = (1000000000 / OR1K_CLOCK_CYCLE_TIME_NANOSECONDS); uint32_t TTMR; /* For TTMR register, @@ -90,11 +108,15 @@ static void generic_or1k_clock_initialize(void) _OR1K_mtspr(CPU_OR1K_SPR_TTMR, TTMR); _OR1K_mtspr(CPU_OR1K_SPR_TTCR, 0); - /* Initialize CPU Counter */ - cpu_counter_ticks = 0; + /* Initialize timecounter */ + or1ksim_tc.tc_get_timecount = or1ksim_get_timecount; + or1ksim_tc.tc_counter_mask = 0xffffffff; + or1ksim_tc.tc_frequency = frequency; + or1ksim_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER; + rtems_timecounter_install(&or1ksim_tc); } - static void generic_or1k_clock_cleanup(void) +static void generic_or1k_clock_cleanup(void) { uint32_t sr; @@ -109,24 +131,6 @@ static void generic_or1k_clock_initialize(void) _OR1K_mtspr(CPU_OR1K_SPR_TTMR, 0); } -/* - * Return the nanoseconds since last tick - */ -static uint32_t generic_or1k_clock_nanoseconds_since_last_tick(void) -{ - return - TTMR_NUM_OF_CLOCK_TICKS_INTERRUPT * OR1K_CLOCK_CYCLE_TIME_NANOSECONDS; -} - -CPU_Counter_ticks _CPU_Counter_read(void) -{ - uint32_t ticks_since_last_timer_interrupt; - - ticks_since_last_timer_interrupt = _OR1K_mfspr(CPU_OR1K_SPR_TTCR); - - return cpu_counter_ticks + ticks_since_last_timer_interrupt; -} - CPU_Counter_ticks _CPU_Counter_difference( CPU_Counter_ticks second, CPU_Counter_ticks first @@ -134,6 +138,7 @@ CPU_Counter_ticks _CPU_Counter_difference( { return second - first; } + #define Clock_driver_support_at_tick() generic_or1k_clock_at_tick() #define Clock_driver_support_initialize_hardware() generic_or1k_clock_initialize() @@ -146,7 +151,4 @@ CPU_Counter_ticks _CPU_Counter_difference( #define Clock_driver_support_shutdown_hardware() generic_or1k_clock_cleanup() -#define Clock_driver_nanoseconds_since_last_tick \ - generic_or1k_clock_nanoseconds_since_last_tick - #include "../../../shared/clockdrv_shell.h" |