OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [greth.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
#include "testmod.h"
2
#include "../greth/greth_api.h"
3
 
4
#define SRC_MAC0  0xDE
5
#define SRC_MAC1  0xAD
6
#define SRC_MAC2  0xBE
7
#define SRC_MAC3  0xEF
8
#define SRC_MAC4  0x00
9
#define SRC_MAC5  0x20 
10
 
11
static int snoopen;
12
 
13
static inline int load(int addr)
14
{
15
    int tmp;
16
    asm(" lda [%1]1, %0 "
17
        : "=r"(tmp)
18
        : "r"(addr)
19
        );
20
    return tmp;
21
}
22
 
23
static inline char loadb(int addr)
24
{
25
  char tmp;
26
  asm volatile (" lduba [%1]1, %0 "
27
      : "=r"(tmp)
28
      : "r"(addr)
29
  );
30
  return tmp;
31
}
32
 
33
struct greth_info greth;
34
 
35
 
36
static void build_arp(unsigned int source_addr_msb,
37
                      unsigned int source_addr_lsb,
38
                      unsigned int sender_ip,
39
                      unsigned int target_ip,
40
                      unsigned char *buf,
41
                      unsigned int *len)
42
{
43
        *len = 42;
44
        buf[0] = 0xFF;
45
        buf[1] = 0xFF;
46
        buf[2] = 0xFF;
47
        buf[3] = 0xFF;
48
        buf[4] = 0xFF;
49
        buf[5] = 0xFF;
50
        buf[6] = (source_addr_msb >> 16) & 0xFF;
51
        buf[7] = (source_addr_msb >> 8) & 0xFF;
52
        buf[8] = source_addr_msb & 0xFF;
53
        buf[9] = (source_addr_lsb >> 16) & 0xFF;
54
        buf[10] = (source_addr_lsb >> 8) & 0xFF;
55
        buf[11] = source_addr_lsb & 0xFF;
56
        buf[12] = 0x08;
57
        buf[13] = 0x06;
58
        buf[14] = 0x00;
59
        buf[15] = 0x01;
60
        buf[16] = 0x08;
61
        buf[17] = 0x00;
62
        buf[18] = 0x06;
63
        buf[19] = 0x04;
64
        buf[20] = 0x00;
65
        buf[21] = 0x01;
66
        buf[22] = (source_addr_msb >> 16) & 0xFF;
67
        buf[23] = (source_addr_msb >> 8) & 0xFF;
68
        buf[24] = source_addr_msb & 0xFF;
69
        buf[25] = (source_addr_lsb >> 16) & 0xFF;
70
        buf[26] = (source_addr_lsb >> 8) & 0xFF;
71
        buf[27] = source_addr_lsb & 0xFF;
72
        buf[28] = (sender_ip >> 24) & 0xFF;
73
        buf[29] = (sender_ip >> 16) & 0xFF;
74
        buf[30] = (sender_ip >> 8) & 0xFF;
75
        buf[31] = (sender_ip) & 0xFF;
76
        buf[32] = 0;
77
        buf[33] = 0;
78
        buf[34] = 0;
79
        buf[35] = 0;
80
        buf[36] = 0;
81
        buf[37] = 0;
82
        buf[38] = (target_ip >> 24) & 0xFF;
83
        buf[39] = (target_ip >> 16) & 0xFF;
84
        buf[40] = (target_ip >> 8) & 0xFF;
85
        buf[41] = (target_ip) & 0xFF;
86
 
87
}
88
 
89
static void build_ip(
90
        unsigned int dest_addr_msb,
91
        unsigned int dest_addr_lsb,
92
        unsigned int source_addr_msb,
93
        unsigned int source_addr_lsb,
94
        unsigned int dest_ip,
95
        unsigned int source_ip,
96
        unsigned int rw,
97
        unsigned int seq,
98
        unsigned int addr,
99
        unsigned int dlen,
100
        unsigned char *data,
101
        unsigned char *buf,
102
        unsigned int *len)
103
{
104
        int i;
105
        int iplen;
106
        int udplen;
107
        int edclctrl;
108
        unsigned int crc;
109
        iplen = 38+dlen;
110
        udplen = 18+dlen;
111
        *len = 52+dlen;
112
        buf[0] = (dest_addr_msb >> 16) & 0xFF;
113
        buf[1] = (dest_addr_msb >> 8) & 0xFF;
114
        buf[2] = dest_addr_msb & 0xFF;
115
        buf[3] = (dest_addr_lsb >> 16) & 0xFF;
116
        buf[4] = (dest_addr_lsb >> 8) & 0xFF;
117
        buf[5] = dest_addr_lsb & 0xFF;
118
        buf[6] = (source_addr_msb >> 16) & 0xFF;
119
        buf[7] = (source_addr_msb >> 8) & 0xFF;
120
        buf[8] = source_addr_msb & 0xFF;
121
        buf[9] = (source_addr_lsb >> 16) & 0xFF;
122
        buf[10] = (source_addr_lsb >> 8) & 0xFF;
123
        buf[11] = source_addr_lsb & 0xFF;
124
        buf[12] = 0x08;
125
        buf[13] = 0x00;
126
        buf[14] = 0x45;
127
        buf[15] = 0x00;
128
        buf[16] = (iplen >> 8) & 0xFF;
129
        buf[17] = iplen & 0xFF;
130
        buf[18] = 0;
131
        buf[19] = 0;
132
        buf[20] = 0;
133
        buf[21] = 0;
134
        buf[22] = 0x40;
135
        buf[23] = 0x11;
136
        buf[26] = (source_ip >> 24) & 0xFF;
137
        buf[27] = (source_ip >> 16) & 0xFF;
138
        buf[28] = (source_ip >> 8) & 0xFF;
139
        buf[29] = (source_ip) & 0xFF;
140
        buf[30] = (dest_ip >> 24) & 0xFF;
141
        buf[31] = (dest_ip >> 16) & 0xFF;
142
        buf[32] = (dest_ip >> 8) & 0xFF;
143
        buf[33] = (dest_ip) & 0xFF;
144
        buf[34] = 0;
145
        buf[35] = 0;
146
        buf[36] = 0;
147
        buf[37] = 0;
148
        crc = 0x8511;
149
        crc = crc + (iplen & 0xFFFF);
150
        crc = crc + (source_ip >> 16) & 0xFFFF;
151
        crc = crc + source_ip & 0xFFFF;
152
        crc = crc + (dest_ip >> 16) & 0xFFFF;
153
        crc = crc + dest_ip & 0xFFFF;
154
        crc = (crc & 0xFFFF) + ((crc >> 16) & 0xFFFF);
155
        crc = (crc & 0xFFFF) + ((crc >> 16) & 0xFFFF);
156
        buf[24] = (crc >> 8) & 0xFF;
157
        buf[25] = crc & 0xFF;
158
        buf[38] = (udplen >> 8) & 0xFF;
159
        buf[39] = udplen & 0xFF;
160
        buf[40] = 0;
161
        buf[41] = 0;
162
        buf[42] = 0;
163
        buf[43] = 0;
164
        edclctrl = ((seq & 0x3FFF) << 18) | (rw << 17) | ((dlen & 0x3FF) << 7);
165
        buf[44] = (edclctrl >> 24) & 0xFF;
166
        buf[45] = (edclctrl >> 16) & 0xFF;
167
        buf[46] = (edclctrl >> 8) & 0xFF;
168
        buf[47] = edclctrl & 0xFF;
169
        buf[48] = (addr >> 24) & 0xFF;
170
        buf[49] = (addr >> 16) & 0xFF;
171
        buf[50] = (addr >> 8) & 0xFF;
172
        buf[51] = addr & 0xFF;
173
        if (rw) {
174
                for(i = 0; i < dlen; i++) {
175
                        buf[52+i] = data[i];
176
                }
177
        }
178
 
179
}
180
 
181
int greth_test(int apbaddr)
182
{
183
        int tmp, i;
184
        int *len;
185
        unsigned char tmp2;
186
        unsigned char txbuf[256];
187
        unsigned char rxbuf[256];
188
        unsigned char wrarea[100];
189
        unsigned char *buf;
190
        struct rxstatus *rxs = malloc(sizeof(struct rxstatus));
191
 
192
        unsigned int ipaddr;
193
        unsigned int emac_addr_msb;
194
        unsigned int emac_addr_lsb;
195
        int seq;
196
 
197
        len = malloc(sizeof(int));
198
 
199
        /* initialize */
200
        report_device(0x0101D000);
201
        greth.regs = (greth_regs *) apbaddr;
202
        greth.esa[0] = SRC_MAC0;
203
        greth.esa[1] = SRC_MAC1;
204
        greth.esa[2] = SRC_MAC2;
205
        greth.esa[3] = SRC_MAC3;
206
        greth.esa[4] = SRC_MAC4;
207
        greth.esa[5] = SRC_MAC5;
208
        greth_init(&greth);
209
 
210
        /* Put phy in loopback*/
211
        tmp = read_mii(greth.phyaddr, 0, greth.regs);
212
 
213
        if (tmp < 0) {
214
                /* Error in MDIO interface access */
215
                fail(0);
216
        }
217
        write_mii(greth.phyaddr, 0, tmp | (1 << 14), greth.regs);
218
 
219
        /* Dest. addr */
220
        txbuf[0] = SRC_MAC0;
221
        txbuf[1] = SRC_MAC1;
222
        txbuf[2] = SRC_MAC2;
223
        txbuf[3] = SRC_MAC3;
224
        txbuf[4] = SRC_MAC4;
225
        txbuf[5] = SRC_MAC5;
226
 
227
        /* Source addr */
228
        txbuf[6]  = SRC_MAC0;
229
        txbuf[7]  = SRC_MAC1;
230
        txbuf[8]  = SRC_MAC2;
231
        txbuf[9]  = SRC_MAC3;
232
        txbuf[10] = SRC_MAC4;
233
        txbuf[11] = SRC_MAC5;
234
 
235
        /* Length 242 (total length 256 incl. address, type) */
236
        txbuf[12] = 0x00;
237
        txbuf[13] = 0xF2;
238
 
239
        for (i = 14; i < 256; i++) {
240
                txbuf[i] = (i % 256);
241
        }
242
 
243
        while(!greth_rx(rxbuf, &greth));
244
 
245
        while(!greth_tx(256, txbuf, &greth));
246
 
247
        while(!greth_checkrx(len, rxs, &greth));
248
 
249
        if (*len != 256) {
250
                /* packet of incorrect length received */
251
                fail(1);
252
        }
253
        for (i = 0; i < 256; i++) {
254
                if ((i % 4) == 0) {
255
                        tmp = load((int)&rxbuf[i]);
256
                }
257
                switch(i % 4) {
258
                        case 0: tmp2 = (unsigned char)((tmp >> 24) & 0xFF);
259
                                break;
260
                        case 1: tmp2 = (unsigned char)((tmp >> 16) & 0xFF);
261
                                break;
262
                        case 2: tmp2 = (unsigned char)((tmp >> 8) & 0xFF);
263
                                break;
264
                        case 3: tmp2 = (unsigned char)(tmp & 0xFF);
265
                                break;
266
                }
267
                if (tmp2 != txbuf[i]) {
268
                        fail(2);
269
                }
270
        }
271
        /* Test EDCL if present */
272
        if (greth.edcl) {
273
                /* read ip address */
274
                ipaddr = load((int)&greth.regs->edclip);
275
 
276
                buf = malloc(256);
277
                /* send arp packet to acquire edcl mac address */
278
                build_arp(0xDEADBE, 0xEF0020, 0xC0A80016, ipaddr, buf, len);
279
 
280
                while(!greth_rx(rxbuf, &greth));
281
                while(!greth_tx(*len, buf, &greth));
282
                while(!greth_checkrx(len, rxs, &greth));
283
 
284
                emac_addr_msb = ((loadb((int)&rxbuf[22]) & 0xFF) << 16) | ((loadb((int)&rxbuf[23]) & 0xFF) << 8) | (loadb((int)&rxbuf[24]) & 0xFF);
285
                emac_addr_lsb = ((loadb((int)&rxbuf[25]) & 0xFF) << 16) | ((loadb((int)&rxbuf[26]) & 0xFF) << 8) | (loadb((int)&rxbuf[27]) & 0xFF);
286
 
287
                /* send zero length read to acquire sequence number */
288
                build_ip(emac_addr_msb, emac_addr_lsb, 0xDEADBE, 0xEF0020, ipaddr,
289
                         0xC0A80016, 0, 0, (unsigned int)wrarea, 0, (unsigned char *)0, buf, len);
290
 
291
                while(!greth_rx(rxbuf, &greth));
292
                while(!greth_tx(*len, buf, &greth));
293
                while(!greth_checkrx(len, rxs, &greth));
294
 
295
                tmp = ((loadb((int)&rxbuf[44]) & 0xFF) << 24) | ((loadb((int)&rxbuf[45]) & 0xFF) << 16) | ((loadb((int)&rxbuf[46]) & 0xFF) << 8) | (loadb((int)&rxbuf[47]) & 0xFF);
296
 
297
                if ((tmp >> 17) & 1) {
298
                        seq = (tmp >> 18) & 0x3FFF;
299
                } else {
300
                        seq = ((tmp >> 18) & 0x3FFF) + 1;
301
                }
302
 
303
                /* write 72 bytes to memory */
304
                build_ip(emac_addr_msb, emac_addr_lsb, 0xDEADBE, 0xEF0020, ipaddr,
305
                         0xC0A80016, 1, seq, (unsigned int)wrarea, 72, txbuf, buf, len);
306
 
307
                while(!greth_rx(rxbuf, &greth));
308
                while(!greth_tx(*len, buf, &greth));
309
                while(!greth_checkrx(len, rxs, &greth));
310
 
311
                if ((loadb((int)&rxbuf[45]) >> 1) & 1) {
312
                        /* unexpected nak */
313
                        fail(3);
314
                }
315
                seq = seq + 1;
316
 
317
                /* read back 72 bytes */
318
                build_ip(emac_addr_msb, emac_addr_lsb, 0xDEADBE, 0xEF0020, ipaddr,
319
                         0xC0A80016, 0, seq, (unsigned int)wrarea, 72, (unsigned char *)0, buf, len);
320
 
321
                while(!greth_rx(rxbuf, &greth));
322
                while(!greth_tx(*len, buf, &greth));
323
                while(!greth_checkrx(len, rxs, &greth));
324
 
325
                if (*len != 124) {
326
                        /* unexpected length of reply packet */
327
                        fail(4);
328
                }
329
                for(i = 0; i < 72; i++) {
330
                        if ((i % 4) == 0) {
331
                                tmp = load((int)&rxbuf[52+i]);
332
                        }
333
                        switch(i % 4) {
334
                                case 0: tmp2 = (unsigned char)((tmp >> 24) & 0xFF);
335
                                        break;
336
                                case 1: tmp2 = (unsigned char)((tmp >> 16) & 0xFF);
337
                                        break;
338
                                case 2: tmp2 = (unsigned char)((tmp >> 8) & 0xFF);
339
                                        break;
340
                                case 3: tmp2 = (unsigned char)(tmp & 0xFF);
341
                                        break;
342
                        }
343
                        if (tmp2 != txbuf[i]) {
344
                                fail(5);
345
                        }
346
 
347
                }
348
                free(buf);
349
        }
350
 
351
        return 0;
352
 
353
}
354
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.