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 prvEthernetConfigureInterface(NULL);
00189 sys_sem_signal(*sem);
00190 }
00191
00195 void v_ethernet_stopResources( void )
00196 {
00197
00198 vDisableMACBOperations( &AVR32_MACB );
00199 }
00200
00210 void vEthernetGetMACAddr(portCHAR * pcConfig)
00211 {
00212 if (pcConfig != NULL)
00213 {
00214 sprintf(pcConfig, "%02x:%02x:%02x:%02x:%02x:%02x", MACB_if.hwaddr[0], MACB_if.hwaddr[1],
00215 MACB_if.hwaddr[2], MACB_if.hwaddr[3],
00216 MACB_if.hwaddr[4], MACB_if.hwaddr[5]);
00217 }
00218 }
00219
00229 void vEthernetGetIPAddr(portCHAR * pcConfig)
00230 {
00231 if (pcConfig != NULL)
00232 {
00233 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 24) & 0xff),
00234 (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 16) & 0xff),
00235 (u16_t)(ntohl((MACB_if.ip_addr.addr) >> 8) & 0xff),
00236 (u16_t) ntohl((MACB_if.ip_addr.addr) & 0xff ));
00237 }
00238 }
00239
00249 void vEthernetGetSubnetMask(portCHAR * pcConfig)
00250 {
00251 if (pcConfig != NULL)
00252 {
00253 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.netmask.addr) >> 24) & 0xff),
00254 (u16_t)(ntohl((MACB_if.netmask.addr) >> 16) & 0xff),
00255 (u16_t)(ntohl((MACB_if.netmask.addr) >> 8) & 0xff),
00256 (u16_t) ntohl((MACB_if.netmask.addr) & 0xff ));
00257 }
00258 }
00259
00269 void vEthernetGetGWAddr(portCHAR * pcConfig)
00270 {
00271 if (pcConfig != NULL)
00272 {
00273 sprintf(pcConfig,"%d.%d.%d.%d", (u16_t)(ntohl((MACB_if.gw.addr) >> 24) & 0xff),
00274 (u16_t)(ntohl((MACB_if.gw.addr) >> 16) & 0xff),
00275 (u16_t)(ntohl((MACB_if.gw.addr) >> 8) & 0xff),
00276 (u16_t) ntohl((MACB_if.gw.addr) & 0xff ));
00277 }
00278 }
00279
00280
00298 eExecStatus e_ethernet_cmd_set_config( eModId xModId, signed short FsNavId,
00299 int ac, signed portCHAR *av[],
00300 signed portCHAR **ppcStringReply )
00301 {
00302
00303 if (config_file_set_value(ETHERNET_CONFIG_FILE, ac, av) != 0)
00304 {
00305 if(ppcStringReply != NULL)
00306 {
00307 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_CONFIGERROR;
00308 }
00309 return( SHELL_EXECSTATUS_KO );
00310 }
00311 if(ppcStringReply != NULL)
00312 {
00313
00314 *ppcStringReply = (signed portCHAR *)pvPortMalloc( strlen( SHELL_MSG_REBOOT ) +1 );
00315 if( NULL != *ppcStringReply )
00316 {
00317 strcpy( (char *)*ppcStringReply, SHELL_MSG_REBOOT );
00318 }
00319 }
00320 return( SHELL_EXECSTATUS_OK );
00321 }
00322
00323
00343 eExecStatus e_ethernet_cmd_get_config( eModId xModId, signed short FsNavId,
00344 int ac, signed portCHAR *av[],
00345 signed portCHAR **ppcStringReply )
00346 {
00347 portCHAR buf[18];
00348
00349 if(ppcStringReply != NULL)
00350 {
00351
00352 *ppcStringReply = (signed portCHAR *)pvPortMalloc(130);
00353 if( NULL == *ppcStringReply )
00354 {
00355 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_MEMALLOC;
00356 return( SHELL_EXECSTATUS_KO );
00357 }
00358
00359 strcpy((char *)*ppcStringReply, "macaddr=");
00360
00361 vEthernetGetMACAddr(buf);
00362 strcat((char *)*ppcStringReply,buf);
00363
00364 strcat((char *)*ppcStringReply,"\r\nipaddr=");
00365
00366 vEthernetGetIPAddr(buf);
00367 strcat((char *)*ppcStringReply,buf);
00368
00369 strcat((char *)*ppcStringReply,"\r\nsubmask=");
00370
00371 vEthernetGetSubnetMask(buf);
00372 strcat((char *)*ppcStringReply,buf);
00373
00374 strcat((char *)*ppcStringReply,"\r\ngwaddr=");
00375
00376 vEthernetGetGWAddr(buf);
00377 strcat((char *)*ppcStringReply,buf);
00378
00379 strcat((char *)*ppcStringReply,"\r\n");
00380
00381 return( SHELL_EXECSTATUS_OK );
00382 }
00383 return( SHELL_EXECSTATUS_KO );
00384 }
00385
00386
00390 static void prvlwIPInit( void )
00391 {
00392 sys_sem_t sem;
00393
00394
00395 sem = sys_sem_new(0);
00396 tcpip_init(tcpip_init_done, &sem);
00397 sys_sem_wait(sem);
00398 sys_sem_free(sem);
00399
00400 }
00401
00405 static void prvEthernetConfigureInterface(void * param)
00406 {
00407 struct ip_addr xIpAddr, xNetMask, xGateway;
00408 extern err_t ethernetif_init( struct netif *netif );
00409 portCHAR token[18];
00410 portCHAR IPAddress[16];
00411 portCHAR * current;
00412 unsigned portCHAR MacAddress[6];
00413 portSHORT NbDigits = 0;
00414 unsigned int AddrByte;
00415
00416
00417
00418
00419 if( pdFALSE == x_supervisor_SemaphoreTake( xCFGMutex, 0 ) )
00420 {
00421
00422 prv_v_set_default_netconfig( MacAddress, &xIpAddr, &xNetMask, &xGateway );
00423 }
00424
00425 else
00426 {
00427 if (config_file_get_value(ETHERNET_CONFIG_FILE, "macaddr" , token) >= 0)
00428 {
00429 current = token;
00430 while (NbDigits < 6)
00431 {
00432
00433 sscanf(current, "%02x", &AddrByte);
00434 MacAddress[NbDigits++] = (portCHAR)AddrByte;
00435 current = strpbrk(current, ":");
00436
00437 if ((current == NULL) && (NbDigits != 6))
00438 {
00439 prv_v_set_default_macaddr( MacAddress );
00440 break;
00441 }
00442 current++;
00443 }
00444 }
00445 else
00446 {
00447
00448 prv_v_set_default_macaddr( MacAddress );
00449 }
00450
00451 vMACBSetMACAddress(MacAddress);
00452
00453
00454
00455
00456
00457 if (config_file_get_value(ETHERNET_CONFIG_FILE, "ipaddr" , token) >= 0)
00458 {
00459
00460 xIpAddr.addr = inet_addr(token);
00461 }
00462 else
00463 {
00464
00465 IP4_ADDR(&xIpAddr,ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3);
00466 }
00467
00468 if (config_file_get_value(ETHERNET_CONFIG_FILE, "submask", token) >= 0)
00469 {
00470
00471 xNetMask.addr = inet_addr(token);
00472 }
00473 else
00474 {
00475
00476 IP4_ADDR(&xNetMask,ETHERNET_CONF_NET_MASK0,ETHERNET_CONF_NET_MASK1,ETHERNET_CONF_NET_MASK2,ETHERNET_CONF_NET_MASK3);
00477 }
00478
00479 if (config_file_get_value(ETHERNET_CONFIG_FILE, "gwaddr" , token) >= 0)
00480 {
00481
00482 xGateway.addr = inet_addr(token);
00483 }
00484 else
00485 {
00486
00487 IP4_ADDR(&xGateway,ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3);
00488 }
00489
00490 x_supervisor_SemaphoreGive( xCFGMutex );
00491 }
00492
00493
00494 netif_add(&MACB_if, &xIpAddr, &xNetMask, &xGateway, NULL, ethernetif_init, tcpip_input);
00495
00496 netif_set_default(&MACB_if);
00497
00498 netif_set_up(&MACB_if);
00499
00500 vEthernetGetIPAddr(IPAddress);
00501
00502 #ifdef MMILCD_ENABLE
00503 vMMI_DisplayIP(IPAddress);
00504 #endif
00505 }
00506
00507
00526 eExecStatus e_ip_stat( eModId xModId, signed short FsNavId,
00527 int ac, signed portCHAR *av[],
00528 signed portCHAR **ppcStringReply )
00529 {
00530 if( NULL != ppcStringReply )
00531 *ppcStringReply = NULL;
00532 stats_display();
00533 return( SHELL_EXECSTATUS_OK );
00534 }
00535
00536
00537
00538
00544 static void prv_v_set_default_macaddr( unsigned portCHAR aMacAddress[] )
00545 {
00546 aMacAddress[0] = ETHERNET_CONF_ETHADDR0;
00547 aMacAddress[1] = ETHERNET_CONF_ETHADDR1;
00548 aMacAddress[2] = ETHERNET_CONF_ETHADDR2;
00549 aMacAddress[3] = ETHERNET_CONF_ETHADDR3;
00550 aMacAddress[4] = ETHERNET_CONF_ETHADDR4;
00551 aMacAddress[5] = ETHERNET_CONF_ETHADDR5;
00552 }
00553
00562 static void prv_v_set_default_netconfig( unsigned portCHAR aMacAddress[],
00563 struct ip_addr *pxIpAddr,
00564 struct ip_addr *pxNetMask,
00565 struct ip_addr *pxGateway )
00566 {
00567
00568 prv_v_set_default_macaddr( aMacAddress );
00569
00570 vMACBSetMACAddress( aMacAddress );
00571
00572
00573
00574
00575
00576
00577 IP4_ADDR(pxIpAddr,ETHERNET_CONF_IPADDR0,ETHERNET_CONF_IPADDR1,ETHERNET_CONF_IPADDR2,ETHERNET_CONF_IPADDR3);
00578
00579
00580 IP4_ADDR(pxNetMask,ETHERNET_CONF_NET_MASK0,ETHERNET_CONF_NET_MASK1,ETHERNET_CONF_NET_MASK2,ETHERNET_CONF_NET_MASK3);
00581
00582
00583 IP4_ADDR(pxGateway,ETHERNET_CONF_GATEWAY_ADDR0,ETHERNET_CONF_GATEWAY_ADDR1,ETHERNET_CONF_GATEWAY_ADDR2,ETHERNET_CONF_GATEWAY_ADDR3);
00584 }