Rahul Dahiya / Mbed OS STM32F7 Ethernet
Committer:
rahul_dahiya
Date:
Wed Jan 15 15:57:15 2020 +0530
Revision:
0:fb8047b156bb
STM32F7 LWIP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rahul_dahiya 0:fb8047b156bb 1 #include "mbed.h"
rahul_dahiya 0:fb8047b156bb 2 #include "lwip/dhcp.h"
rahul_dahiya 0:fb8047b156bb 3 #include "lwip/tcpip.h"
rahul_dahiya 0:fb8047b156bb 4 #include "lwip/api.h"
rahul_dahiya 0:fb8047b156bb 5 #include "eth_arch.h"
rahul_dahiya 0:fb8047b156bb 6
rahul_dahiya 0:fb8047b156bb 7 //#define USE_DHCP /* enable DHCP, if disabled static address is used*/
rahul_dahiya 0:fb8047b156bb 8
rahul_dahiya 0:fb8047b156bb 9 /*Static IP ADDRESS*/
rahul_dahiya 0:fb8047b156bb 10 #define IP_ADDR0 192
rahul_dahiya 0:fb8047b156bb 11 #define IP_ADDR1 168
rahul_dahiya 0:fb8047b156bb 12 #define IP_ADDR2 0
rahul_dahiya 0:fb8047b156bb 13 #define IP_ADDR3 10
rahul_dahiya 0:fb8047b156bb 14
rahul_dahiya 0:fb8047b156bb 15 /*NETMASK*/
rahul_dahiya 0:fb8047b156bb 16 #define NETMASK_ADDR0 255
rahul_dahiya 0:fb8047b156bb 17 #define NETMASK_ADDR1 255
rahul_dahiya 0:fb8047b156bb 18 #define NETMASK_ADDR2 255
rahul_dahiya 0:fb8047b156bb 19 #define NETMASK_ADDR3 0
rahul_dahiya 0:fb8047b156bb 20
rahul_dahiya 0:fb8047b156bb 21 /*Gateway Address*/
rahul_dahiya 0:fb8047b156bb 22 #define GW_ADDR0 192
rahul_dahiya 0:fb8047b156bb 23 #define GW_ADDR1 168
rahul_dahiya 0:fb8047b156bb 24 #define GW_ADDR2 0
rahul_dahiya 0:fb8047b156bb 25 #define GW_ADDR3 1
rahul_dahiya 0:fb8047b156bb 26
rahul_dahiya 0:fb8047b156bb 27 #define DHCP_OFF (uint8_t) 0
rahul_dahiya 0:fb8047b156bb 28 #define DHCP_START (uint8_t) 1
rahul_dahiya 0:fb8047b156bb 29 #define DHCP_WAIT_ADDRESS (uint8_t) 2
rahul_dahiya 0:fb8047b156bb 30 #define DHCP_ADDRESS_ASSIGNED (uint8_t) 3
rahul_dahiya 0:fb8047b156bb 31 #define DHCP_TIMEOUT_APP (uint8_t) 4
rahul_dahiya 0:fb8047b156bb 32 #define DHCP_LINK_DOWN (uint8_t) 5
rahul_dahiya 0:fb8047b156bb 33
rahul_dahiya 0:fb8047b156bb 34 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 35 #define MAX_DHCP_TRIES 4
rahul_dahiya 0:fb8047b156bb 36 __IO uint8_t DHCP_state = DHCP_OFF;
rahul_dahiya 0:fb8047b156bb 37 #endif
rahul_dahiya 0:fb8047b156bb 38
rahul_dahiya 0:fb8047b156bb 39 struct netif gnetif; /* network interface structure */
rahul_dahiya 0:fb8047b156bb 40
rahul_dahiya 0:fb8047b156bb 41 DigitalOut led1(LED1);
rahul_dahiya 0:fb8047b156bb 42 DigitalOut led3(LED3);
rahul_dahiya 0:fb8047b156bb 43
rahul_dahiya 0:fb8047b156bb 44 Thread thread1;
rahul_dahiya 0:fb8047b156bb 45
rahul_dahiya 0:fb8047b156bb 46 static void Netif_Config(void);
rahul_dahiya 0:fb8047b156bb 47 void User_notification(struct netif *netif);
rahul_dahiya 0:fb8047b156bb 48 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 49 void DHCP_thread(void);
rahul_dahiya 0:fb8047b156bb 50 #endif
rahul_dahiya 0:fb8047b156bb 51 static void http_server_netconn_thread(void *arg);
rahul_dahiya 0:fb8047b156bb 52
rahul_dahiya 0:fb8047b156bb 53 int main()
rahul_dahiya 0:fb8047b156bb 54 {
rahul_dahiya 0:fb8047b156bb 55 printf("\n\n*** Welcome STM32F767ZI !!! ***\n\r");
rahul_dahiya 0:fb8047b156bb 56 printf("CLOCK: %d\n\r", OS_Tick_GetClock());
rahul_dahiya 0:fb8047b156bb 57
rahul_dahiya 0:fb8047b156bb 58 /* Create tcp_ip stack thread */
rahul_dahiya 0:fb8047b156bb 59 tcpip_init(NULL, NULL);
rahul_dahiya 0:fb8047b156bb 60
rahul_dahiya 0:fb8047b156bb 61 /* Initialize the LwIP stack */
rahul_dahiya 0:fb8047b156bb 62 Netif_Config();
rahul_dahiya 0:fb8047b156bb 63
rahul_dahiya 0:fb8047b156bb 64 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 65 /* Start DHCPClient */
rahul_dahiya 0:fb8047b156bb 66 thread1.start(DHCP_thread);
rahul_dahiya 0:fb8047b156bb 67 #endif
rahul_dahiya 0:fb8047b156bb 68
rahul_dahiya 0:fb8047b156bb 69 sys_thread_new("HTTP", http_server_netconn_thread, NULL, DEFAULT_THREAD_STACKSIZE, osPriorityAboveNormal);
rahul_dahiya 0:fb8047b156bb 70
rahul_dahiya 0:fb8047b156bb 71 /* Notify user about the network interface config */
rahul_dahiya 0:fb8047b156bb 72 User_notification(&gnetif);
rahul_dahiya 0:fb8047b156bb 73
rahul_dahiya 0:fb8047b156bb 74 while (true) {
rahul_dahiya 0:fb8047b156bb 75
rahul_dahiya 0:fb8047b156bb 76
rahul_dahiya 0:fb8047b156bb 77 }
rahul_dahiya 0:fb8047b156bb 78 }
rahul_dahiya 0:fb8047b156bb 79
rahul_dahiya 0:fb8047b156bb 80
rahul_dahiya 0:fb8047b156bb 81 /**
rahul_dahiya 0:fb8047b156bb 82 * @brief Initializes the lwIP stack
rahul_dahiya 0:fb8047b156bb 83 * @param None
rahul_dahiya 0:fb8047b156bb 84 * @retval None
rahul_dahiya 0:fb8047b156bb 85 */
rahul_dahiya 0:fb8047b156bb 86 static void Netif_Config(void)
rahul_dahiya 0:fb8047b156bb 87 {
rahul_dahiya 0:fb8047b156bb 88 ip_addr_t ipaddr;
rahul_dahiya 0:fb8047b156bb 89 ip_addr_t netmask;
rahul_dahiya 0:fb8047b156bb 90 ip_addr_t gw;
rahul_dahiya 0:fb8047b156bb 91
rahul_dahiya 0:fb8047b156bb 92 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 93 ip_addr_set_zero_ip4(&ipaddr);
rahul_dahiya 0:fb8047b156bb 94 ip_addr_set_zero_ip4(&netmask);
rahul_dahiya 0:fb8047b156bb 95 ip_addr_set_zero_ip4(&gw);
rahul_dahiya 0:fb8047b156bb 96 #else
rahul_dahiya 0:fb8047b156bb 97 IP_ADDR4(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);
rahul_dahiya 0:fb8047b156bb 98 IP_ADDR4(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3);
rahul_dahiya 0:fb8047b156bb 99 IP_ADDR4(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3);
rahul_dahiya 0:fb8047b156bb 100 #endif /* USE_DHCP */
rahul_dahiya 0:fb8047b156bb 101
rahul_dahiya 0:fb8047b156bb 102 /* add the network interface */
rahul_dahiya 0:fb8047b156bb 103 netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &eth_arch_enetif_init, &tcpip_input);
rahul_dahiya 0:fb8047b156bb 104
rahul_dahiya 0:fb8047b156bb 105 /* Registers the default network interface. */
rahul_dahiya 0:fb8047b156bb 106 netif_set_default(&gnetif);
rahul_dahiya 0:fb8047b156bb 107
rahul_dahiya 0:fb8047b156bb 108 if (netif_is_link_up(&gnetif))
rahul_dahiya 0:fb8047b156bb 109 {
rahul_dahiya 0:fb8047b156bb 110 /* When the netif is fully configured this function must be called.*/
rahul_dahiya 0:fb8047b156bb 111 netif_set_up(&gnetif);
rahul_dahiya 0:fb8047b156bb 112 printf("\n\rEth Configured\n\r");
rahul_dahiya 0:fb8047b156bb 113 }
rahul_dahiya 0:fb8047b156bb 114 else
rahul_dahiya 0:fb8047b156bb 115 {
rahul_dahiya 0:fb8047b156bb 116 /* When the netif link is down this function must be called */
rahul_dahiya 0:fb8047b156bb 117 netif_set_down(&gnetif);
rahul_dahiya 0:fb8047b156bb 118 printf("\n\rLink is down\n\r");
rahul_dahiya 0:fb8047b156bb 119 }
rahul_dahiya 0:fb8047b156bb 120
rahul_dahiya 0:fb8047b156bb 121 }
rahul_dahiya 0:fb8047b156bb 122
rahul_dahiya 0:fb8047b156bb 123
rahul_dahiya 0:fb8047b156bb 124 /**
rahul_dahiya 0:fb8047b156bb 125 * @brief Notify the User about the network interface config status
rahul_dahiya 0:fb8047b156bb 126 * @param netif: the network interface
rahul_dahiya 0:fb8047b156bb 127 * @retval None
rahul_dahiya 0:fb8047b156bb 128 */
rahul_dahiya 0:fb8047b156bb 129 void User_notification(struct netif *netif)
rahul_dahiya 0:fb8047b156bb 130 {
rahul_dahiya 0:fb8047b156bb 131 if (netif_is_up(netif))
rahul_dahiya 0:fb8047b156bb 132 {
rahul_dahiya 0:fb8047b156bb 133 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 134 /* Update DHCP state machine */
rahul_dahiya 0:fb8047b156bb 135 DHCP_state = DHCP_START;
rahul_dahiya 0:fb8047b156bb 136 #else
rahul_dahiya 0:fb8047b156bb 137 /* Turn On LED 1 to indicate ETH and LwIP init success*/
rahul_dahiya 0:fb8047b156bb 138 led1 = 1;
rahul_dahiya 0:fb8047b156bb 139 #endif /* USE_DHCP */
rahul_dahiya 0:fb8047b156bb 140 }
rahul_dahiya 0:fb8047b156bb 141 else
rahul_dahiya 0:fb8047b156bb 142 {
rahul_dahiya 0:fb8047b156bb 143 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 144 /* Update DHCP state machine */
rahul_dahiya 0:fb8047b156bb 145 DHCP_state = DHCP_LINK_DOWN;
rahul_dahiya 0:fb8047b156bb 146 #endif /* USE_DHCP */
rahul_dahiya 0:fb8047b156bb 147 /* Turn On LED 3 to indicate ETH and LwIP init error */
rahul_dahiya 0:fb8047b156bb 148 led3 = 1;
rahul_dahiya 0:fb8047b156bb 149 }
rahul_dahiya 0:fb8047b156bb 150 }
rahul_dahiya 0:fb8047b156bb 151
rahul_dahiya 0:fb8047b156bb 152
rahul_dahiya 0:fb8047b156bb 153 #ifdef USE_DHCP
rahul_dahiya 0:fb8047b156bb 154 /**
rahul_dahiya 0:fb8047b156bb 155 * @brief DHCP Process
rahul_dahiya 0:fb8047b156bb 156 * @param argument: network interface
rahul_dahiya 0:fb8047b156bb 157 * @retval None
rahul_dahiya 0:fb8047b156bb 158 */
rahul_dahiya 0:fb8047b156bb 159 void DHCP_thread(void)
rahul_dahiya 0:fb8047b156bb 160 {
rahul_dahiya 0:fb8047b156bb 161 struct netif *netif = &gnetif;
rahul_dahiya 0:fb8047b156bb 162 ip_addr_t ipaddr;
rahul_dahiya 0:fb8047b156bb 163 ip_addr_t netmask;
rahul_dahiya 0:fb8047b156bb 164 ip_addr_t gw;
rahul_dahiya 0:fb8047b156bb 165 struct dhcp *dhcp;
rahul_dahiya 0:fb8047b156bb 166
rahul_dahiya 0:fb8047b156bb 167 for (;;)
rahul_dahiya 0:fb8047b156bb 168 {
rahul_dahiya 0:fb8047b156bb 169 switch (DHCP_state)
rahul_dahiya 0:fb8047b156bb 170 {
rahul_dahiya 0:fb8047b156bb 171 case DHCP_START:
rahul_dahiya 0:fb8047b156bb 172 {
rahul_dahiya 0:fb8047b156bb 173 ip_addr_set_zero_ip4(&netif->ip_addr);
rahul_dahiya 0:fb8047b156bb 174 ip_addr_set_zero_ip4(&netif->netmask);
rahul_dahiya 0:fb8047b156bb 175 ip_addr_set_zero_ip4(&netif->gw);
rahul_dahiya 0:fb8047b156bb 176 dhcp_start(netif);
rahul_dahiya 0:fb8047b156bb 177 DHCP_state = DHCP_WAIT_ADDRESS;
rahul_dahiya 0:fb8047b156bb 178 }
rahul_dahiya 0:fb8047b156bb 179 break;
rahul_dahiya 0:fb8047b156bb 180
rahul_dahiya 0:fb8047b156bb 181 case DHCP_WAIT_ADDRESS:
rahul_dahiya 0:fb8047b156bb 182 {
rahul_dahiya 0:fb8047b156bb 183 if (dhcp_supplied_address(netif))
rahul_dahiya 0:fb8047b156bb 184 {
rahul_dahiya 0:fb8047b156bb 185 DHCP_state = DHCP_ADDRESS_ASSIGNED;
rahul_dahiya 0:fb8047b156bb 186
rahul_dahiya 0:fb8047b156bb 187 led3 = 0;
rahul_dahiya 0:fb8047b156bb 188 led1 = 1;
rahul_dahiya 0:fb8047b156bb 189
rahul_dahiya 0:fb8047b156bb 190 printf("\n\rSTM32 IP: %d.%d.%d.%d\n\r",(((const u8_t*)(&(ipaddr).addr))[0]),(((const u8_t*)(&(ipaddr).addr))[1]),
rahul_dahiya 0:fb8047b156bb 191 (((const u8_t*)(&(ipaddr).addr))[2]),(((const u8_t*)(&(ipaddr).addr))[3]));
rahul_dahiya 0:fb8047b156bb 192 }
rahul_dahiya 0:fb8047b156bb 193 else
rahul_dahiya 0:fb8047b156bb 194 {
rahul_dahiya 0:fb8047b156bb 195 dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
rahul_dahiya 0:fb8047b156bb 196
rahul_dahiya 0:fb8047b156bb 197 /* DHCP timeout */
rahul_dahiya 0:fb8047b156bb 198 if (dhcp->tries > MAX_DHCP_TRIES)
rahul_dahiya 0:fb8047b156bb 199 {
rahul_dahiya 0:fb8047b156bb 200 DHCP_state = DHCP_TIMEOUT_APP;
rahul_dahiya 0:fb8047b156bb 201
rahul_dahiya 0:fb8047b156bb 202 /* Stop DHCP */
rahul_dahiya 0:fb8047b156bb 203 dhcp_stop(netif);
rahul_dahiya 0:fb8047b156bb 204
rahul_dahiya 0:fb8047b156bb 205 /* Static address used */
rahul_dahiya 0:fb8047b156bb 206 IP_ADDR4(&ipaddr, IP_ADDR0 ,IP_ADDR1 , IP_ADDR2 , IP_ADDR3 );
rahul_dahiya 0:fb8047b156bb 207 IP_ADDR4(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
rahul_dahiya 0:fb8047b156bb 208 IP_ADDR4(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
rahul_dahiya 0:fb8047b156bb 209 netif_set_addr(netif, ip_2_ip4(&ipaddr), ip_2_ip4(&netmask), ip_2_ip4(&gw));
rahul_dahiya 0:fb8047b156bb 210
rahul_dahiya 0:fb8047b156bb 211 led3 = 0;
rahul_dahiya 0:fb8047b156bb 212 led1 = 1;
rahul_dahiya 0:fb8047b156bb 213 }
rahul_dahiya 0:fb8047b156bb 214 else
rahul_dahiya 0:fb8047b156bb 215 {
rahul_dahiya 0:fb8047b156bb 216 led3 = 1;
rahul_dahiya 0:fb8047b156bb 217 }
rahul_dahiya 0:fb8047b156bb 218 }
rahul_dahiya 0:fb8047b156bb 219 }
rahul_dahiya 0:fb8047b156bb 220 break;
rahul_dahiya 0:fb8047b156bb 221
rahul_dahiya 0:fb8047b156bb 222 case DHCP_LINK_DOWN:
rahul_dahiya 0:fb8047b156bb 223 {
rahul_dahiya 0:fb8047b156bb 224 /* Stop DHCP */
rahul_dahiya 0:fb8047b156bb 225 dhcp_stop(netif);
rahul_dahiya 0:fb8047b156bb 226 DHCP_state = DHCP_OFF;
rahul_dahiya 0:fb8047b156bb 227 }
rahul_dahiya 0:fb8047b156bb 228 break;
rahul_dahiya 0:fb8047b156bb 229
rahul_dahiya 0:fb8047b156bb 230 default: break;
rahul_dahiya 0:fb8047b156bb 231
rahul_dahiya 0:fb8047b156bb 232 }
rahul_dahiya 0:fb8047b156bb 233
rahul_dahiya 0:fb8047b156bb 234 /* wait 250 ms */
rahul_dahiya 0:fb8047b156bb 235 wait_ms(250);
rahul_dahiya 0:fb8047b156bb 236 }
rahul_dahiya 0:fb8047b156bb 237 }
rahul_dahiya 0:fb8047b156bb 238 #endif /* USE_DHCP */
rahul_dahiya 0:fb8047b156bb 239
rahul_dahiya 0:fb8047b156bb 240
rahul_dahiya 0:fb8047b156bb 241 /**
rahul_dahiya 0:fb8047b156bb 242 * @brief Notify the User about the network interface config status
rahul_dahiya 0:fb8047b156bb 243 * @param netif: the network interface
rahul_dahiya 0:fb8047b156bb 244 * @retval None
rahul_dahiya 0:fb8047b156bb 245 */
rahul_dahiya 0:fb8047b156bb 246 static void http_server_netconn_thread(void *arg)
rahul_dahiya 0:fb8047b156bb 247 {
rahul_dahiya 0:fb8047b156bb 248 struct netconn *conn, *newconn;
rahul_dahiya 0:fb8047b156bb 249 err_t err, accept_err;
rahul_dahiya 0:fb8047b156bb 250
rahul_dahiya 0:fb8047b156bb 251 /* Create a new TCP connection handle */
rahul_dahiya 0:fb8047b156bb 252 conn = netconn_new(NETCONN_TCP);
rahul_dahiya 0:fb8047b156bb 253
rahul_dahiya 0:fb8047b156bb 254 if (conn!= NULL)
rahul_dahiya 0:fb8047b156bb 255 {
rahul_dahiya 0:fb8047b156bb 256 /* Bind to port 80 (HTTP) with default IP address */
rahul_dahiya 0:fb8047b156bb 257 err = netconn_bind(conn, NULL, 80);
rahul_dahiya 0:fb8047b156bb 258
rahul_dahiya 0:fb8047b156bb 259 if (err == ERR_OK)
rahul_dahiya 0:fb8047b156bb 260 {
rahul_dahiya 0:fb8047b156bb 261 /* Put the connection into LISTEN state */
rahul_dahiya 0:fb8047b156bb 262 netconn_listen(conn);
rahul_dahiya 0:fb8047b156bb 263
rahul_dahiya 0:fb8047b156bb 264 while(1)
rahul_dahiya 0:fb8047b156bb 265 {
rahul_dahiya 0:fb8047b156bb 266 /* accept any icoming connection */
rahul_dahiya 0:fb8047b156bb 267 accept_err = netconn_accept(conn, &newconn);
rahul_dahiya 0:fb8047b156bb 268 if(accept_err == ERR_OK)
rahul_dahiya 0:fb8047b156bb 269 {
rahul_dahiya 0:fb8047b156bb 270 /* serve connection */
rahul_dahiya 0:fb8047b156bb 271 // Write your code here
rahul_dahiya 0:fb8047b156bb 272 printf("\n\rNew HTTP Connection");
rahul_dahiya 0:fb8047b156bb 273
rahul_dahiya 0:fb8047b156bb 274 /* delete connection */
rahul_dahiya 0:fb8047b156bb 275 netconn_delete(newconn);
rahul_dahiya 0:fb8047b156bb 276 }
rahul_dahiya 0:fb8047b156bb 277 }
rahul_dahiya 0:fb8047b156bb 278 }
rahul_dahiya 0:fb8047b156bb 279 }
rahul_dahiya 0:fb8047b156bb 280 }