From 35d9acb36e7c325a821cb4f25f6f40c96ba582ab Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 7 Jan 2000 18:52:14 +0000 Subject: Patch from John M. Mills to correct the baseline serial drivers used in the 'gensh2' BSP for the Hitachi sh7045 CPU. --- c/src/lib/libcpu/sh/sh7045/sci/sci.c | 92 +++++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 11 deletions(-) (limited to 'c/src/lib/libcpu/sh/sh7045') diff --git a/c/src/lib/libcpu/sh/sh7045/sci/sci.c b/c/src/lib/libcpu/sh/sh7045/sci/sci.c index 2f0927b15a..9acddbde9b 100644 --- a/c/src/lib/libcpu/sh/sh7045/sci/sci.c +++ b/c/src/lib/libcpu/sh/sh7045/sci/sci.c @@ -50,32 +50,104 @@ #include #include #include -#include +#include +/* #include */ #include +#ifndef STANDALONE_EVB +#define STANDALONE_EVB 0 +#endif + +/* + * NOTE: Some SH variants have 3 sci devices + */ + +#define SCI_MINOR_DEVICES 2 + +/* + * FIXME: sh7045 register names match Hitachi data book, + * but conflict with RTEMS sh7032 usage. + */ + +#define SH_SCI_BASE_0 SCI_SMR0 +#define SH_SCI_BASE_1 SCI_SMR1 + +#define SH_SCI_DEF_COMM_0 B9600 | CS8 +#define SH_SCI_DEF_COMM_1 B38400 | CS8 +/* #define SH_SCI_DEF_COMM_1 B9600 | CS8 */ + struct scidev_t { char * name ; + unsigned32 addr ; rtems_device_minor_number minor ; unsigned short opened ; tcflag_t cflags ; -} sci_device[2] = +} sci_device[SCI_MINOR_DEVICES] = { - { "/dev/sci0", 0, 0, B9600 | CS8 }, - { "/dev/sci1", 1, 0, B9600 | CS8 } + { "/dev/sci0", SH_SCI_BASE_0, 0, 0, SH_SCI_DEF_COMM_0 }, + { "/dev/sci1", SH_SCI_BASE_1, 1, 0, SH_SCI_DEF_COMM_1 } } ; /* local data structures maintain hardware configuration */ +#if UNUSED +static sci_setup_t sio_param[2]; +#endif + +/* imported from scitab.rel */ extern int _sci_get_brparms( tcflag_t cflag, unsigned char *smr, unsigned char *brr ); -#if UNUSED -static sci_setup_t sio_param[2]; -#endif +/* 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; -/* local functions operate SCI ports 0 and 1 */ -/* called from polling routines or ISRs */ + 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 ; +} + +/* + * local functions operate SCI ports 0 and 1 + * called from polling routines or ISRs + */ rtems_boolean wrtSCI0(unsigned char ch) { unsigned8 temp; @@ -242,8 +314,6 @@ rtems_device_driver sh_sci_open( { unsigned8 temp8; unsigned16 temp16; - unsigned char smr ; - unsigned char brr ; unsigned a ; -- cgit v1.2.3