diff options
Diffstat (limited to 'bsps/sparc/erc32/clock/ckinit.c')
-rw-r--r-- | bsps/sparc/erc32/clock/ckinit.c | 138 |
1 files changed, 66 insertions, 72 deletions
diff --git a/bsps/sparc/erc32/clock/ckinit.c b/bsps/sparc/erc32/clock/ckinit.c index e7c5b07f33..6d6a335fed 100644 --- a/bsps/sparc/erc32/clock/ckinit.c +++ b/bsps/sparc/erc32/clock/ckinit.c @@ -24,103 +24,97 @@ #include <bsp.h> #include <bspopts.h> -#include <rtems/counter.h> +#include <rtems/sysinit.h> #include <rtems/timecounter.h> #include <rtems/score/sparcimpl.h> -#define ERC32_REAL_TIME_CLOCK_FREQUENCY 1000000 - -/* - * The Real Time Clock Counter Timer uses this trap type. - */ -#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK ) - -#define Clock_driver_support_install_isr( _new ) \ - set_vector( _new, CLOCK_VECTOR, 1 ) - -#define Clock_driver_support_set_interrupt_affinity( _online_processors ) \ - do { \ - (void) _online_processors; \ - } while (0) - extern int CLOCK_SPEED; -static rtems_timecounter_simple erc32_tc; +#define ERC32_REAL_TIME_CLOCK_FREQUENCY 1000000 -static uint32_t erc32_tc_get( rtems_timecounter_simple *tc ) -{ - return ERC32_MEC.Real_Time_Clock_Counter; -} +static struct timecounter erc32_tc; -static bool erc32_tc_is_pending( rtems_timecounter_simple *tc ) +static void erc32_clock_init( void ) { - return ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK ); + struct timecounter *tc; + + tc = &erc32_tc; + tc->tc_get_timecount = _SPARC_Get_timecount_clock; + tc->tc_counter_mask = 0xffffffff; + tc->tc_frequency = ERC32_REAL_TIME_CLOCK_FREQUENCY; + tc->tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER; + rtems_timecounter_install(tc); } -static uint32_t erc32_tc_get_timecount( struct timecounter *tc ) +uint32_t _CPU_Counter_frequency(void) { - return rtems_timecounter_simple_downcounter_get( - tc, - erc32_tc_get, - erc32_tc_is_pending - ); + return ERC32_REAL_TIME_CLOCK_FREQUENCY; } -static void erc32_tc_at_tick( rtems_timecounter_simple *tc ) +static void erc32_clock_at_tick( void ) { - /* Nothing to do */ -} + SPARC_Counter *counter; + rtems_interrupt_level level; -static void erc32_tc_tick( void ) -{ - rtems_timecounter_simple_downcounter_tick( - &erc32_tc, - erc32_tc_get, - erc32_tc_at_tick - ); + counter = &_SPARC_Counter_mutable; + rtems_interrupt_local_disable(level); + + ERC32_Clear_interrupt( ERC32_INTERRUPT_REAL_TIME_CLOCK ); + counter->accumulated += counter->interval; + + rtems_interrupt_local_enable(level); } -static void erc32_counter_initialize( void ) +static void erc32_clock_initialize_early( void ) { - _SPARC_Counter_initialize( - _SPARC_Counter_read_address, - _SPARC_Counter_difference_clock_period, - &ERC32_MEC.Real_Time_Clock_Counter + SPARC_Counter *counter; + + /* approximately 1 us per countdown */ + ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1; + ERC32_MEC.Real_Time_Clock_Counter = + rtems_configuration_get_microseconds_per_tick(); + ERC32_MEC_Set_Real_Time_Clock_Timer_Control( + ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | + ERC32_MEC_TIMER_COUNTER_LOAD_SCALER | + ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER + ); + ERC32_MEC_Set_Real_Time_Clock_Timer_Control( + ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | + ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO ); -} -uint32_t _CPU_Counter_frequency(void) -{ - return ERC32_REAL_TIME_CLOCK_FREQUENCY; + counter = &_SPARC_Counter_mutable; + counter->read_isr_disabled = _SPARC_Counter_read_clock_isr_disabled; + counter->read = _SPARC_Counter_read_clock; + counter->counter_register = &ERC32_MEC.Real_Time_Clock_Counter, + counter->pending_register = &ERC32_MEC.Interrupt_Pending; + counter->pending_mask = UINT32_C(1) << ERC32_INTERRUPT_REAL_TIME_CLOCK; + counter->accumulated = rtems_configuration_get_microseconds_per_tick(); + counter->interval = rtems_configuration_get_microseconds_per_tick(); } -#define Clock_driver_support_initialize_hardware() \ +RTEMS_SYSINIT_ITEM( + erc32_clock_initialize_early, + RTEMS_SYSINIT_CPU_COUNTER, + RTEMS_SYSINIT_ORDER_FIRST +); + +/* + * The Real Time Clock Counter Timer uses this trap type. + */ +#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK ) + +#define Clock_driver_support_install_isr( _new ) \ + set_vector( _new, CLOCK_VECTOR, 1 ) + +#define Clock_driver_support_set_interrupt_affinity( _online_processors ) \ do { \ - /* approximately 1 us per countdown */ \ - ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1; \ - ERC32_MEC.Real_Time_Clock_Counter = \ - rtems_configuration_get_microseconds_per_tick(); \ - \ - ERC32_MEC_Set_Real_Time_Clock_Timer_Control( \ - ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | \ - ERC32_MEC_TIMER_COUNTER_LOAD_SCALER | \ - ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER \ - ); \ - \ - ERC32_MEC_Set_Real_Time_Clock_Timer_Control( \ - ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | \ - ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO \ - ); \ - rtems_timecounter_simple_install( \ - &erc32_tc, \ - ERC32_REAL_TIME_CLOCK_FREQUENCY, \ - rtems_configuration_get_microseconds_per_tick(), \ - erc32_tc_get_timecount \ - ); \ - erc32_counter_initialize(); \ + (void) _online_processors; \ } while (0) -#define Clock_driver_timecounter_tick() erc32_tc_tick() +#define Clock_driver_support_at_tick() erc32_clock_at_tick() + +#define Clock_driver_support_initialize_hardware() erc32_clock_init() #include "../../../shared/dev/clock/clockimpl.h" |