summaryrefslogtreecommitdiffstats
path: root/bsps/arm/edb7312/net/network.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/edb7312/net/network.c')
-rw-r--r--bsps/arm/edb7312/net/network.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/bsps/arm/edb7312/net/network.c b/bsps/arm/edb7312/net/network.c
new file mode 100644
index 0000000000..480808aeaa
--- /dev/null
+++ b/bsps/arm/edb7312/net/network.c
@@ -0,0 +1,126 @@
+#define __INSIDE_RTEMS_BSD_TCPIP_STACK__
+
+#include <rtems.h>
+#include <sys/param.h>
+#include <sys/mbuf.h>
+#include <bsp/irq.h>
+#include <libchip/cs8900.h>
+#include <assert.h>
+
+#define CS8900_BASE 0x20000300
+unsigned int bsp_cs8900_io_base = 0;
+unsigned int bsp_cs8900_memory_base = 0;
+static void cs8900_isr(void *);
+
+char g_enetbuf[1520];
+
+static void cs8900_isr(void *arg)
+{
+ cs8900_interrupt(BSP_EINT3, arg);
+}
+
+/* cs8900_io_set_reg - set one of the I/O addressed registers */
+void cs8900_io_set_reg (cs8900_device *cs, 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 (cs8900_device *cs, 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 (cs8900_device *cs, unsigned long reg, unsigned short data)
+{
+ /* works the same for all values of dev */
+ cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
+ cs8900_io_set_reg(cs, CS8900_IO_PP_DATA_PORT0, data);
+}
+
+/* cs8900_mem_get_reg - reads one of the registers mapped through
+ * PacketPage
+ */
+unsigned short cs8900_mem_get_reg (cs8900_device *cs, unsigned long reg)
+{
+ /* works the same for all values of dev */
+ cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
+ return cs8900_io_get_reg(cs, CS8900_IO_PP_DATA_PORT0);
+}
+
+void cs8900_attach_interrupt (cs8900_device *cs)
+{
+ rtems_status_code status = RTEMS_SUCCESSFUL;
+
+ status = rtems_interrupt_handler_install(
+ BSP_EINT3,
+ "Network",
+ RTEMS_INTERRUPT_UNIQUE,
+ cs8900_isr,
+ cs
+ );
+ assert(status == RTEMS_SUCCESSFUL);
+}
+
+void cs8900_detach_interrupt (cs8900_device *cs)
+{
+ rtems_status_code status = RTEMS_SUCCESSFUL;
+
+ status = rtems_interrupt_handler_remove(
+ BSP_EINT3,
+ cs8900_isr,
+ cs
+ );
+ assert(status == RTEMS_SUCCESSFUL);
+}
+
+unsigned short cs8900_get_data_block (cs8900_device *cs, unsigned char *data)
+{
+ int len;
+ int i;
+
+ len = cs8900_mem_get_reg(cs, CS8900_PP_RxLength);
+
+ for (i = 0; i < ((len + 1) / 2); i++) {
+ ((short *)data)[i] = cs8900_io_get_reg(cs,
+ CS8900_IO_RX_TX_DATA_PORT0);
+ }
+ return len;
+}
+
+void cs8900_tx_load (cs8900_device *cs, struct mbuf *m)
+{
+ int len;
+ unsigned 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(cs,
+ CS8900_IO_RX_TX_DATA_PORT0,
+ data[i]);
+ }
+}