| 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
main.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 {
127 uint32_t physts;
128 ip_addr_t ipaddr, netmask, gw;
129
130 prvSetupHardware();
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 iperf_server_init();
163
164 /* This could be done in the sysTick ISR, but may stay in IRQ context
165 too long, so do this stuff with a background loop. */
166 while (1) {
167 /* Handle packets as part of this loop, not in the IRQ handler */
168 lpc_enetif_input(&lpc_netif);
169
170 /* lpc_rx_queue will re-qeueu receive buffers. This normally occurs
171 automatically, but in systems were memory is constrained, pbufs
172 may not always be able to get allocated, so this function can be
173 optionally enabled to re-queue receive buffers. */
174 #if 0
175 while (lpc_rx_queue(&lpc_netif)) {}
176 #endif
177
178 /* Free TX buffers that are done sending */
179 lpc_tx_reclaim(&lpc_netif);
180
181 /* LWIP timers - ARP, DHCP, TCP, etc. */
182 sys_check_timeouts();
183
184 /* Call the PHY status update state machine once in a while
185 to keep the link status up-to-date */
186 physts = lpcPHYStsPoll();
187
188 /* Only check for connection state when the PHY status has changed */
189 if (physts & PHY_LINK_CHANGED) {
190 if (physts & PHY_LINK_CONNECTED) {
191 Board_LED_Set(0, true);
192
193 /* Set interface speed and duplex */
194 if (physts & PHY_LINK_SPEED100) {
195 Chip_ENET_SetSpeed(LPC_ETHERNET, 1);
196 NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 100000000);
197 }
198 else {
199 Chip_ENET_SetSpeed(LPC_ETHERNET, 0);
200 NETIF_INIT_SNMP(&lpc_netif, snmp_ifType_ethernet_csmacd, 10000000);
201 }
202 if (physts & PHY_LINK_FULLDUPLX) {
203 Chip_ENET_SetDuplex(LPC_ETHERNET, true);
204 }
205 else {
206 Chip_ENET_SetDuplex(LPC_ETHERNET, false);
207 }
208
209 netif_set_link_up(&lpc_netif);
210 {
211 static char tmp_buff[16];
212 DEBUGOUT("IP_ADDR : %s\r\n", ipaddr_ntoa_r((const ip_addr_t *) &lpc_netif.ip_addr, tmp_buff, 16));
213 DEBUGOUT("NET_MASK : %s\r\n", ipaddr_ntoa_r((const ip_addr_t *) &lpc_netif.netmask, tmp_buff, 16));
214 DEBUGOUT("GATEWAY_IP : %s\r\n", ipaddr_ntoa_r((const ip_addr_t *) &lpc_netif.gw, tmp_buff, 16));
215 }
216 }
217 else {
218 Board_LED_Set(0, false);
219 netif_set_link_down(&lpc_netif);
220 }
221
222 DEBUGOUT("Link connect status: %d\r\n", ((physts & PHY_LINK_CONNECTED) != 0));
223 }
224 }
225
226 /* Never returns, for warning only */
227 return 0;
228 }
229