ARM patches

Jay Monkman jtm at smoothsmoothie.com
Fri Nov 8 04:13:28 UTC 2002


Here's some more patches, mostly for ARM.
diff_edb7312 - BSP for Cirrus's eval board for the CS7312 (The board
	       is made by Cogent.) The BSP passes the regression
	       tests, but isn't really finished. There's some things
	       that need to be cleaned up.
	       
diff_shared - Fixes a bug with handling the situation where we are
	      processing and IRQ, and we recieve an FIQ.

diff_libchip - This is a change to the libchip cs8900 ethernet driver
	       to get it to work with the edb7312 eval board.

	       I don't know why we have to SelfST register twice on
	       the EDB7312, but it doesn't work if we don't. 

	       Joel, if you'd prefer that I handle in the BSP, I can -
	       just let me know.




-- 
Jay Monkman	    The truth knocks on the door and you say "Go away, I'm 
                    looking for the truth," and so it goes away. Puzzling.
		     - from _Zen_and_the_Art_of_Motorcycle_Maintenance_
-------------- next part --------------
diff -Nbaur rtems-ss-20021007/make/custom/edb7312.cfg my_rtems/make/custom/edb7312.cfg
--- rtems-ss-20021007/make/custom/edb7312.cfg	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/make/custom/edb7312.cfg	2002-11-07 19:38:43.000000000 -0600
@@ -0,0 +1,40 @@
+#
+#  Config file for Cirrus/Cogent EDB7312 eval board
+#
+#  $Id: $
+#
+
+include $(RTEMS_ROOT)/make/custom/default.cfg
+
+RTEMS_CPU=arm
+RTEMS_CPU_MODEL=arm7tdmi
+
+# This is the actual bsp directory used during the build process.
+RTEMS_BSP_FAMILY=edb7312
+
+#  This contains the compiler options necessary to select the CPU model
+#  and (hopefully) optimize for it. 
+#
+CPU_CFLAGS = -mcpu=$(RTEMS_CPU_MODEL) -mstructure-size-boundary=8  
+
+# optimize flag: typically -0, could use -O4 or -fast
+# -O4 is ok for RTEMS
+# NOTE2: some level of -O may be actually required by inline assembler (at least
+# -O2 so far.
+CFLAGS_OPTIMIZE_V=-O3
+#CFLAGS_OPTIMIZE_V=-O4 -mmultiple -mstring -mstrict-align
+
+# debug flags: typically none, but at least -O1 is required due to this
+# BSP using inlined code
+CFLAGS_DEBUG_V = -O1
+#CFLAGS_DEBUG_V = -O1 -mmultiple -mstring -mstrict-align
+
+
+define make-exe
+	$(LINK.c) $(AM_CFLAGS) $(AM_LDFLAGS) -o $@ \
+	    $(LINK_OBJS) $(LINK_LIBS)
+	$(NM) -g -n $(basename $@).exe > $(basename $@).num
+	$(SIZE) $(basename $@).exe
+endef
+
+# Miscellaneous additions go here
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/acinclude.m4 my_rtems/c/src/lib/libbsp/arm/acinclude.m4
--- rtems-ss-20021007/c/src/lib/libbsp/arm/acinclude.m4	2001-10-09 19:25:36.000000000 -0500
+++ my_rtems/c/src/lib/libbsp/arm/acinclude.m4	2002-11-07 19:39:26.000000000 -0600
@@ -7,6 +7,8 @@
     AC_CONFIG_SUBDIRS([arm_bare_bsp]);;
   armulator )
     AC_CONFIG_SUBDIRS([armulator]);;
