1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 */
9 #include <rtthread.h>
10 #include "dm9000.h"
11
12 #include <netif/ethernetif.h>
13 #include "lwipopts.h"
14
15 #define MAX_ADDR_LEN 6
16 struct rt_dm9000_eth
17 {
18 /* inherit from ethernet device */
19 struct eth_device parent;
20
21 /* interface address info. */
22 rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
23 };
24 static struct rt_dm9000_eth dm9000_device;
25
26 /* interrupt service routine */
rt_dm9000_isr(int irqno)27 void rt_dm9000_isr(int irqno)
28 {
29 rt_uint32_t status;
30
31 if (status) // if receive packet
32 {
33 rt_err_t result;
34
35 /* a frame has been received */
36 result = eth_device_ready(&(dm9000_device.parent));
37 RT_ASSERT(result == RT_EOK);
38 }
39
40 if (status) // if finished packet transmission
41 {
42 }
43 }
44
45 /* RT-Thread Device Interface */
46 /* initialize the interface */
47
rt_dm9000_init(rt_device_t dev)48 static rt_err_t rt_dm9000_init(rt_device_t dev)
49 {
50 return RT_EOK;
51 }
52
rt_dm9000_open(rt_device_t dev,rt_uint16_t oflag)53 static rt_err_t rt_dm9000_open(rt_device_t dev, rt_uint16_t oflag)
54 {
55 return RT_EOK;
56 }
57
rt_dm9000_close(rt_device_t dev)58 static rt_err_t rt_dm9000_close(rt_device_t dev)
59 {
60 return RT_EOK;
61 }
62
rt_dm9000_read(rt_device_t dev,rt_off_t pos,void * buffer,rt_size_t size)63 static rt_ssize_t rt_dm9000_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
64 {
65 rt_set_errno(-RT_ENOSYS);
66 return 0;
67 }
68
rt_dm9000_write(rt_device_t dev,rt_off_t pos,const void * buffer,rt_size_t size)69 static rt_ssize_t rt_dm9000_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
70 {
71 rt_set_errno(-RT_ENOSYS);
72 return 0;
73 }
74
rt_dm9000_control(rt_device_t dev,int cmd,void * args)75 static rt_err_t rt_dm9000_control(rt_device_t dev, int cmd, void *args)
76 {
77 switch(cmd)
78 {
79 case NIOCTL_GADDR:
80 /* get mac address */
81 if(args) rt_memcpy(args, dm9000_device.dev_addr, 6);
82 else return -RT_ERROR;
83 break;
84
85 default :
86 break;
87 }
88
89 return RT_EOK;
90 }
91
92 /* ethernet device interface */
93 /* transmit packet. */
rt_dm9000_tx(rt_device_t dev,struct pbuf * p)94 rt_err_t rt_dm9000_tx( rt_device_t dev, struct pbuf* p)
95 {
96 struct pbuf* q;
97 rt_uint32_t len;
98 rt_uint8_t* ptr;
99
100 for (q = p; q != NULL; q = q->next)
101 {
102 len = q->len;
103 ptr = q->payload;
104
105 /* write data to device */
106 }
107
108 return RT_EOK;
109 }
110
111 /* reception packet. */
rt_dm9000_rx(rt_device_t dev)112 struct pbuf *rt_dm9000_rx(rt_device_t dev)
113 {
114 struct pbuf* p;
115 rt_uint32_t len;
116
117 /* init p pointer */
118 p = RT_NULL;
119
120 if (1) // if there is packet in device
121 {
122 /* get one packet length */
123 len = 0; // packet length
124
125 /* allocate buffer */
126 p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM);
127
128 if (p != RT_NULL)
129 {
130 rt_uint8_t* data;
131 struct pbuf* q;
132
133 for (q = p; q != RT_NULL; q= q->next)
134 {
135 data = q->payload;
136 len = q->len;
137
138 /* read data from device */
139 }
140 }
141 }
142 else
143 {
144 /* restore interrupt */
145 }
146
147 return p;
148 }
149
rt_hw_dm9000_init()150 void rt_hw_dm9000_init()
151 {
152 dm9000_device.parent.parent.init = rt_dm9000_init;
153 dm9000_device.parent.parent.open = rt_dm9000_open;
154 dm9000_device.parent.parent.close = rt_dm9000_close;
155 dm9000_device.parent.parent.read = rt_dm9000_read;
156 dm9000_device.parent.parent.write = rt_dm9000_write;
157 dm9000_device.parent.parent.control = rt_dm9000_control;
158 dm9000_device.parent.parent.user_data = RT_NULL;
159
160 dm9000_device.parent.eth_rx = rt_dm9000_rx;
161 dm9000_device.parent.eth_tx = rt_dm9000_tx;
162
163 rt_device_register((rt_device_t)&dm9000_device,
164 "E0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX);
165 }
166