From 875fbdbb49cae497c654c9f9f27d97de78225b30 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 22 Nov 1999 13:48:10 +0000 Subject: Added files missed by previous merger of SH-2 port. --- c/src/lib/libbsp/sh/gensh1/console/Makefile.in | 71 +++++ c/src/lib/libcpu/sh/sh7032/delay/Makefile.in | 70 +++++ c/src/lib/libcpu/sh/sh7032/delay/delay.c | 53 ++++ c/src/lib/libcpu/sh/sh7032/sci/Makefile.in | 71 +++++ c/src/lib/libcpu/sh/sh7032/sci/sci.c | 359 +++++++++++++++++++++++++ 5 files changed, 624 insertions(+) create mode 100644 c/src/lib/libbsp/sh/gensh1/console/Makefile.in create mode 100644 c/src/lib/libcpu/sh/sh7032/delay/Makefile.in create mode 100644 c/src/lib/libcpu/sh/sh7032/delay/delay.c create mode 100644 c/src/lib/libcpu/sh/sh7032/sci/Makefile.in create mode 100644 c/src/lib/libcpu/sh/sh7032/sci/sci.c (limited to 'c/src') diff --git a/c/src/lib/libbsp/sh/gensh1/console/Makefile.in b/c/src/lib/libbsp/sh/gensh1/console/Makefile.in new file mode 100644 index 0000000000..9161cf8526 --- /dev/null +++ b/c/src/lib/libbsp/sh/gensh1/console/Makefile.in @@ -0,0 +1,71 @@ +## +## $Id$ +## + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +subdir = sh/gensh1/console + +RTEMS_ROOT = @RTEMS_ROOT@ +PROJECT_ROOT = @PROJECT_ROOT@ + +VPATH = @srcdir@:@top_srcdir@/sh/shared + +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 +# ../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/delay/Makefile.in b/c/src/lib/libcpu/sh/sh7032/delay/Makefile.in new file mode 100644 index 0000000000..740015b9f7 --- /dev/null +++ b/c/src/lib/libcpu/sh/sh7032/delay/Makefile.in @@ -0,0 +1,70 @@ +# +# $Id$ +# + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +subdir = sh/sh7032/delay + +RTEMS_ROOT = @RTEMS_ROOT@ +PROJECT_ROOT = @PROJECT_ROOT@ + +VPATH = @srcdir@ + +PGM = ${ARCH}/delay.rel + +# C source names, if any, go here -- minus the .c +C_PIECES = delay +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 = $(DOCS) $(C_FILES) $(H_FILES) +OBJS = $(C_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 ../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/delay/delay.c b/c/src/lib/libcpu/sh/sh7032/delay/delay.c new file mode 100644 index 0000000000..83f48df853 --- /dev/null +++ b/c/src/lib/libcpu/sh/sh7032/delay/delay.c @@ -0,0 +1,53 @@ +/* + * This routine is a simple spin delay + * + * Author: Ralf Corsepius (corsepiu@faw.uni-ulm.de) + * + * COPYRIGHT (c) 1999, Ralf Corsepius, 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) 1989-1999. + * 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 + +/* + * Simple spin delay in microsecond units for device drivers. + * This is very dependent on the clock speed of the target. + * + * Since we don't have a real time clock, this is a very rough + * approximation, assuming that each cycle of the delay loop takes + * approx. 4 machine cycles. + * + * e.g.: clicks_per_second = 20MHz + * => 5e-8 secs per instruction + * => 4 * 5e-8 secs per delay loop + */ + +void CPU_delay( unsigned32 microseconds ) +{ + register unsigned32 clicks_per_usec = + rtems_cpu_configuration_get_clicks_per_second() / 1000000 ; + register unsigned32 _delay = + (microseconds) * (clicks_per_usec); + asm volatile ( +"0: add #-4,%0\n + nop\n + cmp/pl %0\n + bt 0b + nop" + :: "r" (_delay) ); +} diff --git a/c/src/lib/libcpu/sh/sh7032/sci/Makefile.in b/c/src/lib/libcpu/sh/sh7032/sci/Makefile.in new file mode 100644 index 0000000000..2548c0b478 --- /dev/null +++ b/c/src/lib/libcpu/sh/sh7032/sci/Makefile.in @@ -0,0 +1,71 @@ +## +## $Id$ +## + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +subdir = sh/sh7045/sci + +RTEMS_ROOT = @RTEMS_ROOT@ +PROJECT_ROOT = @PROJECT_ROOT@ + +VPATH = @srcdir@ + +PGM = ${ARCH}/sci.rel + +# C source names, if any, go here -- minus the .c +C_PIECES = sci +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/sci/sci.c b/c/src/lib/libcpu/sh/sh7032/sci/sci.c new file mode 100644 index 0000000000..b194e446d7 --- /dev/null +++ b/c/src/lib/libcpu/sh/sh7032/sci/sci.c @@ -0,0 +1,359 @@ +/* + * /dev/sci[0|1] for Hitachi SH 703X + * + * Author: Ralf Corsepius (corsepiu@faw.uni-ulm.de) + * + * COPYRIGHT (c) 1997-1999, Ralf Corsepius, 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 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * NOTE: Some SH variants have 3 sci devices + */ + +#define SCI_MINOR_DEVICES 2 + +#define SH_SCI_BASE_0 SCI0_SMR +#define SH_SCI_BASE_1 SCI1_SMR + +struct scidev_t { + char * name ; + unsigned32 addr ; + rtems_device_minor_number minor ; + unsigned short opened ; + tcflag_t cflags ; +} sci_device[SCI_MINOR_DEVICES] = +{ + { "/dev/sci0", SH_SCI_BASE_0, 0, 0, B9600 | CS8 }, + { "/dev/sci1", SH_SCI_BASE_1, 1, 0, B9600 | CS8 } +} ; + +/* imported from scitab.rel */ +extern int _sci_get_brparms( + tcflag_t cflag, + unsigned char *smr, + unsigned char *brr ); + +/* Translate termios' tcflag_t into sci settings */ +static int _sci_set_cflags( + struct scidev_t *sci_dev, + tcflag_t c_cflag ) +{ + unsigned8 smr ; + unsigned8 brr ; + + if ( c_cflag & CBAUD ) + { + if ( _sci_get_brparms( c_cflag, &smr, &brr ) != 0 ) + return -1 ; + } + + if ( c_cflag & CSIZE ) + { + if ( c_cflag & CS8 ) + smr &= ~SCI_SEVEN_BIT_DATA; + else if ( c_cflag & CS7 ) + smr |= SCI_SEVEN_BIT_DATA; + else + return -1 ; + } + + if ( c_cflag & CSTOPB ) + smr |= SCI_STOP_BITS_2; + else + smr &= ~SCI_STOP_BITS_2; + + if ( c_cflag & PARENB ) + smr |= SCI_PARITY_ON ; + else + smr &= ~SCI_PARITY_ON ; + + if ( c_cflag & PARODD ) + smr |= SCI_ODD_PARITY ; + else + smr &= ~SCI_ODD_PARITY; + + write8( smr, sci_dev->addr + SCI_SMR ); + write8( brr, sci_dev->addr + SCI_BRR ); + + return 0 ; +} + +static void _sci_init( + rtems_device_minor_number minor ) +{ + unsigned16 temp16 ; + + /* Pin function controller initialisation for asynchronous mode */ + if( minor == 0) + { + temp16 = read16( PFC_PBCR1); + temp16 &= ~( PB8MD | PB9MD ); + temp16 |= (PB_TXD0 | PB_RXD0); + write16( temp16, PFC_PBCR1); + } + else + { + temp16 = read16( PFC_PBCR1); + temp16 &= ~( PB10MD | PB11MD); + temp16 |= (PB_TXD1 | PB_RXD1); + write16( temp16, PFC_PBCR1); + } + + /* disable sck-pin */ + if( minor == 0) + { + temp16 = read16( PFC_PBCR1); + temp16 &= ~(PB12MD); + write16( temp16, PFC_PBCR1); + } + else + { + temp16 = read16( PFC_PBCR1); + temp16 &= ~(PB13MD); + write16( temp16, PFC_PBCR1); + } +} + +static void _sci_tx_polled( + int minor, + const char buf ) +{ + struct scidev_t *scidev = &sci_device[minor] ; + signed8 ssr ; + + while ( !inb((scidev->addr + SCI_SSR) & SCI_TDRE )) + ; + write8(buf,scidev->addr+SCI_TDR); + + ssr = inb(scidev->addr+SCI_SSR); + ssr &= ~SCI_TDRE ; + write8(ssr,scidev->addr+SCI_SSR); +} + +static int _sci_rx_polled ( + int minor) +{ + struct scidev_t *scidev = &sci_device[minor] ; + + unsigned char c; + char ssr ; + ssr = read8(scidev->addr + SCI_SSR) ; + + if (ssr & (SCI_PER | SCI_FER | SCI_ORER)) + write8(ssr & ~(SCI_PER | SCI_FER | SCI_ORER), scidev->addr+SCI_SSR); + + if ( !(ssr & SCI_RDRF) ) + return -1; + + c = read8(scidev->addr + SCI_RDR) ; + + write8(ssr & ~SCI_RDRF,scidev->addr + SCI_SSR); + return c; +} + +/* + * sci_initialize + */ + +rtems_device_driver sh_sci_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg ) +{ + rtems_device_driver status ; + rtems_device_minor_number i; + + /* + * register all possible devices. + * the initialization of the hardware is done by sci_open + */ + + for ( i = 0 ; i < SCI_MINOR_DEVICES ; i++ ) + { + status = rtems_io_register_name( + sci_device[i].name, + major, + sci_device[i].minor ); + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + } + + /* default hardware setup */ + + return RTEMS_SUCCESSFUL; +} + + +/* + * Open entry point + */ + +rtems_device_driver sh_sci_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) +{ + unsigned8 temp8; + + /* check for valid minor number */ + if(( minor > ( SCI_MINOR_DEVICES -1 )) || ( minor < 0 )) + { + return RTEMS_INVALID_NUMBER; + } + + /* device already opened */ + if ( sci_device[minor].opened > 0 ) + { + sci_device[minor].opened++ ; + return RTEMS_SUCCESSFUL ; + } + + _sci_init( minor ); + + if (minor == 0) { + temp8 = read8(sci_device[minor].addr + SCI_SCR); + temp8 &= ~(SCI_TE | SCI_RE) ; + write8(temp8, sci_device[minor].addr + SCI_SCR); /* Clear SCR */ + _sci_set_cflags( &sci_device[minor], sci_device[minor].cflags ); + +/* FIXME: Should be one bit delay */ + CPU_delay(50000); /* microseconds */ + + temp8 |= SCI_RE | SCI_TE; + write8(temp8, sci_device[minor].addr + SCI_SCR); /* Enable clock output */ + } else { + temp8 = read8(sci_device[minor].addr + SCI_SCR); + temp8 &= ~(SCI_TE | SCI_RE) ; + write8(temp8, sci_device[minor].addr + SCI_SCR); /* Clear SCR */ + _sci_set_cflags( &sci_device[minor], sci_device[minor].cflags ); + +/* FIXME: Should be one bit delay */ + CPU_delay(50000); /* microseconds */ + + temp8 |= SCI_RE | SCI_TE; + write8(temp8, sci_device[minor].addr + SCI_SCR); /* Enable clock output */ + } + + sci_device[minor].opened++ ; + + return RTEMS_SUCCESSFUL ; +} + +/* + * Close entry point + */ + +rtems_device_driver sh_sci_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + if( sci_device[minor].opened == 0 ) + { + return RTEMS_INVALID_NUMBER; + } + + sci_device[minor].opened-- ; + + return RTEMS_SUCCESSFUL ; +} + +/* + * read bytes from the serial port. + */ + +rtems_device_driver sh_sci_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + int count = 0; + + rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; + char * buffer = rw_args->buffer; + int maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { + buffer[ count ] = _sci_rx_polled(minor); + if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { + buffer[ count++ ] = '\n'; + break; + } + } + + rw_args->bytes_moved = count; + return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; +} + +/* + * write bytes to the serial port. + */ + +rtems_device_driver sh_sci_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + int count; + + rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) arg; + char *buffer = rw_args->buffer; + int maximum = rw_args->count; + + for (count = 0; count < maximum; count++) { +#if 0 + if ( buffer[ count ] == '\n') { + outbyte(minor, '\r'); + } +#endif + _sci_tx_polled( minor, buffer[ count ] ); + } + + rw_args->bytes_moved = maximum; + return 0; +} + +/* + * IO Control entry point + */ + +rtems_device_driver sh_sci_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + /* Not yet supported */ + return RTEMS_SUCCESSFUL ; +} -- cgit v1.2.3