+  edb7312 )
+    AC_CONFIG_SUBDIRS([edb7312]);;
   vegaplus )
     AC_CONFIG_SUBDIRS([vegaplus]);;
   *)
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/.cvsignore	2002-11-07 19:38:52.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/Makefile.am	2002-11-07 19:38:56.000000000 -0600
@@ -0,0 +1,17 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+ACLOCAL_AMFLAGS = -I ../../../../../../aclocal
+
+# wrapup is the one that actually builds and installs the library
+#  from the individual .rel files built in other directories
+SUBDIRS = include clock console irq startup timer start network wrapup
+
+include $(top_srcdir)/../../bsp.am
+
+EXTRA_DIST = bsp_specs
+
+include $(top_srcdir)/../../../../../../automake/subdirs.am
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/bsp_specs my_rtems/c/src/lib/libbsp/arm/edb7312/bsp_specs
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/bsp_specs	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/bsp_specs	2002-11-07 19:39:07.000000000 -0600
@@ -0,0 +1,23 @@
+%rename cpp old_cpp
+%rename lib old_lib
+%rename endfile old_endfile
+%rename startfile old_startfile
+%rename link old_link
+
+*cpp:
+%(old_cpp) %{qrtems: -D__embedded__ -DUSE_ENHANCED_INTR_API} -Asystem(embedded)
+
+*lib:
+%{!qrtems: %(old_lib)} %{qrtems: --start-group \
+%{!qrtems_debug: -lrtemsbsp -lrtemscpu} %{qrtems_debug: -lrtemsbsp_g -lrtemscpu_g} \
+-lc -lgcc --end-group \
+%{!qnolinkcmds: -T linkcmds%s}}
+
+*startfile:
+%{!qrtems: %(old_startfile)} %{qrtems: \
+%{!qrtems_debug: start.o%s crtbegin.o%s} \
+%{qrtems_debug: start_g.o%s crtbegin.o%s}}
+
+*link:
+%{!qrtems: %(old_link)} %{qrtems: -Qy -dp -Bstatic -N -e _start}
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/clock/.cvsignore	2002-11-07 19:38:42.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/clock/Makefile.am	2002-11-07 19:38:56.000000000 -0600
@@ -0,0 +1,33 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+PGM = $(ARCH)/clock.rel
+
+C_FILES = clockdrv.c
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+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 = ckinit.c
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c my_rtems/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/clock/clockdrv.c	2002-11-07 19:38:36.000000000 -0600
@@ -0,0 +1,78 @@
+/*
+ * Cirrus EP7312 Clock driver
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *
+ *  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 <rtems.h>
+#include <ep7312.h>
+#include <bsp.h>
+#include <irq.h>
+
+
+rtems_isr clock_isr(rtems_vector_number vector);
+rtems_isr Clock_isr(rtems_vector_number vector);
+static void clock_isr_on(const rtems_irq_connect_data *unused);
+static void clock_isr_off(const rtems_irq_connect_data *unused);
+static int clock_isr_is_on(const rtems_irq_connect_data *irq);
+
+rtems_irq_connect_data clock_isr_data = {BSP_TC1OI,
+                                         (rtems_irq_hdl)Clock_isr,
+                                         clock_isr_on,
+                                         clock_isr_off,
+                                         clock_isr_is_on,
+                                         3,
+                                         0 };
+
+#define CLOCK_VECTOR 0
+
+#define Clock_driver_support_at_tick()                \
+  do {                                                \
+    *EP7312_TC1EOI = 0xffffffff;                      \
+  } while(0)
+
+#define Clock_driver_support_install_isr( _new, _old )                      \
+  do {                                                                      \
+      BSP_install_rtems_irq_handler(&clock_isr_data);                       \
+     } while(0)
+
+
+/* 
+ * Set up the clock hardware
+*/
+#define Clock_driver_support_initialize_hardware()                            \
+  do {                                                                        \
+      *EP7312_SYSCON1 |= EP7312_SYSCON1_TC1_PRESCALE;                         \
+      *EP7312_TC1D =(BSP_Configuration.microseconds_per_tick * 2000)/1000000; \
+      *EP7312_TC1EOI = 0xFFFFFFFF;                                            \
+     } while (0)
+
+#define Clock_driver_support_shutdown_hardware()                        \
+  do {                                                                  \
+	BSP_remove_rtems_irq_handler(&clock_isr_data);                  \
+     } while (0)
+
+static void clock_isr_on(const rtems_irq_connect_data *unused)
+{
+    return;
+}
+
+static void clock_isr_off(const rtems_irq_connect_data *unused)
+{
+    return;
+}
+
+static int clock_isr_is_on(const rtems_irq_connect_data *irq)
+{
+    return 1;
+}
+
+
+#include "../../../shared/clockdrv_shell.c"
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/configure.ac my_rtems/c/src/lib/libbsp/arm/edb7312/configure.ac
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/configure.ac	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/configure.ac	2002-11-07 19:39:25.000000000 -0600
@@ -0,0 +1,31 @@
+## Process this file with autoconf to produce a configure script.
+## 
+## $Id: $
+
+AC_PREREQ(2.52)
+AC_INIT
+AC_CONFIG_SRCDIR([bsp_specs])
+RTEMS_TOP(../../../../../..)
+AC_CONFIG_AUX_DIR(../../../../../..)
+
+RTEMS_CANONICAL_TARGET_CPU
+AM_INIT_AUTOMAKE(rtems-c-src-lib-libbsp-arm-edb7312,$RTEMS_VERSION,no)
+RTEMS_BSP_CONFIGURE
+
+RTEMS_PROG_CC_FOR_TARGET([-ansi -fasm])
+RTEMS_CANONICALIZE_TOOLS
+
+
+
+# Explicitly list all Makefiles here
+AC_CONFIG_FILES([Makefile
+clock/Makefile
+console/Makefile
+include/Makefile
+irq/Makefile
+start/Makefile
+startup/Makefile
+timer/Makefile
+network/Makefile
+wrapup/Makefile])
+AC_OUTPUT
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/console/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/console/.cvsignore	2002-11-07 19:38:47.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/console/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/console/Makefile.am	2002-11-07 19:38:40.000000000 -0600
@@ -0,0 +1,37 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+VPATH = @srcdir@:@srcdir@/../../shared/io:@srcdir@/../../../shared
+
+PGM = $(ARCH)/console.rel
+
+C_FILES = uart.c console.c
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+AM_CPPFLAGS += -I $(srcdir)/../irq
+
+$(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 = uart.c console.c
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/uart.c my_rtems/c/src/lib/libbsp/arm/edb7312/console/uart.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/console/uart.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/console/uart.c	2002-11-07 19:38:45.000000000 -0600
@@ -0,0 +1,162 @@
+/*
+ * Cirrus EP7312 Console Driver
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *
+ *  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>                /* Must be before libio.h */
+#include <rtems/libio.h>
+#include <termios.h>
+#include <rtems/bspIo.h>
+
+#include <ep7312.h>
+#include <libchip/serial.h>
+#include <libchip/sersupp.h>
+
+#define NUM_DEVS 1
+int     uart_poll_read(int minor);
+
+static int     uart_first_open(int major, int minor, void *arg);
+static int     uart_last_close(int major, int minor, void *arg);
+static int     uart_read(int minor);
+static int     uart_write(int minor, const char *buf, int len);
+static void    uart_init(int minor);
+static void    uart_write_polled(int minor, char c);
+static int     uart_set_attributes(int minor, const struct termios *t);
+
+unsigned long Console_Port_Count = NUM_DEVS;
+console_data  Console_Port_Data[NUM_DEVS];
+rtems_device_minor_number  Console_Port_Minor = 0;
+console_fns uart_fns = 
+{ 
+    libchip_serial_default_probe,
+    uart_first_open,
+    uart_last_close,
+    uart_read,
+    uart_write,
+    uart_init,
+    uart_write_polled,
+    uart_set_attributes,
+    FALSE
+};
+console_tbl Console_Port_Tbl[] = {
+    {
+        "/dev/com0",                      /* sDeviceName */
+        SERIAL_CUSTOM,                    /* deviceType */
+        &uart_fns,                        /* pDeviceFns */
+        NULL,                             /* deviceProbe */
+        NULL,                             /* pDeviceFlow */
+        16,                               /* ulMargin */
+        8,                                /* ulHysteresis */
+        NULL,                             /* pDeviceParams */
+        (unsigned32)EP7312_UARTCR1,       /* ulCtrlPort1 */
+        (unsigned32)EP7312_SYSFLG1,       /* ulCtrlPort2 */
+        (unsigned32)EP7312_UARTDR1,       /* ulDataPort */
+        0,                                /* getRegister */
+        0,                                /* setRegister */
+        0,                                /* getData */
+        0,                                /* setData */
+        0,                                /* ulClock */
+        0                                 /* ulIntVector */
+    }};
+
+static int     uart_first_open(int major, int minor, void *arg) {return 0;}
+static int     uart_last_close(int major, int minor, void *arg) {return 0;}
+static int     uart_read(int minor) 
+{
+    return uart_poll_read(minor);
+}
+
+static void    uart_write_polled(int minor, char c)
+{
+    uart_write(minor, &c, 1);
+}
+
+static int     uart_set_attributes(int minor, const struct termios *t) 
+{
+    return 0;
+}
+
+int uart_poll_read(int minor)
+{
+    volatile unsigned32 *data_reg;
+    volatile unsigned32 *ctrl_reg1;
+    volatile unsigned32 *ctrl_reg2;
+    char        c;
+    int         err;
+
+    data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;
+    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;
+    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;
+
+    if ((*ctrl_reg2 & EP7312_UART_URXFE1) != 0) {
+        return -1;
+    }
+
+    
+
+    err  = *data_reg;
+    c    = err & 0xff;
+    err &= (EP7312_UART_FRMERR | EP7312_UART_PARERR | EP7312_UART_OVERR);
+
+    return c;
+}
+
+static void _BSP_null_char( char c ) {uart_write_polled(0, c);}
+BSP_output_char_function_type BSP_output_char = _BSP_null_char;
+
+static int uart_write(int minor, const char *buf, int len)
+{
+    volatile unsigned32 *data_reg;
+    volatile unsigned32 *ctrl_reg1;
+    volatile unsigned32 *ctrl_reg2;
+    int i;
+    char c;
+
+    data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;
+    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;
+    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;
+
+    for (i = 0; i < len; i++) {
+        /* Wait for fifo to have room */
+        while ((*ctrl_reg2 & EP7312_UART_UTXFF1) != 0) {
+            continue;
+        }
+
+        c = (char) buf[i];
+        *data_reg = c;
+    }
+    
+    return 1;
+}
+
+static void uart_init(int minor)
+{
+    volatile unsigned32 *data_reg;
+    volatile unsigned32 *ctrl_reg1;
+    volatile unsigned32 *ctrl_reg2;
+    
+    data_reg = (unsigned32*)Console_Port_Tbl[minor].ulDataPort;
+    ctrl_reg1 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort1;
+    ctrl_reg2 = (unsigned32*)Console_Port_Tbl[minor].ulCtrlPort2;
+
+    /*   *ctrl_reg = (BSP_UART_DATA8       |
+                 BSP_UART_STOP1       |
+                 BSP_UART_PARITY_NONE |
+                 EP7312_UART_FIFOEN     |
+                 BSP_UART_BAUD_9600);
+    */
+    *ctrl_reg1 = (EP7312_UART_WRDLEN8    |
+                 EP7312_UART_FIFOEN     |
+                 0x17);              /* 9600 baud */
+    
+
+}
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/include/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/include/.cvsignore	2002-11-07 19:38:37.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/include/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/include/Makefile.am	2002-11-07 19:38:37.000000000 -0600
@@ -0,0 +1,26 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+include_HEADERS = bsp.h coverhd.h bspopts.h ep7312.h
+
+coverhd.h: $(top_srcdir)/../../shared/include/coverhd.h
+	cp $< $@
+
+CLEANFILES = coverhd.h
+
+
+$(PROJECT_INCLUDE):
+	$(mkinstalldirs) $@
+
+$(PROJECT_INCLUDE)/%.h: %.h
+	$(INSTALL_DATA) $< $@
+
+TMPINSTALL_FILES = $(PROJECT_INCLUDE) \
+    $(include_HEADERS:%=$(PROJECT_INCLUDE)/%)
+
+all-local: $(TMPINSTALL_FILES)
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/bsp.h my_rtems/c/src/lib/libbsp/arm/edb7312/include/bsp.h
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/bsp.h	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/include/bsp.h	2002-11-07 19:38:50.000000000 -0600
@@ -0,0 +1,69 @@
+/*
+ * Cirrus EP7312 BSP header file
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *
+ *  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: $
+*/
+#ifndef __BSP_H__
+#define __BSP_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <bspopts.h>
+
+#include <rtems.h>
+#include <iosupp.h>
+#include <console.h>
+#include <clockdrv.h>
+  
+/*
+ *  Define the interrupt mechanism for Time Test 27
+ *
+ *  NOTE: Following are not defined and are board independent
+ *
+ */
+struct rtems_bsdnet_ifconfig *config;
+int cs8900_driver_attach (struct rtems_bsdnet_ifconfig *config,
+                          int                          attaching);
+
+#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 2
+#define CONFIGURE_INTERRUPT_STACK_MEMORY  (16 * 1024)
+
+extern rtems_configuration_table BSP_Configuration;
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) 
+
+#define Cause_tm27_intr()  
+
+#define Clear_tm27_intr()  
+
+#define Lower_tm27_intr()
+
+
+  
+/*
+ * Network driver configuration
+ */
+#define RTEMS_BSP_NETWORK_DRIVER_NAME	"eth0"
+#define RTEMS_BSP_NETWORK_DRIVER_ATTACH	cs8900_driver_attach
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BSP_H__ */
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/ep7312.h my_rtems/c/src/lib/libbsp/arm/edb7312/include/ep7312.h
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/include/ep7312.h	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/include/ep7312.h	2002-11-07 19:39:06.000000000 -0600
@@ -0,0 +1,156 @@
+/*
+ * Cirrus EP7312 register declarations
+ *
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ * 
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *
+ *  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.
+ *
+ *
+ * Notes: The PLL registers (pll_ro and pll_wo) are either read only
+ *        or write only. The data sheet says not to write the read
+ *        only one or read the write only one. I'm not sure what will
+ *        happen if you do.
+ *
+ *  $Id: $
+*/
+#ifndef __EP7312_H__
+#define __EP7312_H__
+
+#define EP7312_REG_BASE 0x80000000
+
+#define EP7312_PADR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0000))
+#define EP7312_PBDR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0001))
+#define EP7312_PDDR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0003))
+#define EP7312_PADDR   ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0040))
+#define EP7312_PBDDR   ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0041))
+#define EP7312_PDDDR   ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0043))
+#define EP7312_PEDR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0080))
+#define EP7312_PEDDR   ((volatile unsigned8  *)(EP7312_REG_BASE + 0x00C0))
+#define EP7312_SYSCON1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0100))
+#define EP7312_SYSFLG1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0140))
+#define EP7312_MEMCFG1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0180))
+#define EP7312_MEMCFG2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x01C0))
+#define EP7312_INTSR1  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0240))
+#define EP7312_INTMR1  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0280))
+#define EP7312_LCDCON  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x02C0))
+#define EP7312_TC1D    ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0300))
+#define EP7312_TC2D    ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0340))
+#define EP7312_RTCDR   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0380))
+#define EP7312_RTCMR   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x03C0))
+#define EP7312_PMPCON  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0400))
+#define EP7312_CODR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x0440))
+#define EP7312_UARTDR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0480))
+#define EP7312_UARTCR1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x04C0))
+#define EP7312_SYNCIO  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0500))
+#define EP7312_PALLSW  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0540))
+#define EP7312_PALMSW  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0580))
+#define EP7312_STFCLR  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x05C0))
+#define EP7312_BLEOI   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0600))
+#define EP7312_MCEOI   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0640))
+#define EP7312_TEOI    ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0680))
+#define EP7312_TC1EOI  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x06C0))
+#define EP7312_TC2EOI  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0700))
+#define EP7312_RTCEOI  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0740))
+#define EP7312_UMSEOI  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0780))
+#define EP7312_COEOI   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x07C0))
+#define EP7312_HALT    ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0800))
+#define EP7312_STDBY   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x0840))
+#define EP7312_FBADDR  ((volatile unsigned8  *)(EP7312_REG_BASE + 0x1000))
+#define EP7312_SYSCON2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1100))
+#define EP7312_SYSFLG2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1140))
+#define EP7312_INTSR2  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1240))
+#define EP7312_INTMR2  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1280))
+#define EP7312_UARTDR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1480))
+#define EP7312_UARTCR2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x14C0))
+#define EP7312_SS2DR   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1500))
+#define EP7312_SRXEOF  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1600))
+#define EP7312_SS2POP  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x16C0))
+#define EP7312_KBDEOI  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x1700))
+#define EP7312_DAIR    ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2000))
+#define EP7312_DAIDR0  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2040))
+#define EP7312_DAIDR1  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2080))
+#define EP7312_DAIDR2  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x20C0))
+#define EP7312_DAISR   ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2100))
+#define EP7312_SYSCON3 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2200))
+#define EP7312_INTSR3  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2240))
+#define EP7312_INTMR3  ((volatile unsigned8  *)(EP7312_REG_BASE + 0x2280))
+#define EP7312_LEDFLSH ((volatile unsigned8  *)(EP7312_REG_BASE + 0x22C0))
+#define EP7312_SDCONF  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2300))
+#define EP7312_SDRFPR  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2340))
+#define EP7312_UNIQID  ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2440))
+#define EP7312_DAI64Fs ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2600))
+#define EP7312_PLLW    ((volatile unsigned8  *)(EP7312_REG_BASE + 0x2610))
+#define EP7312_PLLR    ((volatile unsigned8  *)(EP7312_REG_BASE + 0xA5A8))
+#define EP7312_RANDID0 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2700))
+#define EP7312_RANDID1 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2704))
+#define EP7312_RANDID2 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x2708))
+#define EP7312_RANDID3 ((volatile unsigned32 *)(EP7312_REG_BASE + 0x270C))
+
+/* serial port bits */
+/* BITS in UBRLCR1 */
+#define EP7312_UART_WRDLEN5    0x00000000
+#define EP7312_UART_WRDLEN6    0x00020000
+#define EP7312_UART_WRDLEN7    0x00040000
+#define EP7312_UART_WRDLEN8    0x00060000
+#define EP7312_UART_FIFOEN     0x00010000
+#define EP7312_UART_XSTOP      0x00008000
+#define EP7312_UART_EVENPRT    0x00004000
+#define EP7312_UART_PRTEN      0x00002000
+#define EP7312_UART_BREAK      0x00001000
+
+/* BITS in INTSR1 */
+#define EP7312_UART_UTXINT1    0x00002000
+#define	EP7312_UART_URXINT1    0x00001000
+
+/* BITS in UARTTDR1 */
+#define EP7312_UART_FRMERR     0x00000100
+#define EP7312_UART_PARERR     0x00000200
+#define EP7312_UART_OVERR      0x00000400
+
+/* BITS in system status flag register 1 */
+#define EP7312_UART_UBUSY1     0x00000800
+#define EP7312_UART_URXFE1     0x00400000
+#define EP7312_UART_UTXFF1     0x00800000
+
+/* system configuration bits */
+/* BITS in SYSCON1 */
+#define EP7312_SYSCON1_UART1EN       0x00000100
+#define EP7312_SYSCON1_TC1_PRESCALE  0x00000010
+#define EP7312_SYSCON1_TC1_512KHZ    0x00000020
+#define EP7312_SYSCON1_TC2_PRESCALE  0x00000040
+#define EP7312_SYSCON1_TC2_512KHZ    0x00000080
+
+/* INTR1 (Interrupt 1) mask/status register bits */
+#define EP7312_INTR1_EXTFIQ  0x00000001
+#define EP7312_INTR1_BLINT   0x00000002
+#define EP7312_INTR1_WEINT   0x00000004
+#define EP7312_INTR1_MCINT   0x00000008
+#define EP7312_INTR1_CSINT   0x00000010
+#define EP7312_INTR1_EINT1   0x00000020
+#define EP7312_INTR1_EINT2   0x00000040
+#define EP7312_INTR1_EINT3   0x00000080
+#define EP7312_INTR1_TC1OI   0x00000100
+#define EP7312_INTR1_TC2OI   0x00000200
+#define EP7312_INTR1_RTCMI   0x00000400
+#define EP7312_INTR1_TINT    0x00000800
+#define EP7312_INTR1_URXINT1 0x00001000
+#define EP7312_INTR1_UTXINT1 0x00002000
+#define EP7312_INTR1_UMSINT  0x00004000
+#define EP7312_INTR1_SSEOTI  0x00008000
+
+/* INTR2 (Interrupt 2) mask/status register bits */
+#define EP7312_INTR2_KBDINT  0x00000001
+#define EP7312_INTR2_SS2RX   0x00000002
+#define EP7312_INTR2_SS2TX   0x00000004
+#define EP7312_INTR2_URXINT2 0x00001000
+#define EP7312_INTR2_UTXINT2 0x00002000
+
+/* INTR3 (Interrupt 3) mask/status register bits */
+#define EP7312_INTR2_DAIINT  0x00000001
+
+#endif /* __EP7312_H__ */
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/.cvsignore	2002-11-07 19:39:27.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/Makefile.am	2002-11-07 19:38:52.000000000 -0600
@@ -0,0 +1,50 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+VPATH = @srcdir@:@srcdir@/../../shared/irq
+
+PGM = $(ARCH)/irq.rel
+
+C_FILES = irq.c bsp_irq_init.c irq_init.c
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+S_FILES = bsp_irq_asm.S irq_asm.S
+S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.o)
+
+include_HEADERS = irq.h
+
+OBJS = $(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+AM_CPPFLAGS += -I$(srcdir)
+
+$(PROJECT_INCLUDE):
+	$(mkinstalldirs) $@
+
+$(PROJECT_INCLUDE)/%.h: %.h
+	$(INSTALL_DATA) $< $@
+
+PREINSTALL_FILES = $(PROJECT_INCLUDE) $(include_HEADERS:%=$(PROJECT_INCLUDE)/%)
+
+$(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 = bsp_irq_asm.S bsp_irq_init.c irq.c
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S my_rtems/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_asm.S	2002-11-07 19:38:41.000000000 -0600
@@ -0,0 +1,329 @@
+/*
+ * Cirrus EP7312 Intererrupt handler
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ *
+ *  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: $
+*/
+#define __asm__
+#include "irq.h"
+	
+#define VECTOR_TABLE 0x40
+	
+/* 
+ * Function to obtain, execute an IT handler and acknowledge the IT 
+ */
+
+	.globl ExecuteITHandler
+ExecuteITHandler :
+/*
+ * Look at interrupt status register to determine source.
+ * From source, determine offset into expanded vector table
+ * and load handler address into r0.
+ */
+
+  ldr   r1, =0x80000000 /* close to interrupt status/mask registers 1 */
+  ldr   r2, =0x80001000 /* close to interrupt status/mask registers 2 */
+  ldr   r3, =0x80002000 /* close to interrupt status/mask registers 3 */
+
+  stmdb	  sp!,{r4, r5, r6}
+
+/*
+ * INTSR3
+ */
+check_dai:
+  ldr   r4, [r3, #0x240]
+  ldr   r5, [r3, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+  tst   r6, #0x0001
+  beq   check_extfiq
+  ldr	r0, =(VECTOR_TABLE + (4 * 21)) /* load the vector number */
+  b     get_handler
+
+/*
+ * INTSR1
+ */
+check_extfiq:
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+  tst   r6, #0x0001
+  beq   check_bl
+  ldr	r0, =(VECTOR_TABLE + (4 * 0)) /* load the vector number */
+  b     get_handler
+
+check_bl:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0002
+  beq   check_we
+  ldr	r0, =(VECTOR_TABLE + (4 * 1)) /* load the vector number */
+  b     get_handler
+
+check_we:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0004
+  beq   check_mc
+  ldr	r0, =(VECTOR_TABLE + (4 * 2)) /* load the vector number */
+  b     get_handler
+
+check_mc:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0008
+  beq   check_cs
+  ldr	r0, =(VECTOR_TABLE + (4 * 3)) /* load the vector number */
+  b     get_handler
+
+check_cs:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0010
+  beq   check_e1
+  ldr	r0, =(VECTOR_TABLE + (4 * 4)) /* load the vector number */
+  b     get_handler
+
+check_e1:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0020
+  beq   check_e2
+  ldr	r0, =(VECTOR_TABLE + (4 * 5)) /* load the vector number */
+  b     get_handler
+
+check_e2:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0040
+  beq   check_e3
+  ldr	r0, =(VECTOR_TABLE + (4 * 6)) /* load the vector number */
+  b     get_handler
+
+check_e3:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0080
+  beq   check_tc1
+  ldr	r0, =(VECTOR_TABLE + (4 * 7)) /* load the vector number */
+  b     get_handler
+
+check_tc1:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0100
+  beq   check_tc2
+  ldr	r0, =(VECTOR_TABLE + (4 * 8)) /* load the vector number */
+  b     get_handler
+
+check_tc2:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0200
+  beq   check_rtc
+  ldr	r0, =(VECTOR_TABLE + (4 * 9)) /* load the vector number */
+  b     get_handler
+
+check_rtc:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0400
+  beq   check_tick
+  ldr	r0, =(VECTOR_TABLE + (4 * 10)) /* load the vector number */
+  b     get_handler
+
+check_tick:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0800
+  beq   check_utx1
+  ldr	r0, =(VECTOR_TABLE + (4 * 11)) /* load the vector number */
+  b     get_handler
+
+check_utx1:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x1000
+  beq   check_urx1
+  ldr	r0, =(VECTOR_TABLE + (4 * 12)) /* load the vector number */
+  b     get_handler
+
+check_urx1:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x2000
+  beq   check_ums
+  ldr	r0, =(VECTOR_TABLE + (4 * 13)) /* load the vector number */
+  b     get_handler
+
+check_ums:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x4000
+  beq   check_sse
+  ldr	r0, =(VECTOR_TABLE + (4 * 14)) /* load the vector number */
+  b     get_handler
+
+check_sse:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r1, #0x240]
+  ldr   r5, [r1, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x8000
+  beq   check_kbd
+  ldr	r0, =(VECTOR_TABLE + (4 * 15)) /* load the vector number */
+  b     get_handler
+
+/*
+ * INTSR2
+ */
+check_kbd:
+  ldr   r4, [r2, #0x240]
+  ldr   r5, [r2, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+  tst   r6, #0x0001
+  beq   check_ss2rx
+  ldr	r0, =(VECTOR_TABLE + (4 * 16)) /* load the vector number */
+  b     get_handler
+
+check_ss2rx:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r2, #0x240]
+  ldr   r5, [r2, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0002
+  beq   check_ss2tx
+  ldr	r0, =(VECTOR_TABLE + (4 * 17)) /* load the vector number */
+  b     get_handler
+
+check_ss2tx:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r2, #0x240]
+  ldr   r5, [r2, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x0004
+  beq   check_utx2
+  ldr	r0, =(VECTOR_TABLE + (4 * 18)) /* load the vector number */
+  b     get_handler
+
+check_utx2:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r2, #0x240]
+  ldr   r5, [r2, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x1000
+  beq   check_urx2
+  ldr	r0, =(VECTOR_TABLE + (4 * 19)) /* load the vector number */
+  b     get_handler
+
+check_urx2:
+#if 0
+MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES
+  ldr   r4, [r2, #0x240]
+  ldr   r5, [r2, #0x280]
+  and   r6, r4, r5 /* only look at interrupts which are enabled */
+#endif
+  tst   r6, #0x2000
+  beq   IRQ_NoInterrupt
+  ldr	r0, =(VECTOR_TABLE + (4 * 20)) /* load the vector number */
+  b     get_handler
+
+get_handler:
+
+  ldmia	  sp!,{r4, r5, r6}
+
+  ldr	r0, [r0]		/* extract the IT handler @ */
+
+  /*
+   * re-enable interrupts at processor level as the current
+   * interrupt source is now masked via VEGA logic
+   */
+/*
+  mrs	r1, cpsr
+  and	r1, r1, #0xFFFFFF3F
+  msr	cpsr, r1
+*/
+
+  stmdb	  sp!,{lr}
+  ldr     lr, =IRQ_return         /* prepare the return from handler  */
+
+  mov     pc, r0			/* EXECUTE INT HANDLER */
+
+IRQ_return:
+  ldmia sp!,{lr}
+
+IRQ_NoInterrupt:
+  /* return to the "main" interrupt handler */
+  mov pc, lr
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c my_rtems/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/bsp_irq_init.c	2002-11-07 19:38:47.000000000 -0600
@@ -0,0 +1,117 @@
+/*
+ * Cirrus EP7312 Intererrupt handler
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ *
+ *  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 <irq.h>
+#include <bsp.h>
+#include <ep7312.h>
+
+extern void default_int_handler();
+
+void BSP_rtems_irq_mngt_init()
+{
+	long int_stat;
+
+	/* mask all interrupts */
+	*EP7312_INTMR1 = 0x0;
+	*EP7312_INTMR2 = 0x0;
+	*EP7312_INTMR3 = 0x0;
+
+	/* clear all pending interrupt status' */
+	int_stat = *EP7312_INTSR1;
+	if(int_stat & EP7312_INTR1_EXTFIQ)
+	{
+	}
+	if(int_stat & EP7312_INTR1_BLINT)
+	{
+		*EP7312_BLEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_WEINT)
+	{
+            *EP7312_TEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_MCINT)
+	{
+	}
+	if(int_stat & EP7312_INTR1_CSINT)
+	{
+		*EP7312_COEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_EINT1)
+	{
+	}
+	if(int_stat & EP7312_INTR1_EINT2)
+	{
+	}
+	if(int_stat & EP7312_INTR1_EINT3)
+	{
+	}
+	if(int_stat & EP7312_INTR1_TC1OI)
+	{
+            *EP7312_TC1EOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_TC2OI)
+	{
+            *EP7312_TC2EOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_RTCMI)
+	{
+            *EP7312_RTCEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_TINT)
+	{
+            *EP7312_TEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_URXINT1)
+	{
+	}
+	if(int_stat & EP7312_INTR1_UTXINT1)
+	{
+	}
+	if(int_stat & EP7312_INTR1_UMSINT)
+	{
+            *EP7312_UMSEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR1_SSEOTI)
+	{
+            *EP7312_SYNCIO;
+	}
+	int_stat = *EP7312_INTSR1;
+
+	int_stat = *EP7312_INTSR2;
+	if(int_stat & EP7312_INTR2_KBDINT)
+	{
+            *EP7312_KBDEOI = 0xFFFFFFFF;
+	}
+	if(int_stat & EP7312_INTR2_SS2RX)
+	{
+	}
+	if(int_stat & EP7312_INTR2_SS2TX)
+	{
+	}
+	if(int_stat & EP7312_INTR2_URXINT2)
+	{
+	}
+	if(int_stat & EP7312_INTR2_UTXINT2)
+	{
+	}
+	int_stat = *EP7312_INTSR2;
+
+	int_stat = *EP7312_INTSR3;
+	if(int_stat & EP7312_INTR2_DAIINT)
+	{
+	}
+	int_stat = *EP7312_INTSR3;
+}
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/irq.c my_rtems/c/src/lib/libbsp/arm/edb7312/irq/irq.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/irq.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/irq.c	2002-11-07 19:38:42.000000000 -0600
@@ -0,0 +1,155 @@
+/*
+ * Cirrus EP7312 Intererrupt handler
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ *
+ *  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 <irq.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/apiext.h>
+#include <ep7312.h>
+
+/*
+ * This function check that the value given for the irq line
+ * is valid.
+ */
+
+static int isValidInterrupt(int irq)
+{
+  if ( (irq < 0) || (irq > BSP_MAX_INT))
+    return 0;
+  return 1;
+}
+
+/*
+ * -------------------- RTEMS Single Irq Handler Mngt Routines ----------------
+ */
+
+int BSP_install_rtems_irq_handler  (const rtems_irq_connect_data* irq)
+{
+    rtems_irq_hdl *HdlTable;
+    rtems_interrupt_level level;
+    
+    if (!isValidInterrupt(irq->name)) {
+      return 0;
+    }
+    /*
+     * Check if default handler is actually connected. If not issue an error.
+     */
+    HdlTable = (rtems_irq_hdl *) VECTOR_TABLE;
+    if (*(HdlTable + irq->name) != default_int_handler) {
+      return 0;
+    }
+    
+    _CPU_ISR_Disable(level);
+
+    /*
+     * store the new handler
+     */
+    *(HdlTable + irq->name) = irq->hdl;
+
+    /*
+     * unmask interrupt
+     */
+    if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI)
+    {
+        /* interrupt managed by INTMR1 and INTSR1 */
+        *EP7312_INTMR1 |= (1 << irq->name);
+    }
+    else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX)
+    {
+        /* interrupt managed by INTMR2 and INTSR2 */
+        *EP7312_INTMR2 |= (1 << (irq->name - 16));
+    }
+    else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2)
+    {
+        /* interrupt managed by INTMR2 and INTSR2 */
+        *EP7312_INTMR2 |= (1 << (irq->name - 7));
+    }
+    else if(irq->name == BSP_DAIINT)
+    {
+        /* interrupt managed by INTMR3 and INTSR3 */
+        *EP7312_INTMR3 |= (1 << (irq->name - 21));
+    }
+    
+    /*
+     * Enable interrupt on device
+     */
+    if(irq->on)
+    {
+    	irq->on(irq);
+    }
+    
+    _CPU_ISR_Enable(level);
+    
+    return 1;
+}
+
+int BSP_remove_rtems_irq_handler  (const rtems_irq_connect_data* irq)
+{
+    rtems_irq_hdl *HdlTable;
+    rtems_interrupt_level level;
+  
+    if (!isValidInterrupt(irq->name)) {
+      return 0;
+    }
+    /*
+     * Check if the handler is actually connected. If not issue an error.
+     */
+    HdlTable = (rtems_irq_hdl *) VECTOR_TABLE;
+    if (*(HdlTable + irq->name) != irq->hdl) {
+      return 0;
+    }
+    _CPU_ISR_Disable(level);
+
+    /*
+     * mask interrupt
+     */
+    if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI)
+    {
+        /* interrupt managed by INTMR1 and INTSR1 */
+        *EP7312_INTMR1 &= ~(1 << irq->name);
+    }
+    else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX)
+    {
+        /* interrupt managed by INTMR2 and INTSR2 */
+        *EP7312_INTMR2 &= ~(1 << (irq->name - 16));
+    }
+    else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2)
+    {
+        /* interrupt managed by INTMR2 and INTSR2 */
+        *EP7312_INTMR2 &= ~(1 << (irq->name - 7));
+    }
+    else if(irq->name == BSP_DAIINT)
+    {
+        /* interrupt managed by INTMR3 and INTSR3 */
+        *EP7312_INTMR3 &= ~(1 << (irq->name - 21));
+    }
+    
+    /*
+     * Disable interrupt on device
+     */
+    if(irq->off)
+        irq->off(irq);
+    
+    /*
+     * restore the default irq value
+     */
+    *(HdlTable + irq->name) = default_int_handler;
+    
+    _CPU_ISR_Enable(level);
+
+    return 1;
+}
+
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/irq.h my_rtems/c/src/lib/libbsp/arm/edb7312/irq/irq.h
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/irq/irq.h	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/irq/irq.h	2002-11-07 19:39:05.000000000 -0600
@@ -0,0 +1,195 @@
+/*
+ * Cirrus EP7312 Intererrupt handler
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ *
+ *  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: $
+*/
+
+#ifndef __IRQ_H__
+#define __IRQ_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  /* define that can be useful (the values are just examples) */
+#define VECTOR_TABLE	 0x40
+
+#ifndef __asm__
+
+/*
+ * Include some preprocessor value also used by assember code
+ */
+  
+#include <rtems.h>
+
+extern void default_int_handler();
+/*-------------------------------------------------------------------------+
+| Constants
++--------------------------------------------------------------------------*/
+
+  /* enum of the possible interrupt sources */
+typedef enum {
+  /* int interrupt status/mask register 1 */
+  BSP_EXTFIQ = 0,
+  BSP_BLINT,
+  BSP_WEINT,
+  BSP_MCINT,
+  BSP_CSINT,
+  BSP_EINT1,
+  BSP_EINT2,
+  BSP_EINT3,
+  BSP_TC1OI,
+  BSP_TC2OI,
+  BSP_RTCMI,
+  BSP_TINT,
+  BSP_UTXINT1,
+  BSP_URXINT1,
+  BSP_UMSINT,
+  BSP_SSEOTI,
+  /* int interrupt status/mask register 2 */
+  BSP_KBDINT,
+  BSP_SS2RX,
+  BSP_SS2TX,
+  BSP_UTXINT2,
+  BSP_URXINT2,
+  /* int interrupt status/mask register 3 */
+  BSP_DAIINT,
+  BSP_MAX_INT,
+} rtems_irq_symbolic_name;
+
+
+  
+/*
+ * Type definition for RTEMS managed interrupts
+ */
+typedef unsigned char  rtems_irq_level;
+typedef unsigned char  rtems_irq_trigger;
+
+struct 	__rtems_irq_connect_data__;	/* forward declaratiuon */
+
+typedef void (*rtems_irq_hdl)		(void);
+typedef void (*rtems_irq_enable) (const struct __rtems_irq_connect_data__*);
+typedef void (*rtems_irq_disable) (const struct __rtems_irq_connect_data__*);
+typedef int  (*rtems_irq_is_enabled)(const struct __rtems_irq_connect_data__*);
+
+typedef struct __rtems_irq_connect_data__ {
+  /*
+   * IRQ line
+   */
+  rtems_irq_symbolic_name 	name;
+  /*
+   * handler. See comment on handler properties below in function prototype.
+   */
+  rtems_irq_hdl	   		hdl;
+  /*
+   * function for enabling interrupts at device level (ONLY!).
+   * The BSP code will automatically enable it at i8259s level.
+   * RATIONALE : anyway such code has to exist in current driver code.
+   * It is usually called immediately AFTER connecting the interrupt handler.
+   * RTEMS may well need such a function when restoring normal interrupt
+   * processing after a debug session.
+   * 
+   */
+    rtems_irq_enable		on;	
+  /*
+   * function for disabling interrupts at device level (ONLY!).
+   * The code will disable it at i8259s level. RATIONALE : anyway
+   * such code has to exist for clean shutdown. It is usually called
+   * BEFORE disconnecting the interrupt. RTEMS may well need such
+   * a function when disabling normal interrupt processing for
+   * a debug session. May well be a NOP function.
+   */
+  rtems_irq_disable		off;
+  /*
+   * function enabling to know what interrupt may currently occur
+   * if someone manipulates the i8259s interrupt mask without care...
+   */
+    rtems_irq_is_enabled	isOn;
+  /*
+   * priority level at the vplus level
+   */
+  rtems_irq_level		irqLevel;
+  /*
+   * Trigger way : Rising or falling edge or High or low level
+   */
+  rtems_irq_trigger		irqTrigger;
+} rtems_irq_connect_data;
+
+/*-------------------------------------------------------------------------+
+| Function Prototypes.
++--------------------------------------------------------------------------*/
+/*
+ * ------------------- RTEMS Single Irq Handler Mngt Routines ----------------
+ */
+
+/*
+ * function to initialize the interrupt for a specific BSP
+ */
+void BSP_rtems_irq_mngt_init();
+
+
+/*
+ * function to connect a particular irq handler. This hanlder will NOT be called
+ * directly as the result of the corresponding interrupt. Instead, a RTEMS
+ * irq prologue will be called that will :
+ *
+ *	1) save the C scratch registers,
+ *	2) switch to a interrupt stack if the interrupt is not nested,
+ *	3) store the current i8259s' interrupt masks
+ *	4) modify them to disable the current interrupt at 8259 level (and may
+ *	be others depending on software priorities)
+ *	5) aknowledge the i8259s',
+ *	6) demask the processor,
+ *	7) call the application handler
+ *
+ * As a result the hdl function provided
+ *
+ *	a) can perfectly be written is C,
+ * 	b) may also well directly call the part of the RTEMS API that can be used
+ *	from interrupt level,
+ *	c) It only responsible for handling the jobs that need to be done at
+ *	the device level including (aknowledging/re-enabling the interrupt at device,
+ *	level, getting the data,...)
+ *
+ *	When returning from the function, the following will be performed by
+ *	the RTEMS irq epilogue :
+ *
+ *	1) masks the interrupts again,
+ *	2) restore the original i8259s' interrupt masks
+ *	3) switch back on the orinal stack if needed,
+ *	4) perform rescheduling when necessary,
+ *	5) restore the C scratch registers...
+ *	6) restore initial execution flow
+ * 
+ */
+
+int BSP_install_rtems_irq_handler   	(const rtems_irq_connect_data*);
+/*
+ * function to get the current RTEMS irq handler for ptr->name. It enables to
+ * define hanlder chain...
+ */
+int BSP_get_current_rtems_irq_handler	(rtems_irq_connect_data* ptr);
+/*
+ * function to get disconnect the RTEMS irq handler for ptr->name.
+ * This function checks that the value given is the current one for safety reason.
+ * The user can use the previous function to get it.
+ */
+int BSP_remove_rtems_irq_handler    	(const rtems_irq_connect_data*);
+
+#endif /* __asm__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __IRQ_H__ */
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/network/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/network/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/network/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/network/Makefile.am	2002-11-07 19:39:01.000000000 -0600
@@ -0,0 +1,45 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+PGM = $(ARCH)/network.rel
+
+C_FILES = network.c 
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+include_HEADERS = 
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+AM_CPPFLAGS += -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
+
+$(PROJECT_INCLUDE):
+	$(mkinstalldirs) $@
+
+$(PROJECT_INCLUDE)/%.h: %.h
+	$(INSTALL_DATA) $< $@
+
+PREINSTALL_FILES = $(PROJECT_INCLUDE) \
+    $(include_HEADERS:%=$(PROJECT_INCLUDE)/%)
+
+$(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 = network.c 
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/network/network.c my_rtems/c/src/lib/libbsp/arm/edb7312/network/network.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/network/network.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/network/network.c	2002-11-07 19:38:57.000000000 -0600
@@ -0,0 +1,125 @@
+#include <rtems.h>
+#include <sys/mbuf.h>
+#include <irq.h>
+#include <libchip/cs8900.h>
+
+#define CS8900_BASE 0x20000300
+unsigned int bsp_cs8900_io_base = 0;
+unsigned int bsp_cs8900_memory_base = 0;
+cs8900_device *g_cs;
+rtems_irq_hdl cs8900_isr(rtems_vector_number v);
+rtems_irq_connect_data cs8900_isr_data = {BSP_EINT3,
+                                         (rtems_irq_hdl)cs8900_isr,
+                                         NULL,
+                                         NULL,
+                                         NULL,
+                                         0,
+                                         0 };
+
+char g_enetbuf[1520];
+
+rtems_irq_hdl cs8900_isr(rtems_vector_number v)
+{
+    cs8900_interrupt(v, g_cs);
+}
+
+/* cs8900_io_set_reg - set one of the I/O addressed registers */
+void cs8900_io_set_reg (int dev, unsigned short reg, unsigned short data)
+{
+    /* works the same for all values of dev */
+/*
+    printf("cs8900_io_set_reg: reg: %#6x, val %#6x\n", 
+           CS8900_BASE + reg, 
+           data);
+*/
+   *(unsigned short *)(CS8900_BASE + reg) = data;
+}
+
+/* cs8900_io_get_reg - reads one of the I/O addressed registers */
+unsigned short cs8900_io_get_reg (int dev, unsigned short reg)
+{
+    unsigned short val;
+    /* works the same for all values of dev */
+    val = *(unsigned short *)(CS8900_BASE + reg);
+/*
+    printf("cs8900_io_get_reg: reg: %#6x, val %#6x\n", reg, val);
+*/
+    return val;
+}
+
+/* cs8900_mem_set_reg - sets one of the registers mapped through 
+ *                      PacketPage
+ */
+void cs8900_mem_set_reg (int dev, unsigned long reg, unsigned short data)
+{
+    /* works the same for all values of dev */
+    cs8900_io_set_reg(dev, CS8900_IO_PACKET_PAGE_PTR, reg);
+    cs8900_io_set_reg(dev, CS8900_IO_PP_DATA_PORT0, data);
+}
+
+/* cs8900_mem_get_reg - reads one of the registers mapped through 
+ *                      PacketPage
+ */
+unsigned short cs8900_mem_get_reg (int dev, unsigned long reg)
+{
+    /* works the same for all values of dev */
+    cs8900_io_set_reg(dev, CS8900_IO_PACKET_PAGE_PTR, reg);
+    return cs8900_io_get_reg(dev, CS8900_IO_PP_DATA_PORT0);
+}
+
+void cs8900_get_mac_addr (int dev, unsigned char *mac_address)
+{
+    mac_address[0] = 0x08;
+    mac_address[1] = 0x00;
+    mac_address[2] = 0x3e;
+    mac_address[3] = 0x21;
+    mac_address[4] = 0xc7;
+    mac_address[5] = 0xf7;
+}
+
+void cs8900_attach_interrupt (int dev, cs8900_device *cs)
+{
+    g_cs = cs;
+    BSP_install_rtems_irq_handler(&cs8900_isr_data);
+}
+
+void cs8900_detach_interrupt (int dev)
+{
+    BSP_remove_rtems_irq_handler(&cs8900_isr_data);
+}
+
+unsigned short cs8900_get_data_block (int dev, unsigned char *data)
+{
+    int len;
+    int i;
+
+    len = cs8900_mem_get_reg(dev, CS8900_PP_RxLength);
+
+    for (i = 0; i < ((len + 1) / 2); i++) {
+        ((short *)data)[i] = cs8900_io_get_reg(dev, 
+                                               CS8900_IO_RX_TX_DATA_PORT0);
+    }
+    return len;
+}
+
+void cs8900_tx_load (int dev, struct mbuf *m)
+{
+    int len;
+    short *data;
+    int i;
+
+    len = 0;
+
+    do {
+        memcpy(&g_enetbuf[len], mtod(m, const void *), m->m_len);
+        len += m->m_len;
+        m = m->m_next;
+    } while (m != 0);
+    
+    data = (unsigned short *) &g_enetbuf[0];
+    for (i = 0; i < ((len + 1) / 2); i++) {
+        cs8900_io_set_reg(dev, 
+                          CS8900_IO_RX_TX_DATA_PORT0,
+                          data[i]);
+    }
+}
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/start/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/start/.cvsignore	2002-11-07 19:38:51.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/start/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/start/Makefile.am	2002-11-07 19:38:42.000000000 -0600
@@ -0,0 +1,35 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+PGMS = $(ARCH)/start.o
+
+S_FILES = start.S
+S_O_FILES = $(S_FILES:%.S=$(ARCH)/%.$(OBJEXT))
+
+OBJS = $(S_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+bsplib_DATA = $(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT)
+
+$(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT): $(ARCH)/start.$(OBJEXT)
+	$(INSTALL_DATA) $< $@
+
+TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/start$(LIB_VARIANT).$(OBJEXT)
+
+all-local: $(ARCH) $(OBJS) $(ARCH)/start.$(OBJEXT) $(TMPINSTALL_FILES)
+
+.PRECIOUS: $(ARCH)/start.$(OBJEXT)
+
+EXTRA_DIST = start.S
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/start.S my_rtems/c/src/lib/libbsp/arm/edb7312/start/start.S
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/start/start.S	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/start/start.S	2002-11-07 19:39:02.000000000 -0600
@@ -0,0 +1,170 @@
+/*
+ * Cirrus EP7312 Startup code
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ * Copyright (c) 2002 by Charlie Steader <charlies at poliac.com>
+ *
+ *  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: $
+*/
+
+		
+/* Some standard definitions...*/
+
+.equ Mode_USR,        	     0x10
+.equ Mode_FIQ,        	     0x11
+.equ Mode_IRQ,        	     0x12
+.equ Mode_SVC,        	     0x13
+.equ Mode_ABT,        	     0x17
+.equ Mode_ABORT,             0x17
+.equ Mode_UNDEF,      	     0x1B
+.equ Mode_SYS,        	     0x1F /*only available on ARM Arch. v4*/
+
+.equ I_Bit,           	     0x80
+.equ F_Bit,           	     0x40
+
+
+	.text
+	.globl	_start
+
+	 
+_start:
+	/* store the sp */
+	mov	r12, sp
+/*
+ * Here is the code to initialize the low-level BSP environment
+ * (Chip Select, PLL, ....?)
+
+	
+/* zero the bss */
+        LDR     r1, =_bss_end_       /* get end of ZI region */
+        LDR     r0, =_bss_start_     /* load base address of ZI region */
+
+zi_init:	
+        MOV     r2, #0
+        CMP     r0, r1		       /* loop whilst r0 < r1 */
+        STRLOT   r2, [r0], #4
+        BLO     zi_init 
+	
+/* Load basic ARM7 interrupt table */
+VectorInit:	
+	MOV	R0, #0
+	ADR	R1, Vector_Init_Block
+	LDMIA	R1!, {R2, r3}	/* Copy the Vectors (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the Vectors (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the Vectors (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the Vectors (8 words) */
+	STMIA	R0!, {r2, r3}
+
+	LDMIA	R1!, {R2, r3}	/* Copy the .long'ed addresses (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the .long'ed addresses (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the .long'ed addresses (8 words) */
+	STMIA	R0!, {r2, r3}
+	LDMIA	R1!, {R2, r3}	/* Copy the .long'ed addresses (8 words) */
+	STMIA	R0!, {r2, r3}
+
+	B	init2
+
+/*******************************************************
+ standard exception vectors table
+ *** Must be located at address 0 
+********************************************************/	 
+
+Vector_Init_Block:	
+	LDR	PC, Reset_Addr
+	LDR	PC, Undefined_Addr
+	LDR	PC, SWI_Addr
+	LDR	PC, Prefetch_Addr
+	LDR	PC, Abort_Addr
+	NOP
+	LDR	PC, IRQ_Addr
+	LDR	PC, FIQ_Addr
+
+	.globl Reset_Addr
+Reset_Addr:	.long   _start 
+Undefined_Addr:	.long	Undefined_Handler
+SWI_Addr:	.long	SWI_Handler
+Prefetch_Addr:	.long	Prefetch_Handler
+Abort_Addr:	.long	Abort_Handler
+		.long	0	
+IRQ_Addr:	.long	IRQ_Handler
+FIQ_Addr:	.long	FIQ_Handler
+	
+/* The following handlers do not do anything useful */
+	.globl Undefined_Handler
+Undefined_Handler:	
+        B       Undefined_Handler
+	.globl SWI_Handler
+SWI_Handler:	
+        B       SWI_Handler 
+	.globl Prefetch_Handler
+Prefetch_Handler:	
+        B       Prefetch_Handler
+	.globl Abort_Handler
+Abort_Handler:	
+        B       Abort_Handler
+	.globl IRQ_Handler
+IRQ_Handler:	
+        B       IRQ_Handler
+	.globl FIQ_Handler
+FIQ_Handler:	
+        B       FIQ_Handler
+
+init2 :	
+/* --- Initialise stack pointer registers
+	
+/* Enter IRQ mode and set up the IRQ stack pointer */
+    MOV     r0, #Mode_IRQ | I_Bit | F_Bit     /* No interrupts */
+    MSR     cpsr, r0
+    ldr	    r1, =_irq_stack_size
+    LDR     sp, =_irq_stack
+    add	    sp, sp, r1
+    sub     sp, sp, #0x64	
+
+/* Enter FIQ mode and set up the FIQ stack pointer */
+    MOV     r0, #Mode_FIQ | I_Bit | F_Bit     /* No interrupts */
+    MSR     cpsr, r0
+    ldr	    r1, =_fiq_stack_size
+    LDR     sp, =_fiq_stack
+    add	    sp, sp, r1
+    sub     sp, sp, #0x64	
+
+/* Enter ABT mode and set up the ABT stack pointer */
+    MOV     r0, #Mode_ABT | I_Bit | F_Bit     /* No interrupts */
+    MSR     cpsr, r0
+    ldr	    r1, =_abt_stack_size
+    LDR     sp, =_abt_stack
+    add	    sp, sp, r1
+    sub     sp, sp, #0x64	
+	
+/* Set up the SVC stack pointer last and stay in SVC mode */
+    MOV     r0, #Mode_SVC | I_Bit | F_Bit     /* No interrupts */
+    MSR     cpsr, r0
+    ldr	    r1, =_svc_stack_size
+    LDR     sp, =_svc_stack
+    add	    sp, sp, r1
+    sub     sp, sp, #0x64	
+
+	/* save the original registers */
+	stmdb	sp!, {r4-r12, lr}
+
+/* --- Now we enter the C code */
+
+    bl	boot_card
+
+	ldmia	sp!, {r4-r12, lr}
+	mov	sp, r12
+	mov	pc, lr
+
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/startup/.cvsignore	2002-11-07 19:38:56.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/startup/Makefile.am	2002-11-07 19:39:07.000000000 -0600
@@ -0,0 +1,40 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+VPATH = @srcdir@:@srcdir@/../../../shared
+
+PGM = $(ARCH)/startup.rel
+
+C_FILES = bsplibc.c bsppost.c bspstart.c exit.c bootcard.c main.c sbrk.c \
+    gnatinstallhandler.c
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+$(PGM): $(OBJS)
+	$(make-rel)
+
+$(PROJECT_RELEASE)/lib/linkcmds: linkcmds
+	$(INSTALL_DATA) $< $@
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/linkcmds
+
+all-local: $(ARCH) $(OBJS) $(PGM) $(TMPINSTALL_FILES)
+
+.PRECIOUS: $(PGM)
+
+EXTRA_DIST = bspstart.c exit.c linkcmds
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c my_rtems/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/startup/bspstart.c	2002-11-07 19:38:36.000000000 -0600
@@ -0,0 +1,188 @@
+/*
+ * Cirrus EP7312 Startup code
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ *  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/libcsupport.h>
+#include <rtems/libio.h>
+#include <ep7312.h>
+#include <uart.h>
+
+/*************************************************************/
+/* Macros                                                    */
+/*************************************************************/
+
+/*************************************************************/
+/* Data Structures                                           */
+/*************************************************************/
+
+/*************************************************************/
+/* Global Variables                                          */
+/*************************************************************/
+extern void            *_flash_size;
+extern void            *_flash_base;
+extern void            *_sdram_size;
+extern void            *_sdram_base;
+extern void            *_bss_free_start;
+
+unsigned long           free_mem_start;
+unsigned long           free_mem_end;
+
+/* The original BSP configuration table from the application and our copy of it
+   with some changes. */
+
+extern rtems_configuration_table  Configuration;
+       rtems_configuration_table  BSP_Configuration;
+
+rtems_cpu_table Cpu_table;                    /* CPU configuration table.    */
+char            *rtems_progname;              /* Program name - from main(). */
+
+/*************************************************************/
+/* Function prototypes                                       */
+/*************************************************************/
+extern void rtems_irq_mngt_init(void);
+void bsp_libc_init( void *, unsigned32, int );
+void bsp_postdriver_hook(void);
+
+/**************************************************************************/
+/*                                                                        */
+/* NAME: bps_pretasking_hook - Function to setup system before startup    */
+/*                                                                        */
+/* DESCRIPTION:                                                           */
+/*   This function is called before drivers are initialized and used      */
+/*   to setup libc and BSP extensions. It configures non cacheable        */
+/*   SDRAM, SRAM, AIM, and ADM regions and sets up the CPU's memory       */
+/*   protection unit.                                                     */
+/*                                                                        */
+/* GLOBALS USED:                                                          */
+/*   free_mem_start                                                 */
+/*   free_mem_end                                                   */
+/*                                                                        */
+/* RESTRICTIONS/LIMITATIONS:                                              */
+/*   Since this function is setting up libc, it cannot use and libc       */
+/*   functions.                                                           */
+/*                                                                        */
+/**************************************************************************/
+void bsp_pretasking_hook(void)
+{
+    unsigned32 heap_start;
+    unsigned32 heap_size;
+
+
+    /* 
+     * Set up the heap. It uses all free SDRAM except that reserved
+     * for non-cached uses.
+     */
+    heap_start =  free_mem_start;
+    
+    /*   heap_size = (free_mem_end - heap_start - MEM_NOCACHE_SIZE); */
+    heap_size = 0x200000;
+
+    bsp_libc_init((void *)heap_start, heap_size, 0);
+
+#ifdef RTEMS_DEBUG
+
+  rtems_debug_enable(RTEMS_DEBUG_ALL_MASK);
+
+#endif /* RTEMS_DEBUG */
+
+} /* bsp_pretasking_hook */
+ 
+
+/**************************************************************************/
+/*                                                                        */
+/* NAME: bsp_start_default - BSP initialization function                  */
+/*                                                                        */
+/* DESCRIPTION:                                                           */
+/*   This function is called before RTEMS is initialized and used         */
+/*   adjust the kernel's configuration.                                   */
+/*                                                                        */
+/*   This function also configures the CPU's memory protection unit.      */
+/*                                                                        */
+/* GLOBALS USED:                                                          */
+/*    CPU_table                                                    */
+/*    BSP_Configuration                                            */
+/*    free_mem_start                                               */
+/*    free_mem_end                                                 */
+/*    free_mem_nocache_start                                       */
+/*    _bss_free_start                                              */
+/*    mpu_region_tbl                                               */
+/*                                                                        */
+/*                                                                        */
+/*                                                                        */
+/*                                                                        */
+/* RESTRICTIONS/LIMITATIONS:                                              */
+/*   Since RTEMS is not configured, no RTEMS functions can be called.     */
+/*                                                                        */
+/**************************************************************************/
+void bsp_start_default( void )
+{
+    int i;
+
+    /* disable interrupts */
+    *EP7312_INTMR1 = 0;
+    *EP7312_INTMR2 = 0;
+    Cpu_table.pretasking_hook        = bsp_pretasking_hook;
+    Cpu_table.postdriver_hook        = bsp_postdriver_hook;
+    Cpu_table.do_zero_of_workspace   = TRUE;
+    
+    /* Place RTEMS workspace at beginning of free memory. */
+    BSP_Configuration.work_space_start = (void *)&_bss_free_start;
+    
+    free_mem_start = ((unsigned32)&_bss_free_start + 
+                      BSP_Configuration.work_space_size);
+    
+    free_mem_end = ((unsigned32)&_sdram_base + (unsigned32)&_sdram_size);
+    
+    /*
+     * Init rtems exceptions management
+     */
+    rtems_exception_init_mngt();
+    
+    /*
+     * Init rtems interrupt management
+     */
+    rtems_irq_mngt_init(); 
+    
+    
+    /*
+     *  The following information is very useful when debugging.
+     */
+#if 0
+    printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size );
+    printk( "maximum_extensions = 0x%x\n", BSP_Configuration.maximum_extensions );
+    printk( "microseconds_per_tick = 0x%x\n",
+            BSP_Configuration.microseconds_per_tick );
+    printk( "ticks_per_timeslice = 0x%x\n",
+            BSP_Configuration.ticks_per_timeslice );
+    printk( "maximum_devices = 0x%x\n", BSP_Configuration.maximum_devices );
+    printk( "number_of_device_drivers = 0x%x\n",
+            BSP_Configuration.number_of_device_drivers );
+    printk( "Device_driver_table = 0x%x\n",
+            BSP_Configuration.Device_driver_table );
+    
+    /*  printk( "_stack_size = 0x%x\n", _stack_size );*/
+    printk( "work_space_start = 0x%x\n", BSP_Configuration.work_space_start );
+    printk( "work_space_size = 0x%x\n", BSP_Configuration.work_space_size );
+#endif
+} /* bsp_start */
+
+
+
+
+/*
+ *  By making this a weak alias for bsp_start_default, a brave soul
+ *  can override the actual bsp_start routine used.
+ */
+
+void bsp_start (void) __attribute__ ((weak, alias("bsp_start_default")));
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/exit.c my_rtems/c/src/lib/libbsp/arm/edb7312/startup/exit.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/exit.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/startup/exit.c	2002-11-07 19:38:56.000000000 -0600
@@ -0,0 +1,40 @@
+/*
+ * Cirrus EP7312 BSP Shutdown  code
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ *  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 <stdio.h>
+#include <bsp.h>
+#include <rtems/bspIo.h>
+#include <rtems/libio.h>
+
+int uart_poll_read(int);
+
+void rtemsReboot (void)
+{
+  asm volatile ("b _start");
+}
+
+void bsp_cleanup(void)
+{
+  static   char line[]="\nEXECUTIVE SHUTDOWN! Any key to reboot...";
+  /*
+   * AT this point, the console driver is disconnected => we must
+   * use polled output/input. This is exactly what printk
+   * does.
+   */
+  printk("\n");
+  printk(line);
+  while (uart_poll_read(0) < 0) continue;
+
+  /* rtemsReboot(); */
+}
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/linkcmds my_rtems/c/src/lib/libbsp/arm/edb7312/startup/linkcmds
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/startup/linkcmds	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/startup/linkcmds	2002-11-07 19:38:49.000000000 -0600
@@ -0,0 +1,219 @@
+/*
+ * Cirrus EP7312 linker script
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ *  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: $
+*/
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
+	      "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+/* SEARCH_DIR(/usr/local/rtems-arm-dev-tools/arm-rtems/lib); */
+
+
+MEMORY {
+	sdram : ORIGIN = 0x00000000, LENGTH = 16M
+	regs  : ORIGIN = 0x80000000, LENGTH = 1M
+}
+
+/*
+ * Declare some sizes.
+ */
+
+_sdram_base = DEFINED(_sdram_base) ? _sdram_base : 0x00000000;
+_sdram_size = DEFINED(_sdram_size) ? _sdram_size : 16M;
+
+
+_irq_stack_size = DEFINED(_irq_stack_size) ? _irq_stack_size : 0x1000;
+_fiq_stack_size = DEFINED(_fiq_stack_size) ? _fiq_stack_size : 0x400;
+_abt_stack_size = DEFINED(_abt_stack_size) ? _abt_stack_size : 0;
+_svc_stack_size = DEFINED(_svc_stack_size) ? _svc_stack_size : 0x1000;
+
+
+
+/* Do we need any of these for elf?
+   __DYNAMIC = 0;    */
+
+SECTIONS
+{
+  .base :
+  {
+    _sram_base = .;
+    arm_exception_table = .;    
+
+    arm_reset_vect    = .;     /* 0x00 */
+    . += 4;
+
+    arm_undef_vect    = .;     /* 0x04 */
+    . += 4;
+
+    arm_swi_vect      = .;     /* 0x08 */
+    . += 4;
+
+    arm_iabrt_vect    = .;     /* 0x0c */
+    . += 4;
+
+    arm_dabrt_vect    = .;     /* 0x10 */
+    . += 4;
+
+    /* no vector here */
+    . += 4;
+
+    arm_irq_vect      = .;     /* 0x18 */
+    . += 4;
+
+    arm_fiq_vect      = .;     /* 0x1c */
+    . += 4;
+			      /* FIXME: */
+    fiq_vect_table    = .;    /* this and irq_vector_table should be swapped */
+    . += (32 * 4);
+
+    irq_vector_table = .;
+    . += (32 * 4);      
+
+  } > sdram
+
+  .init          : 
+  { 
+    KEEP (*(.init))
+  } > sdram   /*=0*/
+
+  .text      :
+  {
+	_text_start = .;
+	 CREATE_OBJECT_SYMBOLS
+	*(.text) 
+	*(.text.*)
+	*(.glue_7)
+	*(.glue_7t)
+
+	/* I think these come from the ld docs: */	
+	___CTOR_LIST__ = .;
+	LONG((___CTOR_END__ - ___CTOR_LIST__) / 4 - 2)
+	*(.ctors)
+	LONG(0)
+	___CTOR_END__ = .;
+	___DTOR_LIST__ = .;
+	LONG((___DTOR_END__ - ___DTOR_LIST__) / 4 - 2)
+	*(.dtors)
+	LONG(0)
+	___DTOR_END__ = .;
+
+	_etext = .;
+	PROVIDE (etext = .);
+  } > sdram  
+
+  .fini      :
+  {
+    KEEP (*(.fini))
+  } > sdram  /*=0*/
+
+  .data :
+  { 
+    *(.data)
+    *(.data.*)
+    *(.gnu.linkonce.d*)
+    SORT(CONSTRUCTORS)
+    _edata = .;
+  } > sdram 
+
+  .rodata :
+  {
+    *(.rodata)
+    *(.rodata.*)
+    *(.gnu.linkonce.r*)
+  } > sdram
+
+  .bss       :
+  {
+	_bss_start_ = .;
+	_clear_start = .;
+	*(.bss)
+	*(.bss.*)
+	*(COMMON)
+	. = ALIGN(64);
+	_clear_end = .;
+
+	. = ALIGN (256);
+	_abt_stack = .;
+	. += _abt_stack_size;
+
+	. = ALIGN (256);
+	_irq_stack = .;
+	. += _irq_stack_size;
+
+	. = ALIGN (256);
+	_fiq_stack = .;
+	. += _fiq_stack_size;
+
+	. = ALIGN (256);
+	_svc_stack = .;
+	. += _svc_stack_size;
+
+	_bss_end_ = .;
+	_end = .;
+	__end = .;
+
+
+	. = ALIGN (1024);
+	_bss_free_start = .;
+
+  } > sdram
+
+/*
+  .regs	:
+  {
+	ep7312_regs_base = .;
+	ep7312_regs = .;
+	. += 8192;
+  } > regs
+*/
+
+
+/* Debugging stuff follows? */
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) } 
+  .stabstr 0 : { *(.stabstr) } 
+  .stab.excl 0 : { *(.stab.excl) } 
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) } 
+  .stab.indexstr 0 : { *(.stab.indexstr) } 
+  .comment 0 : { *(.comment) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) } 
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) } 
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) } 
+  /*.stack 0x80000 : { _stack = .; *(.stack) }*/
+  /* These must appear regardless of  .  */
+}
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/timer/.cvsignore	2002-11-07 19:38:53.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/timer/Makefile.am	2002-11-07 19:39:27.000000000 -0600
@@ -0,0 +1,35 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+VPATH = @srcdir@:@srcdir@/../../../shared
+
+PGM = $(ARCH)/timer.rel
+
+C_FILES = timer.c
+C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.o)
+
+OBJS = $(C_O_FILES)
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+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 = timer.c
+
+include $(top_srcdir)/../../../../../../automake/local.am
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/timer.c my_rtems/c/src/lib/libbsp/arm/edb7312/timer/timer.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/timer/timer.c	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/timer/timer.c	2002-11-07 19:39:30.000000000 -0600
@@ -0,0 +1,93 @@
+/*
+ * Cirrus EP7312 Timer driver
+ *
+ * Copyright (c) 2002 by Jay Monkman <jtm at smoothsmoothie.com>
+ *	
+ *  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.
+ *
+ * Notes:
+ *  This file manages the benchmark timer used by the RTEMS Timing Test
+ *  Suite.  Each measured time period is demarcated by calls to
+ *  Timer_initialize() and Read_timer().  Read_timer() usually returns
+ *  the number of microseconds since Timer_initialize() exitted.
+ *
+ *  It is important that the timer start/stop overhead be determined 
+ *  when porting or modifying this code.
+ *
+ *  $Id: $
+*/
+
+#include <rtems.h>
+#include <bsp.h>
+#include <ep7312.h>
+
+rtems_unsigned16 tstart;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+void Timer_initialize( void )
+{
+    *EP7312_SYSCON1 |= EP7312_SYSCON1_TC2_512KHZ;
+    *EP7312_TC2D = 0xffff;
+}
+
+/*
+ *  The following controls the behavior of Read_timer().
+ *
+ *  AVG_OVEREHAD is the overhead for starting and stopping the timer.  It
+ *  is usually deducted from the number returned.
+ *
+ *  LEAST_VALID is the lowest number this routine should trust.  Numbers
+ *  below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD      0  /* It typically takes X.X microseconds */
+                             /* (Y countdowns) to start/stop the timer. */
+                             /* This value is in microseconds. */
+#define LEAST_VALID       1  /* Don't trust a clicks value lower than this */
+
+int Read_timer( void )
+{
+  rtems_unsigned16 t;
+  rtems_unsigned32 total;
+  t = *EP7312_TC2D;
+
+  /*
+   *  Total is calculated by taking into account the number of timer overflow
+   *  interrupts since the timer was initialized and clicks since the last
+   *  interrupts.
+   */
+
+  total = (unsigned32)0x0000ffff - t;  /* result is 1/512000 = ~2 uS */
+  total = (total * 1953) / 1000;   /* convert to uS */
+  if ( Timer_driver_Find_average_overhead == 1 )
+    return total;          /* in XXX microsecond units */
+  else {
+    if ( total < LEAST_VALID )
+      return 0;            /* below timer resolution */
+  /*
+   *  Somehow convert total into microseconds
+   */
+      return (total - AVG_OVERHEAD);
+    }
+}
+
+/*
+ *  Empty function call used in loops to measure basic cost of looping
+ *  in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function( void )
+{
+  return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+  rtems_boolean find_flag
+)
+{
+  Timer_driver_Find_average_overhead = find_flag;
+}
+
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/times my_rtems/c/src/lib/libbsp/arm/edb7312/times
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/times	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/times	2002-11-07 19:39:02.000000000 -0600
@@ -0,0 +1,189 @@
+#
+#  Timing Test Suite Results for the EDB7312 BSP
+#
+#  
+#
+
+Board:  Cogent EDB7312
+CPU: Cirrus EP7312
+Clock Speed: 74MHz
+Memory Configuration: SDRAM, 16 bit bus
+Cache: Data and Instruction cache enabled
+Wait States:
+
+Times Reported in: microseconds
+Timer Source: Timer 2, 512KHz timer rate
+
+
+#                          DESCRIPTION                                 A    B
+== =================================================================  ==== ====
+ 1 rtems_semaphore_create					        35
+   rtems_semaphore_delete					        29
+   rtems_semaphore_obtain: available				         3
+   rtems_semaphore_obtain: not available -- NO_WAIT		         3
+   rtems_semaphore_release: no waiting tasks			         6
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks	        34
+  
+ 3 rtems_semaphore_release: task readied -- preempts caller	        27
+  
+ 4 rtems_task_restart: blocked task -- preempts caller		        95
+   rtems_task_restart: ready task -- preempts caller	                99
+   rtems_semaphore_release: task readied -- returns to caller	        12
+   rtems_task_create						        47
+   rtems_task_start						        25
+   rtems_task_restart: suspended task -- returns to caller	        25
+   rtems_task_delete: suspended task				        48
+   rtems_task_restart: ready task -- returns to caller		        26
+   rtems_task_restart: blocked task -- returns to caller	        33
+   rtems_task_delete: blocked task                                      51
+  
+ 5 rtems_task_suspend: calling task                                     25
+   rtems_task_resume: task readied -- preempts caller                   23
+  
+ 6 rtems_task_restart: calling task                                     19
+   rtems_task_suspend: returns to caller                                 8
+   rtems_task_resume: task readied -- returns to caller                  9
+   rtems_task_delete: ready task                                        58
+  
+ 7 rtems_task_restart: suspended task -- preempts caller                47
+  
+ 8 rtems_task_set_priority: obtain current priority                      4
+   rtems_task_set_priority: returns to caller                            9
+   rtems_task_mode: obtain current mode                                  2
+   rtems_task_mode: no reschedule                                        2
+   rtems_task_mode: reschedule -- returns to caller                     15
+   rtems_task_mode: reschedule -- preempts caller                       52
+   rtems_task_set_note                                                   4
+   rtems_task_get_note                                                   4
+   rtems_clock_set                                                      14
+   rtems_clock_get                                                       1
+
+ 9 rtems_message_queue_create                                           97
+   rtems_message_queue_send: no waiting tasks                           10
+   rtems_message_queue_urgent: no waiting tasks                         10
+   rtems_message_queue_receive: available                               11
+   rtems_message_queue_flush: no messages flushed                        2
+   rtems_message_queue_flush: messages flushed                           6
+   rtems_message_queue_delete                                           52
+
+10 rtems_message_queue_receive: not available -- NO_WAIT                 6
+   rtems_message_queue_receive: not available -- caller blocks          36
+
+11 rtems_message_queue_send: task readied -- preempts caller            34
+
+12 rtems_message_queue_send: task readied -- returns to caller          17
+
+13 rtems_message_queue_urgent: task readied -- preempts caller          34
+
+14 rtems_message_queue_urgent: task readied -- returns to caller        17
+
+15 rtems_event_receive: obtain current events                            1
+   rtems_event_receive: not available -- NO_WAIT                         4
+   rtems_event_receive: not available -- caller blocks                  28
+   rtems_event_send: no task readied                                     4
+   rtems_event_receive: available                                       15
+   rtems_event_send: task readied -- returns to caller                  15
+
+16 rtems_event_send: task readied -- preempts caller                    29
+
+17 rtems_task_set_priority: preempts caller                             36
+
+18 rtems_task_delete: calling task                                      81
+
+19 rtems_signal_catch                                                    5
+   rtems_signal_send: returns to caller                                 29
+   rtems_signal_send: signal to self                                    50
+   exit ASR overhead: returns to calling task                           29
+   exit ASR overhead: returns to preempting task                        33
+
+20 rtems_partition_create                                               44
+   rtems_region_create                                                  70
+   rtems_partition_get_buffer: available                                23
+   rtems_partition_get_buffer: not available                             3
+   rtems_partition_return_buffer                                        21
+   rtems_partition_delete                                               15
+   rtems_region_get_segment: available                                  25
+   rtems_region_get_segment: not available -- NO_WAIT                   58
+   rtems_region_return_segment: no waiting tasks                        25
+   rtems_region_get_segment: not available -- caller blocks            115
+   rtems_region_return_segment: task readied -- preempts caller        132
+   rtems_region_return_segment: task readied -- returns to caller       70
+   rtems_region_delete                                                  41
+   rtems_io_initialize                                                   1
+   rtems_io_open                                                         0
+   rtems_io_close                                                        0
+   rtems_io_read                                                         0
+   rtems_io_write                                                        0
+   rtems_io_control                                                      0
+
+21 rtems_task_ident                                                     34
+   rtems_message_queue_ident                                            33
+   rtems_semaphore_ident                                                38
+   rtems_partition_ident                                                33
+   rtems_region_ident                                                   36
+   rtems_port_ident                                                     33
+   rtems_timer_ident                                                    33
+   rtems_rate_monotonic_ident                                           34
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller     48
+   rtems_message_queue_broadcast: no waiting tasks                       8
+   rtems_message_queue_broadcast: task readied -- preempts caller       60
+
+23 rtems_timer_create                                                    6
+   rtems_timer_fire_after: inactive                                     11
+   rtems_timer_fire_after: active                                       11
+   rtems_timer_cancel: active                                            6
+   rtems_timer_cancel: inactive                                          5
+   rtems_timer_reset: inactive                                           9
+   rtems_timer_reset: active                                            10
+   rtems_timer_fire_when: inactive                                      12
+   rtems_timer_fire_when: active                                        13
+   rtems_timer_delete: active                                            8
+   rtems_timer_delete: inactive                                          7
+   rtems_task_wake_when                                                 38
+
+24 rtems_task_wake_after: yield -- returns to caller                     2
+   rtems_task_wake_after: yields -- preempts caller                     20
+
+25 rtems_clock_tick                                                     17
+
+26 _ISR_Disable                                                          0
+   _ISR_Flash                                                            0
+   _ISR_Enable                                                           0
+   _Thread_Disable_dispatch                                              0
+   _Thread_Enable_dispatch                                               3
+   _Thread_Set_state                                                    11
+   _Thread_Disptach (NO FP)                                             25
+   context switch: no floating point contexts                           15
+   context switch: self                                                  0
+   context switch: to another task                                       0
+   fp context switch: restore 1st FP task -                             NA
+   fp context switch: save idle, restore initialized -                  NA
+   fp context switch: save idle, restore idle -                         NA
+   fp context switch: save initialized, restore initialized -           NA
+   _Thread_Resume                                                       13
+   _Thread_Unblock                                                      11
+   _Thread_Ready                                                         5
+   _Thread_Get                                                           2
+   _Semaphore_Get                                                        1
+   _Thread_Get: invalid id                                               1
+
+27 interrupt entry overhead: returns to interrupted task                 0
+   interrupt exit overhead: returns to interrupted task                  0
+   interrupt entry overhead: returns to nested interrupt                 0
+   interrupt exit overhead: returns to nested interrupt                  0
+
+28 rtems_port_create                                                    23
+   rtems_port_external_to_internal                                       3
+   rtems_port_internal_to_external                                       3
+   rtems_port_delete                                                    21
+
+29 rtems_rate_monotonic_create                                          21
+   rtems_rate_monotonic_period: initiate period -- returns to caller    41
+   rtems_rate_monotonic_period: obtain status                           11
+   rtems_rate_monotonic_cancel                                          23
+   rtems_rate_monotonic_delete: inactive                                25
+   rtems_rate_monotonic_delete: active                                  21
+   rtems_rate_monotonic_period: conclude periods -- caller blocks       23
+  
\ No newline at end of file
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore my_rtems/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/wrapup/.cvsignore	2002-11-07 19:39:02.000000000 -0600
@@ -0,0 +1,14 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+missing
+mkinstalldirs
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am my_rtems/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am
--- rtems-ss-20021007/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am	1969-12-31 18:00:00.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/edb7312/wrapup/Makefile.am	2002-11-07 19:39:28.000000000 -0600
@@ -0,0 +1,33 @@
+##
+## $Id: $
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+BSP_FILES = clock console startup irq timer network start
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS = $(foreach piece, $(BSP_FILES), $(wildcard ../$(piece)/$(ARCH)/*.$(OBJEXT))) \
+    $(wildcard ../../../../libcpu/$(RTEMS_CPU)/shared/*/$(ARCH)/*.$(OBJEXT)) \
+    $(wildcard ../../../../libcpu/$(RTEMS_CPU)/$(RTEMS_CPU_MODEL)/*/$(ARCH)/*.$(OBJEXT))
+LIB = $(ARCH)/libbsp.a
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
+include $(top_srcdir)/../../../../../../automake/compile.am
+include $(top_srcdir)/../../../../../../automake/lib.am
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+$(LIB): ${OBJS}
+	$(make-library)
+
+$(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a: $(LIB)
+	$(INSTALL_DATA) $< $@
+
+TMPINSTALL_FILES += $(PROJECT_RELEASE)/lib/libbsp$(LIB_VARIANT).a
+
+all-local: ${ARCH} $(TMPINSTALL_FILES)
+
+include $(top_srcdir)/../../../../../../automake/local.am
-------------- next part --------------
diff -Nbaur rtems-ss-20021007/c/src/libchip/network/cs8900.c my_rtems/c/src/libchip/network/cs8900.c
--- rtems-ss-20021007/c/src/libchip/network/cs8900.c	2002-09-07 18:09:47.000000000 -0500
+++ my_rtems/c/src/libchip/network/cs8900.c	2002-11-07 19:39:28.000000000 -0600
@@ -258,9 +258,13 @@
   
   io_pp_bit_set_reg_16 (dev, CS8900_PP_SelfCTL, CS8900_SELF_CTRL_RESET);
 
-  rtems_task_wake_after (TOD_MILLISECONDS_TO_TICKS (20));
+  rtems_task_wake_after (TOD_MILLISECONDS_TO_TICKS (20));
   
   status = io_pp_get_reg_16 (dev, CS8900_PP_SelfST);
+  if (status == 0) {
+      printf("Reading status register again\n");
+      status = io_pp_get_reg_16 (dev, CS8900_PP_SelfST);
+  }
     
   if (((status & CS8900_SELF_STATUS_INITD) == 0) ||
       ((status & CS8900_SELF_STATUS_INITD) &&
-------------- next part --------------
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/shared/irq/irq_asm.S my_rtems/c/src/lib/libbsp/arm/shared/irq/irq_asm.S
--- rtems-ss-20021007/c/src/lib/libbsp/arm/shared/irq/irq_asm.S	2002-10-04 08:24:40.000000000 -0500
+++ my_rtems/c/src/lib/libbsp/arm/shared/irq/irq_asm.S	2002-11-07 19:38:47.000000000 -0600
@@ -62,6 +62,12 @@
         cmp   r0, #0x12        /* is it INT mode? */  
         beq   exitit
 
+/* check to see if we interrupted nd INT (with FIQ?) */
+        mrs   r0, spsr
+        and   r0, r0, #0x1f
+        cmp   r0, #0x12        /* is it INT mode? */  
+        beq   exitit
+
 /* If thread dispatching is disabled, exit */
         cmp     r1, #0
         bne     exitit
diff -Nbaur rtems-ss-20021007/c/src/lib/libbsp/arm/shared/irq/irq_init.c my_rtems/c/src/lib/libbsp/arm/shared/irq/irq_init.c
--- rtems-ss-20021007/c/src/lib/libbsp/arm/shared/irq/irq_init.c	2002-01-04 11:40:41.000000000 -0600
+++ my_rtems/c/src/lib/libbsp/arm/shared/irq/irq_init.c	2002-11-07 19:38:58.000000000 -0600
@@ -16,7 +16,6 @@
 #include <irq.h>
 #include <bsp.h>
 #include <rtems/bspIo.h>
-#include <registers.h>
 
 /*
  * default int vector


More information about the users mailing list