]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/SuperH_SH7216_Renesas/RTOSDemo/uIP_Task.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / SuperH_SH7216_Renesas / RTOSDemo / uIP_Task.c
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4  *\r
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6  * this software and associated documentation files (the "Software"), to deal in\r
7  * the Software without restriction, including without limitation the rights to\r
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9  * the Software, and to permit persons to whom the Software is furnished to do so,\r
10  * subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be included in all\r
13  * copies or substantial portions of the Software. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 /* Standard includes. */\r
30 #include <string.h>\r
31 \r
32 /* Scheduler includes. */\r
33 #include "FreeRTOS.h"\r
34 #include "task.h"\r
35 #include "semphr.h"\r
36 \r
37 /* uip includes. */\r
38 #include "net/uip.h"\r
39 #include "net/uip_arp.h"\r
40 #include "apps/httpd/httpd.h"\r
41 #include "sys/timer.h"\r
42 #include "net/clock-arch.h"\r
43 \r
44 /* Demo includes. */\r
45 #include "ParTest.h"\r
46 \r
47 /* Hardware includes. */\r
48 #include "hwEthernet.h"\r
49 \r
50 /*-----------------------------------------------------------*/\r
51 \r
52 /* How long to wait before attempting to connect the MAC again. */\r
53 #define uipINIT_WAIT    ( 100 / portTICK_PERIOD_MS )\r
54 \r
55 /* Shortcut to the header within the Rx buffer. */\r
56 #define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])\r
57 \r
58 /* Standard constant. */\r
59 #define uipTOTAL_FRAME_HEADER_SIZE      54\r
60 \r
61 /*-----------------------------------------------------------*/\r
62 \r
63 /*\r
64  * Setup the MAC address in the MAC itself, and in the uIP stack.\r
65  */\r
66 static void prvSetMACAddress( void );\r
67 \r
68 /*\r
69  * Port functions required by the uIP stack.\r
70  */\r
71 void clock_init( void );\r
72 clock_time_t clock_time( void );\r
73 \r
74 /*-----------------------------------------------------------*/\r
75 \r
76 /* The semaphore used by the ISR to wake the uIP task. */\r
77 SemaphoreHandle_t xEMACSemaphore = NULL;\r
78 \r
79 /*-----------------------------------------------------------*/\r
80 \r
81 void clock_init(void)\r
82 {\r
83         /* This is done when the scheduler starts. */\r
84 }\r
85 /*-----------------------------------------------------------*/\r
86 \r
87 clock_time_t clock_time( void )\r
88 {\r
89         return xTaskGetTickCount();\r
90 }\r
91 /*-----------------------------------------------------------*/\r
92 \r
93 void vuIP_Task( void *pvParameters )\r
94 {\r
95 portBASE_TYPE i;\r
96 uip_ipaddr_t xIPAddr;\r
97 struct timer periodic_timer, arp_timer;\r
98 extern void ( vEMAC_ISR_Wrapper )( void );\r
99 \r
100         ( void ) pvParameters;\r
101 \r
102         /* Initialise the uIP stack. */\r
103         timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );\r
104         timer_set( &arp_timer, configTICK_RATE_HZ * 10 );\r
105         uip_init();\r
106         uip_ipaddr( &xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );\r
107         uip_sethostaddr( &xIPAddr );\r
108         uip_ipaddr( &xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );\r
109         uip_setnetmask( &xIPAddr );\r
110         prvSetMACAddress();\r
111         httpd_init();\r
112 \r
113         /* Create the semaphore used to wake the uIP task. */\r
114         vSemaphoreCreateBinary( xEMACSemaphore );\r
115 \r
116         /* Initialise the MAC. */\r
117         vInitEmac();\r
118 \r
119         while( lEMACWaitForLink() != pdPASS )\r
120     {\r
121         vTaskDelay( uipINIT_WAIT );\r
122     }\r
123 \r
124         for( ;; )\r
125         {\r
126                 /* Is there received data ready to be processed? */\r
127                 uip_len = ( unsigned short ) ulEMACRead();\r
128                 \r
129                 if( ( uip_len > 0 ) && ( uip_buf != NULL ) )\r
130                 {\r
131                         /* Standard uIP loop taken from the uIP manual. */\r
132                         if( xHeader->type == htons( UIP_ETHTYPE_IP ) )\r
133                         {\r
134                                 uip_arp_ipin();\r
135                                 uip_input();\r
136 \r
137                                 /* If the above function invocation resulted in data that\r
138                                 should be sent out on the network, the global variable\r
139                                 uip_len is set to a value > 0. */\r
140                                 if( uip_len > 0 )\r
141                                 {\r
142                                         uip_arp_out();\r
143                                         vEMACWrite();\r
144                                 }\r
145                         }\r
146                         else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )\r
147                         {\r
148                                 uip_arp_arpin();\r
149 \r
150                                 /* If the above function invocation resulted in data that\r
151                                 should be sent out on the network, the global variable\r
152                                 uip_len is set to a value > 0. */\r
153                                 if( uip_len > 0 )\r
154                                 {\r
155                                         vEMACWrite();\r
156                                 }\r
157                         }\r
158                 }\r
159                 else\r
160                 {\r
161                         if( timer_expired( &periodic_timer ) && ( uip_buf != NULL ) )\r
162                         {\r
163                                 timer_reset( &periodic_timer );\r
164                                 for( i = 0; i < UIP_CONNS; i++ )\r
165                                 {\r
166                                         uip_periodic( i );\r
167 \r
168                                         /* If the above function invocation resulted in data that\r
169                                         should be sent out on the network, the global variable\r
170                                         uip_len is set to a value > 0. */\r
171                                         if( uip_len > 0 )\r
172                                         {\r
173                                                 uip_arp_out();\r
174                                                 vEMACWrite();\r
175                                         }\r
176                                 }\r
177 \r
178                                 /* Call the ARP timer function every 10 seconds. */\r
179                                 if( timer_expired( &arp_timer ) )\r
180                                 {\r
181                                         timer_reset( &arp_timer );\r
182                                         uip_arp_timer();\r
183                                 }\r
184                         }\r
185                         else\r
186                         {\r
187                                 /* We did not receive a packet, and there was no periodic\r
188                                 processing to perform.  Block for a fixed period.  If a packet\r
189                                 is received during this period we will be woken by the ISR\r
190                                 giving us the Semaphore. */\r
191                                 xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );\r
192                         }\r
193                 }\r
194         }\r
195 }\r
196 /*-----------------------------------------------------------*/\r
197 \r
198 static void prvSetMACAddress( void )\r
199 {\r
200 struct uip_eth_addr xAddr;\r
201 \r
202         /* Configure the MAC address in the uIP stack. */\r
203         xAddr.addr[ 0 ] = configMAC_ADDR0;\r
204         xAddr.addr[ 1 ] = configMAC_ADDR1;\r
205         xAddr.addr[ 2 ] = configMAC_ADDR2;\r
206         xAddr.addr[ 3 ] = configMAC_ADDR3;\r
207         xAddr.addr[ 4 ] = configMAC_ADDR4;\r
208         xAddr.addr[ 5 ] = configMAC_ADDR5;\r
209         uip_setethaddr( xAddr );\r
210 }\r
211 /*-----------------------------------------------------------*/\r
212 \r
213 void vApplicationProcessFormInput( char *pcInputString )\r
214 {\r
215 char *c;\r
216 \r
217         /* Process the form input sent by the IO page of the served HTML. */\r
218 \r
219         c = strstr( pcInputString, "?" );\r
220     if( c )\r
221     {\r
222                 /* Turn the FIO1 LED's on or off in accordance with the check box status. */\r
223                 if( strstr( c, "LED0=1" ) != NULL )\r
224                 {\r
225                         /* Turn LED 4 on. */\r
226                         vParTestSetLED( 4, 1 );\r
227                 }\r
228                 else\r
229                 {\r
230                         /* Turn LED 4 off. */\r
231                         vParTestSetLED( 4, 0 );\r
232                 }\r
233     }\r
234 }\r
235 \r