\r
/* The buffer used by the uIP stack to both receive and send. This points to\r
one of the Ethernet buffers when its actually in use. */\r
-unsigned char *uip_buf = NULL;\r
+extern unsigned char *uip_buf;\r
\r
static const unsigned char ucMACAddress[] = { configMAC_ADDR0, configMAC_ADDR1, configMAC_ADDR2, configMAC_ADDR3, configMAC_ADDR4, configMAC_ADDR5 };\r
\r
\r
void vEMACWrite( void );\r
\r
-unsigned long ulEMACRead( void );\r
long lEMACWaitForLink( void );\r
\r
/*\r
\r
void vuIP_Task( void *pvParameters )\r
{\r
-portBASE_TYPE i, xDoneSomething;\r
+portBASE_TYPE i;\r
unsigned long ulNewEvent;\r
\r
( void ) pvParameters;\r
\r
for( ;; )\r
{\r
- xDoneSomething = pdFALSE;\r
- \r
- /* Is there received data ready to be processed? */\r
- uip_len = ( unsigned short ) ulEMACRead();\r
- \r
- if( ( uip_len > 0 ) && ( uip_buf != NULL ) )\r
+ if( ( ulUIP_Events & uipETHERNET_TX_EVENT ) != 0UL )\r
{\r
- /* Standard uIP loop taken from the uIP manual. */\r
- if( xHeader->type == htons( UIP_ETHTYPE_IP ) )\r
- {\r
- uip_arp_ipin();\r
- uip_input();\r
+ ulUIP_Events &= ~uipETHERNET_TX_EVENT;\r
+ MSS_MAC_TxBufferCompleted();\r
+ }\r
\r
- /* If the above function invocation resulted in data that\r
- should be sent out on the network, the global variable\r
- uip_len is set to a value > 0. */\r
- if( uip_len > 0 )\r
+ if( ( ulUIP_Events & uipETHERNET_RX_EVENT ) != 0UL )\r
+ {\r
+ ulUIP_Events &= ~uipETHERNET_RX_EVENT;\r
+\r
+ /* Is there received data ready to be processed? */\r
+ uip_len = MSS_MAC_rx_packet();\r
+\r
+ if( ( uip_len > 0 ) && ( uip_buf != NULL ) )\r
+ {\r
+ /* Standard uIP loop taken from the uIP manual. */\r
+ if( xHeader->type == htons( UIP_ETHTYPE_IP ) )\r
{\r
- uip_arp_out();\r
- vEMACWrite();\r
+ uip_arp_ipin();\r
+ uip_input();\r
+\r
+ /* If the above function invocation resulted in data that\r
+ should be sent out on the network, the global variable\r
+ uip_len is set to a value > 0. */\r
+ if( uip_len > 0 )\r
+ {\r
+ uip_arp_out();\r
+ vEMACWrite();\r
+ }\r
}\r
- \r
- xDoneSomething = pdTRUE;\r
- }\r
- else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )\r
- {\r
- uip_arp_arpin();\r
-\r
- /* If the above function invocation resulted in data that\r
- should be sent out on the network, the global variable\r
- uip_len is set to a value > 0. */\r
- if( uip_len > 0 )\r
+ else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )\r
{\r
- vEMACWrite();\r
+ uip_arp_arpin();\r
+\r
+ /* If the above function invocation resulted in data that\r
+ should be sent out on the network, the global variable\r
+ uip_len is set to a value > 0. */\r
+ if( uip_len > 0 )\r
+ {\r
+ vEMACWrite();\r
+ }\r
}\r
- \r
- xDoneSomething = pdTRUE;\r
}\r
}\r
\r
- if( ( ( ulUIP_Events & uipPERIODIC_TIMER_EVENT ) != 0UL ) && ( uip_buf != NULL ) )\r
+ if( ( ulUIP_Events & uipPERIODIC_TIMER_EVENT ) != 0UL )\r
{\r
ulUIP_Events &= ~uipPERIODIC_TIMER_EVENT;\r
\r
vEMACWrite();\r
}\r
}\r
+ }\r
\r
- /* Call the ARP timer function every 10 seconds. */\r
- if( ( ulUIP_Events & uipARP_TIMER_EVENT ) != 0 )\r
- {\r
- ulUIP_Events &= ~uipARP_TIMER_EVENT;\r
- uip_arp_timer();\r
- }\r
- \r
- xDoneSomething = pdTRUE;\r
+ /* Call the ARP timer function every 10 seconds. */\r
+ if( ( ulUIP_Events & uipARP_TIMER_EVENT ) != 0 )\r
+ {\r
+ ulUIP_Events &= ~uipARP_TIMER_EVENT;\r
+ uip_arp_timer();\r
}\r
- \r
- if( xDoneSomething == pdFALSE )\r
+\r
+ if( ulUIP_Events == pdFALSE )\r
{\r
xQueueReceive( xEMACEventQueue, &ulNewEvent, portMAX_DELAY );\r
ulUIP_Events |= ulNewEvent;\r
\r
if( ( ulISREvents & MSS_MAC_EVENT_PACKET_SEND ) != 0UL )\r
{\r
- /* Handle send event. */\r
- ulUIPEvents |= uipETHERNET_TX_EVENT;\r
+ ulUIP_Events |= 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
+ }\r
+\r
+ if( ulUIPEvents != 0UL )\r
+ {\r
xQueueSendFromISR( xEMACEventQueue, &ulUIPEvents, &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
void vEMACWrite( void )\r
{\r
- MSS_MAC_tx_packet( uip_buf, uip_len, 0 );\r
-}\r
-/*-----------------------------------------------------------*/\r
+const long lMaxAttempts = 10;\r
+long lAttempt;\r
+const portTickType xShortDelay = ( 10 / portTICK_RATE_MS );\r
\r
-unsigned long ulEMACRead( void )\r
-{\r
- return MSS_MAC_rx_packet( &uip_buf, ( MSS_RX_BUFF_SIZE + 4 ), 0UL );\r
+ for( lAttempt = 0; lAttempt < lMaxAttempts; lAttempt++ )\r
+ {\r
+ if( MSS_MAC_tx_packet( uip_len ) != 0 )\r
+ {\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ vTaskDelay( xShortDelay );\r
+ }\r
+ }\r
}\r
/*-----------------------------------------------------------*/\r
\r