diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-11-13 17:55:09 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-11-13 17:55:09 +0000 |
commit | 3d6669ccf7960af91b93d5b8781b78160547c0d1 (patch) | |
tree | 80667b374c0bcd965f95072ee63cbe5902d98509 /c/src/lib/libbsp/arm/edb7312/network | |
parent | 2002-11-13 Jay Monkman <jtm@smoothsmoothie.com> (diff) | |
download | rtems-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.am | 43 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/edb7312/network/network.c | 125 |
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]); + } +} |