LPCOpen Platform  v1.03
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 
89 /*****************************************************************************
90  * Private types/enumerations/variables
91  ****************************************************************************/
92 
93 /* NETIF data */
94 static struct netif lpc_netif;
95 
96 /*****************************************************************************
97  * Public types/enumerations/variables
98  ****************************************************************************/
99 
100 /*****************************************************************************
101  * Private functions
102  ****************************************************************************/
103 
104 /* Sets up system hardware */
105 static void prvSetupHardware(void)
106 {
107  /* LED0 is used for the link status, on = PHY cable detected */
108  Board_Init();
109 
110  /* Initial LED state is off to show an unconnected cable state */
111  Board_LED_Set(0, false);
112 
113  /* Setup a 1mS sysTick for the primary time base */
114  SysTick_Enable(1);
115 }
116 
117 /*****************************************************************************
118  * Public functions
119  ****************************************************************************/
120 
125 int main(void)
126 {
128  ip_addr_t ipaddr, netmask, gw;
129 
131 
132  /* Initialize LWIP */
133  lwip_init();
134 
135  LWIP_DEBUGF(LWIP_DBG_ON, ("Starting LWIP TCP echo server...\n"));
136 
137  /* Static IP assignment */
138 #if LWIP_DHCP
139  IP4_ADDR(&gw, 0, 0, 0, 0);
140  IP4_ADDR(&ipaddr, 0, 0, 0, 0);
141  IP4_ADDR(&netmask, 0, 0, 0, 0);
142 #else
143  IP4_ADDR(&gw, 10, 1, 10, 1);
144  IP4_ADDR(&ipaddr, 10, 1, 10, 234);
145  IP4_ADDR(&netmask, 255, 255, 255, 0);
146  APP_PRINT_IP(&ipaddr);
147 #endif
148 
149  /* Add netif interface for lpc17xx_8x */
150  netif_add(&lpc_netif, &ipaddr, &netmask, &gw, NULL, lpc_enetif_init,
151  ethernet_input);
152  netif_set_default(&lpc_netif);
153  netif_set_up(&lpc_netif);
154 
155 #if LWIP_DHCP
156  dhcp_start(&lpc_netif);
157 #endif
158 
159  /* Initialize and start application */
160  echo_init();
161 
162  /* This could be done in the sysTick ISR, but may stay in IRQ context
163  too long, so do this stuff with a background loop. */
164  while (1) {
165  /* Handle packets as part of this loop, not in the IRQ handler */
167 
168  /* lpc_rx_queue will re-qeueu receive buffers. This normally occurs
169  automatically, but in systems were memory is constrained, pbufs
170  may not always be able to get allocated, so this function can be
171  optionally enabled to re-queue receive buffers. */
172 #if 0
173  while (lpc_rx_queue(&lpc_netif)) {}
174 #endif
175 
176  /* Free TX buffers that are done sending */
178 
179  /* LWIP timers - ARP, DHCP, TCP, etc. */
180  sys_check_timeouts();
181 
182  /* Call the PHY status update state machine once in a while
183  to keep the link status up-to-date */
184  physts = lpcPHYStsPoll();
185 
186  /* Only check for connection state when the PHY status has changed */
187  if (physts & PHY_LINK_CHANGED) {
188  if (physts & PHY_LINK_CONNECTED) {
189  Board_LED_Set(0, true);
190 
191  /* Set interface speed and duplex */
192  if (physts & PHY_LINK_SPEED100) {
194  NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 100000000);
195  }
196  else {
198  NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 10000000);
199  }
200  if (physts & PHY_LINK_FULLDUPLX) {
202  }
203  else {
205  }
206 
207  netif_set_link_up(&lpc_netif);
208  }
209  else {
210  Board_LED_Set(0, false);
211  netif_set_link_down(&lpc_netif);
212  }
213 
214  DEBUGOUT("Link connect status: %d\r\n", ((physts & PHY_LINK_CONNECTED) != 0));
215  }
216  }
217 
218  /* Never returns, for warning only */
219  return 0;
220 }
221