00001
00083 #include <stdio.h>
00084 #include <string.h>
00085
00086 #include <avr32/io.h>
00087 #include "print_funcs.h"
00088 #include "usart.h"
00089 #include "board.h"
00090 #include "macb.h"
00091 #include "gpio.h"
00092 #include "compiler.h"
00093 #include "conf_eth.h"
00094 #include "flashc.h"
00095 #include "pm.h"
00096 #include "intc.h"
00097
00099 #define SEQ_NUM_START 0x2546
00100
00102 unsigned short seqnum = SEQ_NUM_START;
00103
00105 const unsigned char local_ipaddr[4] = {ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3};
00106
00108 const unsigned char ARP_FRAME[42] = {
00109 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
00110 ETHERNET_CONF_ETHADDR0,ETHERNET_CONF_ETHADDR1,ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,ETHERNET_CONF_ETHADDR4,ETHERNET_CONF_ETHADDR5,
00111 0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04,0x00,0x01,
00112 ETHERNET_CONF_ETHADDR0,ETHERNET_CONF_ETHADDR1,ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,ETHERNET_CONF_ETHADDR4,ETHERNET_CONF_ETHADDR5,
00113 ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3,
00114 0x00,0x00,0x00,0x00,0x00,0x00,
00115 ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3
00116 };
00117
00119 unsigned char data[ETHERNET_CONF_TX_BUFFER_SIZE];
00120
00121 unsigned char hwaddr[ 6 ] = { ETHERNET_CONF_ETHADDR0,ETHERNET_CONF_ETHADDR1,ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,ETHERNET_CONF_ETHADDR4,ETHERNET_CONF_ETHADDR5 };
00122
00123
00132 unsigned short in_cksum(unsigned short *addr, int len)
00133 {
00134 int nleft, sum;
00135 unsigned short *w;
00136 union {
00137 unsigned short us;
00138 unsigned char uc[2];
00139 } last;
00140 unsigned short answer;
00141
00142 nleft = len;
00143 sum = 0;
00144 w = addr;
00145
00146
00147
00148
00149
00150
00151 while (nleft > 1)
00152 {
00153 sum += *w++;
00154 nleft -= 2;
00155 }
00156
00157
00158 if (nleft == 1)
00159 {
00160 last.uc[0] = *(unsigned char *)w;
00161 last.uc[1] = 0;
00162 sum += last.us;
00163 }
00164
00165
00166 sum = (sum >> 16) + (sum & 0xffff);
00167 sum += (sum >> 16);
00168 answer = ~sum;
00169 return(answer);
00170 }
00171
00177 void macb_example_send_ping_response(macb_packet_t *pkt)
00178 {
00179 unsigned char ipaddr[4];
00180 unsigned short chksum;
00181
00182
00183 memmove(pkt->data, pkt->data+6, 6);
00184 memcpy(pkt->data+6, hwaddr, 6);
00185
00186 memcpy(ipaddr, pkt->data+26, 4);
00187 memmove(pkt->data+26, pkt->data+30, 4);
00188 memcpy(pkt->data+30, ipaddr, 4);
00189
00190 pkt->data[18] = MSB(seqnum);
00191 pkt->data[19] = LSB(seqnum);
00192 if (++seqnum >= 0xFF00) seqnum = SEQ_NUM_START;
00193
00194 pkt->data[24] = 0;
00195 pkt->data[25] = 0;
00196
00197 chksum = in_cksum((unsigned short *)&pkt->data[14], 20);
00198
00199 pkt->data[24] = MSB(chksum);
00200 pkt->data[25] = LSB(chksum);
00201
00202 pkt->data[34] = 0;
00203
00204 pkt->data[36] = 0;
00205 pkt->data[37] = 0;
00206
00207 chksum = in_cksum((unsigned short *)&pkt->data[34], (pkt->len - 34));
00208
00209 pkt->data[36] = MSB(chksum);
00210 pkt->data[37] = LSB(chksum);
00211
00212 lMACBSend(&AVR32_MACB, pkt->data, pkt->len, TRUE);
00213 }
00214
00219 void macb_example_receive_packet(macb_packet_t *pkt)
00220 {
00221 unsigned char ipaddr[4];
00222
00223
00224 if ((pkt->data[12] == 0x08) && (pkt->data[13] == 0x06))
00225 {
00226
00227 if ((pkt->data[20] == 0x00) && (pkt->data[21] == 0x01))
00228 {
00229 print_dbg("ARP Request received...\r\n");
00230
00231 if(memcmp(pkt->data+38, local_ipaddr, 4))
00232 {
00233 print_dbg("...Ignored...\r\n");
00234 return;
00235 }
00236
00237
00238 memmove(pkt->data, pkt->data+6, 6);
00239 memcpy(pkt->data+6, hwaddr, 6);
00240
00241 pkt->data[21] = 0x02;
00242
00243 memcpy(ipaddr, pkt->data+38, 4);
00244 memmove(pkt->data+32, pkt->data+22, 10);
00245 memcpy(pkt->data+22, hwaddr, 6);
00246 memcpy(pkt->data+28, ipaddr, 4);
00247
00248 lMACBSend(&AVR32_MACB, pkt->data, pkt->len, TRUE);
00249 }
00250
00251 else if ((pkt->data[20] == 0x00) && (pkt->data[21] == 0x02))
00252 {
00253 print_dbg("ARP Response received...\r\n");
00254 }
00255
00256 else
00257 {
00258 print_dbg("Unimplemented ARP packet...\r\n");
00259 }
00260 }
00261
00262 else if (pkt->data[23] == 0x01)
00263 {
00264
00265 if (!memcmp(&pkt->data[30], local_ipaddr, 4))
00266 {
00267 if (pkt->data[34] == 0x08)
00268 {
00269 print_dbg("PING Request received...\r\n");
00270 macb_example_send_ping_response(pkt);
00271 }
00272 else
00273 {
00274 print_dbg("Unimplemented ICMP packet...\r\n");
00275 }
00276 }
00277 }
00278 else
00279 {
00280 print_dbg("Unknown packet...\r\n");
00281 }
00282 }
00283
00287 static void macb_example_send_ARP_request(void)
00288 {
00289 macb_packet_t request_pkt;
00290
00291 request_pkt.data = data;
00292
00293 memcpy(request_pkt.data, ARP_FRAME, 42);
00294 request_pkt.len = 42;
00295 #if CONF_MACB_VERBOSE
00296 print_dbg("Sending ARP Request...\r\n");
00297 #endif
00298
00299 lMACBSend(&AVR32_MACB, request_pkt.data, request_pkt.len, TRUE);
00300 }
00301
00305 void local_start_pll(void)
00306 {
00307 volatile avr32_pm_t *pm = &AVR32_PM;
00308
00309
00310 pm_switch_to_osc0(pm, FOSC0, OSC0_STARTUP);
00311
00312 pm_pll_setup(pm,
00313 0,
00314 15,
00315 1,
00316 0,
00317 16);
00318
00319 pm_pll_set_option(pm,
00320 0,
00321 0,
00322 1,
00323 0);
00324
00325 pm_pll_enable(pm,0);
00326
00327 pm_wait_for_pll0_locked(pm) ;
00328
00329 pm_gc_setup(pm,
00330 0,
00331 1,
00332 0,
00333 0,
00334 0);
00335
00336 pm_gc_enable(pm, 0);
00337
00338 pm_cksel(pm,1,2,1,0,1,0);
00339
00340 flashc_set_wait_state(1);
00341
00342 gpio_enable_module_pin(AVR32_PM_GCLK_0_0_PIN, AVR32_PM_GCLK_0_0_FUNCTION);
00343
00344 pm_switch_to_clock(pm, AVR32_PM_MCCTRL_MCSEL_PLL0);
00345 }
00346
00350 int main(void)
00351 {
00352 unsigned long len, i = 0;
00353 macb_packet_t recvd_pkt;
00354 static const gpio_map_t MACB_GPIO_MAP =
00355 {
00356 {AVR32_MACB_MDC_0_PIN, AVR32_MACB_MDC_0_FUNCTION },
00357 {AVR32_MACB_MDIO_0_PIN, AVR32_MACB_MDIO_0_FUNCTION },
00358 {AVR32_MACB_RXD_0_PIN, AVR32_MACB_RXD_0_FUNCTION },
00359 {AVR32_MACB_TXD_0_PIN, AVR32_MACB_TXD_0_FUNCTION },
00360 {AVR32_MACB_RXD_1_PIN, AVR32_MACB_RXD_1_FUNCTION },
00361 {AVR32_MACB_TXD_1_PIN, AVR32_MACB_TXD_1_FUNCTION },
00362 {AVR32_MACB_TX_EN_0_PIN, AVR32_MACB_TX_EN_0_FUNCTION },
00363 {AVR32_MACB_RX_ER_0_PIN, AVR32_MACB_RX_ER_0_FUNCTION },
00364 {AVR32_MACB_RX_DV_0_PIN, AVR32_MACB_RX_DV_0_FUNCTION },
00365 {AVR32_MACB_TX_CLK_0_PIN, AVR32_MACB_TX_CLK_0_FUNCTION}
00366 };
00367
00368
00369 local_start_pll();
00370
00371
00372 INTC_init_interrupts();
00373
00374
00375 init_dbg_rs232(FOSC0);
00376
00377
00378 print_dbg("\x1B[2J\x1B[H\r\n MACB Example\r\n");
00379
00380
00381 gpio_enable_module(MACB_GPIO_MAP, sizeof(MACB_GPIO_MAP) / sizeof(MACB_GPIO_MAP[0]));
00382
00383
00384 if (xMACBInit(&AVR32_MACB) == FALSE )
00385 {
00386 gpio_clr_gpio_pin(LED0_GPIO);
00387 while(1);
00388 }
00389
00390 gpio_clr_gpio_pin(LED1_GPIO);
00391
00392
00393 while (1)
00394 {
00395
00396 vMACBWaitForInput(100);
00397
00398 len = ulMACBInputLength();
00399 if( len != 0)
00400 {
00401
00402 vMACBRead( NULL, 0, 0 );
00403
00404 vMACBRead( data, 128, len );
00405 recvd_pkt.data = data;
00406 recvd_pkt.len = len;
00407 macb_example_receive_packet(&recvd_pkt);
00408 }
00409 if (++i >= 400)
00410 {
00411 i = 0;
00412
00413 macb_example_send_ARP_request();
00414 }
00415 }
00416 }