NuMaker Transfer data UART to Ethernet

Fork of Serial-to-Ethernet by Morgan Du

Committer:
cyliang
Date:
Mon Mar 06 05:37:33 2023 +0000
Revision:
10:39188e266f53
Parent:
9:b300117f3ed7
Remove BufferSerial lib, target OS v6.x only

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morgandu 0:11bc39d0f367 1 /*
morgandu 0:11bc39d0f367 2 * Copyright (c) 2017 Nuvoton Tecnology Corp. All rights reserved.
morgandu 0:11bc39d0f367 3 *
morgandu 0:11bc39d0f367 4 * The code is forward data from UART port to Ethernet, and vice versa.
morgandu 0:11bc39d0f367 5 *
morgandu 0:11bc39d0f367 6 *
morgandu 0:11bc39d0f367 7 */
morgandu 0:11bc39d0f367 8 #include "ste_config.h"
morgandu 0:11bc39d0f367 9
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 10 /* If choose static IP, specify the default IP address here. */
morgandu 0:11bc39d0f367 11 #if 0
morgandu 0:11bc39d0f367 12 // private IP address for general purpose
morgandu 0:11bc39d0f367 13 #define IP_ADDRESS "192.168.1.2"
morgandu 0:11bc39d0f367 14 #define NETWORK_MASK "255.255.255.0"
morgandu 0:11bc39d0f367 15 #define GATEWAY_ADDRESS "192.168.1.1"
morgandu 0:11bc39d0f367 16 #else
morgandu 0:11bc39d0f367 17 // private IP address only for test with Windows when DHCP server doesn't exist.
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 18 // Windows set its LAN IP address to 169.254.xxx.xxx / 255.255.0.0
morgandu 0:11bc39d0f367 19 #define IP_ADDRESS "169.254.108.2"
morgandu 0:11bc39d0f367 20 #define NETWORK_MASK "255.255.0.0"
morgandu 0:11bc39d0f367 21 #define GATEWAY_ADDRESS "169.254.108.1"
morgandu 0:11bc39d0f367 22 #endif
morgandu 0:11bc39d0f367 23
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 24 /* Default IP configuration for Ethernet network */
morgandu 0:11bc39d0f367 25 S_NET_CONFIG net_config = {IP_STATIC_MODE, IP_ADDRESS, NETWORK_MASK, GATEWAY_ADDRESS};
morgandu 0:11bc39d0f367 26
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 27 #if defined (TARGET_NUMAKER_PFM_M487) || defined(TARGET_NUMAKER_IOT_M487)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 28 #if MBED_MAJOR_VERSION <= 5
cyliang 7:c03b2ed97d94 29 BufferedSerial serial_0(PB_3, PB_2, 256, 4); // UART1
cyliang 7:c03b2ed97d94 30 BufferedSerial serial_1(PA_5, PA_4, 256, 4); // UART5
cyliang 7:c03b2ed97d94 31 //BufferedSerial serial_2(PB_13, PB_12, 256, 4); // UART0, Debug
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 32 #else
cyliang 7:c03b2ed97d94 33 BufferedSerial serial_0(PB_3, PB_2); // UART1
cyliang 7:c03b2ed97d94 34 BufferedSerial serial_1(PA_5, PA_4); // UART5
cyliang 7:c03b2ed97d94 35 //BufferedSerial serial_2(PB_13, PB_12); // UART0, Debug
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 36 #endif
morgandu 0:11bc39d0f367 37
morgandu 0:11bc39d0f367 38 #elif defined (TARGET_NUMAKER_PFM_NUC472)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 39 #if MBED_MAJOR_VERSION <= 5
cyliang 7:c03b2ed97d94 40 BufferedSerial serial_0(PH_1, PH_0, 256, 4); // UART4
cyliang 7:c03b2ed97d94 41 BufferedSerial serial_1(PG_2, PG_1, 256, 4); // UART0
cyliang 7:c03b2ed97d94 42 BufferedSerial serial_2(PC_11, PC_10, 256, 4); // UART2
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 43 #else
cyliang 7:c03b2ed97d94 44 BufferedSerial serial_0(PH_1, PH_0); // UART4
cyliang 7:c03b2ed97d94 45 BufferedSerial serial_1(PG_2, PG_1); // UART0
cyliang 7:c03b2ed97d94 46 BufferedSerial serial_2(PC_11, PC_10); // UART2
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 47 #endif
morgandu 0:11bc39d0f367 48
cyliang 9:b300117f3ed7 49 #elif defined (TARGET_NUMAKER_IOT_M467)
cyliang 9:b300117f3ed7 50 BufferedSerial serial_0(PB_3, PB_2); // UART1
cyliang 9:b300117f3ed7 51 BufferedSerial serial_1(PB_13, PB_12); // UART0
cyliang 9:b300117f3ed7 52 BufferedSerial serial_2(PF_7, PF_6); // UART4
cyliang 9:b300117f3ed7 53
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 54 #elif defined (TARGET_NUMAKER_PFM_M453) || defined(TARGET_NUMAKER_PFM_NANO130) || defined(TARGET_NUMAKER_PFM_M2351)
morgandu 0:11bc39d0f367 55 #error The board has no Ethernet.
morgandu 0:11bc39d0f367 56
morgandu 0:11bc39d0f367 57 #else
morgandu 0:11bc39d0f367 58 #error define UART ports for your board.
morgandu 0:11bc39d0f367 59 #endif
morgandu 0:11bc39d0f367 60
morgandu 0:11bc39d0f367 61 /* Default configuration for network ports and UART ports, etc. */
morgandu 0:11bc39d0f367 62 S_PORT_CONFIG port_config[MAX_UART_PORTS] = {
morgandu 0:11bc39d0f367 63
morgandu 0:11bc39d0f367 64 #if MAX_UART_PORTS == 1
morgandu 0:11bc39d0f367 65 {NET_SERVER_MODE, NET_PORT_BASE, &serial_0, DEFAULT_UART_BAUD, 8, 1, SerialBase::None}
morgandu 0:11bc39d0f367 66
morgandu 0:11bc39d0f367 67 #elif MAX_UART_PORTS == 2
morgandu 0:11bc39d0f367 68 {NET_SERVER_MODE, NET_PORT_BASE + 0, &serial_0, DEFAULT_UART_BAUD, 8, 1, SerialBase::None},
morgandu 0:11bc39d0f367 69 {NET_SERVER_MODE, NET_PORT_BASE + 1, &serial_1, DEFAULT_UART_BAUD, 8, 1, SerialBase::None}
morgandu 0:11bc39d0f367 70
morgandu 0:11bc39d0f367 71 #elif MAX_UART_PORTS == 3
morgandu 0:11bc39d0f367 72 {NET_SERVER_MODE, NET_PORT_BASE + 0, &serial_0, DEFAULT_UART_BAUD, 8, 1, SerialBase::None},
morgandu 0:11bc39d0f367 73 {NET_SERVER_MODE, NET_PORT_BASE + 1, &serial_1, DEFAULT_UART_BAUD, 8, 1, SerialBase::None},
morgandu 0:11bc39d0f367 74 {NET_SERVER_MODE, NET_PORT_BASE + 2, &serial_2, DEFAULT_UART_BAUD, 8, 1, SerialBase::None}
morgandu 0:11bc39d0f367 75
morgandu 0:11bc39d0f367 76 #else
morgandu 0:11bc39d0f367 77 #error You have to define ports mapping table.
morgandu 0:11bc39d0f367 78 #endif
morgandu 0:11bc39d0f367 79 };
morgandu 0:11bc39d0f367 80
morgandu 0:11bc39d0f367 81 EthernetInterface eth;
morgandu 0:11bc39d0f367 82
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 83 #if ENABLE_WEB_CONFIG
morgandu 0:11bc39d0f367 84
morgandu 0:11bc39d0f367 85 /* Declare the SD card as storage */
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 86 NuSDBlockDevice *bd = new NuSDBlockDevice();
morgandu 0:11bc39d0f367 87 FATFileSystem fs("fs");
morgandu 0:11bc39d0f367 88 bool SD_Card_Mounted = FALSE;
morgandu 0:11bc39d0f367 89
morgandu 0:11bc39d0f367 90 #endif
morgandu 0:11bc39d0f367 91
morgandu 0:11bc39d0f367 92 /* --- --- */
morgandu 0:11bc39d0f367 93
morgandu 0:11bc39d0f367 94 /*
morgandu 0:11bc39d0f367 95 * Forward serial port data to ethernet, and vice versa.
morgandu 0:11bc39d0f367 96 *
morgandu 0:11bc39d0f367 97 */
morgandu 0:11bc39d0f367 98 void exchange_data(S_PORT_CONFIG *pmap, TCPSocket *psocket)
morgandu 0:11bc39d0f367 99 {
morgandu 0:11bc39d0f367 100 unsigned char n_buf[256];
morgandu 0:11bc39d0f367 101 unsigned char s_buf[256];
morgandu 0:11bc39d0f367 102 int n_len = 0, n_index = 0;
morgandu 0:11bc39d0f367 103 int s_len = 0, s_index = 0;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 104 unsigned int eth_tx_count = 0;
morgandu 0:11bc39d0f367 105
morgandu 0:11bc39d0f367 106 while(1)
morgandu 0:11bc39d0f367 107 {
morgandu 0:11bc39d0f367 108 /*** Network to Serial ***/
morgandu 0:11bc39d0f367 109
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 110 if (n_len == 0)
morgandu 0:11bc39d0f367 111 {
morgandu 0:11bc39d0f367 112 // net buffer is empty, try to get new data from network.
morgandu 0:11bc39d0f367 113 n_len = psocket->recv(n_buf, sizeof(n_buf));
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 114 if (n_len == 0)
morgandu 0:11bc39d0f367 115 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 116 eth_tx_count += 3;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 117 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 118 else if (n_len == NSAPI_ERROR_WOULD_BLOCK)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 119 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 120 n_len = 0;
morgandu 0:11bc39d0f367 121 }
morgandu 0:11bc39d0f367 122 else if (n_len < 0)
morgandu 0:11bc39d0f367 123 {
morgandu 0:11bc39d0f367 124 printf("Socket Recv Err (%d)\r\n", n_len);
morgandu 0:11bc39d0f367 125 break;
morgandu 0:11bc39d0f367 126 }
morgandu 0:11bc39d0f367 127 }
morgandu 0:11bc39d0f367 128 else
morgandu 0:11bc39d0f367 129 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 130 n_index += pmap->pserial->write(n_buf+n_index, n_len-n_index);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 131 if (n_index == n_len)
morgandu 0:11bc39d0f367 132 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 133 n_len = 0;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 134 n_index = 0;
morgandu 0:11bc39d0f367 135 }
morgandu 0:11bc39d0f367 136 }
morgandu 0:11bc39d0f367 137
morgandu 0:11bc39d0f367 138 /*** Serial to Network ***/
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 139
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 140 // try to get more data from serial port
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 141 #if MBED_MAJOR_VERSION <= 5
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 142 for(; s_index < sizeof(s_buf) && pmap->pserial->readable(); s_index++)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 143 s_buf[s_index] = pmap->pserial->getc();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 144 #else
morgandu 0:11bc39d0f367 145 if (pmap->pserial->readable())
morgandu 0:11bc39d0f367 146 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 147 s_len = pmap->pserial->read(s_buf+s_index, sizeof(s_buf)-s_index);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 148 if (s_len > 0)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 149 s_index += s_len;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 150 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 151 #endif
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 152
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 153 if (s_index >= 240 || (s_index != 0 && ++eth_tx_count >= 5))
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 154 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 155 s_len = psocket->send(s_buf, s_index);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 156
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 157 if (s_len == NSAPI_ERROR_WOULD_BLOCK)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 158 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 159 printf("Socket Send no block.\r\n");
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 160 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 161 else if (s_len < 0)
morgandu 0:11bc39d0f367 162 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 163 printf("Socket Send Err (%d)\r\n", s_len);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 164 break;
morgandu 0:11bc39d0f367 165 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 166 else // s_len >= s_index
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 167 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 168 unsigned int i;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 169
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 170 // move remain data if existed.
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 171 for(i=0; s_len < s_index; i++, s_len++)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 172 s_buf[i] = s_buf[s_len];
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 173
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 174 s_index = i;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 175 eth_tx_count = 0;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 176 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 177 }
morgandu 0:11bc39d0f367 178 }
morgandu 0:11bc39d0f367 179 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 180
morgandu 0:11bc39d0f367 181 void bridge_net_client(S_PORT_CONFIG *pmap)
morgandu 0:11bc39d0f367 182 {
morgandu 0:11bc39d0f367 183 TCPSocket socket;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 184 SocketAddress server_ipaddr;
morgandu 0:11bc39d0f367 185 nsapi_error_t err;
morgandu 0:11bc39d0f367 186
morgandu 0:11bc39d0f367 187 printf("Thread %x in TCP client mode.\r\n", (unsigned int)pmap);
morgandu 0:11bc39d0f367 188
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 189 if ((err=socket.open(&eth)) != NSAPI_ERROR_OK)
morgandu 0:11bc39d0f367 190 {
morgandu 0:11bc39d0f367 191 printf("TCP socket can't open (%d)(%x).\r\n", err, (unsigned int)pmap);
morgandu 0:11bc39d0f367 192 return;
morgandu 0:11bc39d0f367 193 }
morgandu 0:11bc39d0f367 194
morgandu 0:11bc39d0f367 195 printf("Connecting server %s:%d ...\r\n", pmap->server_addr, pmap->server_port);
morgandu 0:11bc39d0f367 196 while(1)
morgandu 0:11bc39d0f367 197 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 198 server_ipaddr.set_ip_address(pmap->server_addr);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 199 server_ipaddr.set_port(pmap->server_port);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 200 if ((err=socket.connect(server_ipaddr)) >= 0)
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 201 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 202 printf("\r\nConnected.");
morgandu 0:11bc39d0f367 203 break;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 204 }
morgandu 0:11bc39d0f367 205 }
morgandu 0:11bc39d0f367 206
morgandu 0:11bc39d0f367 207 socket.set_timeout(1);
morgandu 0:11bc39d0f367 208 exchange_data(pmap, &socket);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 209 socket.close();
morgandu 0:11bc39d0f367 210 }
morgandu 0:11bc39d0f367 211
morgandu 0:11bc39d0f367 212 void bridge_net_server(S_PORT_CONFIG *pmap)
morgandu 0:11bc39d0f367 213 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 214 TCPSocket tcp_server;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 215 TCPSocket *client_socket;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 216 SocketAddress client_ipaddr;
morgandu 0:11bc39d0f367 217 nsapi_error_t err;
morgandu 0:11bc39d0f367 218
morgandu 0:11bc39d0f367 219 printf("Thread %x in TCP server mode.\r\n", (unsigned int)pmap);
morgandu 0:11bc39d0f367 220
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 221 if ((err=tcp_server.open(&eth)) != NSAPI_ERROR_OK)
morgandu 0:11bc39d0f367 222 {
morgandu 0:11bc39d0f367 223 printf("TCP server can't open (%d)(%x).\r\n", err, (unsigned int)pmap);
morgandu 0:11bc39d0f367 224 return;
morgandu 0:11bc39d0f367 225 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 226 if ((err=tcp_server.bind(pmap->port)) != NSAPI_ERROR_OK)
morgandu 0:11bc39d0f367 227 {
morgandu 0:11bc39d0f367 228 printf("TCP server can't bind address and port (%d)(%x).\r\n", err, (unsigned int)pmap);
morgandu 0:11bc39d0f367 229 return;
morgandu 0:11bc39d0f367 230 }
morgandu 0:11bc39d0f367 231 if ((err=tcp_server.listen(1)) < 0)
morgandu 0:11bc39d0f367 232 {
morgandu 0:11bc39d0f367 233 printf("TCP server can't listen (%d)(%x).\r\n", err, (unsigned int)pmap);
morgandu 0:11bc39d0f367 234 return;
morgandu 0:11bc39d0f367 235 }
morgandu 0:11bc39d0f367 236
morgandu 0:11bc39d0f367 237 while(1)
morgandu 0:11bc39d0f367 238 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 239 client_socket = tcp_server.accept(&err);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 240 if (err != NSAPI_ERROR_OK && err != NSAPI_ERROR_WOULD_BLOCK)
morgandu 0:11bc39d0f367 241 {
morgandu 0:11bc39d0f367 242 printf("TCP server fail to accept connection (%d)(%x).\r\n", err, (unsigned int)pmap);
morgandu 0:11bc39d0f367 243 return;
morgandu 0:11bc39d0f367 244 }
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 245 else
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 246 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 247 client_socket->getpeername(&client_ipaddr);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 248 printf("Connect (%d) from %s:%d ...\r\n", pmap->port, client_ipaddr.get_ip_address(), client_ipaddr.get_port());
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 249
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 250 client_socket->set_timeout(1);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 251 exchange_data(pmap, client_socket);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 252 client_socket->close();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 253 }
morgandu 0:11bc39d0f367 254 }
morgandu 0:11bc39d0f367 255 }
morgandu 0:11bc39d0f367 256
morgandu 0:11bc39d0f367 257 int main()
morgandu 0:11bc39d0f367 258 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 259 SocketAddress ip_addr;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 260 SocketAddress ip_mask;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 261 SocketAddress ip_gwaddr;
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 262
cyliang 7:c03b2ed97d94 263 printf("\r\nmbed OS version is %d.\r\n", MBED_VERSION);
morgandu 0:11bc39d0f367 264 printf("Start Serial-to-Ethernet...\r\n");
morgandu 0:11bc39d0f367 265
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 266 #if ENABLE_WEB_CONFIG
morgandu 0:11bc39d0f367 267
morgandu 0:11bc39d0f367 268 /* Restore configuration from SD card */
morgandu 0:11bc39d0f367 269
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 270 printf("Mounting SD card...\r\n");
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 271 SD_Card_Mounted = (fs.mount(bd) == 0);
morgandu 0:11bc39d0f367 272 if (SD_Card_Mounted)
morgandu 0:11bc39d0f367 273 {
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 274 printf("SD card mounted. Read configuration file...\r\n");
morgandu 0:11bc39d0f367 275 FILE *fd = fopen(SER_CONFIG_FILE, "r");
morgandu 0:11bc39d0f367 276 if (fd != NULL)
morgandu 0:11bc39d0f367 277 {
morgandu 0:11bc39d0f367 278 char pBuf[sizeof(port_config)+2];
morgandu 0:11bc39d0f367 279 int len = fread(pBuf, 1, sizeof(port_config)+2, fd);
morgandu 0:11bc39d0f367 280 if (len == (sizeof(port_config)+2) && pBuf[0] == 'N' && pBuf[1] == 'T')
morgandu 0:11bc39d0f367 281 {
morgandu 0:11bc39d0f367 282 printf("Set Serial ports from config file in SD card.\r\n");
morgandu 0:11bc39d0f367 283 memcpy(port_config, pBuf+2, sizeof(port_config));
morgandu 0:11bc39d0f367 284 }
morgandu 0:11bc39d0f367 285 else
morgandu 0:11bc39d0f367 286 printf("Incorrect serial config file.\r\n");
morgandu 0:11bc39d0f367 287
morgandu 0:11bc39d0f367 288 fclose(fd);
morgandu 0:11bc39d0f367 289 }
morgandu 0:11bc39d0f367 290 else
morgandu 0:11bc39d0f367 291 printf("Can't open serial config file.\r\n");
morgandu 0:11bc39d0f367 292
morgandu 0:11bc39d0f367 293 fd = fopen(NET_CONFIG_FILE, "r");
morgandu 0:11bc39d0f367 294 if (fd != NULL)
morgandu 0:11bc39d0f367 295 {
morgandu 0:11bc39d0f367 296 char pBuf[sizeof(net_config)+2];
morgandu 0:11bc39d0f367 297 int len = fread(pBuf, 1, sizeof(net_config)+2, fd);
morgandu 0:11bc39d0f367 298 if (len == (sizeof(net_config)+2) && pBuf[0] == 'N' && pBuf[1] == 'T')
morgandu 0:11bc39d0f367 299 {
morgandu 0:11bc39d0f367 300 printf("Set network from config file in SD card.\r\n");
morgandu 0:11bc39d0f367 301 memcpy(&net_config, pBuf+2, sizeof(net_config));
morgandu 0:11bc39d0f367 302 }
morgandu 0:11bc39d0f367 303 else
morgandu 0:11bc39d0f367 304 printf("Incorrect network config file.\r\n");
morgandu 0:11bc39d0f367 305
morgandu 0:11bc39d0f367 306 fclose(fd);
morgandu 0:11bc39d0f367 307 }
morgandu 0:11bc39d0f367 308 else
morgandu 0:11bc39d0f367 309 printf("Can't open network config file.\r\n");
morgandu 0:11bc39d0f367 310 }
morgandu 0:11bc39d0f367 311 else
morgandu 0:11bc39d0f367 312 {
morgandu 0:11bc39d0f367 313 printf("Can't find SD card.\r\n");
morgandu 0:11bc39d0f367 314 }
morgandu 0:11bc39d0f367 315
morgandu 0:11bc39d0f367 316 #endif
morgandu 0:11bc39d0f367 317
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 318 /* Configure serial ports */
morgandu 0:11bc39d0f367 319 printf("Configure UART ports...\r\n");
morgandu 0:11bc39d0f367 320 for(int i=0; i<MAX_UART_PORTS; i++)
morgandu 0:11bc39d0f367 321 {
cyliang 7:c03b2ed97d94 322 #if MBED_MAJOR_VERSION <= 5
morgandu 0:11bc39d0f367 323 port_config[i].pserial->baud(port_config[i].baud);
morgandu 0:11bc39d0f367 324 port_config[i].pserial->format(port_config[i].data, port_config[i].parity, port_config[i].stop);
cyliang 7:c03b2ed97d94 325 #else
cyliang 7:c03b2ed97d94 326 port_config[i].pserial->set_baud(port_config[i].baud);
cyliang 7:c03b2ed97d94 327 port_config[i].pserial->set_format(port_config[i].data, port_config[i].parity, port_config[i].stop);
cyliang 7:c03b2ed97d94 328 #endif
morgandu 0:11bc39d0f367 329 }
morgandu 0:11bc39d0f367 330
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 331 /* Configure network IP address */
morgandu 0:11bc39d0f367 332 if (net_config.mode == IP_STATIC_MODE)
morgandu 0:11bc39d0f367 333 {
morgandu 0:11bc39d0f367 334 printf("Start Ethernet in Static mode.\r\n");
morgandu 0:11bc39d0f367 335 eth.disconnect();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 336
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 337 ip_addr.set_ip_address(net_config.ip);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 338 ip_mask.set_ip_address(net_config.mask);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 339 ip_gwaddr.set_ip_address(net_config.gateway);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 340 ((NetworkInterface *)&eth)->set_network(ip_addr, ip_mask, ip_gwaddr);
morgandu 0:11bc39d0f367 341 }
morgandu 0:11bc39d0f367 342 else
morgandu 0:11bc39d0f367 343 printf("Start Ethernet in DHCP mode.\r\n");
morgandu 0:11bc39d0f367 344
morgandu 0:11bc39d0f367 345 eth.connect();
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 346 eth.get_ip_address(&ip_addr);
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 347 printf("IP Address is %s\r\n", ip_addr.get_ip_address());
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 348
morgandu 0:11bc39d0f367 349 Thread thread[MAX_UART_PORTS];
morgandu 0:11bc39d0f367 350
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 351 /* Folk thread for each serial port */
morgandu 0:11bc39d0f367 352 for(int i=0; i<MAX_UART_PORTS; i++)
morgandu 0:11bc39d0f367 353 {
morgandu 0:11bc39d0f367 354 if (port_config[i].mode == NET_SERVER_MODE)
morgandu 0:11bc39d0f367 355 {
morgandu 0:11bc39d0f367 356 thread[i].start(callback(bridge_net_server, &(port_config[i])));
morgandu 0:11bc39d0f367 357 }
morgandu 0:11bc39d0f367 358 else // if (port_config[i].mode == TCP_CLIENT_MODE)
morgandu 0:11bc39d0f367 359 {
morgandu 0:11bc39d0f367 360 thread[i].start(callback(bridge_net_client, &(port_config[i])));
morgandu 0:11bc39d0f367 361 }
morgandu 0:11bc39d0f367 362 }
morgandu 0:11bc39d0f367 363
SHLIU1@OANBE02333.nuvoton.com 6:014b1a469aed 364 #if ENABLE_WEB_CONFIG
morgandu 0:11bc39d0f367 365
morgandu 0:11bc39d0f367 366 /*** main thread to be a web server for configuration ***/
morgandu 0:11bc39d0f367 367 start_httpd();
morgandu 0:11bc39d0f367 368
morgandu 0:11bc39d0f367 369 #endif
morgandu 0:11bc39d0f367 370
morgandu 0:11bc39d0f367 371 while(1);
morgandu 0:11bc39d0f367 372
morgandu 0:11bc39d0f367 373 /* end of main task */
morgandu 0:11bc39d0f367 374 //eth.disconnect();
morgandu 0:11bc39d0f367 375 }
cyliang 7:c03b2ed97d94 376
cyliang 7:c03b2ed97d94 377