+/*-----------------------------------------------------------*/\r
+\r
+static void prvInitialise_uIP( void )\r
+{\r
+uip_ipaddr_t xIPAddr;\r
+xTimerHandle xARPTimer, xPeriodicTimer;\r
+\r
+ uip_init();\r
+ uip_ipaddr( &xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );\r
+ uip_sethostaddr( &xIPAddr );\r
+ uip_ipaddr( &xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );\r
+ uip_setnetmask( &xIPAddr );\r
+ prvSetMACAddress();\r
+ httpd_init();\r
+\r
+ /* Create the queue used to sent TCP/IP events to the uIP stack. */\r
+ xEMACEventQueue = xQueueCreate( uipEVENT_QUEUE_LENGTH, sizeof( unsigned long ) );\r
+\r
+ /* Create and start the uIP timers. */\r
+ xARPTimer = xTimerCreate( ( const signed char * const ) "ARPTimer", /* Just a name that is helpful for debugging, not used by the kernel. */\r
+ ( 500 / portTICK_RATE_MS ), /* Timer period. */\r
+ pdTRUE, /* Autor-reload. */\r
+ ( void * ) uipARP_TIMER,\r
+ prvUIPTimerCallback\r
+ );\r
+\r
+ xPeriodicTimer = xTimerCreate( ( const signed char * const ) "PeriodicTimer",\r
+ ( 5000 / portTICK_RATE_MS ),\r
+ pdTRUE, /* Autor-reload. */\r
+ ( void * ) uipPERIODIC_TIMER,\r
+ prvUIPTimerCallback\r
+ );\r
+\r
+ configASSERT( xARPTimer );\r
+ configASSERT( xPeriodicTimer );\r
+\r
+ xTimerStart( xARPTimer, portMAX_DELAY );\r
+ xTimerStart( xPeriodicTimer, portMAX_DELAY );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvEMACEventListener( unsigned long ulISREvents )\r
+{\r
+long lHigherPriorityTaskWoken = pdFALSE;\r
+unsigned long ulUIPEvents = 0UL;\r
+\r
+ configASSERT( xEMACEventQueue );\r
+\r
+ if( ( ulISREvents & MSS_MAC_EVENT_PACKET_SEND ) != 0UL )\r
+ {\r
+ /* Handle send event. */\r
+ ulUIPEvents |= uipETHERNET_TX_EVENT;\r
+ }\r
+\r
+ if( ( ulISREvents & MSS_MAC_EVENT_PACKET_RECEIVED ) != 0UL )\r
+ {\r
+ /* Wake the uIP task as new data has arrived. */\r
+ ulUIPEvents |= uipETHERNET_RX_EVENT;\r
+ xQueueSendFromISR( xEMACEventQueue, &ulUIPEvents, &lHigherPriorityTaskWoken );\r
+ }\r
+\r
+ portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvInitEmac( void )\r
+{\r
+unsigned long ulMACCfg;\r
+const unsigned char ucPHYAddress = 1;\r
+\r
+ MSS_MAC_init( ucPHYAddress );\r
+\r
+ MSS_MAC_set_callback( prvEMACEventListener );\r
+\r
+ /* Setup the EMAC and the NVIC for MAC interrupts. */\r
+ NVIC_SetPriority( EthernetMAC_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\r
+ NVIC_EnableIRQ( EthernetMAC_IRQn );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vEMACWrite( void )\r
+{\r
+ MSS_MAC_tx_packet( uip_buf, uip_len, 0 );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+unsigned long ulEMACRead( void )\r
+{\r
+ return MSS_MAC_rx_packet( &uip_buf, ( MSS_RX_BUFF_SIZE + 4 ), 0UL );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+long lEMACWaitForLink( void )\r
+{\r
+long lReturn = pdFAIL;\r
+unsigned long ulStatus;\r
+\r
+ ulStatus = MSS_MAC_link_status();\r
+ if( ( ulStatus & ( unsigned long ) MSS_MAC_LINK_STATUS_LINK ) != 0UL )\r
+ {\r
+ lReturn = pdPASS;\r
+ }\r
+\r
+ return lReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r