LPCOpen Platform
LPCOpen Platform for NXP LPC Microcontrollers
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
lwip_tcpecho_sa.c
Go to the documentation of this file.
1 /*
2  * @brief LWIP no-RTOS TCP Echo example
3  *
4  * @note
5  * Copyright(C) NXP Semiconductors, 2012
6  * All rights reserved.
7  *
8  * @par
9  * Software that is described herein is for illustrative purposes only
10  * which provides customers with programming information regarding the
11  * LPC products. This software is supplied "AS IS" without any warranties of
12  * any kind, and NXP Semiconductors and its licensor disclaim any and
13  * all warranties, express or implied, including all implied warranties of
14  * merchantability, fitness for a particular purpose and non-infringement of
15  * intellectual property rights. NXP Semiconductors assumes no responsibility
16  * or liability for the use of the software, conveys no license or rights under any
17  * patent, copyright, mask work right, or any other intellectual property rights in
18  * or to any products. NXP Semiconductors reserves the right to make changes
19  * in the software without notification. NXP Semiconductors also makes no
20  * representation or warranty that such application will be suitable for the
21  * specified use without further testing or modification.
22  *
23  * @par
24  * Permission to use, copy, modify, and distribute this software and its
25  * documentation is hereby granted, under NXP Semiconductors' and its
26  * licensor's relevant copyrights in the software, without fee, provided that it
27  * is used in conjunction with NXP Semiconductors microcontrollers. This
28  * copyright, permission, and disclaimer notice must appear in all copies of
29  * this code.
30  */
31 
32 #include "lwip/init.h"
33 #include "lwip/opt.h"
34 #include "lwip/sys.h"
35 #include "lwip/memp.h"
36 #include "lwip/tcpip.h"
37 #include "lwip/ip_addr.h"
38 #include "lwip/netif.h"
39 #include "lwip/timers.h"
40 #include "netif/etharp.h"
41 
42 #if LWIP_DHCP
43 #include "lwip/dhcp.h"
44 #endif
45 
46 #include "board.h"
47 #include "lpc_phy.h"
48 #include "arch\lpc18xx_43xx_emac.h"
49 #include "arch\lpc_arch.h"
50 #include "echo.h"
51 
74 /*****************************************************************************
75  * Private types/enumerations/variables
76  ****************************************************************************/
77 
78 /* NETIF data */
79 static struct netif lpc_netif;
80 
81 /*****************************************************************************
82  * Public types/enumerations/variables
83  ****************************************************************************/
84 
85 /*****************************************************************************
86  * Private functions
87  ****************************************************************************/
88 
89 /* Sets up system hardware */
90 static void prvSetupHardware(void)
91 {
92  /* LED0 is used for the link status, on = PHY cable detected */
93  Board_Init();
95 
96  /* Initial LED state is off to show an unconnected cable state */
97  Board_LED_Set(0, false);
98 
99  /* Setup a 1mS sysTick for the primary time base */
100  SysTick_Enable(1);
101 }
102 
103 /*****************************************************************************
104  * Public functions
105  ****************************************************************************/
106 
111 int main(void)
112 {
114  ip_addr_t ipaddr, netmask, gw;
115 
117 
118  /* Initialize LWIP */
119  lwip_init();
120 
121  LWIP_DEBUGF(LWIP_DBG_ON, ("Starting LWIP TCP echo server...\n"));
122 
123  /* Static IP assignment */
124 #if LWIP_DHCP
125  IP4_ADDR(&gw, 0, 0, 0, 0);
126  IP4_ADDR(&ipaddr, 0, 0, 0, 0);
127  IP4_ADDR(&netmask, 0, 0, 0, 0);
128 #else
129  IP4_ADDR(&gw, 10, 1, 10, 1);
130  IP4_ADDR(&ipaddr, 10, 1, 10, 234);
131  IP4_ADDR(&netmask, 255, 255, 255, 0);
132  APP_PRINT_IP(&ipaddr);
133 #endif
134 
135  /* Add netif interface for lpc17xx_8x */
136  netif_add(&lpc_netif, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init,
137  ethernet_input);
138  netif_set_default(&lpc_netif);
139  netif_set_up(&lpc_netif);
140 
141 #if LWIP_DHCP
142  dhcp_start(&lpc_netif);
143 #endif
144 
145  /* Initialize and start application */
146  echo_init();
147 
148  /* This could be done in the sysTick ISR, but may stay in IRQ context
149  too long, so do this stuff with a background loop. */
150  while (1) {
151  /* Handle packets as part of this loop, not in the IRQ handler */
153 
154  /* lpc_rx_queue will re-qeueu receive buffers. This normally occurs
155  automatically, but in systems were memory is constrained, pbufs
156  may not always be able to get allocated, so this function can be
157  optionally enabled to re-queue receive buffers. */
158 #if 0
159  while (lpc_rx_queue(&lpc_netif)) {}
160 #endif
161 
162  /* Free TX buffers that are done sending */
164 
165  /* LWIP timers - ARP, DHCP, TCP, etc. */
166  sys_check_timeouts();
167 
168  /* Call the PHY status update state machine once in a while
169  to keep the link status up-to-date */
170  physts = lpcPHYStsPoll();
171 
172  /* Only check for connection state when the PHY status has changed */
173  if (physts & PHY_LINK_CHANGED) {
174  if (physts & PHY_LINK_CONNECTED) {
175  Board_LED_Set(0, true);
176 
177  /* Set interface speed and duplex */
178  if (physts & PHY_LINK_SPEED100) {
180  NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 100000000);
181  }
182  else {
184  NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 10000000);
185  }
186  if (physts & PHY_LINK_FULLDUPLX) {
187  Chip_ENET_Set_Duplex(true);
188  }
189  else {
190  Chip_ENET_Set_Duplex(false);
191  }
192 
193  netif_set_link_up(&lpc_netif);
194  }
195  else {
196  Board_LED_Set(0, false);
197  netif_set_link_down(&lpc_netif);
198  }
199 
200  DEBUGOUT("Link connect status: %d\n", ((physts & PHY_LINK_CONNECTED) != 0));
201  }
202  }
203 
204  /* Never returns, for warning only */
205  return 0;
206 }
207