This patch could use some more explanation, and probably some documentation in the BSP guide. Why is erc32 being changed, for what purpose?
On Wed, Apr 1, 2015 at 10:37 AM, Alexander Krutwig <alexander.krut...@embedded-brains.de> wrote: > --- > c/src/lib/libbsp/shared/clockdrv_shell.h | 31 ++++++++++++----- > c/src/lib/libbsp/sparc/erc32/clock/ckinit.c | 54 > +++++++++++++++++++++++------ > 2 files changed, 66 insertions(+), 19 deletions(-) > > diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h > b/c/src/lib/libbsp/shared/clockdrv_shell.h > index 5dbea13..cf3237d 100644 > --- a/c/src/lib/libbsp/shared/clockdrv_shell.h > +++ b/c/src/lib/libbsp/shared/clockdrv_shell.h > @@ -20,6 +20,10 @@ > #include <bsp.h> > #include <rtems/clockdrv.h> > > +#ifdef Clock_driver_nanoseconds_since_last_tick > +#error "adjust your clock driver" Please make error message more informative. I have no idea what it should be adjusted to. > +#endif > + > /** > * @defgroup bsp_clock Clock Support > * > @@ -39,6 +43,14 @@ > #define Clock_driver_support_find_timer() > #endif > > +/* > + * A specialized clock driver may use for example _Timecounter_Tick_simple() > + * instead of the default. > + */ > +#ifndef Clock_driver_timecounter_tick > + Clock_driver_timecounter_tick() _Timecounter_Tick() > +#endif > + > /** > * @brief ISRs until next clock tick > */ > @@ -53,6 +65,12 @@ volatile uint32_t Clock_driver_ticks; > > void Clock_exit( void ); > > +static void Clock_tick( void ) > +{ > + Clock_driver_timecounter_tick(); > + rtems_clock_tick(); > +} > + > /** > * @brief Clock_isr > * > @@ -79,7 +97,7 @@ rtems_isr Clock_isr( > > #if CLOCK_DRIVER_USE_FAST_IDLE > do { > - rtems_clock_tick(); > + Clock_tick(); > } while ( > _Thread_Heir == _Thread_Executing > && _Thread_Executing->Start.entry_point > @@ -101,7 +119,7 @@ rtems_isr Clock_isr( > * The driver is multiple ISRs per clock tick. > */ > if ( !Clock_driver_isrs ) { > - rtems_clock_tick(); > + Clock_tick(); > > Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK; > } > @@ -110,7 +128,7 @@ rtems_isr Clock_isr( > /* > * The driver is one ISR per clock tick. > */ > - rtems_clock_tick(); > + Clock_tick(); > #endif > #endif > } > @@ -149,6 +167,7 @@ rtems_device_driver Clock_initialize( > > Clock_driver_ticks = 0; > > + > /* > * Find timer -- some BSPs search buses for hardware timer > */ > @@ -160,12 +179,6 @@ rtems_device_driver Clock_initialize( > (void) Old_ticker; > Clock_driver_support_install_isr( Clock_isr, Old_ticker ); > > - #if defined(Clock_driver_nanoseconds_since_last_tick) > - rtems_clock_set_nanoseconds_extension( > - Clock_driver_nanoseconds_since_last_tick > - ); > - #endif > - > /* > * Now initialize the hardware that is the source of the tick ISR. > */ > diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c > b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c > index 2afe770..1fb186c 100644 > --- a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c > +++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c > @@ -25,6 +25,7 @@ > #include <bsp.h> > #include <bspopts.h> > #include <rtems/counter.h> > +#include <rtems/score/timecounterimpl.h> > > #if SIMSPARC_FAST_IDLE==1 > #define CLOCK_DRIVER_USE_FAST_IDLE 1 > @@ -44,25 +45,33 @@ > > extern int CLOCK_SPEED; > > -static uint32_t bsp_clock_nanoseconds_since_last_tick(void) > +static struct timecounter erc32_tc; > + > +static uint64_t erc32_tc_scaler; > + > +static uint32_t erc32_tc_interval; > + > +static uint32_t erc32_tc_current(void) > +{ > + return (ERC32_MEC.Real_Time_Clock_Counter * erc32_tc_scaler) >> 32; > +} > + > +static u_int erc32_get_timecount(struct timecounter *tc) > { > uint32_t clicks; > - uint32_t usecs; > + uint32_t interval; > > - clicks = ERC32_MEC.Real_Time_Clock_Counter; > + interval = erc32_tc_interval; > + clicks = erc32_tc_current(); > > if ( ERC32_Is_interrupt_pending( ERC32_INTERRUPT_REAL_TIME_CLOCK ) ) { > - clicks = ERC32_MEC.Real_Time_Clock_Counter; > - usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks); > + clicks = erc32_tc_current(); > + return (2 * interval - clicks); > } else { > - usecs = (rtems_configuration_get_microseconds_per_tick() - clicks); > + return (interval - clicks); > } > - return usecs * 1000; > } > > -#define Clock_driver_nanoseconds_since_last_tick \ > - bsp_clock_nanoseconds_since_last_tick > - > static CPU_Counter_ticks erc32_counter_difference( > CPU_Counter_ticks second, > CPU_Counter_ticks first > @@ -75,6 +84,7 @@ static CPU_Counter_ticks erc32_counter_difference( > > #define Clock_driver_support_initialize_hardware() \ > do { \ > + uint32_t mask; \ > /* approximately 1 us per countdown */ \ > ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1; \ > ERC32_MEC.Real_Time_Clock_Counter = \ > @@ -89,7 +99,18 @@ static CPU_Counter_ticks erc32_counter_difference( > ERC32_MEC_Set_Real_Time_Clock_Timer_Control( \ > ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING | \ > ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO \ > + ); \ > + _Timecounter_Get_binary_scaler_and_mask( \ > + rtems_configuration_get_microseconds_per_tick(), \ > + &erc32_tc_scaler, \ > + &mask \ > ); \ > + erc32_tc_interval = (mask + 1) / 2; \ > + erc32_tc.tc_get_timecount = erc32_get_timecount; \ > + erc32_tc.tc_counter_mask = mask; \ > + erc32_tc.tc_frequency = (1000000 * erc32_tc_scaler) >> 32; \ > + erc32_tc.tc_quality = TIMECOUNTER_DEFAULT_DRIVER_QUALITY; \ > + _Timecounter_Install(&erc32_tc); \ > _SPARC_Counter_initialize( \ > &ERC32_MEC.Real_Time_Clock_Counter, \ > erc32_counter_difference \ > @@ -97,6 +118,19 @@ static CPU_Counter_ticks erc32_counter_difference( > rtems_counter_initialize_converter(1000000); \ > } while (0) > > +static void erc32_tc_tick(void) > +{ > + uint32_t clicks; > + uint32_t interval; > + > + interval = erc32_tc_interval; > + clicks = interval - erc32_tc_current(); > + > + _Timecounter_Tick_simple(interval + clicks, clicks); > +} > + > +#define Clock_driver_timecounter_tick() erc32_tc_tick() > + > #define Clock_driver_support_shutdown_hardware() \ > do { \ > ERC32_Mask_interrupt( ERC32_INTERRUPT_REAL_TIME_CLOCK ); \ > -- > 1.8.4.5 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel