summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/edb7312/network
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-11-13 17:55:09 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-11-13 17:55:09 +0000
commit3d6669ccf7960af91b93d5b8781b78160547c0d1 (patch)
tree80667b374c0bcd965f95072ee63cbe5902d98509 /c/src/lib/libbsp/arm/edb7312/network
parent2002-11-13 Jay Monkman <jtm@smoothsmoothie.com> (diff)
downloadrtems-3d6669ccf7960af91b93d5b8781b78160547c0d1.tar.bz2
2002-11-13 Jay Monkman <jtm@smoothsmoothie.com>
* New BSP. * .cvsignore, ChangeLog, Makefile.am, bsp_specs, configure.ac, README, times, clock/.cvsignore, clock/Makefile.am, clock/clockdrv.c, console/.cvsignore, console/Makefile.am, console/uart.c, include/.cvsignore, include/Makefile.am, include/bsp.h, include/ep7312.h, irq/.cvsignore, irq/Makefile.am, irq/bsp_irq_asm.S, irq/bsp_irq_init.c, irq/irq.c, irq/irq.h, network/Makefile.am, network/network.c, start/.cvsignore, start/Makefile.am, start/start.S, startup/.cvsignore, startup/Makefile.am, startup/bspstart.c, startup/exit.c, startup/linkcmds, timer/.cvsignore, timer/Makefile.am, timer/timer.c, wrapup/.cvsignore, wrapup/Makefile.am: New file.
Diffstat (limited to 'c/src/lib/libbsp/arm/edb7312/network')
-rw-r--r--c/src/lib/libbsp/arm/edb7312/network/Makefile.am43
-rw-r--r--c/src/lib/libbsp/arm/edb7312/network/network.c125
2 files changed, 168 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/edb7312/network/Makefile.am b/c/src/lib/libbsp/arm/edb7312/network/Makefile.am
new file mode 100644
index 0000000000..fb06ff5e5b
--- /dev/null
+++ b/c/src/lib/libbsp/arm/edb7312/network/Makefile.am
@@ -0,0 +1,43 @@
+##
+## $Id$
+##
+
+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@.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 --git a/c/src/lib/libbsp/arm/edb7312/network/network.c b/c/src/lib/libbsp/arm/edb7312/network/network.c
new file mode 100644
index 0000000000..9265cddb94
--- /dev/null
+++ b/c/src/lib/libbsp/arm/edb7312/network/network.c
@@ -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]);
+ }
+}