diff options
author | Ralf Corsepius <ralf.corsepius@rtems.org> | 2006-03-16 17:18:20 +0000 |
---|---|---|
committer | Ralf Corsepius <ralf.corsepius@rtems.org> | 2006-03-16 17:18:20 +0000 |
commit | 72837683458ae43e7616c5af6764238167c16f2b (patch) | |
tree | 340b1c0116f0deb46e225327d8ca4053548836d5 /c/src/lib/libbsp/mips/hurricane/clock | |
parent | 2006-03-16 Ralf Corsepius <ralf.corsepius@rtems.org> (diff) | |
download | rtems-72837683458ae43e7616c5af6764238167c16f2b.tar.bz2 |
New (Submission by Bruce Robinson <brucer@pmccorp.com>).
Diffstat (limited to 'c/src/lib/libbsp/mips/hurricane/clock')
-rw-r--r-- | c/src/lib/libbsp/mips/hurricane/clock/ckinit.c | 262 | ||||
-rw-r--r-- | c/src/lib/libbsp/mips/hurricane/clock/clock.S | 45 | ||||
-rw-r--r-- | c/src/lib/libbsp/mips/hurricane/clock/clock.h | 25 |
3 files changed, 332 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/mips/hurricane/clock/ckinit.c b/c/src/lib/libbsp/mips/hurricane/clock/ckinit.c new file mode 100644 index 0000000000..4a906756b6 --- /dev/null +++ b/c/src/lib/libbsp/mips/hurricane/clock/ckinit.c @@ -0,0 +1,262 @@ + +/* ckinit.c + * + * This file contains the clock driver initialization for the Hurricane BSP. + * + * Author: Craig Lebakken <craigl@transition.com> + * + * COPYRIGHT (c) 1996 by Transition Networks Inc. + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Transition Networks not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * Transition Networks makes no representations about the suitability + * of this software for any purpose. + * + * Derived from c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c: + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +/* + * Rather than deleting this, it is commented out to (hopefully) help + * the submitter send updates. + * + * static char _sccsid[] = "@(#)ckinit.c 08/20/96 1.3\n"; + */ + + +#include <stdlib.h> + +#include <rtems.h> +#include <rtems/libio.h> + +#define EXT_INT1 0x800 /* external interrupt 5 */ + +#include "clock.h" + +/* formerly in the BSP */ +#if 0 +#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ ) /* equivalent to CPU clock speed in MHz */ +#endif + +#define CLOCKS_PER_MICROSECOND \ + rtems_cpu_configuration_get_clicks_per_microsecond() +/* to avoid including the bsp */ +mips_isr_entry set_vector( rtems_isr_entry, rtems_vector_number, int ); + +void USC_isr( void ); +void reset_wdt(void); +void enable_wdi(void); +void init_hbt(void); +void enable_hbi(void); +void disable_hbi(void); + +void Clock_exit( void ); +rtems_isr Clock_isr( rtems_vector_number vector ); + + +/* + * The interrupt vector number associated with the clock tick device + * driver. + */ + +#define CLOCK_VECTOR_MASK EXT_INT1 +#define CLOCK_VECTOR MIPS_INTERRUPT_BASE + 0x3 + +/* + * Clock_driver_ticks is a monotonically increasing counter of the + * number of clock ticks since the driver was initialized. + */ + +volatile uint32_t Clock_driver_ticks; + +/* + * Clock_isrs is the number of clock ISRs until the next invocation of + * the RTEMS clock tick routine. The clock tick device driver + * gets an interrupt once a millisecond and counts down until the + * length of time between the user configured microseconds per tick + * has passed. + */ + +uint32_t Clock_isrs; /* ISRs until next tick */ + +/* + * These are set by clock driver during its init + */ + +rtems_device_major_number rtems_clock_major = ~0; +rtems_device_minor_number rtems_clock_minor; + +/* + * The previous ISR on this clock tick interrupt vector. + */ + +rtems_isr_entry Old_ticker; + +void Clock_exit( void ); + +static uint32_t mips_timer_rate = 0; + +/* + * Isr Handler + */ + +rtems_isr Clock_isr( + rtems_vector_number vector +) +{ +/* + * bump the number of clock driver ticks since initialization + * + * determine if it is time to announce the passing of tick as configured + * to RTEMS through the rtems_clock_tick directive + * + * perform any timer dependent tasks + */ + + reset_wdt(); /* Reset hardware watchdog timer */ + + Clock_driver_ticks += 1; + + rtems_clock_tick(); +} + +/* User callback shell (set from Clock_Control) */ +static void (*user_callback)(void); + +rtems_isr User_Clock_isr( + rtems_vector_number vector +) +{ + if (user_callback) + user_callback(); +} + +/* + * Install_clock + * + * Install a clock tick handleR and reprograms the chip. This + * is used to initially establish the clock tick. + */ + +void Install_clock( + rtems_isr_entry clock_isr +) +{ + /* + * Initialize the clock tick device driver variables + */ + + Clock_driver_ticks = 0; + Clock_isrs = rtems_configuration_get_milliseconds_per_tick(); + + mips_timer_rate = + rtems_configuration_get_microseconds_per_tick() * CLOCKS_PER_MICROSECOND; + + /* + * Hardware specific initialize goes here + */ + + /* Set up USC heartbeat timer to generate interrupts */ + disable_hbi(); /* Disable heartbeat interrupt in USC */ + + /* Install interrupt handler */ + Old_ticker = (rtems_isr_entry) set_vector( USC_isr, CLOCK_VECTOR, 1 ); + + init_hbt(); /* Initialize heartbeat timer */ + + reset_wdt(); /* Reset watchdog timer */ + + enable_wdi(); /* Enable watchdog interrupt in USC */ + + enable_hbi(); /* Enable heartbeat interrupt in USC */ + + /* Enable USC interrupt in MIPS processor */ + mips_enable_in_interrupt_mask(CLOCK_VECTOR_MASK); + + /* + * Schedule the clock cleanup routine to execute if the application exits. + */ + + atexit( Clock_exit ); +} + +/* + * Clean up before the application exits + */ + +void Clock_exit( void ) +{ + /* mips: turn off the timer interrupts */ + mips_disable_in_interrupt_mask(~CLOCK_VECTOR_MASK); +} + +/* + * Clock_initialize + * + * Device driver entry point for clock tick driver initialization. + */ + +rtems_device_driver Clock_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + Install_clock( Clock_isr ); + + /* + * make major/minor avail to others such as shared memory driver + */ + + rtems_clock_major = major; + rtems_clock_minor = minor; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver Clock_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *pargp +) +{ + uint32_t isrlevel; + rtems_libio_ioctl_args_t *args = pargp; + + if (args == 0) + goto done; + + /* + * This is hokey, but until we get a defined interface + * to do this, it will just be this simple... + */ + + if (args->command == rtems_build_name('I', 'S', 'R', ' ')) + { + Clock_isr(CLOCK_VECTOR); + } + else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) + { + rtems_interrupt_disable( isrlevel ); + user_callback = (void (*)(void))args->buffer; + (void) set_vector( User_Clock_isr, CLOCK_VECTOR, 1 ); + rtems_interrupt_enable( isrlevel ); + } + +done: + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/mips/hurricane/clock/clock.S b/c/src/lib/libbsp/mips/hurricane/clock/clock.S new file mode 100644 index 0000000000..30b823f5ba --- /dev/null +++ b/c/src/lib/libbsp/mips/hurricane/clock/clock.S @@ -0,0 +1,45 @@ +/* clock.s + * + * This file contains the assembly code for the Hurricane BSP clock driver. + * + * Author: Craig Lebakken <craigl@transition.com> + * + * COPYRIGHT (c) 1996 by Transition Networks Inc. + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Transition Networks not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * Transition Networks makes no representations about the suitability + * of this software for any purpose. + * + * clock.S,v 1.5 2001/05/24 13:23:48 joel Exp + */ +/* @(#)clock.S 08/20/96 1.2 */ + +#include <iregdef.h> +#include <idtcpu.h> +#include <asm.h> + +FRAME(mips_set_timer,sp,0,ra) + .set noreorder + mfc0 t0,C0_COUNT + nop + addu t0,a0,t0 + mtc0 t0,C0_COMPARE + j ra + nop + .set reorder +ENDFRAME(mips_set_timer) + +FRAME(mips_get_timer,sp,0,ra) + .set noreorder + mfc0 v0,C0_COUNT + j ra + nop + .set reorder +ENDFRAME(mips_get_timer) diff --git a/c/src/lib/libbsp/mips/hurricane/clock/clock.h b/c/src/lib/libbsp/mips/hurricane/clock/clock.h new file mode 100644 index 0000000000..49f97db29f --- /dev/null +++ b/c/src/lib/libbsp/mips/hurricane/clock/clock.h @@ -0,0 +1,25 @@ +/* clock.s + * + * This file contains the assembly code for the Hurricane BSP clock driver. + * + * Author: Craig Lebakken <craigl@transition.com> + * + * COPYRIGHT (c) 1996 by Transition Networks Inc. + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Transition Networks not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * Transition Networks makes no representations about the suitability + * of this software for any purpose. + * + * clock.h,v 1.2 1996/09/11 19:14:52 joel Exp + */ + +/* @(#)clock.h 08/20/96 1.2 */ + +extern void mips_set_timer( uint32_t timer_clock_interval ); |