From c2a4084fe4ff0f8bbf74d1bee51f92be66b09e0a Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 12 Jan 2001 15:00:54 +0000 Subject: 2001-01-12 Eric Norum * README, clock/Makefile.am, clock/ckinit.c, clock/clock.c: Clock driver updated to use shell driver mechanism. * clock/ckinit.c: Removed. * clock/clock.c: New file. --- c/src/lib/libbsp/m68k/gen68360/ChangeLog | 7 + c/src/lib/libbsp/m68k/gen68360/README | 2 +- c/src/lib/libbsp/m68k/gen68360/clock/Makefile.am | 4 +- c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c | 192 ----------------------- c/src/lib/libbsp/m68k/gen68360/clock/clock.c | 102 ++++++++++++ 5 files changed, 112 insertions(+), 195 deletions(-) delete mode 100644 c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c create mode 100644 c/src/lib/libbsp/m68k/gen68360/clock/clock.c (limited to 'c/src/lib/libbsp/m68k') diff --git a/c/src/lib/libbsp/m68k/gen68360/ChangeLog b/c/src/lib/libbsp/m68k/gen68360/ChangeLog index 5c635b521e..4087335f4a 100644 --- a/c/src/lib/libbsp/m68k/gen68360/ChangeLog +++ b/c/src/lib/libbsp/m68k/gen68360/ChangeLog @@ -1,3 +1,10 @@ +2001-01-12 Eric Norum + + * README, clock/Makefile.am, clock/ckinit.c, clock/clock.c: + Clock driver updated to use shell driver mechanism. + * clock/ckinit.c: Removed. + * clock/clock.c: New file. + 2000-12-19 Joel Sherrill * Makefile.am: Removed unneeded blank line. diff --git a/c/src/lib/libbsp/m68k/gen68360/README b/c/src/lib/libbsp/m68k/gen68360/README index 802e518e70..d91aa2d37d 100644 --- a/c/src/lib/libbsp/m68k/gen68360/README +++ b/c/src/lib/libbsp/m68k/gen68360/README @@ -302,7 +302,7 @@ The board support package has been tested with: Interrupt Notes =============== -ckinit.c: +clock.c: Occasional network lockups have been noted when the PIT has a higher interrupt request level than the CPM. The SCC1 bit in the CISR is set even though the SCC1 interrupt handler is not active. This blocks diff --git a/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.am b/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.am index bb7f99ff8d..30b2bfbe74 100644 --- a/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.am +++ b/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.am @@ -6,7 +6,7 @@ AUTOMAKE_OPTIONS = foreign 1.4 PGM = $(ARCH)/clock.rel -C_FILES = ckinit.c +C_FILES = clock.c C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) OBJS = $(C_O_FILES) @@ -28,6 +28,6 @@ all-local: $(ARCH) $(OBJS) $(PGM) .PRECIOUS: $(PGM) -EXTRA_DIST = ckinit.c +EXTRA_DIST = clock.c include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c b/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c deleted file mode 100644 index 8fd64ff918..0000000000 --- a/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - * This routine initializes the MC68360 Periodic Interval Timer - * - * The PIT has rather poor resolution, but it is easy to set up - * and requires no housekeeping once it is going. - * - * Based on the `gen68302' board support package, and covered by the - * original distribution terms. - * - * W. Eric Norum - * Saskatchewan Accelerator Laboratory - * University of Saskatchewan - * Saskatoon, Saskatchewan, CANADA - * eric@skatter.usask.ca - * - * $Id$ - */ - -/* - * Input parameters: NONE - * - * Output parameters: NONE - * - * 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. - */ - -#include /* for atexit() */ -#include -#include -#include "m68360.h" - -#define CLOCK_VECTOR 120 -#define CLOCK_IRQ_LEVEL 4 - -/* - * Clock_driver_ticks is a monotonically increasing counter of the - * number of clock ticks since the driver was initialized. - */ -volatile rtems_unsigned32 Clock_driver_ticks; - -/* - * These are set by clock driver during its init - */ - -rtems_device_major_number rtems_clock_major = ~0; -rtems_device_minor_number rtems_clock_minor; - -char M360DefaultWatchdogFeeder = 1; - -/* - * RTEMS and hardware have different notions of clock rate. - */ -static unsigned long rtems_nsec_per_tick; -static unsigned long pit_nsec_per_tick; - -/* - * Periodic interval timer interrupt handler - */ - -rtems_isr -Clock_isr (rtems_vector_number vector) -{ - static unsigned long nsec; - - /* - * See if it's really time for a `tick' - */ - nsec += pit_nsec_per_tick; - if (nsec >= rtems_nsec_per_tick) { - nsec -= rtems_nsec_per_tick; - - /* - * Perform a dummy read of DPRAM. - * This works around a bug in Rev. B of the 68360 - */ - m360.dpram0[0]; - - /* - * Feed the watchdog - * Application code can override this by - * setting M360DefaultWatchdogFeeder to zero. - */ - if (M360DefaultWatchdogFeeder) { - m360.swsr = 0x55; - m360.swsr = 0xAA; - } - - /* - * Announce the clock tick - */ - Clock_driver_ticks++; - rtems_clock_tick(); - } -} - -void -Clock_exit (void) -{ - /* - * Turn off periodic interval timer - */ - m360.pitr &= ~0xFF; -} - -static void -Install_clock (rtems_isr_entry clock_isr) -{ - int divisor; - extern int m360_clock_rate; /* This should be somewhere in a config file */ - unsigned long nsec_per_chip_tick = 1000000000 / m360_clock_rate; - unsigned long nsec_per_pit_tick = 512 * nsec_per_chip_tick; - - Clock_driver_ticks = 0; - /* - * Choose periodic interval timer register value - * The rate at which the periodic interval timer - * can generate interrupts is almost certainly not - * the same as desired by the BSP configuration. - * Handle the difference by choosing the largest PIT - * interval which is less than or equal to the RTEMS - * interval and skipping some hardware interrupts. - * To reduce the jitter in the calls to RTEMS the - * hardware interrupt interval is never less than - * the maximum non-prescaled value from the PIT. - * - * For a 25 MHz external clock the basic clock rate is - * 40 nsec * 128 * 4 = 20.48 usec/tick - */ - - rtems_nsec_per_tick = BSP_Configuration.microseconds_per_tick * 1000; - divisor = rtems_nsec_per_tick / nsec_per_pit_tick; - if (divisor >= 256) { - divisor = 255; - } else if (divisor == 0) { - divisor = 1; - } - pit_nsec_per_tick = nsec_per_pit_tick * divisor; - m360.pitr &= ~0x1FF; - m360.picr = (CLOCK_IRQ_LEVEL << 8) | CLOCK_VECTOR; - set_vector (clock_isr, CLOCK_VECTOR, 1); - m360.pitr |= divisor; - atexit (Clock_exit); -} - -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 -) -{ - rtems_unsigned32 isrlevel; - rtems_libio_ioctl_args_t *args = pargp; - - if (args) { - /* - * 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 ); - (void) set_vector( args->buffer, CLOCK_VECTOR, 1 ); - rtems_interrupt_enable( isrlevel ); - } - } - return RTEMS_SUCCESSFUL; -} diff --git a/c/src/lib/libbsp/m68k/gen68360/clock/clock.c b/c/src/lib/libbsp/m68k/gen68360/clock/clock.c new file mode 100644 index 0000000000..1d2663ffcf --- /dev/null +++ b/c/src/lib/libbsp/m68k/gen68360/clock/clock.c @@ -0,0 +1,102 @@ +/* + * This routine initializes the MC68360 Periodic Interval Timer + * + * The PIT has rather poor resolution, but it is easy to set up + * and requires no housekeeping once it is going. + * + * W. Eric Norum + * Saskatchewan Accelerator Laboratory + * University of Saskatchewan + * Saskatoon, Saskatchewan, CANADA + * eric@skatter.usask.ca + * + * $Id$ + */ + +#include +#include +#include "m68360.h" + +#define CLOCK_VECTOR 120 +#define CLOCK_IRQ_LEVEL 4 + +char M360DefaultWatchdogFeeder = 1; + +/* + * RTEMS and hardware have different notions of clock rate. + */ +static unsigned long rtems_nsec_per_tick; +static unsigned long pit_nsec_per_tick; +static unsigned long nsec; + +/* + * Periodic interval timer interrupt handler + * See if it's really time for a `tick' + * Perform a dummy read of DPRAM (work around bug in Rev. B of the 68360). + * Feed the watchdog + * Application code can override this by + * setting M360DefaultWatchdogFeeder to zero. + */ +#define Clock_driver_support_at_tick() \ + do { \ + nsec += pit_nsec_per_tick; \ + if (nsec >= rtems_nsec_per_tick) \ + return; \ + nsec -= rtems_nsec_per_tick; \ + m360.dpram0[0]; \ + if (M360DefaultWatchdogFeeder) { \ + m360.swsr = 0x55; \ + m360.swsr = 0xAA; \ + } \ + } while (0) \ + +/* + * Attach clock interrupt handler + */ +#define Clock_driver_support_install_isr( _new, _old ) \ + do { \ + _old = (rtems_isr_entry)set_vector(_new, CLOCK_VECTOR, 1); \ + } while(0) + +/* + * Turn off the clock + */ +#define Clock_driver_support_shutdown_hardware() \ + do { \ + m360.pitr &= ~0xFF; \ + } while(0) + +/* + * Set up the clock hardware + * The rate at which the periodic interval timer + * can generate interrupts is almost certainly not + * the same as desired by the BSP configuration. + * Handle the difference by choosing the largest PIT + * interval which is less than or equal to the RTEMS + * interval and skipping some hardware interrupts. + * To reduce the jitter in the calls to RTEMS the + * hardware interrupt interval is never greater than + * the maximum non-prescaled value from the PIT. + * + * For a 25 MHz external clock the basic clock rate is + * 40 nsec * 128 * 4 = 20.48 usec/tick + */ +#define Clock_driver_support_initialize_hardware() \ + do { \ + unsigned int divisor; \ + extern int m360_clock_rate; \ + unsigned long nsec_per_chip_tick = 1000000000 / m360_clock_rate; \ + unsigned long nsec_per_pit_tick = 512 * nsec_per_chip_tick; \ + rtems_nsec_per_tick = BSP_Configuration.microseconds_per_tick * 1000; \ + divisor = rtems_nsec_per_tick / nsec_per_pit_tick; \ + if (divisor > 255) \ + divisor = 255; \ + else if (divisor == 0) \ + divisor = 1; \ + pit_nsec_per_tick = nsec_per_pit_tick * divisor; \ + m360.pitr &= ~0x1FF; \ + m360.picr = (CLOCK_IRQ_LEVEL << 8) | CLOCK_VECTOR; \ + m360.pitr |= divisor; \ + } while (0) + +#include "../../../shared/clockdrv_shell.c" -- cgit v1.2.3