2001-08-10 Radzislaw Galler <rgaller@et.put.poznan.pl>

* score/cpu_asm.c (sh_set_irq_priority): Changed interrupt vector
	number range check and handling of interrupt priority regs to
	conform SH2 specs.
	* sci/sci_termios.c: New file.
	* include/sci_termios.h: New file.
	* include/Makefile.am (EXTRA_DIST): Added sci_termios.h.
	(include_sh_HEADERS): Added sci_termios.h.
	* score/ispsh7045.c (isp): Calling an ISR with immediate argument
	casued negative sign extension for vector numbers of 128 and
	above. This was fixed.
	* sci/sci.c: Cleaned initialization of SCI registers; added
	necessary setup for new TERMIOS console cooperation
This commit is contained in:
Joel Sherrill
2001-08-16 21:08:28 +00:00
parent ede9699cf4
commit 7ae512513f
7 changed files with 161 additions and 24 deletions

View File

@@ -1,3 +1,18 @@
2001-08-10 Radzislaw Galler <rgaller@et.put.poznan.pl>
* score/cpu_asm.c (sh_set_irq_priority): Changed interrupt vector
number range check and handling of interrupt priority regs to
conform SH2 specs.
* sci/sci_termios.c: New file.
* include/sci_termios.h: New file.
* include/Makefile.am (EXTRA_DIST): Added sci_termios.h.
(include_sh_HEADERS): Added sci_termios.h.
* score/ispsh7045.c (isp): Calling an ISR with immediate argument
casued negative sign extension for vector numbers of 128 and
above. This was fixed.
* sci/sci.c: Cleaned initialization of SCI registers; added
necessary setup for new TERMIOS console cooperation
2001-02-18 Ralf Corsepiu <corsepius@faw.uni-ulm.de>
* include/Makefile.am: Apply include_*HEADERS instead of H_FILES.

View File

@@ -9,7 +9,7 @@ AUTOMAKE_OPTIONS = foreign 1.4
include_shdir = $(includedir)/sh
include_rtems_scoredir = $(includedir)/rtems/score
include_sh_HEADERS = io_types.h sci.h sh7_pfc.h sh7_sci.h
include_sh_HEADERS = io_types.h sci.h sh7_pfc.h sh7_sci.h sci_termios.h
include_rtems_score_HEADERS = ispsh7045.h iosh7045.h
$(PROJECT_INCLUDE)/sh:
@@ -27,6 +27,6 @@ TMPINSTALL_FILES += $(PROJECT_INCLUDE)/sh \
all-local: $(TMPINSTALL_FILES)
EXTRA_DIST = io_types.h sci.h sh7_pfc.h sh7_sci.h
EXTRA_DIST = io_types.h sci.h sh7_pfc.h sh7_sci.h sci_termios.h
include $(top_srcdir)/../../../../../../automake/local.am

View File

@@ -25,6 +25,8 @@
#ifndef _sh_sci_h
#define _sh_sci_h
#include <rtems/libio.h>
#ifdef __cplusplus
extern "C" {
#endif
@@ -77,6 +79,11 @@ extern rtems_device_driver sh_sci_control(
rtems_device_minor_number,
void *
);
extern const rtems_termios_callbacks * sh_sci_get_termios_handlers(
rtems_boolean poll
);
#ifdef __cplusplus
}

View File

@@ -6,7 +6,7 @@ AUTOMAKE_OPTIONS = foreign 1.4
PGM = $(ARCH)/sci.rel
C_FILES = sci.c
C_FILES = sci.c sci_termios.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
OBJS = $(C_O_FILES)
@@ -26,6 +26,6 @@ all-local: $(ARCH) $(OBJS) $(PGM)
.PRECIOUS: $(PGM)
EXTRA_DIST = sci.c
EXTRA_DIST = sci.c sci_termios.c
include $(top_srcdir)/../../../../../../automake/local.am

View File

