| LPCOpen Platform v1.03 LPCOpen Platform for NXP LPC Microcontrollers

- Main Page
- Modules
- Data Structures
- Files
- Related Pages

- File List
- Globals

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