summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/c4x/c4xsim/console
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2000-02-22 18:39:52 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2000-02-22 18:39:52 +0000
commit61ba976360804d85f9203821518bb4b132852188 (patch)
tree28e72dd94472e21da42f5f5d1e82912a9f83852a /c/src/lib/libbsp/c4x/c4xsim/console
parentAdding information on prebuilt toolset binaries. (diff)
downloadrtems-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.am34
-rw-r--r--c/src/lib/libbsp/c4x/c4xsim/console/console.c155
-rw-r--r--c/src/lib/libbsp/c4x/c4xsim/console/consolereserveresources.c26
-rw-r--r--c/src/lib/libbsp/c4x/c4xsim/console/debugio.c57
-rw-r--r--c/src/lib/libbsp/c4x/c4xsim/console/simio.c308
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,&param,(char *)path,strlen(path)+1);
+ call_sim();
+ from_sim(&param, NULL);
+ return param.openr.result;
+}
+
+int sim_close(int fno)
+{
+ io param;
+
+ param.close.fd = fno;
+ to_sim(SIM_CLOSE,&param,NULL,0);
+ call_sim();
+ from_sim(&param, 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,&param,NULL,0);
+ call_sim();
+ from_sim(&param, 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,&param,(char *)buf,count);
+ call_sim();
+ from_sim(&param, 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,&param,NULL,0);
+ call_sim();
+ from_sim(&param, 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(&param, 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(&param, 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(&param, result);
+ return param.getenvr.result ? result : NULL;
+}
+
+int sim_gettime(void)
+{
+ io param;
+
+ to_sim(SIM_GETTIME,NULL,NULL,0);
+ call_sim();
+ from_sim(&param, NULL);
+ return param.gettimer.result;
+}
+
+int sim_getclock(void)
+{
+ io param;
+
+ to_sim(SIM_GETCLOCK,NULL,NULL,0);
+ call_sim();
+ from_sim(&param, 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