netconf.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "lwip/mem.h"
  2. #include "lwip/memp.h"
  3. #include "lwip/dhcp.h"
  4. #include "ethernetif.h"
  5. #include "common_config.h"
  6. #include "netconf.h"
  7. #include "tcpip.h"
  8. #include "main.h"
  9. #include "settings_api.h"
  10. #include "parameters.h"
  11. #include "stm32f4x7_eth.h"
  12. #ifdef PRINTF_STDLIB
  13. #include <stdio.h>
  14. #endif
  15. #ifdef PRINTF_CUSTOM
  16. #include "tinystdio.h"
  17. #endif
  18. #include <string.h>
  19. #define MAX_DHCP_TRIES 4
  20. #define TIME_COUNTER_10_MIN 600
  21. #define TIME_COUNTER_1_MIN 60
  22. /**
  23. * @brief Network interface structure
  24. */
  25. struct netif xnetif;
  26. /**
  27. * @brief Флаг ининциализации Eth интерфейса
  28. */
  29. unsigned char eth_ready_flag = 0;
  30. /**
  31. * @brief Задача получения сетевый параметров по DHCP протоколу
  32. */
  33. TaskHandle_t xHandleDHCP = NULL;
  34. /**
  35. * @brief Общая структура настроек
  36. */
  37. extern SETTINGS_t sSettings;
  38. void LwIP_Init(void)
  39. {
  40. struct ip4_addr ipaddr;
  41. struct ip4_addr netmask;
  42. struct ip4_addr gw;
  43. uint16_t reg = 0;
  44. tcpip_init( NULL, NULL );
  45. ipaddr.addr = 0;
  46. netmask.addr = 0;
  47. gw.addr = 0;
  48. netif_add(&xnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
  49. netif_set_default(&xnetif);
  50. netif_set_link_up(&xnetif);
  51. netif_set_up(&xnetif);
  52. /* Проверяем наличие линка */
  53. // reg = ETH_ReadPHYRegister(0, 1);
  54. // if (reg & 4)
  55. xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,
  56. tskIDLE_PRIORITY + 2, &xHandleDHCP);
  57. }
  58. void init_get_ip_address_controller(void)
  59. {
  60. xTaskCreate(LwIP_DHCP_task, "DHCPClient", configMINIMAL_STACK_SIZE * 2, NULL,
  61. tskIDLE_PRIORITY + 2, &xHandleDHCP);
  62. }
  63. /**
  64. * @brief LwIP_DHCP_Process_Handle
  65. * @param None
  66. * @retval None
  67. */
  68. void LwIP_DHCP_task(void *pvParameters)
  69. {
  70. struct ip4_addr ipaddr;
  71. struct ip4_addr netmask;
  72. struct ip4_addr gw;
  73. uint8_t DHCP_state;
  74. DHCP_state = DHCP_START;
  75. for (;;) {
  76. struct dhcp *dhcp = netif_dhcp_data(&xnetif);
  77. switch (DHCP_state) {
  78. case DHCP_START: {
  79. dhcp_start(&xnetif);
  80. DHCP_state = DHCP_WAIT_ADDRESS;
  81. //PRINT_USART("\n\rLooking for DHCP server please wait...\n\r");
  82. }
  83. break;
  84. case DHCP_WAIT_ADDRESS: {
  85. /* Read the new IP address */
  86. ipaddr = xnetif.ip_addr;
  87. netmask = xnetif.netmask;
  88. gw = xnetif.gw;
  89. if (ipaddr.addr != 0) {
  90. DHCP_state = DHCP_ADDRESS_ASSIGNED;
  91. PRINT_USART("Parameters assigned by a DHCP server:\n\r IP: ");
  92. PRINT_USART(ipaddr_ntoa(&ipaddr));
  93. PRINT_USART("\n\r");
  94. PRINT_USART("Netmask: ");
  95. PRINT_USART(ipaddr_ntoa(&netmask));
  96. PRINT_USART("\n\r");
  97. PRINT_USART("Gateway: ");
  98. PRINT_USART(ipaddr_ntoa(&gw));
  99. PRINT_USART("\n\r");
  100. printf("ETH OK\r\n");
  101. /* Установлен динамический IP. *
  102. * Ждем инициализацию интерфейса и выставляем флаг готовности. */
  103. vTaskDelay(2000);
  104. eth_ready_flag = 1;
  105. vTaskDelete(xHandleDHCP);
  106. } else {
  107. /* DHCP timeout */
  108. if (dhcp->tries > MAX_DHCP_TRIES) {
  109. DHCP_state = DHCP_TIMEOUT;
  110. /* Stop DHCP */
  111. dhcp_stop(&xnetif);
  112. /* if (sSettings.sFlags.netsettingsChanged == true)
  113. {
  114. ipaddr.addr = ipaddr_addr(sSettings.sWebTempParams.ip);
  115. netmask.addr = ipaddr_addr(sSettings.sWebTempParams.mask);
  116. gw.addr = ipaddr_addr(sSettings.sWebTempParams.gate);
  117. }
  118. else
  119. {
  120. ipaddr.addr = ipaddr_addr(sSettings.sWebParams.ip);
  121. netmask.addr = ipaddr_addr(sSettings.sWebParams.mask);
  122. gw.addr = ipaddr_addr(sSettings.sWebParams.gate);
  123. }
  124. //Static address used
  125. netif_set_addr(&xnetif, &ipaddr , &netmask, &gw);
  126. printf("DHCP timeout\n\r");
  127. printf("\n\rStatic IP address\n\r");
  128. printf(ipaddr_ntoa(&ipaddr));
  129. printf("\n\r");*/
  130. /* Установлен динамический IP. *
  131. * Ждем инициализацию интерфейса и выставляем флаг готовности. */
  132. vTaskDelay(2000);
  133. eth_ready_flag = 0;
  134. vTaskDelete(xHandleDHCP);
  135. }
  136. }
  137. }
  138. break;
  139. default: break;
  140. }
  141. vTaskDelay(250);
  142. }
  143. }
  144. /*********** Portions COPYRIGHT 2012 Embest Tech. Co., Ltd.*****END OF FILE****/