diff options
author | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
---|---|---|
committer | Ranjith Kumaran <ranjith@cygnus.com> | 2000-03-17 22:48:54 +0000 |
commit | 03261851a10dd2d6900a0a00a7515a0a46fb5d76 (patch) | |
tree | 7c22ac6cbbc99fd5cd1b5426853be8d4fd7bfcf1 /libgloss/mips/jmr3904-io.c | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
Diffstat (limited to 'libgloss/mips/jmr3904-io.c')
-rw-r--r-- | libgloss/mips/jmr3904-io.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/libgloss/mips/jmr3904-io.c b/libgloss/mips/jmr3904-io.c new file mode 100644 index 000000000..8d4300739 --- /dev/null +++ b/libgloss/mips/jmr3904-io.c @@ -0,0 +1,104 @@ + + +#define READ_UINT8( _register_, _value_ ) \ + ((_value_) = *((volatile unsigned char *)(_register_))) + +#define WRITE_UINT8( _register_, _value_ ) \ + (*((volatile unsigned char *)(_register_)) = (_value_)) + + /* - Board specific addresses for serial chip */ +#define DIAG_BASE 0xfffff300 +#define DIAG_SLCR (DIAG_BASE+0x00) +#define DIAG_SLSR (DIAG_BASE+0x04) +#define DIAG_SLDICR (DIAG_BASE+0x08) +#define DIAG_SLDISR (DIAG_BASE+0x0C) +#define DIAG_SFCR (DIAG_BASE+0x10) +#define DIAG_SBRG (DIAG_BASE+0x14) +#define DIAG_TFIFO (DIAG_BASE+0x20) +#define DIAG_RFIFO (DIAG_BASE+0x30) + +#define BRG_T0 0x0000 +#define BRG_T2 0x0100 +#define BRG_T4 0x0200 +#define BRG_T5 0x0300 + + +#define READ_UINT16( _register_, _value_ ) \ + ((_value_) = *((volatile unsigned short *)(_register_))) + +#define WRITE_UINT16( _register_, _value_ ) \ + (*((volatile unsigned short *)(_register_)) = (_value_)) + +unsigned char +inbyte (void) +{ + unsigned char c; + unsigned short disr; + + for (;;) + { + READ_UINT16 (DIAG_SLDISR, disr); + if (disr & 0x0001) + break; + } + disr = disr & ~0x0001; + READ_UINT8 (DIAG_RFIFO, c); + WRITE_UINT16 (DIAG_SLDISR, disr); + return c; +} + +void +outbyte (unsigned char c) +{ + unsigned short disr; + + for (;;) + { + READ_UINT16 (DIAG_SLDISR, disr); + if (disr & 0x0002) + break; + } + disr = disr & ~0x0002; + WRITE_UINT8 (DIAG_TFIFO, c); + WRITE_UINT16 (DIAG_SLDISR, disr); +} + +/* Stuff required to setup IO on this board */ +void board_serial_init (void) +{ + WRITE_UINT16 (DIAG_SLCR, 0x0020); + WRITE_UINT16 (DIAG_SLDICR, 0x0000); + WRITE_UINT16 (DIAG_SFCR, 0x0000); + WRITE_UINT16 (DIAG_SBRG, BRG_T2 | 5); +} + +/* If you want this to be initialized as part of the stuff which gets called + by crt0, it should be named 'hardware_init_hook'. + Local implementations may want to move or add to this function OR + do the initializations after main() is entered. +*/ +void hardware_init_hook(void) +{ + board_serial_init() ; +} + +/* Structure filled in by get_mem_info. Only the size field is + actually used (by sbrk), so the others aren't even filled in. */ + +struct s_mem +{ + unsigned int size; + unsigned int icsize; + unsigned int dcsize; +}; + +/* mem_size is provided in the linker script so that we don't have to + define it here. */ +extern char _mem_size[]; + +void +get_mem_info (mem) + struct s_mem *mem; +{ + mem->size = (unsigned int)_mem_size; +} |