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