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/hp74x/io.c | |
parent | fae4c299f14fc23e2829c8656992eba21f79242a (diff) | |
download | cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.gz cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.tar.bz2 cygnal-03261851a10dd2d6900a0a00a7515a0a46fb5d76.zip |
20000317 sourceware import
Diffstat (limited to 'libgloss/hp74x/io.c')
-rw-r--r-- | libgloss/hp74x/io.c | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/libgloss/hp74x/io.c b/libgloss/hp74x/io.c new file mode 100644 index 000000000..054d90ce4 --- /dev/null +++ b/libgloss/hp74x/io.c @@ -0,0 +1,338 @@ +/* + * io.c -- all the code to make GCC and the libraries run on + * a bare target board. + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> + +#include "hppa-defs.h" + +extern char *_end; /* _end is set in the linker command file */ + +/* just in case, most boards have at least some memory */ +#ifndef RAMSIZE +# define RAMSIZE (char *)0x100000 +#endif + +int +print(ptr) +char *ptr; +{ + while (*ptr) + outbyte (*ptr++); +} + +int +putnum (Num) +unsigned int Num; +{ + char Buffer[9]; + int Count; + char *BufPtr = Buffer; + int Digit; + + for (Count = 7 ; Count >= 0 ; Count--) { + Digit = (Num >> (Count * 4)) & 0xf; + + if (Digit <= 9) + *BufPtr++ = (char) ('0' + Digit); + else + *BufPtr++ = (char) ('a' - 10 + Digit); + } + + *BufPtr = (char) 0; + print (Buffer); + return; +} + +int +delay (x) + int x; +{ + int y = 17; + while (x-- !=0) + y = y^2; +} + +/* + * strobe -- do a zylons thing, toggling each led in sequence forever... + */ +int +zylons() +{ + while (1) { + strobe(); + } +} + +/* + * strobe -- toggle each led in sequence up and back once. + */ +int +strobe() +{ + static unsigned char curled = 1; + static unsigned char dir = 0; + + curled = 1; + dir = 0; + while (curled != 0) { + led_putnum (curled); + delay (70000); + if (dir) + curled >>= 1; + else + curled <<= 1; + + if (curled == 128) { + dir = ~dir; + } + } + curled = 1; + dir = 0; +} + +/* + * iodc_io_call -- this makes a call into the IODC routine + */ +int +iodc_io_call(ep_address,arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) +int ep_address, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11; +{ + int (*iodc_entry_point)(); + + iodc_entry_point = (int (*)())ep_address; + + return ((*iodc_entry_point)(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)); +} + +/* + * pdc_call -- this makes a call into the PDC routine + */ +int +pdc_call(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11) + int arg0, arg1, arg2, arg3, arg4, arg5; + int arg6, arg7, arg9, arg10, arg11; +{ + return ( CALL_PDC(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)); +} + +/* + * put_led -- put a bit pattern on the LED's. + */ +int +led_putnum (byte) + unsigned short byte; +{ + return (pdc_call(OPT_PDC_CHASSIS,0,byte)); +} + + +/* + * outbyte -- shove a byte out the serial port + */ +int +outbyte(byte) + unsigned char byte; +{ + int status; + int R_addr[32]; + struct _dev *console = (struct _dev *)PGZ_CONSOLE_STRUCT; + + status = iodc_io_call(console->iodc_io, console->hpa, IO_CONSOLE_OUTPUT, console->spa, + console->layer[0], R_addr, 0, &byte, 1, 0); + + switch(status) + { + case 0: return(1); + default: return (-1); + } +} + +/* + * inbyte -- get a byte from the serial port + */ +unsigned char +inbyte() +{ + int status; + int R_addr[32]; + char inbuf; + struct _dev *console = (struct _dev *)PGZ_CONSOLE_STRUCT; + + while (status == 0) { + status = iodc_io_call(console->iodc_io, console->hpa, IO_CONSOLE_INPUT, console->spa, + console->layer[0], R_addr, 0, &inbuf, 1, 0); + + switch (status) { + case 0: + case 2: /* recoverable error */ + if (R_addr[0] != 0) { /* found a character */ + return(inbuf); + } + else + break; /* error, no character */ + default: /* error, no character */ + return(0); + } + } +} + +/* + * read -- read bytes from the serial port. Ignore fd, since + * we only have stdin. + */ +int +read(fd, buf, nbytes) + int fd; + char *buf; + int nbytes; +{ + int i = 0; + + for (i = 0; i < nbytes; i++) { + *(buf + i) = inbyte(); + if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) { + (*(buf + i)) = 0; + break; + } + } + return (i); +} + +/* + * write -- write bytes to the serial port. Ignore fd, since + * stdout and stderr are the same. Since we have no filesystem, + * open will only return an error. + */ +int +write(fd, buf, nbytes) + int fd; + char *buf; + int nbytes; +{ + int i; + + for (i = 0; i < nbytes; i++) { + if (*(buf + i) == '\n') { + outbyte ('\r'); + } + outbyte (*(buf + i)); + } + return (nbytes); +} + +/* + * open -- open a file descriptor. We don't have a filesystem, so + * we return an error. + */ +int +open(buf, flags, mode) + char *buf; + int flags; + int mode; +{ + errno = EIO; + return (-1); +} + +/* + * close -- close a file descriptor. We don't need + * to do anything, but pretend we did. + */ +int +close(fd) + int fd; +{ + return (0); +} + +/* + * sbrk -- changes heap size size. Get nbytes more + * RAM. We just increment a pointer in what's + * left of memory on the board. + */ +char * +sbrk(nbytes) + int nbytes; +{ + static char * heap_ptr = NULL; + char * base; + + if (heap_ptr == NULL) { + heap_ptr = (char *)&_end; + } + + if ((RAMSIZE - heap_ptr) >= 0) { + base = heap_ptr; + heap_ptr += nbytes; + return (heap_ptr); + } else { + errno = ENOMEM; + return ((char *)-1); + } +} + +/* + * isatty -- returns 1 if connected to a terminal device, + * returns 0 if not. Since we're hooked up to a + * serial port, we'll say yes return a 1. + */ +int +isatty(fd) + int fd; +{ + return (1); +} + +/* + * lseek -- move read/write pointer. Since a serial port + * is non-seekable, we return an error. + */ +off_t +lseek(fd, offset, whence) + int fd; + off_t offset; + int whence; +{ + errno = ESPIPE; + return ((off_t)-1); +} + +/* + * fstat -- get status of a file. Since we have no file + * system, we just return an error. + */ +int +fstat(fd, buf) + int fd; + struct stat *buf; +{ + errno = EIO; + return (-1); +} + +/* + * getpid -- only one process, so just return 1. + */ +#define __MYPID 1 +int +getpid() +{ + return __MYPID; +} + +/* + * kill -- assume mvme.S, and go out via exit... + */ +int +kill(pid, sig) + int pid; + int sig; +{ + if(pid == __MYPID) + _exit(sig); + return 0; +} |