00001
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #include <stdlib.h>
00048 #include <string.h>
00049
00050 #include "conf_eth.h"
00051 #include "conf_explorer.h"
00052
00053 #include "gpio.h"
00054
00055
00056
00057 #include "FreeRTOS.h"
00058 #include "task.h"
00059
00060
00061 #include "serial.h"
00062 #include "fsaccess.h"
00063 #include "config_file.h"
00064 #include "conf_lwip_threads.h"
00065
00066
00067 #include "ethernet.h"
00068 #include "macb.h"
00069
00070 #if (HTTP_USED == 1)
00071 #include "BasicWEB.h"
00072 #endif
00073
00074 #if (TFTP_USED == 1)
00075 #include "BasicTFTP.h"
00076 #endif
00077
00078 #if (SMTP_USED == 1)
00079 #include "BasicSMTP.h"
00080 #endif
00081
00082
00083 #include "lwip/sys.h"
00084 #include "lwip/api.h"
00085 #include "lwip/tcpip.h"
00086 #include "lwip/memp.h"
00087 #include "lwip/stats.h"
00088 #include "netif/loopif.h"
00089
00090
00091 #include "supervisor.h"
00092 #include "shell.h"
00093
00094 #include "MMI.h"
00095
00096
00097
00098
00099
00100
00101
00102 struct netif MACB_if;
00103
00105 extern xSemaphoreHandle xCFGMutex;
00106
00107
00108
00109
00110 static void prvlwIPInit( void );
00111
00112
00113 static void prvEthernetConfigureInterface(void * param);
00114
00115 static void prv_v_set_default_macaddr( unsigned portCHAR aMacAddress[] );
00116
00117 static void prv_v_set_default_netconfig( unsigned portCHAR aMacAddress[],
00118 struct ip_addr *pxIpAddr,
00119 struct ip_addr *pxNetMask,
00120 struct ip_addr *pxGateway );
00121
00122
00123
00124
00125 void vStartEthernetTaskLauncher( unsigned portBASE_TYPE uxPriority )
00126 {
00127
00128 xTaskCreate( vStartEthernetTask, ( const signed portCHAR * )"ETHLAUNCH",
00129 configMINIMAL_STACK_SIZE + 192, NULL, uxPriority, ( xTaskHandle * )NULL );
00130 }
00131
00132
00133
00134
00135 portTASK_FUNCTION( vStartEthernetTask, pvParameters )
00136 {
00137 static const gpio_map_t MACB_GPIO_MAP =
00138 {
00139 {AVR32_MACB_MDC_0_PIN, AVR32_MACB_MDC_0_FUNCTION },
00140 {AVR32_MACB_MDIO_0_PIN, AVR32_MACB_MDIO_0_FUNCTION },
00141 {AVR32_MACB_RXD_0_PIN, AVR32_MACB_RXD_0_FUNCTION },
00142 {AVR32_MACB_TXD_0_PIN, AVR32_MACB_TXD_0_FUNCTION },
00143 {AVR32_MACB_RXD_1_PIN, AVR32_MACB_RXD_1_FUNCTION },
00144 {AVR32_MACB_TXD_1_PIN, AVR32_MACB_TXD_1_FUNCTION },
00145 {AVR32_MACB_TX_EN_0_PIN, AVR32_MACB_TX_EN_0_FUNCTION },
00146 {AVR32_MACB_RX_ER_0_PIN, AVR32_MACB_RX_ER_0_FUNCTION },
00147 {AVR32_MACB_RX_DV_0_PIN, AVR32_MACB_RX_DV_0_FUNCTION },
00148 {AVR32_MACB_TX_CLK_0_PIN, AVR32_MACB_TX_CLK_0_FUNCTION}
00149 };
00150
00151
00152 gpio_enable_module(MACB_GPIO_MAP, sizeof(MACB_GPIO_MAP) / sizeof(MACB_GPIO_MAP[0]));
00153
00154
00155
00156 prvlwIPInit();
00157
00158 #if (HTTP_USED == 1)
00159
00160 sys_thread_new( "WEB", vBasicWEBServer, ( void * ) NULL,
00161 CTRLPANEL_WEB_SERVER_STACK_SIZE,
00162 CTRLPANEL_WEB_SERVER_PRIORITY );
00163 #endif
00164
00165 #if (TFTP_USED == 1)
00166
00167 sys_thread_new( "TFTP", vBasicTFTPServer, ( void * ) NULL,
00168 CTRLPANEL_TFTP_SERVER_STACK_SIZE,
00169 CTRLPANEL_TFTP_SERVER_PRIORITY );
00170 #endif
00171
00172 #if (SMTP_USED == 1)
00173
00174 sys_thread_new( "SMTP", vBasicSMTPClient, ( void * ) NULL,
00175 CTRLPANEL_SMTP_CLIENT_STACK_SIZE,
00176 CTRLPANEL_SMTP_CLIENT_PRIORITY );
00177 #endif
00178
00179 vTaskDelete(NULL);
00180 }
00181
00182
00184 static void tcpip_init_done(void *arg)
00185 {
00186 sys_sem_t *sem;
00187 sem = (sys_sem_t *)arg;
00188 sys_sem_signal(*sem);
00189 }
00190
00194 void v_ethernet_stopResources( void )
00195 {
00196
00197 vDisableMACBOperations( &AVR32_MACB );
00198 }
00199
00209 void vEthernetGetMACAddr(portCHAR * pcConfig)
00210 {
00211 if (pcConfig != NULL)
00212 {
00213 sprintf(pcConfig, "%02x:%02x:%02x:%02x:%02x:%02x", MACB_if.hwaddr[0], MACB_if.hwaddr[1],
00214 MACB_if.hwaddr[2], MACB_if.hwaddr[3],
00215 MACB_if.hwaddr[4], MACB_if.hwaddr[5]);
00216 }
00217 }
00218
00228 void vEthernetGetIPAddr(portCHAR * pcConfig)
00229 {
00230 if (pcConfig != NULL)
00231 {
00232 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 24) & 0xff),
00233 (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 16) & 0xff),
00234 (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 8) & 0xff),
00235 (u16_t) ntohl((MACB_if.ip_addr.addr) & 0xff ));
00236 }
00237 }
00238
00248 void vEthernetGetSubnetMask(portCHAR * pcConfig)
00249 {
00250 if (pcConfig != NULL)
00251 {
00252 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.netmask.addr) >> 24) & 0xff),
00253 (u16_t)(ntohl((MACB_if.netmask.addr) >> 16) & 0xff),
00254 (u16_t)(ntohl((MACB_if.netmask.addr) >> 8) & 0xff),
00255 (u16_t) ntohl((MACB_if.netmask.addr) & 0xff ));
00256 }
00257 }
00258
00268 void vEthernetGetGWAddr(portCHAR * pcConfig)
00269 {
00270 if (pcConfig != NULL)
00271 {
00272 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.gw.addr) >> 24) & 0xff),
00273 (u16_t)(ntohl((MACB_if.gw.addr) >> 16) & 0xff),
00274 (u16_t)(ntohl((MACB_if.gw.addr) >> 8) & 0xff),
00275 (u16_t) ntohl((MACB_if.gw.addr) & 0xff ));
00276 }
00277 }
00278
00279
00297 eExecStatus e_ethernet_cmd_set_config( eModId xModId, signed short FsNavId,
00298 int ac, signed portCHAR *av[],
00299 signed portCHAR **ppcStringReply )
00300 {
00301
00302 if (config_file_set_value(ETHERNET_CONFIG_FILE, ac, av) != 0)
00303 {
00304 if(ppcStringReply != NULL)
00305 {
00306 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_CONFIGERROR;
00307 }
00308 return( SHELL_EXECSTATUS_KO );
00309 }
00310 if(ppcStringReply != NULL)
00311 {
00312
00313 *ppcStringReply = (signed portCHAR *)pvPortMalloc( strlen( SHELL_MSG_REBOOT ) +1 );
00314 if( NULL != *ppcStringReply )
00315 {
00316 strcpy( (char *)*ppcStringReply, SHELL_MSG_REBOOT );
00317 }
00318 }
00319 return( SHELL_EXECSTATUS_OK );
00320 }
00321
00322
00342 eExecStatus e_ethernet_cmd_get_config( eModId xModId, signed short FsNavId,
00343 int ac, signed portCHAR *av[],
00344 signed portCHAR **ppcStringReply )
00345 {
00346 portCHAR buf[18];
00347
00348 if(ppcStringReply != NULL)
00349 {
00350
00351 *ppcStringReply = (signed portCHAR *)pvPortMalloc(130);
00352 if( NULL == *ppcStringReply )
00353 {
00354 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_MEMALLOC;
00355 return( SHELL_EXECSTATUS_KO );
00356 }
00357
00358 strcpy((char *)*ppcStringReply, "macaddr=");
00359
00360 vEthernetGetMACAddr(buf);
00361 strcat((char *)*ppcStringReply,buf);
00362
00363 strcat((char *)*ppcStringReply,"\r\nipaddr=");
00364
00365 vEthernetGetIPAddr(buf);
00366 strcat((char *)*ppcStringReply,buf);
00367
00368 strcat((char *)*ppcStringReply,"\r\nsubmask=");
00369
00370 vEthernetGetSubnetMask(buf);
00371 strcat((char *)*ppcStringReply,buf);
00372
00373 strcat((char *)*ppcStringReply,"\r\ngwaddr=");
00374
00375 vEthernetGetGWAddr(buf);
00376 strcat((char *)*ppcStringReply,buf);
00377
00378 strcat((char *)*ppcStringReply,"\r\n");
00379
00380 return( SHELL_EXECSTATUS_OK );
00381 }
00382 return( SHELL_EXECSTATUS_KO );
00383 }
00384
00385
00389 static void prvlwIPInit( void )
00390 {
00391 sys_sem_t sem;
00392
00393
00394 sem = sys_sem_new(0);
00395 tcpip_init(tcpip_init_done, &sem);
00396 sys_sem_wait(sem);
00397 sys_sem_free(sem);
00398
00399
00400 prvEthernetConfigureInterface(NULL);
00401 }
00402
00406 static void prvEthernetConfigureInterface(void * param)
00407 {
00408 struct ip_addr xIpAddr, xNetMask, xGateway;
00409 extern err_t ethernetif_init( struct netif *netif );
00410 portCHAR token[18];
00411 portCHAR IPAddress[16];
00412 portCHAR * current;
00413 unsigned portCHAR MacAddress[6];
00414 portSHORT NbDigits = 0;
00415 unsigned int AddrByte;
00416
00417
00418
00419
00420 if( pdFALSE == x_supervisor_SemaphoreTake( xCFGMutex, 0 ) )
00421 {
00422
00423 prv_v_set_default_netconfig( MacAddress, &xIpAddr, &xNetMask, &xGateway );
00424 }
00425
00426 else
00427 {
00428 if (config_file_get_value(ETHERNET_CONFIG_FILE, "macaddr" , token) >= 0)
00429 {
00430 current = token;
00431 while (NbDigits < 6)
00432 {
00433
00434 sscanf(current, "%02x", &AddrByte);
00435 MacAddress[NbDigits++] = (portCHAR)AddrByte;
00436 current = strpbrk(current, ":");
00437
00438 if ((current == NULL) && (NbDigits != 6))
00439 {
00440 prv_v_set_default_macaddr( MacAddress );
00441 break;
00442 }
00443 current++;
00444 }
00445 }
00446 else
00447 {
00448
00449 prv_v_set_default_macaddr( MacAddress );
00450 }
00451
00452 vMACBSetMACAddress(MacAddress);
00453
00454
00455
00456
00457
00458 if (config_file_get_value(ETHERNET_CONFIG_FILE, "ipaddr" , token) >= 0)
00459 {
00460
00461 xIpAddr.addr = inet_addr(token);
00462 }
00463 else
00464 {
00465
00466 IP4_ADDR(&xIpAddr,ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3);
00467 }
00468
00469 if (config_file_get_value(ETHERNET_CONFIG_FILE, "submask", token) >= 0)
00470 {
00471
00472 xNetMask.addr = inet_addr(token);
00473 }
00474 else
00475 {
00476
00477 IP4_ADDR(&xNetMask,ETHERNET_CONF_NET_MASK0,ETHERNET_CONF_NET_MASK1,ETHERNET_CONF_NET_MASK2,ETHERNET_CONF_NET_MASK3);
00478 }
00479
00480 if (config_file_get_value(ETHERNET_CONFIG_FILE, "gwaddr" , token) >= 0)
00481 {
00482
00483 xGateway.addr = inet_addr(token);
00484 }
00485 else
00486 {
00487
00488 IP4_ADDR(&xGateway,ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3);
00489 }
00490
00491 x_supervisor_SemaphoreGive( xCFGMutex );
00492 }
00493
00494
00495 netif_add(&MACB_if, &xIpAddr, &xNetMask, &xGateway, NULL, ethernetif_init, tcpip_input);
00496
00497 netif_set_default(&MACB_if);
00498
00499 netif_set_up(&MACB_if);
00500
00501 vEthernetGetIPAddr(IPAddress);
00502
00503 #ifdef MMILCD_ENABLE
00504 vMMI_DisplayIP(IPAddress);
00505 #endif
00506 }
00507
00508
00527 eExecStatus e_ip_stat( eModId xModId, signed short FsNavId,
00528 int ac, signed portCHAR *av[],
00529 signed portCHAR **ppcStringReply )
00530 {
00531 if( NULL != ppcStringReply )
00532 *ppcStringReply = NULL;
00533 stats_display();
00534 return( SHELL_EXECSTATUS_OK );
00535 }
00536
00537
00538
00539
00545 static void prv_v_set_default_macaddr( unsigned portCHAR aMacAddress[] )
00546 {
00547 aMacAddress[0] = ETHERNET_CONF_ETHADDR0;
00548 aMacAddress[1] = ETHERNET_CONF_ETHADDR1;
00549 aMacAddress[2] = ETHERNET_CONF_ETHADDR2;
00550 aMacAddress[3] = ETHERNET_CONF_ETHADDR3;
00551 aMacAddress[4] = ETHERNET_CONF_ETHADDR4;
00552 aMacAddress[5] = ETHERNET_CONF_ETHADDR5;
00553 }
00554
00563 static void prv_v_set_default_netconfig( unsigned portCHAR aMacAddress[],
00564 struct ip_addr *pxIpAddr,
00565 struct ip_addr *pxNetMask,
00566 struct ip_addr *pxGateway )
00567 {
00568
00569 prv_v_set_default_macaddr( aMacAddress );
00570
00571 vMACBSetMACAddress( aMacAddress );
00572
00573
00574
00575
00576
00577
00578 IP4_ADDR(pxIpAddr,ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3);
00579
00580
00581 IP4_ADDR(pxNetMask,ETHERNET_CONF_NET_MASK0,ETHERNET_CONF_NET_MASK1,ETHERNET_CONF_NET_MASK2,ETHERNET_CONF_NET_MASK3);
00582
00583
00584 IP4_ADDR(pxGateway,ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3);
00585 }