diff options
| author | Yuval Adam <yuv.adm@gmail.com> | 2014-06-29 12:34:32 +0300 |
|---|---|---|
| committer | Yuval Adam <yuv.adm@gmail.com> | 2014-06-29 12:34:32 +0300 |
| commit | c3e4c9a25c2910d2d66d52215b3406b13d5b23d5 (patch) | |
| tree | added370d1e356901f8579f076e3263fb0464db7 /boards/dk-tm4c129x/freertos_demo/lwip_task.c | |
| parent | 990090a4cc9070837d31e66b58d40f0c3d038741 (diff) | |
Add more board models
Diffstat (limited to 'boards/dk-tm4c129x/freertos_demo/lwip_task.c')
| -rw-r--r-- | boards/dk-tm4c129x/freertos_demo/lwip_task.c | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/boards/dk-tm4c129x/freertos_demo/lwip_task.c b/boards/dk-tm4c129x/freertos_demo/lwip_task.c new file mode 100644 index 0000000..9787b34 --- /dev/null +++ b/boards/dk-tm4c129x/freertos_demo/lwip_task.c @@ -0,0 +1,378 @@ +//*****************************************************************************
+//
+// lwip_task.c - Tasks to serve web pages over Ethernet using lwIP.
+//
+// Copyright (c) 2009-2014 Texas Instruments Incorporated. All rights reserved.
+// Software License Agreement
+//
+// Texas Instruments (TI) is supplying this software for use solely and
+// exclusively on TI's microcontroller products. The software is owned by
+// TI and/or its suppliers, and is protected under applicable copyright
+// laws. You may not combine this software with "viral" open-source
+// software in order to form a larger program.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
+// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
+// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
+// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+// DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+// This is part of revision 2.1.0.12573 of the DK-TM4C129X Firmware Package.
+//
+//*****************************************************************************
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "inc/hw_ints.h"
+#include "inc/hw_types.h"
+#include "driverlib/rom.h"
+#include "utils/lwiplib.h"
+#include "utils/locator.h"
+#include "utils/ustdlib.h"
+#include "httpserver_raw/httpd.h"
+#include "freertos_demo.h"
+#include "cgifuncs.h"
+#include "led_task.h"
+#include "idle_task.h"
+#include "lwip_task.h"
+#include "spider_task.h"
+//*****************************************************************************
+//
+// This structure contains the details of a SSI tag.
+//
+//*****************************************************************************
+typedef struct
+{
+ //
+ // The text name of the tag. If the name is "foo", it will appear in the
+ // HTML source as "<!--#foo-->".
+ //
+ const char *pcName;
+
+ //
+ // A pointer to the variable that contains the value of this tag.
+ //
+ uint32_t *pui32Value;
+}
+tSSITag;
+
+//*****************************************************************************
+//
+// The list of tags.
+//
+//*****************************************************************************
+const tSSITag g_psTags[] =
+{
+ { "linksent", (uint32_t *) &lwip_stats.link.xmit },
+ { "linkrecv", (uint32_t *) &lwip_stats.link.recv },
+ { "linkdrop", (uint32_t *) &lwip_stats.link.drop },
+ { "linkcksm", (uint32_t *) &lwip_stats.link.chkerr },
+ { "linklen", (uint32_t *) &lwip_stats.link.lenerr },
+ { "linkmem", (uint32_t *) &lwip_stats.link.memerr },
+ { "linkrte", (uint32_t *) &lwip_stats.link.rterr },
+ { "linkprot", (uint32_t *) &lwip_stats.link.proterr },
+ { "linkopt", (uint32_t *) &lwip_stats.link.opterr },
+ { "linkmisc", (uint32_t *) &lwip_stats.link.err },
+ { "arpsent", (uint32_t *) &lwip_stats.etharp.xmit },
+ { "arprecv", (uint32_t *) &lwip_stats.etharp.recv },
+ { "arpdrop", (uint32_t *) &lwip_stats.etharp.drop },
+ { "arpcksm", (uint32_t *) &lwip_stats.etharp.chkerr },
+ { "arplen", (uint32_t *) &lwip_stats.etharp.lenerr },
+ { "arpmem", (uint32_t *) &lwip_stats.etharp.memerr },
+ { "arprte", (uint32_t *) &lwip_stats.etharp.rterr },
+ { "arpprot", (uint32_t *) &lwip_stats.etharp.proterr },
+ { "arpopt", (uint32_t *) &lwip_stats.etharp.opterr },
+ { "arpmisc", (uint32_t *) &lwip_stats.etharp.err },
+ { "icmpsent", (uint32_t *) &lwip_stats.icmp.xmit },
+ { "icmprecv", (uint32_t *) &lwip_stats.icmp.recv },
+ { "icmpdrop", (uint32_t *) &lwip_stats.icmp.drop },
+ { "icmpcksm", (uint32_t *) &lwip_stats.icmp.chkerr },
+ { "icmplen", (uint32_t *) &lwip_stats.icmp.lenerr },
+ { "icmpmem", (uint32_t *) &lwip_stats.icmp.memerr },
+ { "icmprte", (uint32_t *) &lwip_stats.icmp.rterr },
+ { "icmpprot", (uint32_t *) &lwip_stats.icmp.proterr },
+ { "icmpopt", (uint32_t *) &lwip_stats.icmp.opterr },
+ { "icmpmisc", (uint32_t *) &lwip_stats.icmp.err },
+ { "ipsent", (uint32_t *) &lwip_stats.ip.xmit },
+ { "iprecv", (uint32_t *) &lwip_stats.ip.recv },
+ { "ipdrop", (uint32_t *) &lwip_stats.ip.drop },
+ { "ipcksm", (uint32_t *) &lwip_stats.ip.chkerr },
+ { "iplen", (uint32_t *) &lwip_stats.ip.lenerr },
+ { "ipmem", (uint32_t *) &lwip_stats.ip.memerr },
+ { "iprte", (uint32_t *) &lwip_stats.ip.rterr },
+ { "ipprot", (uint32_t *) &lwip_stats.ip.proterr },
+ { "ipopt", (uint32_t *) &lwip_stats.ip.opterr },
+ { "ipmisc", (uint32_t *) &lwip_stats.ip.err },
+ { "tcpsent", (uint32_t *) &lwip_stats.tcp.xmit },
+ { "tcprecv", (uint32_t *) &lwip_stats.tcp.recv },
+ { "tcpdrop", (uint32_t *) &lwip_stats.tcp.drop },
+ { "tcpcksm", (uint32_t *) &lwip_stats.tcp.chkerr },
+ { "tcplen", (uint32_t *) &lwip_stats.tcp.lenerr },
+ { "tcpmem", (uint32_t *) &lwip_stats.tcp.memerr },
+ { "tcprte", (uint32_t *) &lwip_stats.tcp.rterr },
+ { "tcpprot", (uint32_t *) &lwip_stats.tcp.proterr },
+ { "tcpopt", (uint32_t *) &lwip_stats.tcp.opterr },
+ { "tcpmisc", (uint32_t *) &lwip_stats.tcp.err },
+ { "udpsent", (uint32_t *) &lwip_stats.udp.xmit },
+ { "udprecv", (uint32_t *) &lwip_stats.udp.recv },
+ { "udpdrop", (uint32_t *) &lwip_stats.udp.drop },
+ { "udpcksm", (uint32_t *) &lwip_stats.udp.chkerr },
+ { "udplen", (uint32_t *) &lwip_stats.udp.lenerr },
+ { "udpmem", (uint32_t *) &lwip_stats.udp.memerr },
+ { "udprte", (uint32_t *) &lwip_stats.udp.rterr },
+ { "udpprot", (uint32_t *) &lwip_stats.udp.proterr },
+ { "udpopt", (uint32_t *) &lwip_stats.udp.opterr },
+ { "udpmisc", (uint32_t *) &lwip_stats.udp.err },
+ { "ledrate", (uint32_t *) &g_ui32LEDDelay },
+ { "spider", (uint32_t *) g_pui32SpiderDelay }
+};
+
+//*****************************************************************************
+//
+// The number of tags.
+//
+//*****************************************************************************
+#define NUM_TAGS (sizeof(g_psTags) / sizeof(g_psTags[0]))
+
+//*****************************************************************************
+//
+// An array of names for the tags, as required by the web server.
+//
+//*****************************************************************************
+static const char *g_ppcSSITags[NUM_TAGS];
+
+//*****************************************************************************
+//
+// The CGI handler for changing the toggle rate of the LED task.
+//
+//*****************************************************************************
+static const char *
+ToggleRateCGIHandler(int32_t i32Index, int32_t i32NumParams, char *ppcParam[],
+ char *ppcValue[])
+{
+ bool bParamError;
+ int32_t i32Rate;
+
+ //
+ // Get the value of the time parameter.
+ //
+ bParamError = false;
+ i32Rate = GetCGIParam("time", ppcParam, ppcValue, i32NumParams,
+ &bParamError);
+
+ //
+ // Return a parameter error if the time parameter was not supplied or was
+ // out of range.
+ //
+ if(bParamError || (i32Rate < 1) || (i32Rate > 10000))
+ {
+ return("/perror.htm");
+ }
+
+ //
+ // Update the delay between toggles of the LED.
+ //
+ g_ui32LEDDelay = i32Rate;
+
+ //
+ // Refresh the current page.
+ //
+ return("/io.ssi");
+}
+
+//*****************************************************************************
+//
+// The CGI handler for changing the spider speed.
+//
+//*****************************************************************************
+static const char *
+SpiderSpeedCGIHandler(int32_t i32Index, int32_t i32NumParams, char *ppcParam[],
+ char *ppcValue[])
+{
+ bool bParamError;
+ int32_t i32Rate;
+
+ //
+ // Get the value of the time parameter.
+ //
+ bParamError = false;
+ i32Rate = GetCGIParam("time", ppcParam, ppcValue, i32NumParams,
+ &bParamError);
+
+ //
+ // Return a parameter error if the time parameter was not supplied or was
+ // out of range.
+ //
+ if(bParamError)
+ {
+ return("/perror.htm");
+ }
+
+ //
+ // Update the speed of the spiders.
+ //
+ SpiderSpeedSet(i32Rate);
+
+ //
+ // Refresh the current page.
+ //
+ return("/io.ssi");
+}
+
+//*****************************************************************************
+//
+// The array of CGI handlers, as required by the web server.
+//
+//*****************************************************************************
+static const tCGI g_psCGIs[] =
+{
+ { "/toggle_rate.cgi", ToggleRateCGIHandler },
+ { "/spider_rate.cgi", SpiderSpeedCGIHandler }
+};
+
+//*****************************************************************************
+//
+// The number of CGI handlers.
+//
+//*****************************************************************************
+#define NUM_CGIS (sizeof(g_psCGIs) / sizeof(g_psCGIs[0]))
+
+//*****************************************************************************
+//
+// The handler for server side includes.
+//
+//*****************************************************************************
+static uint16_t
+SSIHandler(int32_t i32Index, char *pcInsert, int32_t i32InsertLen)
+{
+ //
+ // Replace the tag with an appropriate value.
+ //
+ if(i32Index < NUM_TAGS)
+ {
+ //
+ // This is a valid tag, so print out its value.
+ //
+ usnprintf(pcInsert, i32InsertLen, "%d",
+ *(g_psTags[i32Index].pui32Value));
+ }
+ else
+ {
+ //
+ // This is an unknown tag.
+ //
+ usnprintf(pcInsert, i32InsertLen, "??");
+ }
+
+ //
+ // Determine the length of the replacement text.
+ //
+ for(i32Index = 0; pcInsert[i32Index] != 0; i32Index++)
+ {
+ }
+
+ //
+ // Return the length of the replacement text.
+ //
+ return(i32Index);
+}
+
+//*****************************************************************************
+//
+// Sets up the additional lwIP raw API services provided by the application.
+//
+//*****************************************************************************
+void
+SetupServices(void *pvArg)
+{
+ uint8_t pui8MAC[6];
+ uint32_t ui32Idx;
+
+ //
+ // Setup the device locator service.
+ //
+ LocatorInit();
+ lwIPLocalMACGet(pui8MAC);
+ LocatorMACAddrSet(pui8MAC);
+
+ LocatorAppTitleSet("DK-TM4C129X freertos_demo");
+
+ //
+ // Initialize the sample httpd server.
+ //
+ httpd_init();
+
+ //
+ // Initialize the tag array used by the web server's SSI processing.
+ //
+ for(ui32Idx = 0; ui32Idx < NUM_TAGS; ui32Idx++)
+ {
+ g_ppcSSITags[ui32Idx] = g_psTags[ui32Idx].pcName;
+ }
+
+ //
+ // Register the SSI tags and handler with the web server.
+ //
+ http_set_ssi_handler(SSIHandler, g_ppcSSITags, NUM_TAGS);
+
+ //
+ // Register the CGI handlers with the web server.
+ //
+ http_set_cgi_handlers(g_psCGIs, NUM_CGIS);
+}
+
+//*****************************************************************************
+//
+// Initializes the lwIP tasks.
+//
+//*****************************************************************************
+uint32_t
+lwIPTaskInit(void)
+{
+ uint32_t ui32User0, ui32User1;
+ uint8_t pui8MAC[6];
+
+ //
+ // Get the MAC address from the user registers.
+ //
+ ROM_FlashUserGet(&ui32User0, &ui32User1);
+ if((ui32User0 == 0xffffffff) || (ui32User1 == 0xffffffff))
+ {
+ return(1);
+ }
+
+ //
+ // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
+ // address needed to program the hardware registers, then program the MAC
+ // address into the Ethernet Controller registers.
+ //
+ pui8MAC[0] = ((ui32User0 >> 0) & 0xff);
+ pui8MAC[1] = ((ui32User0 >> 8) & 0xff);
+ pui8MAC[2] = ((ui32User0 >> 16) & 0xff);
+ pui8MAC[3] = ((ui32User1 >> 0) & 0xff);
+ pui8MAC[4] = ((ui32User1 >> 8) & 0xff);
+ pui8MAC[5] = ((ui32User1 >> 16) & 0xff);
+
+ //
+ // Lower the priority of the Ethernet interrupt handler. This is required
+ // so that the interrupt handler can safely call the interrupt-safe
+ // FreeRTOS functions (specifically to send messages to the queue).
+ //
+ ROM_IntPrioritySet(INT_EMAC0, 0xC0);
+
+ //
+ // Initialize lwIP.
+ //
+ lwIPInit(g_ui32SysClock, pui8MAC, 0, 0, 0, IPADDR_USE_DHCP);
+
+ //
+ // Setup the remaining services inside the TCP/IP thread's context.
+ //
+ tcpip_callback(SetupServices, 0);
+
+ //
+ // Success.
+ //
+ return(0);
+}
|
