lwip_dm9k.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include "lwip_dm9k.h"
  2. #include "ethernetif_dm9k.h"
  3. #include "lwip/tcpip.h"
  4. //*******************************************************************************
  5. struct netif dm9k_netif; // 定义一个网络接口
  6. /*函数声明*/
  7. #ifdef USE_DHCP
  8. static void lwip_dhcp_task(void const *pdata);
  9. #endif
  10. static void ethernet_link_status_updated(struct netif *netif);
  11. // LWIP初始化(LWIP启动的时候使用)
  12. void lwip_dm9k_init(void)
  13. {
  14. ip4_addr_t ipaddr;
  15. ip4_addr_t netmask;
  16. ip4_addr_t gw;
  17. #ifdef USE_DHCP //使用动态IP
  18. ip_addr_set_zero_ip4(&ipaddr);
  19. ip_addr_set_zero_ip4(&netmask);
  20. ip_addr_set_zero_ip4(&gw);
  21. #else //使用静态IP
  22. IP4_ADDR(&ipaddr, DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
  23. IP4_ADDR(&netmask, DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
  24. IP4_ADDR(&gw, DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
  25. printf("\r\n");
  26. printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n", DM9K_MAC_ADDR0, DM9K_MAC_ADDR1, DM9K_MAC_ADDR2, DM9K_MAC_ADDR3, DM9K_MAC_ADDR4, DM9K_MAC_ADDR5);
  27. printf("静态IP地址........................%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
  28. printf("子网掩码..........................%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
  29. printf("默认网关..........................%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
  30. #endif
  31. netif_add(&dm9k_netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_dm9k_init, &tcpip_input); //向网卡列表中添加一个网口
  32. netif_set_default(&dm9k_netif); //设置netif为默认网口
  33. ethernet_link_status_updated(&dm9k_netif);
  34. #if LWIP_NETIF_LINK_CALLBACK
  35. netif_set_link_callback(&dm9k_netif, ethernet_link_status_updated);
  36. #endif
  37. //操作OK.
  38. }
  39. //如果使能了DHCP
  40. #ifdef USE_DHCP
  41. // DHCP处理任务
  42. static osSemaphoreId DHCPSemaphore = NULL; /* Semaphore to signal incoming packets */
  43. static void lwip_dhcp_task(void const *argument)
  44. {
  45. struct netif *netif = (struct netif *)argument;
  46. struct dhcp *dhcp;
  47. ip_addr_t ipaddr;
  48. ip_addr_t netmask;
  49. ip_addr_t gw;
  50. for (;;)
  51. {
  52. if (osSemaphoreWait(DHCPSemaphore, osWaitForever) == osOK)
  53. {
  54. if (dm9kdev.dhcpstatus == DHCP_START)
  55. {
  56. ip_addr_set_zero_ip4(&netif->ip_addr);
  57. ip_addr_set_zero_ip4(&netif->netmask);
  58. ip_addr_set_zero_ip4(&netif->gw);
  59. dm9kdev.dhcpstatus = DHCP_WAIT_ADDRESS;
  60. dhcp_start(netif); //开启DHCP
  61. printf("dm9k 开启DHCP服务,请稍等...........\r\n");
  62. }
  63. else if (dm9kdev.dhcpstatus == DHCP_LINK_DOWN)
  64. {
  65. dm9kdev.dhcpstatus = DHCP_OFF;
  66. // dhcp_stop(netif);
  67. // dhcp_try_stop(netif);
  68. printf("dm9k 链接断开\r\n");
  69. }
  70. while (dm9kdev.dhcpstatus == DHCP_WAIT_ADDRESS)
  71. {
  72. printf("dm9k 正在获取地址...\r\n");
  73. if (dhcp_supplied_address(netif)) //当正确读取到IP地址的时候
  74. {
  75. dm9kdev.dhcpstatus = DHCP_ADDRESS_ASSIGNED;
  76. printf("dm9k 网卡en的MAC地址为:.......%d.%d.%d.%d.%d.%d\r\n", DM9K_MAC_ADDR0, DM9K_MAC_ADDR1, DM9K_MAC_ADDR2, DM9K_MAC_ADDR3, DM9K_MAC_ADDR4, DM9K_MAC_ADDR5);
  77. //解析出通过DHCP获取到的IP地址
  78. dm9kdev.ip[3] = (uint8_t)(netif->ip_addr.addr >> 24);
  79. dm9kdev.ip[2] = (uint8_t)(netif->ip_addr.addr >> 16);
  80. dm9kdev.ip[1] = (uint8_t)(netif->ip_addr.addr >> 8);
  81. dm9kdev.ip[0] = (uint8_t)(netif->ip_addr.addr);
  82. printf("dm9k DHCP获取到IP地址.........%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
  83. //解析通过DHCP获取到的子网掩码地址
  84. dm9kdev.netmask[3] = (uint8_t)(netif->netmask.addr >> 24);
  85. dm9kdev.netmask[2] = (uint8_t)(netif->netmask.addr >> 16);
  86. dm9kdev.netmask[1] = (uint8_t)(netif->netmask.addr >> 8);
  87. dm9kdev.netmask[0] = (uint8_t)(netif->netmask.addr);
  88. printf("dm9k DHCP获取到子网掩码.......%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
  89. //解析出通过DHCP获取到的默认网关
  90. dm9kdev.gateway[3] = (uint8_t)(netif->gw.addr >> 24);
  91. dm9kdev.gateway[2] = (uint8_t)(netif->gw.addr >> 16);
  92. dm9kdev.gateway[1] = (uint8_t)(netif->gw.addr >> 8);
  93. dm9kdev.gateway[0] = (uint8_t)(netif->gw.addr);
  94. printf("dm9k DHCP获取到的网关..........%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
  95. }
  96. else
  97. {
  98. dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
  99. if (dhcp->tries > LWIP_MAX_DHCP_TRIES) //通过DHCP服务获取IP地址失败,且超过最大尝试次数
  100. {
  101. dm9kdev.dhcpstatus = DHCP_TIMEOUT;
  102. //使用静态IP地址
  103. netif_set_down(netif); //先禁用网卡
  104. lwip_dm9k_default_ip_set(&dm9kdev); //设置默认IP等信息
  105. IP4_ADDR(&ipaddr, dm9kdev.ip[0], dm9kdev.ip[1], dm9kdev.ip[2], dm9kdev.ip[3]);
  106. IP4_ADDR(&netmask, dm9kdev.netmask[0], dm9kdev.netmask[1], dm9kdev.netmask[2], dm9kdev.netmask[3]);
  107. IP4_ADDR(&gw, dm9kdev.gateway[0], dm9kdev.gateway[1], dm9kdev.gateway[2], dm9kdev.gateway[3]);
  108. // netif_set_addr(netif, &ipaddr, &netmask, &gw);
  109. netif_set_gw(netif, &gw); //重新设置网关地址
  110. netif_set_netmask(netif, &netmask); //重新设置子网掩码
  111. netif_set_ipaddr(netif, &ipaddr); //重新设置IP地址
  112. printf("dm9k DHCP服务超时,使用静态IP地址!\r\n");
  113. printf("dm9k 网卡en的MAC地址为:........%d.%d.%d.%d.%d.%d\r\n", dm9kdev.mac[0], dm9kdev.mac[1], dm9kdev.mac[2], dm9kdev.mac[3], dm9kdev.mac[4], dm9kdev.mac[5]);
  114. printf("dm9k 静态IP地址................%d.%d.%d.%d\r\n", dm9kdev.ip[0], dm9kdev.ip[1], dm9kdev.ip[2], dm9kdev.ip[3]);
  115. printf("dm9k 子网掩码..................%d.%d.%d.%d\r\n", dm9kdev.netmask[0], dm9kdev.netmask[1], dm9kdev.netmask[2], dm9kdev.netmask[3]);
  116. printf("dm9k 默认网关..................%d.%d.%d.%d\r\n", dm9kdev.gateway[0], dm9kdev.gateway[1], dm9kdev.gateway[2], dm9kdev.gateway[3]);
  117. netif_set_up(netif); //启用网卡
  118. }
  119. }
  120. OSTimeDly(500);
  121. }
  122. }
  123. }
  124. }
  125. #endif
  126. /**
  127. * @brief This function notify user about link status changement.
  128. * @param netif: the network interface
  129. * @retval None
  130. */
  131. static void ethernet_link_status_updated(struct netif *netif)
  132. {
  133. #ifdef USE_DHCP
  134. if (DHCPSemaphore == NULL)
  135. {
  136. osSemaphoreDef(ETH_SEM);
  137. DHCPSemaphore = osSemaphoreCreate(osSemaphore(ETH_SEM), 1);
  138. }
  139. #else
  140. ip4_addr_t ipaddr;
  141. ip4_addr_t netmask;
  142. ip4_addr_t gw;
  143. #endif
  144. if (netif_is_link_up(netif))
  145. {
  146. #ifdef USE_DHCP
  147. /* Update DHCP state machine */
  148. dm9kdev.dhcpstatus = DHCP_START;
  149. osSemaphoreRelease(DHCPSemaphore);
  150. #else
  151. IP4_ADDR(&ipaddr, DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
  152. IP4_ADDR(&netmask, DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
  153. IP4_ADDR(&gw, DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
  154. printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n", DM9K_MAC_ADDR0, DM9K_MAC_ADDR1, DM9K_MAC_ADDR2, DM9K_MAC_ADDR3, DM9K_MAC_ADDR4, DM9K_MAC_ADDR5);
  155. printf("静态IP地址........................%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
  156. printf("子网掩码..........................%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
  157. printf("默认网关..........................%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
  158. netif_set_addr(netif, &ipaddr, &netmask, &gw);
  159. #endif
  160. }
  161. else
  162. {
  163. #ifdef USE_DHCP
  164. /* Update DHCP state machine */
  165. osSemaphoreRelease(DHCPSemaphore);
  166. #endif /* USE_DHCP */
  167. // dm9kdev.dhcpstatus = DHCP_LINK_DOWN;
  168. }
  169. }