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