@@ -42,6 +42,7 @@
#include <rtems.h>
#include <stdlib.h>
#include <rtems/libio.h>
@@ -212,6 +213,14 @@ rtems_boolean rdSCI0(unsigned char *ch)
/* Clear RDRF flag */
temp = read8(SCI_SSR0) & ~SCI_RDRF;
write8(temp, SCI_SSR0);
/* Check for transmission errors */
if(temp & (SCI_ORER | SCI_FER | SCI_PER)){
/* TODO: report to RTEMS transmission error */
/* clear error flags*/
temp &= ~(SCI_ORER | SCI_FER | SCI_PER);
write8(temp, SCI_SSR0);
}
result = TRUE;
}
return result;
@@ -228,8 +237,16 @@ rtems_boolean rdSCI1(unsigned char *ch)
/* Clear RDRF flag */
temp= read8(SCI_SSR1) & ~SCI_RDRF;
write8(temp, SCI_SSR1);
result = TRUE;
/* Check for transmission errors */
if(temp & (SCI_ORER | SCI_FER | SCI_PER)){
/* TODO: report to RTEMS transmission error */
/* clear error flags*/
temp &= ~(SCI_ORER | SCI_FER | SCI_PER);
write8(temp, SCI_SSR1);
}
result = TRUE;
}
return result;
} /* rdSCI1 */
@@ -278,21 +295,33 @@ rtems_device_driver sh_sci_initialize(
void *arg )
{
rtems_device_driver status ;
rtems_device_minor_number i;
rtems_device_minor_number i;
rtems_driver_name_t *driver = NULL;
/*
* register all possible devices.
* the initialization of the hardware is done by sci_open
*
* One of devices could be previously registered by console
* initialization therefore we check it everytime
*/
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);
status = rtems_io_lookup_name(
sci_device[i].name,
&driver);
if( status != RTEMS_SUCCESSFUL )
{
/* OK. We assume it is not registered yet. */
status = rtems_io_register_name(
sci_device[i].name,
major,
sci_device[i].minor );
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
}
}
/* non-default hardware setup occurs in sh_sci_open() */
@@ -304,7 +333,6 @@ rtems_device_driver sh_sci_initialize(
/*
* Open entry point
* Sets up port and pins for selected sci.
* SCI0 setup is conditional on STANDALONE_EVB == 1
*/
rtems_device_driver sh_sci_open(
@@ -332,7 +360,7 @@ rtems_device_driver sh_sci_open(
/* set PFC registers to enable I/O pins */
if ((minor == 0) && (STANDALONE_EVB == 1)) {
if ((minor == 0)) {
temp16 = read16(PFC_PACRL2); /* disable SCK0, DMA, IRQ */
temp16 &= ~(PA2MD1 | PA2MD0);
temp16 |= (PA_TXD0 | PA_RXD0); /* enable pins for Tx0, Rx0 */
@@ -347,8 +375,7 @@ rtems_device_driver sh_sci_open(
} /* add other devices and pins as req'd. */
/* set up SCI registers */
if ((minor != 0) || (STANDALONE_EVB == 1)) {
write8(0x00, sci_device[minor].addr + SCI_SCR); /* Clear SCR */
write8(0x00, sci_device[minor].addr + SCI_SCR); /* Clear SCR */
/* set SMR and BRR */
_sci_set_cflags( &sci_device[minor], sci_device[minor].cflags );
@@ -358,10 +385,17 @@ rtems_device_driver sh_sci_open(
write8((SCI_RE | SCI_TE), /* enable async. Tx and Rx */
sci_device[minor].addr + SCI_SCR);
temp8 = read8(sci_device[minor].addr + SCI_RDR); /* flush input */
/* clear error flags */
temp8 = read8(sci_device[minor].addr + SCI_SSR);
while(temp8 & (SCI_RDRF | SCI_ORER | SCI_FER | SCI_PER)){
temp8 = read8(sci_device[minor].addr + SCI_RDR); /* flush input */
temp8 = read8(sci_device[minor].addr + SCI_SSR); /* clear some flags */
write8(temp8 & ~(SCI_RDRF | SCI_ORER | SCI_FER | SCI_PER),
sci_device[minor].addr + SCI_SSR);
temp8 = read8(sci_device[minor].addr + SCI_SSR); /* check if everything is OK */
}
/* Clear RDRF flag */
temp8= read8(sci_device[minor].addr + SCI_SSR) & ~SCI_RDRF;
write8(temp8, sci_device[minor].addr + SCI_SSR);
write8(0x00, sci_device[minor].addr + SCI_TDR); /* force output */
/* Clear the TDRE bit */
temp8 = read8(sci_device[minor].addr + SCI_SSR) & ~SCI_TDRE;
@@ -369,8 +403,7 @@ rtems_device_driver sh_sci_open(
/* add interrupt setup if required */
}
sci_device[minor].opened++ ;
return RTEMS_SUCCESSFUL ;
@@ -471,3 +504,79 @@ rtems_device_driver sh_sci_control(
/* Not yet supported */
return RTEMS_SUCCESSFUL ;
}
/*
* Termios polled first open
*/
static int _sh_sci_poll_first_open(int major, int minor, void *arg)
{
return sh_sci_open(major, minor, arg);
}
/*
* Termios general last close
*/
static int _sh_sci_last_close(int major, int minor, void *arg)
{
return sh_sci_close(major, minor, arg);
}
/*
* Termios polled read
*/
static int _sh_sci_poll_read(int minor)
{
int value = -1;
char ch;
if( minor == 0 ){
if( rdSCI0( &ch ) )
value = (int) ch;
}else if( minor == 1 ){
if( rdSCI1( &ch ) )
value = (int) ch;
}
return value;
}
/*
* Termios polled write
*/
static int _sh_sci_poll_write(int minor, const char *buf, int len)
{
int count;
for(count = 0; count < len; count++)
outbyte( minor, buf[count] );
return count;
}
/*
* Termios set attributes
*/
static int _sh_sci_set_attributes( int minor, const struct termios *t)
{
return _sci_set_cflags( &sci_device[ minor ], t->c_cflag);
}
const rtems_termios_callbacks sci_poll_callbacks = {
_sh_sci_poll_first_open, /* FirstOpen*/
_sh_sci_last_close, /* LastClose*/
_sh_sci_poll_read, /* PollRead */
_sh_sci_poll_write, /* Write */
_sh_sci_set_attributes, /* setAttributes */
NULL, /* stopRemoteTX */
NULL, /* StartRemoteTX */
0 /* outputUsesInterrupts */
};
/* FIXME: not yet supported */
const rtems_termios_callbacks sci_interrupt_callbacks;
const rtems_termios_callbacks* sh_sci_get_termios_handlers( rtems_boolean poll )
{
return poll ?
&sci_poll_callbacks :
&sci_interrupt_callbacks;
}

View File

@@ -81,7 +81,7 @@ unsigned int sh_set_irq_priority(
/*
* first check for valid interrupt
*/
if(( irq > 113) || (_Hardware_isr_Table[irq] == _dummy_isp))
if(( irq > 156) || (irq < 64) || (_Hardware_isr_Table[irq] == _dummy_isp))
return -1;
/*
* check for valid irq priority
@@ -102,6 +102,9 @@ unsigned int sh_set_irq_priority(
case 0: { prioreg = INTC_IPRC; break;}
case 1: { prioreg = INTC_IPRD; break;}
case 2: { prioreg = INTC_IPRE; break;}
case 3: { prioreg = INTC_IPRF; break;}
case 4: { prioreg = INTC_IPRG; break;}
case 5: { prioreg = INTC_IPRH; break;}
default: return -1;
}
}

View File

@@ -123,9 +123,10 @@ asm (".global _"Str(name)"\n\t" \
" sts.l mach,@-r15 \n\t" \
" sts.l macl,@-r15 \n\t" \
" mov r15,r14 \n\t" \
" mov.l "Str(name)"_v, r2 \n\t" \
" mov.l "Str(name)"_k, r1\n\t" \
" jsr @r1 \n\t" \
" mov #"Str(number)", r4\n\t" \
" mov r2,r4 \n\t" \
" mov r14,r15 \n\t" \
" lds.l @r15+,macl \n\t" \
" lds.l @r15+,mach \n\t" \
@@ -143,7 +144,9 @@ asm (".global _"Str(name)"\n\t" \
" nop \n\t" \
" .align 2 \n\t" \
#name"_k: \n\t" \
".long "Str(func));
".long "Str(func)"\n\t" \
#name"_v: \n\t" \
".long "Str(number));
/************************************************
* Dummy interrupt service procedure for