summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/sh/sh7032
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-18 21:22:58 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-18 21:22:58 +0000
commit4a238002e71ec018723229f8669363a5ffb7302e (patch)
treefc5a57faf9a30225bd1f3fa2d713b85815cb77ef /c/src/lib/libcpu/sh/sh7032
parent5503d75c00d94d2e0b7677d137c38a44e19d725e (diff)
downloadrtems-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.in2
-rw-r--r--c/src/lib/libcpu/sh/sh7032/clock/Makefile.in2
-rw-r--r--c/src/lib/libcpu/sh/sh7032/clock/ckinit.c94
-rw-r--r--c/src/lib/libcpu/sh/sh7032/console/Makefile.in71
-rw-r--r--c/src/lib/libcpu/sh/sh7032/console/console.c153
-rw-r--r--c/src/lib/libcpu/sh/sh7032/include/Makefile.in4
-rw-r--r--c/src/lib/libcpu/sh/sh7032/include/ioqueue.h77
-rw-r--r--c/src/lib/libcpu/sh/sh7032/include/sci.h6
-rw-r--r--c/src/lib/libcpu/sh/sh7032/include/sh7_pfc.h2
-rw-r--r--c/src/lib/libcpu/sh/sh7032/include/sh7_sci.h2
-rw-r--r--c/src/lib/libcpu/sh/sh7032/score/cpu_asm.c13
-rw-r--r--c/src/lib/libcpu/sh/sh7032/score/ispsh7032.c8
-rw-r--r--c/src/lib/libcpu/sh/sh7032/timer/Makefile.in2
-rw-r--r--c/src/lib/libcpu/sh/sh7032/timer/timer.c40
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) ;
}
}