This driver lacked several features and cannot support SMP configurations. Use the standard clock driver instead. --- c/src/lib/libbsp/sparc/leon3/Makefile.am | 5 +- c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 10 - c/src/lib/libbsp/sparc/shared/include/tlib.h | 8 - c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c | 290 ---------------------- 4 files changed, 2 insertions(+), 311 deletions(-) delete mode 100644 c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c
diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am index f2f690e..42084c2 100644 --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am @@ -68,13 +68,12 @@ libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_names.c libbsp_a_SOURCES += ../../sparc/shared/amba/ambapp_show.c libbsp_a_SOURCES += ../../sparc/shared/amba/ahbstat.c -# Clock Driver and Timer Library +# Timer Library include_bsp_HEADERS += ../../sparc/shared/include/gptimer.h include_bsp_HEADERS += ../../sparc/shared/include/tlib.h libbsp_a_SOURCES += ../../sparc/shared/timer/gptimer.c libbsp_a_SOURCES += ../../sparc/shared/timer/tlib.c -libbsp_a_SOURCES += ../../sparc/shared/timer/tlib_ckinit.c -# non-Driver Manager Clock Implementation +# Clock Driver libbsp_a_SOURCES += clock/ckinit.c libbsp_a_SOURCES += ../../shared/clockdrv_shell.h diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c index f2372ec..ca0d0c7 100644 --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c @@ -28,14 +28,6 @@ #include <rtems/score/profiling.h> #include <rtems/timecounter.h> -/* The LEON3 BSP Timer driver can rely on the Driver Manager if the - * DrvMgr is initialized during startup. Otherwise the classic driver - * must be used. - * - * The DrvMgr Clock driver is located in the shared/timer directory - */ -#ifndef RTEMS_DRVMGR_STARTUP - /* LEON3 Timer system interrupt number */ static int clkirq; @@ -281,5 +273,3 @@ static void leon3_clock_initialize(void) #define Clock_driver_timecounter_tick() leon3_tc_do_tick() #include "../../../shared/clockdrv_shell.h" - -#endif diff --git a/c/src/lib/libbsp/sparc/shared/include/tlib.h b/c/src/lib/libbsp/sparc/shared/include/tlib.h index 7e6c49a..118722b 100644 --- a/c/src/lib/libbsp/sparc/shared/include/tlib.h +++ b/c/src/lib/libbsp/sparc/shared/include/tlib.h @@ -54,14 +54,6 @@ struct tlib_dev { struct tlib_drv *drv; }; -#ifdef RTEMS_DRVMGR_STARTUP -/* Clock Driver Timer register function. Only used when the TLIB-Clock - * driver is used. A specific Timer is registered as the System Clock - * timer. - */ -extern void Clock_timer_register(int timer_number); -#endif - /* Register Timer. Called by Timer Drivers in order to register * a Timer to the Timer Library. The registration order determines * the Timer Number used in tlib_open() to identify a specific diff --git a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c b/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c deleted file mode 100644 index 2848f4c..0000000 --- a/c/src/lib/libbsp/sparc/shared/timer/tlib_ckinit.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Clock Tick Device Driver using Timer Library implemented - * by the GRLIB GPTIMER / LEON2 Timer drivers. - * - * COPYRIGHT (c) 2010. - * Cobham Gaisler AB. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - */ - -#include <rtems.h> -#include <rtems/timecounter.h> -#include <rtems/score/percpu.h> -#include <stdlib.h> -#include <bsp.h> -#include <bsp/tlib.h> - -#ifdef RTEMS_DRVMGR_STARTUP - -/* Undefine this to save space in standard LEON configurations, - * it will assume that Prescaler is running at 1MHz. - */ -#undef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ - -/* Set the below defines from bsp.h if function needed. -#undef CLOCK_DRIVER_ISRS_PER_TICK -#undef CLOCK_DRIVER_USE_FAST_IDLE -*/ - -/* - * Number of Clock ticks since initialization - */ -volatile uint32_t Clock_driver_ticks; - -/* - * Timer Number in Timer Library. Defaults to the first Timer in - * the System. - */ -int Clock_timer = 0; - -/* - * Timer Handle in Timer Library - */ -void *Clock_handle = NULL; - -#ifdef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ -unsigned int Clock_basefreq; -#endif - -void Clock_exit(void); -void Clock_isr(void *arg_unused); - -static rtems_timecounter_simple tlib_tc; - -static uint32_t tlib_tc_get(rtems_timecounter_simple *tc) -{ - unsigned int clicks = 0; - - if (Clock_handle != NULL) { - tlib_get_counter(Clock_handle, &clicks); - } - - return clicks; -} - -static bool tlib_tc_is_pending(rtems_timecounter_simple *tc) -{ - bool pending = false; - - if (Clock_handle != NULL) { - pending = tlib_interrupt_pending(Clock_handle, 0) != 0; - } - - return pending; -} - -static uint32_t tlib_tc_get_timecount(struct timecounter *tc) -{ - return rtems_timecounter_simple_downcounter_get( - tc, - tlib_tc_get, - tlib_tc_is_pending - ); -} - -static void tlib_tc_at_tick(rtems_timecounter_simple *tc) -{ - /* Nothing to do? */ -} - -static void tlib_tc_tick(void) -{ - rtems_timecounter_simple_downcounter_tick( - &tlib_tc, - tlib_tc_get, - tlib_tc_at_tick - ); -} - -/* - * Clock_isr - * - * This is the clock tick interrupt handler. - * - * Input parameters: - * vector - vector number - * - * Output parameters: NONE - * - * Return values: NONE - * - */ - -void Clock_isr(void *arg_unused) -{ - /* - * Support for shared interrupts. Ack IRQ at source, only handle - * interrupts generated from the tick-timer. - */ - if ( tlib_interrupt_pending(Clock_handle, 1) == 0 ) - return; - - /* - * Accurate count of ISRs - */ - - Clock_driver_ticks += 1; - -#ifdef CLOCK_DRIVER_USE_FAST_IDLE - do { - tlib_tc_tick(); - } while ( _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle ); - - return; - -#else - -#ifdef CLOCK_DRIVER_ISRS_PER_TICK - /* - * The driver is multiple ISRs per clock tick. - */ - - if ( !Clock_driver_isrs ) { - - tlib_tc_tick(); - - Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK; - } - Clock_driver_isrs--; -#else - - /* - * The driver is one ISR per clock tick. - */ - tlib_tc_tick(); -#endif -#endif -} - -/* - * Clock_exit - * - * This routine allows the clock driver to exit by masking the interrupt and - * disabling the clock's counter. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: NONE - * - */ - -void Clock_exit( void ) -{ - /* Stop all activity of the Timer, no more ISRs. - * We could be using tlib_close(), however tlib_stop() is quicker - * and independent of IRQ unregister code. - */ - if ( Clock_handle ) { - tlib_stop(Clock_handle); - Clock_handle = NULL; - } -} - -/* - * Clock_initialize - * - * This routine initializes the clock driver and starts the Clock. - * - * Input parameters: - * major - clock device major number - * minor - clock device minor number - * parg - pointer to optional device driver arguments - * - * Output parameters: NONE - * - * Return values: - * rtems_device_driver status code - */ - -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp -) -{ - uint64_t frequency; - unsigned int tick_hz; - - /* - * Take Timer that should be used as system timer. - * - */ - Clock_handle = tlib_open(Clock_timer); - if ( Clock_handle == NULL ) { - /* System Clock Timer not found */ - return RTEMS_NOT_DEFINED; - } - - /* - * Install Clock ISR before starting timer - */ - tlib_irq_register(Clock_handle, Clock_isr, NULL); - - /* Set Timer Frequency to tick at Configured value. The Timer - * Frequency is set in multiples of the timer base frequency. - * - * In standard LEON3 designs the base frequency is is 1MHz, to - * save instructions undefine CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ - * to avoid 64-bit calculation. - */ -#ifdef CLOCK_DRIVER_DONT_ASSUME_PRESCALER_1MHZ - { - uint64_t tmp; - - tlib_get_freq(Clock_handle, &Clock_basefreq, NULL); - - frequency = Clock_basefreq - tmp = frequency * (uint64_t)rtems_configuration_get_microseconds_per_tick(); - tick_hz = tmp / 1000000; - } -#else - frequency = 1000000; - tick_hz = rtems_configuration_get_microseconds_per_tick(); -#endif - - tlib_set_freq(Clock_handle, tick_hz); - - rtems_timecounter_simple_install( - &tlib_tc, - frequency, - tick_hz, - tlib_tc_get_timecount - ); - - /* - * IRQ and Frequency is setup, now we start the Timer. IRQ is still - * disabled globally during startup, so IRQ will hold for a while. - */ - tlib_start(Clock_handle, 0); - - /* - * Register function called at system shutdown - */ - atexit( Clock_exit ); - - /* - * If we are counting ISRs per tick, then initialize the counter. - */ - -#ifdef CLOCK_DRIVER_ISRS_PER_TICK - Clock_driver_isrs = CLOCK_DRIVER_ISRS_PER_TICK; -#endif - - return RTEMS_SUCCESSFUL; -} - -/*** Timer Driver Interface ***/ - -/* Set system clock timer instance */ -void Clock_timer_register(int timer_number) -{ - Clock_timer = timer_number; -} - -#endif -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel