diff options
Diffstat (limited to 'tools/cpu')
-rw-r--r-- | tools/cpu/sh/AUTHORS | 3 | ||||
-rw-r--r-- | tools/cpu/sh/COPYING | 19 | ||||
-rw-r--r-- | tools/cpu/sh/Makefile.in | 62 | ||||
-rw-r--r-- | tools/cpu/sh/TODO | 13 | ||||
-rw-r--r-- | tools/cpu/sh/sci.c | 157 | ||||
-rw-r--r-- | tools/cpu/sh/sci.h | 11 | ||||
-rw-r--r-- | tools/cpu/sh/shgen.c | 65 |
7 files changed, 330 insertions, 0 deletions
diff --git a/tools/cpu/sh/AUTHORS b/tools/cpu/sh/AUTHORS new file mode 100644 index 0000000000..225c2fa974 --- /dev/null +++ b/tools/cpu/sh/AUTHORS @@ -0,0 +1,3 @@ +Ralf Corsepius (corsepiu@faw.uni-ulm.de) + * Initial implementation + * generator for sci bitrate table diff --git a/tools/cpu/sh/COPYING b/tools/cpu/sh/COPYING new file mode 100644 index 0000000000..805cdd8ffc --- /dev/null +++ b/tools/cpu/sh/COPYING @@ -0,0 +1,19 @@ + + shgen - code generator for the Hitachi SH microcontroller family + + Copyright (C) 1998 Ralf Corsepius (corsepiu@faw.uni-ulm.de) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + diff --git a/tools/cpu/sh/Makefile.in b/tools/cpu/sh/Makefile.in new file mode 100644 index 0000000000..c35743adea --- /dev/null +++ b/tools/cpu/sh/Makefile.in @@ -0,0 +1,62 @@ +# +# $Id$ +# +# FIXME: $ARCH shouldn't be used inside of host-tools. +# + +@SET_MAKE@ +srcdir = @srcdir@ +VPATH = @srcdir@ +RTEMS_ROOT = @top_srcdir@ +PROJECT_ROOT = @PROJECT_ROOT@ + +# we use the host compiler here +USE_HOST_COMPILER=yes + +# C source names, if any, go here -- minus the .c +C_PIECES=shgen sci +C_FILES=$(C_PIECES:%=%.c) +C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) + +H_FILES=sci.h + +SRCS=$(C_FILES) $(H_FILES) +OBJS=$(C_O_FILES) + +PGMS=${ARCH}/shgen@EXEEXT@ + +include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg +include $(RTEMS_ROOT)/make/leaf.cfg + +# +# Add local stuff here using += +# + +DEFINES += -Wall +CPPFLAGS += -I. +CFLAGS += + +LD_PATHS += +LD_LIBS += -lm +LDFLAGS += + +# +# Add your list of files to delete here. +# + +CLEAN_ADDITIONS += +CLOBBER_ADDITIONS += + +DESTDIR=${PROJECT_RELEASE}/bin + +all: $(ARCH) $(PGMS) + +${PGMS}: $(OBJS) $(LINK_FILES) + $(make-exe) + +$(DESTDIR): + $(BSDINSTALL) $(INSTDIRFLAGS) $@ + +# Install the program +install: $(DESTDIR) $(PGMS) + $(BSDINSTALL) $(INSTBINFLAGS) ${PGMS} $(DESTDIR) diff --git a/tools/cpu/sh/TODO b/tools/cpu/sh/TODO new file mode 100644 index 0000000000..bcdd1bf6df --- /dev/null +++ b/tools/cpu/sh/TODO @@ -0,0 +1,13 @@ +* Add support for more drivers to shgen !!!! + +* shgen relies on having a gnu-compatible getopt, which should be + available on all hosts using gcc/egcs/binutils. + Using other getopt-variants may produce faulty results or shgen may also + refuse to compile. Probably the easiest solution to this problem would be + to integrate libiberty into rtems. + +* shgen uses floating point mathematics. Therefore Makefile.in contains a + reference to libm. In case the host doesn't have its floating point + support in libm, shgen will fail to compile. If we should ever meet such + a host, checks for floating point libraries have to be added to rtems' + autoconf support. diff --git a/tools/cpu/sh/sci.c b/tools/cpu/sh/sci.c new file mode 100644 index 0000000000..58be0e68bf --- /dev/null +++ b/tools/cpu/sh/sci.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 1998 Ralf Corsepius (corsepiu@faw.uni-ulm.de) + * + * See the file COPYING for copyright notice. + */ + +#include <math.h> +#include <stdio.h> +#include <stdlib.h> + +#include "sci.h" + +/* + n .. baudrate generator source 0,1,2,3 + + N .. BRR setting (0..255) + + Phi .. processor baud rate + + B .. bitrate + */ + +typedef struct sci_tab { + unsigned int B ; + unsigned int n ; + int N ; + double err ; + } sci_tab_t ; + +static unsigned int bitrate [] = { + 50, + 75, + 110, + 134, + 150, + 200, + 300, + 600, + 1200, + 1800, + 2400, + 4800, + 9600, + 19200, + 38400, + 57600, + 115200, + 230400, + 460800 +}; + +static sci_tab_t test_array[4] ; + +static void Compute( + unsigned int n, + unsigned int B, + unsigned int Phi, + struct sci_tab *entry ) +{ + int a = ( 32 << ( 2 * n ) ) * B ; + + entry->n = n ; + entry->B = B ; + entry->N = rint( ( Phi / a ) - 1.0 ) ; + + if ( ( entry->N > 0 ) && ( entry->N < 256 ) ) + entry->err = + ( ( Phi / ( (entry->N + 1) * a ) - 1.0 ) * 100.0 ); + else + entry->err = 100.0 ; +} + +static sci_tab_t *SelectN( + unsigned int B, + double Phi ) +{ + unsigned int i ; + struct sci_tab* best = NULL ; + + for ( i = 0 ; i < 4 ; i++ ) + { + double err ; + + Compute( i, B, Phi, &test_array[i] ); + err = fabs( test_array[i].err ); + + if ( best ) + { + if ( err < fabs( best->err ) ) + best = &test_array[i] ; + } + else + best = &test_array[i] ; + } + + return best ; +} + +int shgen_gensci( + FILE *file, + double Phi ) /* Processor frequency [Hz] */ +{ + unsigned int i ; + + fprintf( file, + "/*\n * Bitrate table for the serial devices (sci) of the SH at %.3f MHz\n" + " */\n\n", Phi / 1000000.0 ); + fprintf( file, + "/*\n" + " * n .. SMR bits 0,1 : baud rate generator clock source\n" + " * N .. BRR bits 0..7: setting for baud rate generator\n" + " * error .. percentual error to nominal bitrate\n" + " * Hitachi's HW manual recommends bitrates with an error less than 1%%\n" + " * We experienced values less than 2%% to be stable\n" + " */\n\n" ); + fprintf( file, "#include <termios.h>\n\n" ); + fprintf( file, + "static struct sci_bitrate_t {\n" + " unsigned char n ;\n" + " unsigned char N ;\n" + "} _sci_bitrates[] = {\n" + "/* n N error */\n" ); + + for ( i = 0 ; i < sizeof(bitrate)/sizeof(int) ; i++ ) + { + struct sci_tab* best = SelectN( bitrate[i], Phi ); + + if ( i > 0 ) + fprintf( file, ",\n" ); + fprintf( file, " { %1d, %3d } /* %+7.2f%% ; B%d */", + best->n, + best->N, + best->err, + best->B ); + } + + fprintf( file, "\n};\n\n" ); + + fprintf( file, + "int _sci_get_brparms( \n" + " tcflag_t cflag,\n" + " unsigned char *smr,\n" + " unsigned char *brr )\n" + "{\n" + " unsigned int offset ;\n\n" + " offset = ( cflag & ( CBAUD & ~CBAUDEX ) )\n" + " + ( ( cflag & CBAUDEX ) ? B38400 : 0 );\n" + " if ( offset == 0 ) return -1 ;\n" + " offset-- ;\n\n" + " *smr &= ~0x03;\n" + " *smr |= _sci_bitrates[offset].n;\n" + " *brr = _sci_bitrates[offset].N;\n\n" + " return 0;\n" + "}\n" ); + + return 0 ; +} diff --git a/tools/cpu/sh/sci.h b/tools/cpu/sh/sci.h new file mode 100644 index 0000000000..b55bbfb670 --- /dev/null +++ b/tools/cpu/sh/sci.h @@ -0,0 +1,11 @@ +#ifndef _shgen_sci_h +#define _shgen_sci_h + +#include <stdio.h> + +extern int shgen_gensci( + FILE *file, + double Phi /* Processor frequency [Hz] */ + ); + +#endif diff --git a/tools/cpu/sh/shgen.c b/tools/cpu/sh/shgen.c new file mode 100644 index 0000000000..3fa6ae9b75 --- /dev/null +++ b/tools/cpu/sh/shgen.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1998 Ralf Corsepius (corsepiu@faw.uni-ulm.de) + * + * See the file COPYING for copyright notice. + */ + +#include <stdio.h> +#include <string.h> /* strcmp, strerror */ +#include <errno.h> +#include <getopt.h> + +#include "sci.h" + +static void usage( char *prog ) +{ + fprintf( stderr, "usage: %s [options] driver\n", prog ); + fprintf( stderr, "options:\n" ); + fprintf( stderr, "\t-M Phi .. processor frequency [MHz] default: 20\n" ); + fprintf( stderr, "driver:\n" ); + fprintf( stderr, "\tsci .. bitrate table for sci\n" ); + exit ( 1 ); +} + +static void shgen_header( FILE *file ) +{ + fprintf( file, + "/*\n * DO NOT EDIT - this file is automatically generated by shgen\n" ); + fprintf( file, + " * Copyright (c) 1998, Ralf Corsepius (corsepiu@faw.uni-ulm.de)\n */\n" ); + fprintf( file, + "\n/* This file is not copyrighted */\n\n" ); +} + +int main( int argc, char *argv[] ) +{ + double Phi = 20.0 ; + + while ( ( optopt = getopt( argc, argv, "M:" ) ) > 0 ) + { + switch ( optopt ) + { + case 'M' : + sscanf( optarg, "%lf", &Phi ); + Phi = Phi * 1000000.0; + break ; + default : + usage( argv[0] ); + break ; + } + } + + if ( argc - optind != 1 ) + usage( argv[0] ); + + shgen_header( stdout ); + + if ( strcmp( argv[optind], "sci" ) == 0 ) + { + shgen_gensci( stdout, Phi ); + } + else + usage( argv[0] ); + + return 0 ; +} |