summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-06-14 14:28:28 +0000
committer[email protected] <[email protected]>2011-06-14 14:28:28 +0000
commit99dc4465a66d757b1a94220b513d30e647861b4c (patch)
treecef24d0887d8c3a8340f7fe66c0a981d56b5adcb
parent3d4b5722fca72bd60d56b3ad97db70597550149a (diff)
add skeleton template of network interface driver.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1502 bbd45198-f89e-11dd-88c7-29a3b14d5316
-rw-r--r--components/net/lwip/src/netif/skeleton.c211
-rw-r--r--components/net/lwip/src/netif/skeleton.h6
2 files changed, 217 insertions, 0 deletions
diff --git a/components/net/lwip/src/netif/skeleton.c b/components/net/lwip/src/netif/skeleton.c
new file mode 100644
index 0000000000..da7280a8a7
--- /dev/null
+++ b/components/net/lwip/src/netif/skeleton.c
@@ -0,0 +1,211 @@
+#include <rtthread.h>
+#include "skeleton.h"
+#include <netif/ethernetif.h>
+
+#define MAX_ADDR_LEN 6
+struct rt_skeleton_eth
+{
+ /* inherit from ethernet device */
+ struct eth_device parent;
+
+ /* interface address info. */
+ rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
+};
+static struct rt_skeleton_eth _skeleton_device;
+
+void rt_skeleton_isr(int irqno)
+{
+ rt_uint32_t status;
+
+ /* read status */
+
+ /* Received the coming packet */
+ if (status)
+ {
+ /* disable receive interrupt */
+
+ /* a frame has been received */
+ eth_device_ready(&(_skeleton_device.parent));
+ }
+
+ /* Transmit Interrupt check */
+ if (status)
+ {
+ }
+}
+
+static rt_err_t rt_skeleton_init(rt_device_t dev)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_skeleton_open(rt_device_t dev, rt_uint16_t oflag)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_skeleton_close(rt_device_t dev)
+{
+ return RT_EOK;
+}
+
+static rt_size_t rt_skeleton_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
+{
+ rt_set_errno(-RT_ENOSYS);
+ return 0;
+}
+
+static rt_size_t rt_skeleton_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
+{
+ rt_set_errno(-RT_ENOSYS);
+ return 0;
+}
+
+static rt_err_t rt_skeleton_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+{
+ struct rt_skeleton_eth *eth;
+
+ eth = (struct rt_skeleton_eth*)dev;
+ RT_ASSERT(eth != RT_NULL);
+
+ switch (cmd)
+ {
+ case NIOCTL_GADDR:
+ /* get mac address */
+ if (args) rt_memcpy(args, _skeleton_device.dev_addr, 6);
+ else return -RT_ERROR;
+ break;
+
+ default :
+ break;
+ }
+
+ return RT_EOK;
+}
+
+rt_err_t rt_skeleton_tx( rt_device_t dev, struct pbuf* p)
+{
+ {
+ /* q traverses through linked list of pbuf's
+ * This list MUST consist of a single packet ONLY */
+ struct pbuf *q;
+ rt_uint16_t pbuf_index = 0;
+ rt_uint8_t word[2], word_index = 0;
+
+ q = p;
+ /* Write data into hardware, two bytes at a time
+ * Handling pbuf's with odd number of bytes correctly
+ * No attempt to optimize for speed has been made */
+ while (q)
+ {
+ if (pbuf_index < q->len)
+ {
+ word[word_index++] = ((u8_t*)q->payload)[pbuf_index++];
+ if (word_index == 2)
+ {
+ /* write data to hardware */
+
+ word_index = 0;
+ }
+ }
+ else
+ {
+ q = q->next;
+ pbuf_index = 0;
+ }
+ }
+ /* One byte could still be unsent */
+ if (word_index == 1)
+ {
+ /* write data to hardware */
+
+ }
+ }
+
+ return RT_EOK;
+}
+
+struct pbuf *rt_skeleton_rx(rt_device_t dev)
+{
+ struct pbuf* p;
+ rt_uint32_t rxbyte;
+
+ /* init p pointer */
+ p = RT_NULL;
+ rxbyte = 0; /* get eth status */
+ if (rxbyte) /* there is data received */
+ {
+ rt_uint16_t rx_len;
+ rt_uint16_t* data;
+
+ /* get recieved packet length */
+ rx_len = 0;
+
+ /* allocate buffer */
+ p = pbuf_alloc(PBUF_LINK, rx_len, PBUF_RAM);
+ if (p != RT_NULL)
+ {
+ struct pbuf* q;
+ rt_int32_t len;
+
+ for (q = p; q != RT_NULL; q= q->next)
+ {
+ data = (rt_uint16_t*)q->payload;
+ len = q->len;
+
+ while (len > 0)
+ {
+ *data = 0; /* read data from hardware */
+ data ++;
+ len -= 2;
+ }
+ }
+ }
+ else
+ {
+ rt_uint16_t dummy;
+ rt_int32_t len;
+
+ /* no pbuf, discard data from EMAC */
+ data = &dummy;
+ len = rx_len;
+ while (len > 0)
+ {
+ *data = 0; /* read from hardware */
+ len -= 2;
+ }
+ }
+ }
+ else
+ {
+ /* restore receive interrupt */
+ }
+
+ return p;
+}
+
+void rt_hw_skeleton_init()
+{
+ /* set default MAC address */
+ _skeleton_device.dev_addr[0] = 0x00;
+ _skeleton_device.dev_addr[1] = 0x60;
+ _skeleton_device.dev_addr[2] = 0x6E;
+ _skeleton_device.dev_addr[3] = 0x11;
+ _skeleton_device.dev_addr[4] = 0x22;
+ _skeleton_device.dev_addr[5] = 0x33;
+
+ /* set RT-Thread device interface */
+ _skeleton_device.parent.parent.init = rt_skeleton_init;
+ _skeleton_device.parent.parent.open = rt_skeleton_open;
+ _skeleton_device.parent.parent.close = rt_skeleton_close;
+ _skeleton_device.parent.parent.read = rt_skeleton_read;
+ _skeleton_device.parent.parent.write = rt_skeleton_write;
+ _skeleton_device.parent.parent.control = rt_skeleton_control;
+ _skeleton_device.parent.parent.user_data = RT_NULL;
+
+ /* set ethernet interface */
+ _skeleton_device.parent.eth_rx = rt_skeleton_rx;
+ _skeleton_device.parent.eth_tx = rt_skeleton_tx;
+
+ eth_device_init(&(_skeleton_device.parent), "e0");
+}
diff --git a/components/net/lwip/src/netif/skeleton.h b/components/net/lwip/src/netif/skeleton.h
new file mode 100644
index 0000000000..f8185d0da5
--- /dev/null
+++ b/components/net/lwip/src/netif/skeleton.h
@@ -0,0 +1,6 @@
+#ifndef __SKELETON_H__
+#define __SKELETON_H__
+
+void rt_hw_skeleton_init(void);
+
+#endif