]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_LPC1768_GCC_RedSuite/src/webserver/uIP_Task.c
Update version number to 8.1.2 after moving the defaulting of configUSE_PORT_OPTIMISE...
[freertos] / FreeRTOS / Demo / CORTEX_LPC1768_GCC_RedSuite / src / webserver / uIP_Task.c
1 /*\r
2     FreeRTOS V8.1.2 - Copyright (C) 2014 Real Time Engineers Ltd. \r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     ***************************************************************************\r
8      *                                                                       *\r
9      *    FreeRTOS provides completely free yet professionally developed,    *\r
10      *    robust, strictly quality controlled, supported, and cross          *\r
11      *    platform software that has become a de facto standard.             *\r
12      *                                                                       *\r
13      *    Help yourself get started quickly and support the FreeRTOS         *\r
14      *    project by purchasing a FreeRTOS tutorial book, reference          *\r
15      *    manual, or both from: http://www.FreeRTOS.org/Documentation        *\r
16      *                                                                       *\r
17      *    Thank you!                                                         *\r
18      *                                                                       *\r
19     ***************************************************************************\r
20 \r
21     This file is part of the FreeRTOS distribution.\r
22 \r
23     FreeRTOS is free software; you can redistribute it and/or modify it under\r
24     the terms of the GNU General Public License (version 2) as published by the\r
25     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
26 \r
27     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
28     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
29     >>!   obliged to provide the source code for proprietary components     !<<\r
30     >>!   outside of the FreeRTOS kernel.                                   !<<\r
31 \r
32     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
33     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
34     FOR A PARTICULAR PURPOSE.  Full license text is available from the following\r
35     link: http://www.freertos.org/a00114.html\r
36 \r
37     1 tab == 4 spaces!\r
38 \r
39     ***************************************************************************\r
40      *                                                                       *\r
41      *    Having a problem?  Start by reading the FAQ "My application does   *\r
42      *    not run, what could be wrong?"                                     *\r
43      *                                                                       *\r
44      *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
45      *                                                                       *\r
46     ***************************************************************************\r
47 \r
48     http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
49     license and Real Time Engineers Ltd. contact details.\r
50 \r
51     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
52     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
53     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
54 \r
55     http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
56     Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
57     licenses offer ticketed support, indemnification and middleware.\r
58 \r
59     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
60     engineered and independently SIL3 certified version for use in safety and\r
61     mission critical applications that require provable dependability.\r
62 \r
63     1 tab == 4 spaces!\r
64 */\r
65 \r
66 /* Standard includes. */\r
67 #include <string.h>\r
68 \r
69 /* Scheduler includes. */\r
70 #include "FreeRTOS.h"\r
71 #include "task.h"\r
72 #include "semphr.h"\r
73 \r
74 /* uip includes. */\r
75 #include "uip.h"\r
76 #include "uip_arp.h"\r
77 #include "httpd.h"\r
78 #include "timer.h"\r
79 #include "clock-arch.h"\r
80 \r
81 /* Demo includes. */\r
82 #include "EthDev_LPC17xx.h"\r
83 #include "EthDev.h"\r
84 #include "ParTest.h"\r
85 \r
86 /*-----------------------------------------------------------*/\r
87 \r
88 /* How long to wait before attempting to connect the MAC again. */\r
89 #define uipINIT_WAIT    ( 100 / portTICK_PERIOD_MS )\r
90 \r
91 /* Shortcut to the header within the Rx buffer. */\r
92 #define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])\r
93 \r
94 /* Standard constant. */\r
95 #define uipTOTAL_FRAME_HEADER_SIZE      54\r
96 \r
97 /*-----------------------------------------------------------*/\r
98 \r
99 /*\r
100  * Setup the MAC address in the MAC itself, and in the uIP stack.\r
101  */\r
102 static void prvSetMACAddress( void );\r
103 \r
104 /*\r
105  * Port functions required by the uIP stack.\r
106  */\r
107 void clock_init( void );\r
108 clock_time_t clock_time( void );\r
109 \r
110 /*-----------------------------------------------------------*/\r
111 \r
112 /* The semaphore used by the ISR to wake the uIP task. */\r
113 SemaphoreHandle_t xEMACSemaphore = NULL;\r
114 \r
115 /*-----------------------------------------------------------*/\r
116 \r
117 void clock_init(void)\r
118 {\r
119         /* This is done when the scheduler starts. */\r
120 }\r
121 /*-----------------------------------------------------------*/\r
122 \r
123 clock_time_t clock_time( void )\r
124 {\r
125         return xTaskGetTickCount();\r
126 }\r
127 /*-----------------------------------------------------------*/\r
128 \r
129 void vuIP_Task( void *pvParameters )\r
130 {\r
131 portBASE_TYPE i;\r
132 uip_ipaddr_t xIPAddr;\r
133 struct timer periodic_timer, arp_timer;\r
134 extern void ( vEMAC_ISR_Wrapper )( void );\r
135 \r
136         ( void ) pvParameters;\r
137 \r
138         /* Initialise the uIP stack. */\r
139         timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );\r
140         timer_set( &arp_timer, configTICK_RATE_HZ * 10 );\r
141         uip_init();\r
142         uip_ipaddr( xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );\r
143         uip_sethostaddr( xIPAddr );\r
144         uip_ipaddr( xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );\r
145         uip_setnetmask( xIPAddr );\r
146         httpd_init();\r
147 \r
148         /* Create the semaphore used to wake the uIP task. */\r
149         vSemaphoreCreateBinary( xEMACSemaphore );\r
150 \r
151         /* Initialise the MAC. */\r
152         while( lEMACInit() != pdPASS )\r
153     {\r
154         vTaskDelay( uipINIT_WAIT );\r
155     }\r
156 \r
157         portENTER_CRITICAL();\r
158         {\r
159                 LPC_EMAC->IntEnable = ( INT_RX_DONE | INT_TX_DONE );\r
160 \r
161                 /* Set the interrupt priority to the max permissible to cause some\r
162                 interrupt nesting. */\r
163                 NVIC_SetPriority( ENET_IRQn, configEMAC_INTERRUPT_PRIORITY );\r
164 \r
165                 /* Enable the interrupt. */\r
166                 NVIC_EnableIRQ( ENET_IRQn );\r
167                 prvSetMACAddress();\r
168         }\r
169         portEXIT_CRITICAL();\r
170 \r
171 \r
172         for( ;; )\r
173         {\r
174                 /* Is there received data ready to be processed? */\r
175                 uip_len = ulGetEMACRxData();\r
176 \r
177                 if( ( uip_len > 0 ) && ( uip_buf != NULL ) )\r
178                 {\r
179                         /* Standard uIP loop taken from the uIP manual. */\r
180                         if( xHeader->type == htons( UIP_ETHTYPE_IP ) )\r
181                         {\r
182                                 uip_arp_ipin();\r
183                                 uip_input();\r
184 \r
185                                 /* If the above function invocation resulted in data that\r
186                                 should be sent out on the network, the global variable\r
187                                 uip_len is set to a value > 0. */\r
188                                 if( uip_len > 0 )\r
189                                 {\r
190                                         uip_arp_out();\r
191                                         vSendEMACTxData( uip_len );\r
192                                 }\r
193                         }\r
194                         else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )\r
195                         {\r
196                                 uip_arp_arpin();\r
197 \r
198                                 /* If the above function invocation resulted in data that\r
199                                 should be sent out on the network, the global variable\r
200                                 uip_len is set to a value > 0. */\r
201                                 if( uip_len > 0 )\r
202                                 {\r
203                                         vSendEMACTxData( uip_len );\r
204                                 }\r
205                         }\r
206                 }\r
207                 else\r
208                 {\r
209                         if( timer_expired( &periodic_timer ) && ( uip_buf != NULL ) )\r
210                         {\r
211                                 timer_reset( &periodic_timer );\r
212                                 for( i = 0; i < UIP_CONNS; i++ )\r
213                                 {\r
214                                         uip_periodic( i );\r
215 \r
216                                         /* If the above function invocation resulted in data that\r
217                                         should be sent out on the network, the global variable\r
218                                         uip_len is set to a value > 0. */\r
219                                         if( uip_len > 0 )\r
220                                         {\r
221                                                 uip_arp_out();\r
222                                                 vSendEMACTxData( uip_len );\r
223                                         }\r
224                                 }\r
225 \r
226                                 /* Call the ARP timer function every 10 seconds. */\r
227                                 if( timer_expired( &arp_timer ) )\r
228                                 {\r
229                                         timer_reset( &arp_timer );\r
230                                         uip_arp_timer();\r
231                                 }\r
232                         }\r
233                         else\r
234                         {\r
235                                 /* We did not receive a packet, and there was no periodic\r
236                                 processing to perform.  Block for a fixed period.  If a packet\r
237                                 is received during this period we will be woken by the ISR\r
238                                 giving us the Semaphore. */\r
239                                 xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );\r
240                         }\r
241                 }\r
242         }\r
243 }\r
244 /*-----------------------------------------------------------*/\r
245 \r
246 static void prvSetMACAddress( void )\r
247 {\r
248 struct uip_eth_addr xAddr;\r
249 \r
250         /* Configure the MAC address in the uIP stack. */\r
251         xAddr.addr[ 0 ] = configMAC_ADDR0;\r
252         xAddr.addr[ 1 ] = configMAC_ADDR1;\r
253         xAddr.addr[ 2 ] = configMAC_ADDR2;\r
254         xAddr.addr[ 3 ] = configMAC_ADDR3;\r
255         xAddr.addr[ 4 ] = configMAC_ADDR4;\r
256         xAddr.addr[ 5 ] = configMAC_ADDR5;\r
257         uip_setethaddr( xAddr );\r
258 }\r
259 /*-----------------------------------------------------------*/\r
260 \r
261 void vApplicationProcessFormInput( char *pcInputString )\r
262 {\r
263 char *c;\r
264 const unsigned long ulLEDNo = 3;\r
265 \r
266         /* Process the form input sent by the IO page of the served HTML. */\r
267 \r
268         c = strstr( pcInputString, "?" );\r
269     if( c )\r
270     {\r
271                 /* Turn LED's on or off in accordance with the check box status. */\r
272                 if( strstr( c, "LED0=1" ) != NULL )\r
273                 {\r
274                         /* Set LED7. */\r
275                         vParTestSetLED( ulLEDNo, pdFALSE );\r
276                 }\r
277                 else\r
278                 {\r
279                         /* Clear LED7. */\r
280                         vParTestSetLED( ulLEDNo, pdTRUE );\r
281                 }\r
282     }\r
283 }\r
284 \r