diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-18 21:22:58 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-18 21:22:58 +0000 |
commit | 4a238002e71ec018723229f8669363a5ffb7302e (patch) | |
tree | fc5a57faf9a30225bd1f3fa2d713b85815cb77ef /c/src/lib/libcpu/sh/sh7032 | |
parent | Corrected to include extra arguments for simulators on sparc (diff) | |
download | rtems-4a238002e71ec018723229f8669363a5ffb7302e.tar.bz2 |
Patch from "John M. Mills" <jmills@tga.com> with subsequent cleanup from
Ralf Corsepius <corsepiu@faw.uni-ulm.de> that adds initial Hitachi SH-2
support to RTEMS. Ralf's comments are:
Changes:
------
1. SH-Port:
* Many files renamed.
* CONSOLE_DEVNAME and MHZ defines removed from libcpu.
* console.c moved to libbsp/sh/shared, build in libbsp/sh/<BSP>/console
applying VPATH.
* CONSOLE_DEVNAME made BSP-specific, replacement is defined in bsp.h
* MHZ define replaced with HZ (extendent resolution) in custom/*.cfg
* -DHZ=HZ used in bspstart.c, only
* Makefile variable HZ used in bsp-dependent directories only.
2. SH1-Port
* clock-driver rewritten to provide better resolution for odd CPU
frequencies. This driver is only partially tested on hardware, ie.
sightly experimental, but I don't expect severe problems with it.
* Polling SCI-driver added. This driver is experimental and completly
untested yet. Therefore it is not yet used for the console (/dev/console
is still pointing to /dev/null, cf. gensh1/bsp.h).
* minor changes to the timer driver
* SH1 specific delay()/CPU_delay() now is implemented as a function
3. SH2-Port
* Merged
* IMO, the code is still in its infancy. Therefore I have interspersed
comments (FIXME) it for items which I think John should look after.
* sci and console drivers partially rewritten and extended (John, I hope
you don't mind).
* Copyright notices are not yet adapted
Diffstat (limited to 'c/src/lib/libcpu/sh/sh7032')
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/Makefile.in | 2 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/clock/Makefile.in | 2 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/clock/ckinit.c | 94 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/console/Makefile.in | 71 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/console/console.c | 153 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/include/Makefile.in | 4 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/include/ioqueue.h | 77 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/include/sci.h | 6 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h | 2 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h | 2 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c | 13 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c | 8 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/timer/Makefile.in | 2 | ||||
-rw-r--r-- | c/src/lib/libcpu/sh/sh7032/timer/timer.c | 40 |
14 files changed, 132 insertions, 344 deletions
diff --git a/c/src/lib/libcpu/sh/sh7032/Makefile.in b/c/src/lib/libcpu/sh/sh7032/Makefile.in index b91162bc3a..34e6494f8b 100644 --- a/c/src/lib/libcpu/sh/sh7032/Makefile.in +++ b/c/src/lib/libcpu/sh/sh7032/Makefile.in @@ -18,7 +18,7 @@ include $(RTEMS_ROOT)/make/directory.cfg INSTALL_CHANGE = @INSTALL_CHANGE@ -SUB_DIRS = include clock console timer null +SUB_DIRS = include clock timer null sci delay Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ diff --git a/c/src/lib/libcpu/sh/sh7032/clock/Makefile.in b/c/src/lib/libcpu/sh/sh7032/clock/Makefile.in index c9bd2ac92d..5617ae594e 100644 --- a/c/src/lib/libcpu/sh/sh7032/clock/Makefile.in +++ b/c/src/lib/libcpu/sh/sh7032/clock/Makefile.in @@ -40,7 +40,7 @@ INSTALL_CHANGE = @INSTALL_CHANGE@ # DEFINES += -CPPFLAGS += -DMHZ=$(MHZ) +CPPFLAGS += CFLAGS += $(CFLAGS_OS_V) LD_PATHS += diff --git a/c/src/lib/libcpu/sh/sh7032/clock/ckinit.c b/c/src/lib/libcpu/sh/sh7032/clock/ckinit.c index 7aef64ed99..a8acc1ca20 100644 --- a/c/src/lib/libcpu/sh/sh7032/clock/ckinit.c +++ b/c/src/lib/libcpu/sh/sh7032/clock/ckinit.c @@ -29,19 +29,30 @@ #include <rtems/libio.h> #include <rtems/score/sh_io.h> #include <rtems/score/sh.h> -#include <rtems/score/cpu_isps.h> -#include <rtems/score/iosh7030.h> - -#define _ITU_COUNTER0_MICROSECOND (MHZ/4) +#include <rtems/score/ispsh7032.h> +#include <rtems/score/iosh7032.h> #ifndef CLOCKPRIO #define CLOCKPRIO 10 #endif +#define I_CLK_PHI_1 0 +#define I_CLK_PHI_2 1 +#define I_CLK_PHI_4 2 +#define I_CLK_PHI_8 3 + +/* + * Set I_CLK_PHI to one of the I_CLK_PHI_X values from above to choose + * a PHI/X clock rate. + */ + +#define I_CLK_PHI I_CLK_PHI_4 +#define CLOCK_SCALE (1<<I_CLK_PHI) + #define ITU0_STARTMASK 0xfe #define ITU0_SYNCMASK 0xfe #define ITU0_MODEMASK 0xfe -#define ITU0_TCRMASK 0x22 +#define ITU0_TCRMASK (0x20 | I_CLK_PHI) #define ITU_STAT_MASK 0xf8 #define ITU0_IRQMASK 0xfe #define ITU0_TIERMASK 0x01 @@ -49,6 +60,55 @@ #define ITU0_TIORVAL 0x08 /* + * clicks_per_tick := clicks_per_sec * usec_per_tick + * + * This is a very expensive function ;-) + * + * Below are two variants: + * 1. A variant applying integer arithmetics, only. + * 2. A variant applying floating point arithmetics + * + * The floating point variant pulls in the fmath routines when linking, + * resulting in slightly larger executables for applications that do not + * apply fmath otherwise. However, the imath variant is significantly slower + * than the fmath variant and more complex. + * + * Assuming that most applications will not use fmath, but are critical + * in memory size constraints, we apply the integer variant. + * + * To the sake of simplicity, we might abandon one of both variants in + * future. + */ +static unsigned int sh_clicks_per_tick( + unsigned int clicks_per_sec, + unsigned int usec_per_tick ) +{ +#if 1 + unsigned int clicks_per_tick = 0 ; + + unsigned int b = clicks_per_sec ; + unsigned int c = 1000000 ; + unsigned int d = 1 ; + unsigned int a = ( ( b / c ) * usec_per_tick ) / d; + + clicks_per_tick += a ; + + while ( ( b %= c ) > 0 ) + { + c /= 10 ; + d *= 10 ; + a = ( ( b / c ) * usec_per_tick ) / d ; + clicks_per_tick += a ; + } + return clicks_per_tick ; +#else + double fclicks_per_tick = + ((double) clicks_per_sec * (double) usec_per_tick) / 1000000.0 ; + return (unsigned32) fclicks_per_tick ; +#endif +} + +/* * The interrupt vector number associated with the clock tick device * driver. */ @@ -100,7 +160,6 @@ rtems_isr Clock_isr( /* * 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 * @@ -137,13 +196,31 @@ void Install_clock( ) { unsigned8 temp8 = 0; + unsigned32 microseconds_per_tick ; + unsigned32 cclicks_per_tick ; + unsigned16 Clock_limit ; /* * Initialize the clock tick device driver variables */ Clock_driver_ticks = 0; - Clock_isrs_const = rtems_configuration_get_microseconds_per_tick() / 10000; + + if ( rtems_configuration_get_microseconds_per_tick() != 0 ) + microseconds_per_tick = rtems_configuration_get_microseconds_per_tick() ; + else + microseconds_per_tick = 10000 ; /* 10000 us */ + + /* clock clicks per tick */ + cclicks_per_tick = + sh_clicks_per_tick( + rtems_cpu_configuration_get_clicks_per_second() / CLOCK_SCALE, + microseconds_per_tick ); + + Clock_isrs_const = cclicks_per_tick >> 16 ; + if ( ( cclicks_per_tick | 0xffff ) > 0 ) + Clock_isrs_const++ ; + Clock_limit = cclicks_per_tick / Clock_isrs_const ; Clock_isrs = Clock_isrs_const; /* @@ -191,8 +268,7 @@ void Install_clock( rtems_fatal_error_occurred( RTEMS_NOT_CONFIGURED); /* set counter limits */ - write16( _ITU_COUNTER0_MICROSECOND * rtems_configuration_get_microseconds_per_tick(), - ITU_GRA0); + write16( Clock_limit, ITU_GRA0); /* start counter */ temp8 = read8( ITU_TSTR) |~ITU0_STARTMASK; diff --git a/c/src/lib/libcpu/sh/sh7032/console/Makefile.in b/c/src/lib/libcpu/sh/sh7032/console/Makefile.in deleted file mode 100644 index 33710ef51f..0000000000 --- a/c/src/lib/libcpu/sh/sh7032/console/Makefile.in +++ /dev/null @@ -1,71 +0,0 @@ -# -# $Id$ -# - -@SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -top_builddir = ../../.. -subdir = sh/sh7032/console - -RTEMS_ROOT = @RTEMS_ROOT@ -PROJECT_ROOT = @PROJECT_ROOT@ - -VPATH = @srcdir@ - -PGM = ${ARCH}/console.rel - -# C source names, if any, go here -- minus the .c -C_PIECES = console -C_FILES = $(C_PIECES:%=%.c) -C_O_FILES = $(C_PIECES:%=${ARCH}/%.o) - -H_FILES = - -# Assembly source names, if any, go here -- minus the .S -S_PIECES = -S_FILES = $(S_PIECES:%=%.S) -S_O_FILES = $(S_FILES:%.S=${ARCH}/%.o) - -SRCS = $(C_FILES) $(H_FILES) $(S_FILES) -OBJS = $(C_O_FILES) $(S_O_FILES) - -include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg -include $(RTEMS_ROOT)/make/leaf.cfg - -INSTALL_CHANGE = @INSTALL_CHANGE@ - -# -# (OPTIONAL) Add local stuff here using += -# - -DEFINES += -CPPFLAGS += -CFLAGS += - -LD_PATHS += -LD_LIBS += -LDFLAGS += - -# -# Add your list of files to delete here. The config files -# already know how to delete some stuff, so you may want -# to just run 'make clean' first to see what gets missed. -# 'make clobber' already includes 'make clean' -# - -CLEAN_ADDITIONS += -CLOBBER_ADDITIONS += - -${PGM}: ${SRCS} ${OBJS} - $(make-rel) - -all: ${ARCH} $(SRCS) $(PGM) - -# the .rel file built here will be put into libbsp.a by -# libbsp/sh/BSP/wrapup/Makefile -install: all - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status diff --git a/c/src/lib/libcpu/sh/sh7032/console/console.c b/c/src/lib/libcpu/sh/sh7032/console/console.c deleted file mode 100644 index 6c16adfa5f..0000000000 --- a/c/src/lib/libcpu/sh/sh7032/console/console.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * /dev/console for Hitachi SH 703X - * - * The SH doesn't have a designated console device. Therefore we "alias" - * another device as /dev/console and revector all calls to /dev/console - * to this device. - * - * This approach is similar to installing a sym-link from one device to - * another device. If rtems once will support sym-links for devices files, - * this implementation could be dropped. - * - * Author: Ralf Corsepius (corsepiu@faw.uni-ulm.de) - * - * COPYRIGHT (c) 1997-1998, FAW Ulm, Germany - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * - * COPYRIGHT (c) 1998. - * On-Line Applications Research Corporation (OAR). - * Copyright assigned to U.S. Government, 1994. - * - * 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$ - */ - -#include <bsp.h> -#include <rtems.h> -#include <rtems/libio.h> -#include <iosupp.h> - -#ifndef CPU_CONSOLE_DEVNAME -#error Missing CPU_CONSOLE_DEVNAME -#endif - -static rtems_driver_name_t *low_level_device_info = NULL ; - -/* console_initialize - * - * This routine initializes the console IO driver. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: - */ - -rtems_device_driver console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) -{ - rtems_device_driver status ; - - status = rtems_io_register_name( - "/dev/console", - major, - (rtems_device_minor_number) 0 - ); - - if (status != RTEMS_SUCCESSFUL) - rtems_fatal_error_occurred(status); - - status = rtems_io_lookup_name( CPU_CONSOLE_DEVNAME, - &low_level_device_info ); - if (status != RTEMS_SUCCESSFUL) - rtems_fatal_error_occurred(status); - - return RTEMS_SUCCESSFUL; -} - - -/* - * Open entry point - */ - -rtems_device_driver console_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_io_open( low_level_device_info->major, - low_level_device_info->minor, - arg ); -} - -/* - * Close entry point - */ - -rtems_device_driver console_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_io_close( low_level_device_info->major, - low_level_device_info->minor, - arg ); -} - -/* - * read bytes from the serial port. We only have stdin. - */ - -rtems_device_driver console_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_io_read( low_level_device_info->major, - low_level_device_info->minor, - arg ); -} - -/* - * write bytes to the serial port. Stdout and stderr are the same. - */ - -rtems_device_driver console_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_io_write( low_level_device_info->major, - low_level_device_info->minor, - arg ); -} - -/* - * IO Control entry point - */ - -rtems_device_driver console_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return rtems_io_control( low_level_device_info->major, - low_level_device_info->minor, - arg ); -} diff --git a/c/src/lib/libcpu/sh/sh7032/include/Makefile.in b/c/src/lib/libcpu/sh/sh7032/include/Makefile.in index 5f180b27f3..fb379f14eb 100644 --- a/c/src/lib/libcpu/sh/sh7032/include/Makefile.in +++ b/c/src/lib/libcpu/sh/sh7032/include/Makefile.in @@ -13,8 +13,8 @@ PROJECT_ROOT = @PROJECT_ROOT@ VPATH = @srcdir@ -H_FILES = $(srcdir)/ioqueue.h $(srcdir)/null.h $(srcdir)/sci.h \ - $(srcdir)/sh7_pfc.h $(srcdir)/sh7_sci.h +H_FILES = $(srcdir)/null.h $(srcdir)/sci.h $(srcdir)/sh7_pfc.h \ + $(srcdir)/sh7_sci.h SRCS = $(H_FILES) diff --git a/c/src/lib/libcpu/sh/sh7032/include/ioqueue.h b/c/src/lib/libcpu/sh/sh7032/include/ioqueue.h deleted file mode 100644 index 55020acfad..0000000000 --- a/c/src/lib/libcpu/sh/sh7032/include/ioqueue.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Defines for low level queue management - * - * Author: Ralf Corsepius (corsepiu@faw.uni-ulm.de) - * - * COPYRIGHT (c) 1997-1998, Ralf Corsepius, Germany - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * - * COPYRIGHT (c) 1998. - * On-Line Applications Research Corporation (OAR). - * Copyright assigned to U.S. Government, 1994. - * - * 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$ - * - */ - -#ifndef _io_queue_h -#define _io_queue_h - -#include <stdlib.h> /* size_t */ - -/* - * NOTE: size needs to be a power of 2 - */ -#define IO_QUEUE(type,size,name) \ -typedef struct { \ - volatile type queue[size] ; \ - volatile unsigned short tail ; \ - volatile unsigned short head ; \ -} name ; - -#define IO_QUEUE_FULL(queue, size) \ - ((queue)->tail == (((queue)->head+1) & ((size)-1))) - -#define IO_QUEUE_EMPTY(queue) \ - (((queue)->tail) == ((queue)->head)) - -#define IO_QUEUE_INIT(queue) \ - (queue)->tail = (queue)->head = 0 - -#define IO_QUEUE_ADD(queue,size) \ - (queue)->head = (((queue)->head + 1) & ((size)-1)) - -#define IO_QUEUE_SUB(queue,size) \ - (queue)->tail = (((queue)->tail + 1) & ((size)-1)) - -#define IO_QUEUE_PUT(_queue,item) \ -{ \ - size_t i; \ - unsigned char* dest = (unsigned char*) ((_queue)->queue[(_queue)->head]); \ - unsigned char* src = (unsigned char*) (item); \ - for( i = 0; i < sizeof(item); i++) \ - { \ - dest[i] = src[i]; \ - } \ -} - -#define IO_QUEUE_GET(_queue,item) \ -{\ - size_t i; \ - unsigned char *src = (unsigned char*) (_queue)->queue[(_queue)->tail]; \ - unsigned char *dest = (unsigned char*) (item); \ - for( i=0; i< sizeof(item); i++)\ - {\ - dest[i] = src[i]; \ - }\ -} - -#endif diff --git a/c/src/lib/libcpu/sh/sh7032/include/sci.h b/c/src/lib/libcpu/sh/sh7032/include/sci.h index d897003315..b2468400b8 100644 --- a/c/src/lib/libcpu/sh/sh7032/include/sci.h +++ b/c/src/lib/libcpu/sh/sh7032/include/sci.h @@ -78,12 +78,6 @@ extern rtems_device_driver sh_sci_control( void * ); -/* Internal error codes */ -#define SH_TTY_NO_ERROR 0x2000 -#define SH_TTY_FRAME_ERR 0x2001 -#define SH_TTY_PARITY_ERR 0x2002 -#define SH_TTY_OVERRUN_ERR 0x2003 - #ifdef __cplusplus } #endif diff --git a/c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h b/c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h index ba6580c5fd..6e12740340 100644 --- a/c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h +++ b/c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h @@ -27,7 +27,7 @@ #ifndef _sh7_pfc_h #define _sh7_pfc_h -#include <rtems/score/iosh7030.h> +#include <rtems/score/iosh7032.h> /* * Port B IO Register (PBIOR) diff --git a/c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h b/c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h index cb2cc03893..3bd01ecc8f 100644 --- a/c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h +++ b/c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h @@ -27,7 +27,7 @@ #ifndef _sh7_sci_h #define _sh7_sci_h -#include <rtems/score/iosh7030.h> +#include <rtems/score/iosh7032.h> /* * Serial mode register bits diff --git a/c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c b/c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c index 42764f6eb1..192c2f43d2 100644 --- a/c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c +++ b/c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c @@ -41,10 +41,17 @@ #include <rtems/score/cpu.h> #include <rtems/score/isr.h> #include <rtems/score/thread.h> -#include <rtems/score/cpu_isps.h> -#include <rtems/score/sh_io.h> #include <rtems/score/sh.h> -#include <rtems/score/iosh7030.h> + +#if defined(sh7032) +#include <rtems/score/ispsh7032.h> +#include <rtems/score/iosh7032.h> +#elif defined (sh7045) +#include <rtems/score/ispsh7045.h> +#include <rtems/score/iosh7045.h> +#endif + +#include <rtems/score/sh_io.h> /* from cpu_isps.c */ extern proc_ptr _Hardware_isr_Table[]; diff --git a/c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c b/c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c index 3ef3c32465..9fcc9badbf 100644 --- a/c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c +++ b/c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c @@ -30,10 +30,14 @@ #include <rtems/system.h> #include <rtems/score/shtypes.h> -#include <rtems/score/cpu_isps.h> +#include <rtems/score/ispsh7032.h> + +#if !defined(sh7032) +#error Wrong CPU MODEL +#endif /* - * This is a exception vector table + * This is an exception vector table * * It has the same structure like the actual vector table (vectab) */ diff --git a/c/src/lib/libcpu/sh/sh7032/timer/Makefile.in b/c/src/lib/libcpu/sh/sh7032/timer/Makefile.in index 735ef3961d..ce19bbb25c 100644 --- a/c/src/lib/libcpu/sh/sh7032/timer/Makefile.in +++ b/c/src/lib/libcpu/sh/sh7032/timer/Makefile.in @@ -40,7 +40,7 @@ INSTALL_CHANGE = @INSTALL_CHANGE@ # DEFINES += -CPPFLAGS += -DMHZ=$(MHZ) +CPPFLAGS += CFLAGS += LD_PATHS += diff --git a/c/src/lib/libcpu/sh/sh7032/timer/timer.c b/c/src/lib/libcpu/sh/sh7032/timer/timer.c index 03ffdd7e56..9dd57a4bb4 100644 --- a/c/src/lib/libcpu/sh/sh7032/timer/timer.c +++ b/c/src/lib/libcpu/sh/sh7032/timer/timer.c @@ -32,17 +32,26 @@ #include <rtems.h> #include <rtems/score/sh_io.h> -#include <rtems/score/iosh7030.h> +#include <rtems/score/ispsh7032.h> +#include <rtems/score/iosh7032.h> + +#define I_CLK_PHI_1 0 +#define I_CLK_PHI_2 1 +#define I_CLK_PHI_4 2 +#define I_CLK_PHI_8 3 /* - * We use a Phi/4 timer + * Set I_CLK_PHI to one of the I_CLK_PHI_X values from above to choose + * a PHI/X clock rate. */ -#define SCALE (MHZ/4) + +#define I_CLK_PHI I_CLK_PHI_4 +#define CLOCK_SCALE (1<<I_CLK_PHI) #define ITU1_STARTMASK 0xfd #define ITU1_SYNCMASK 0xfd #define ITU1_MODEMASK 0xfd -#define ITU1_TCRMASK 0x02 +#define ITU1_TCRMASK (0x00 | I_CLK_PHI) #define ITU1_TIORMASK 0x88 #define ITU1_STAT_MASK 0xf8 #define ITU1_TIERMASK 0xfc @@ -52,7 +61,7 @@ #define ITU1_PRIO 15 #endif -#define ITU1_VECTOR 86 +#define ITU1_VECTOR OVI1_ISP_V rtems_isr timerisr(); @@ -60,6 +69,8 @@ static rtems_unsigned32 Timer_interrupts; rtems_boolean Timer_driver_Find_average_overhead; +static rtems_unsigned32 Timer_HZ ; + void Timer_initialize( void ) { rtems_unsigned8 temp8; @@ -67,6 +78,8 @@ void Timer_initialize( void ) rtems_unsigned32 level; rtems_isr *ignored; + Timer_HZ = rtems_cpu_configuration_get_clicks_per_second() / CLOCK_SCALE ; + /* * Timer has never overflowed. This may not be necessary on some * implemenations of timer but .... @@ -93,12 +106,7 @@ void Timer_initialize( void ) temp8 = read8( ITU_TMDR) & ITU1_MODEMASK; write8( temp8, ITU_TMDR); - /* x0000000 - * |||||+++--- Internal Clock - * |||++------ Count on rising edge - * |++-------- disable TCNT clear - * +---------- don`t care - */ + /* Use a Phi/X counter */ write8( ITU1_TCRMASK, ITU_TCR1); /* gra and grb are not used */ @@ -142,14 +150,14 @@ void Timer_initialize( void ) int Read_timer( void ) { - rtems_unsigned32 clicks; + rtems_unsigned32 cclicks; rtems_unsigned32 total ; /* * Read the timer and see how many clicks it has been since we started. */ - clicks = read16( ITU_TCNT1); /* XXX: read some HW here */ + cclicks = read16( ITU_TCNT1); /* XXX: read some HW here */ /* * Total is calculated by taking into account the number of timer overflow @@ -157,10 +165,10 @@ int Read_timer( void ) * interrupts. */ - total = clicks + Timer_interrupts * 65536 ; + total = cclicks + Timer_interrupts * 65536 ; if ( Timer_driver_Find_average_overhead ) - return total / SCALE; /* in XXX microsecond units */ + return total / CLOCK_SCALE; /* in XXX microsecond units */ else { if ( total < LEAST_VALID ) @@ -168,7 +176,7 @@ int Read_timer( void ) /* * Somehow convert total into microseconds */ - return (total / SCALE - AVG_OVERHEAD) ; + return (total / CLOCK_SCALE - AVG_OVERHEAD) ; } } |