diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-02-22 18:39:52 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-02-22 18:39:52 +0000 |
commit | 61ba976360804d85f9203821518bb4b132852188 (patch) | |
tree | 28e72dd94472e21da42f5f5d1e82912a9f83852a /c/src/lib/libbsp/c4x/c4xsim/console | |
parent | Adding information on prebuilt toolset binaries. (diff) | |
download | rtems-61ba976360804d85f9203821518bb4b132852188.tar.bz2 |
New port of RTEMS to TI C3x and C4x.
Diffstat (limited to 'c/src/lib/libbsp/c4x/c4xsim/console')
-rw-r--r-- | c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am | 34 | ||||
-rw-r--r-- | c/src/lib/libbsp/c4x/c4xsim/console/console.c | 155 | ||||
-rw-r--r-- | c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c | 26 | ||||
-rw-r--r-- | c/src/lib/libbsp/c4x/c4xsim/console/debugio.c | 57 | ||||
-rw-r--r-- | c/src/lib/libbsp/c4x/c4xsim/console/simio.c | 308 |
5 files changed, 580 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am b/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am new file mode 100644 index 0000000000..b05928ea32 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/Makefile.am @@ -0,0 +1,34 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/console.rel + +VPATH = @srcdir@:@srcdir@/../../../shared + +C_FILES = console.c consolereserveresources.c debugio.c simio.c printk.c +C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o) + +OBJS = $(C_O_FILES) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(OBJS) + $(make-rel) + +# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile + +all-local: $(ARCH) $(OBJS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = console.c consolereserveresources.c debugputs.c + +include $(top_srcdir)/../../../../../../automake/local.am diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/console.c b/c/src/lib/libbsp/c4x/c4xsim/console/console.c new file mode 100644 index 0000000000..08fad800ea --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/console.c @@ -0,0 +1,155 @@ +/* + * This file contains the hardware specific portions of the TTY driver + * for the serial ports on the erc32. + * + * COPYRIGHT (c) 1989-1997. + * 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 <bsp.h> +#include <rtems/libio.h> +#include <stdlib.h> +#include <assert.h> + +#include <simio.h> + +/* + * console_outbyte_polled + * + * This routine transmits a character using polling. + */ + +void console_outbyte_polled( + int port, + char ch +); + +/* + * console_inbyte_nonblocking + * + * This routine polls for a character. + */ + +int console_inbyte_nonblocking( + int port +); + +/* + * Console Termios Support Entry Points + * + */ + +int console_write_support ( + int minor, + const char *bufarg, + int len +) +{ + int nwrite = 0; + const char *buf = bufarg; + + while (nwrite < len) { + if ( *buf ) + console_outbyte_polled( minor, *buf & 0x7f ); + buf++; + nwrite++; + } + return nwrite; +} + +/* + * Console Device Driver Entry Points + * + */ + +rtems_device_driver console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code status; + + rtems_termios_initialize(); + + /* + * Register Device Names + */ + + status = rtems_io_register_name( "/dev/console", major, 0 ); + if (status != RTEMS_SUCCESSFUL) + rtems_fatal_error_occurred(status); + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_status_code sc; + static const rtems_termios_callbacks pollCallbacks = { + NULL, /* firstOpen */ + NULL, /* lastClose */ + console_inbyte_nonblocking, /* pollRead */ + console_write_support, /* write */ + NULL, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + 0 /* outputUsesInterrupts */ + }; + + + assert( minor <= 1 ); + if ( minor > 2 ) + return RTEMS_INVALID_NUMBER; + + sc = rtems_termios_open (major, minor, arg, &pollCallbacks ); + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_close (arg); +} + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_read (arg); +} + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_write (arg); +} + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_ioctl (arg); +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c b/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c new file mode 100644 index 0000000000..40a65de7c5 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c @@ -0,0 +1,26 @@ +/* + * This file contains the TTY driver for the serial ports on the erc32. + * + * This driver uses the termios pseudo driver. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * 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 <bsp.h> +#include <rtems/libio.h> +#include <stdlib.h> +#include <assert.h> + +void console_reserve_resources( + rtems_configuration_table *configuration +) +{ + rtems_termios_reserve_resources( configuration, 2 ); +} diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c b/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c new file mode 100644 index 0000000000..5c066bcad0 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/debugio.c @@ -0,0 +1,57 @@ +/* + * This file contains the TTY driver for the serial ports on the erc32. + * + * This driver uses the termios pseudo driver. + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * 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 <bsp.h> +#include <rtems/libio.h> +#include <stdlib.h> +#include <assert.h> + +#include <simio.h> + +/* + * console_outbyte_polled + * + * This routine transmits a character using polling. + */ + +void console_outbyte_polled( + int port, + char ch +) +{ + char out[2]; + out[0] = ch; + out[1] = 0; + sim_write(1, out, 1); +} + +C4X_BSP_output_char( int c ) +{ + console_outbyte_polled( 0, (char) c ); +} + +/* + * console_inbyte_nonblocking + * + * This routine polls for a character. + */ + +int console_inbyte_nonblocking( int port ) +{ + char c; + sim_read(1, &c, 1); + return c; +} + diff --git a/c/src/lib/libbsp/c4x/c4xsim/console/simio.c b/c/src/lib/libbsp/c4x/c4xsim/console/simio.c new file mode 100644 index 0000000000..6b976737e4 --- /dev/null +++ b/c/src/lib/libbsp/c4x/c4xsim/console/simio.c @@ -0,0 +1,308 @@ +/* + * C4x simulator IO interface routines based on code provided + * by Herman ten Brugge <Haj.Ten.Brugge@net.HCC.nl> + * + * $Id$ + */ + +#include <stdio.h> + +#define SIM_OPEN (0xf0) +#define SIM_CLOSE (0xf1) +#define SIM_READ (0xf2) +#define SIM_WRITE (0xf3) +#define SIM_LSEEK (0xf4) +#define SIM_UNLINK (0xf5) +#define SIM_GETENV (0xf6) +#define SIM_RENAME (0xf7) +#define SIM_GETTIME (0xf8) +#define SIM_GETCLOCK (0xf9) + +typedef union _io { + struct _open { + int fd : 16; + int flags : 16; + } open; + struct _openr { + int result : 16; + } openr; + struct _close { + int fd : 16; + } close; + struct _closer { + int result : 16; + } closer; + struct _read { + int fd : 16; + int count : 16; + } read; + struct _readr { + int result : 16; + } readr; + struct _write { + int fd : 16; + int count : 16; + } write; + struct _writer { + int result : 16; + } writer; + struct _lseek { + int fd : 16; + int offsetlow : 16; + int offsethigh : 16; + int orgin : 16; + } lseek; + struct _lseekr { + int result; + } lseekr; + struct _unlinkr { + int result : 16; + } unlinkr; + struct _renamer { + int result : 16; + } renamer; + struct _getenvr { + int result : 16; + } getenvr; + struct _gettimer { + int result; + } gettimer; + struct _getclockr { + int result; + } getclockr; + struct _common { + int word1; + int word2; + } common; +} io; + +static void to_sim(int command, io *param, char *data, int length); +static void call_sim(void); +static void from_sim(io *param, char *data); + +void sim_exit(void) +{ + __asm__(" .global C$$EXIT"); + __asm__("C$$EXIT: nop"); + __asm__("nop"); +} + +int sim_open(const char *path, unsigned flags, int fno) +{ + io param; + + param.open.fd = fno; + param.open.flags = flags; + to_sim(SIM_OPEN,¶m,(char *)path,strlen(path)+1); + call_sim(); + from_sim(¶m, NULL); + return param.openr.result; +} + +int sim_close(int fno) +{ + io param; + + param.close.fd = fno; + to_sim(SIM_CLOSE,¶m,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.closer.result; +} + +int sim_read(int fno, char *buf, unsigned count) +{ + io param; + + param.read.fd = fno; + param.read.count = count; + to_sim(SIM_READ,¶m,NULL,0); + call_sim(); + from_sim(¶m, buf); + return param.readr.result; +} + +int sim_write(int fno, const char *buf, unsigned count) +{ + io param; + + param.write.fd = fno; + param.write.count = count; + to_sim(SIM_WRITE,¶m,(char *)buf,count); + call_sim(); + from_sim(¶m, NULL); + return param.writer.result; +} + +fpos_t sim_lseek(int fno, fpos_t offset, int origin) +{ + io param; + + param.lseek.fd = fno; + param.lseek.offsetlow = offset & 0xffff; + param.lseek.offsethigh = offset >> 16; + to_sim(SIM_LSEEK,¶m,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.lseekr.result; +} + +int sim_unlink(const char *path) +{ + io param; + + to_sim(SIM_UNLINK,NULL,(char *)path,strlen(path)+1); + call_sim(); + from_sim(¶m, NULL); + return param.unlinkr.result; +} + +int sim_rename(const char *old, const char *new) +{ + int l; + static char combined[200]; + io param; + + strcpy(combined,old); + l = strlen(old)+1; + strcpy(combined+l,new); + l += strlen(new) + 1; + to_sim(SIM_RENAME,NULL,combined,l); + call_sim(); + from_sim(¶m, NULL); + return param.renamer.result; +} + +char *sim_getenv(const char *str) +{ + io param; + static char result[200]; + + to_sim(SIM_GETENV,NULL,(char *)str,strlen(str)+1); + call_sim(); + from_sim(¶m, result); + return param.getenvr.result ? result : NULL; +} + +int sim_gettime(void) +{ + io param; + + to_sim(SIM_GETTIME,NULL,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.gettimer.result; +} + +int sim_getclock(void) +{ + io param; + + to_sim(SIM_GETCLOCK,NULL,NULL,0); + call_sim(); + from_sim(¶m, NULL); + return param.getclockr.result; +} + +int _CIOBUF_[BUFSIZ+32]; + +static void to_sim(int command, io *param, char *data, int length) +{ + int i; + int n; + int v; + int *ip = &_CIOBUF_[0]; + + *ip++ = length; + *ip++ = command; + if (param) { + *ip++ = param->common.word1; + *ip++ = param->common.word2; + } + else { + *ip++ = 0; + *ip++ = 0; + } + n = length & ~3; + for (i = 0 ; i < n ; i += 4) { + v = *data++ & 0xff; + v |= (*data++ & 0xff) << 8; + v |= (*data++ & 0xff) << 16; + v |= (*data++ & 0xff) << 24; + *ip++ = v; + } + v = 0; + for ( ; i < length ; i++) { + v |= (*data++ & 0xff) << ((i & 3) << 3); + } + *ip = v; +} + +static void call_sim(void) +{ + __asm__(" .global C$$IO$$"); + __asm__("C$$IO$$: nop"); +} + +static void from_sim(io *param, char *data) +{ + int i; + int l; + int n; + int v; + int *ip = &_CIOBUF_[0]; + + l = *ip++; + param->common.word1 = *ip++; + param->common.word2 = *ip++; + if (data != NULL) { + n = l & ~3; + for (i = 0 ; i < n ; i += 4) { + v = *ip++; + *data++ = v & 0xff; + *data++ = (v >> 8) & 0xff; + *data++ = (v >> 16) & 0xff; + *data++ = (v >> 24) & 0xff; + } + v = *ip; + for (; i < l ; i++) { + *data++ = v >> ((i & 3) << 3); + } + } +} + +#if 0 +#include <fcntl.h> +sim_io_test() +{ +sim_write(1, "howdy\n", 6); +} +#endif + +/* + * Debug junk + */ +#if 0 +void printk_wrapper(void) +{ + __asm__(" .global _printf"); + __asm__("_printf: bu _printk"); +} +#endif + +#if 1 +#ifdef _HAVE_STDC +#include <stdarg.h> +#else +#include <varargs.h> +#endif + +int __svfscanf( + register FILE *fp, + char const *fmt0, + va_list ap +) +{ + return 0; +} +#endif |