123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #include "lwip_dm9k.h"
- #include "ethernetif_dm9k.h"
- #include "lwip/tcpip.h"
- //*******************************************************************************
- struct netif dm9k_netif; // 定义一个网络接口
- /*函数声明*/
- #ifdef USE_DHCP
- static void lwip_dhcp_task(void const *pdata);
- #endif
- static void ethernet_link_status_updated(struct netif *netif);
- // LWIP初始化(LWIP启动的时候使用)
- void lwip_dm9k_init(void)
- {
- ip4_addr_t ipaddr;
- ip4_addr_t netmask;
- ip4_addr_t gw;
- #ifdef USE_DHCP //使用动态IP
- ip_addr_set_zero_ip4(&ipaddr);
- ip_addr_set_zero_ip4(&netmask);
- ip_addr_set_zero_ip4(&gw);
- #else //使用静态IP
- IP4_ADDR(&ipaddr, DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
- IP4_ADDR(&netmask, DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
- IP4_ADDR(&gw, DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
- printf("\r\n");
- 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);
- printf("静态IP地址........................%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
- printf("子网掩码..........................%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
- printf("默认网关..........................%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
- #endif
- netif_add(&dm9k_netif, &ipaddr, &netmask, &gw, NULL, ðernetif_dm9k_init, &tcpip_input); //向网卡列表中添加一个网口
- netif_set_default(&dm9k_netif); //设置netif为默认网口
- ethernet_link_status_updated(&dm9k_netif);
- #if LWIP_NETIF_LINK_CALLBACK
- netif_set_link_callback(&dm9k_netif, ethernet_link_status_updated);
- #endif
- //操作OK.
- }
- //如果使能了DHCP
- #ifdef USE_DHCP
- // DHCP处理任务
- static osSemaphoreId DHCPSemaphore = NULL; /* Semaphore to signal incoming packets */
- static void lwip_dhcp_task(void const *argument)
- {
- struct netif *netif = (struct netif *)argument;
- struct dhcp *dhcp;
- ip_addr_t ipaddr;
- ip_addr_t netmask;
- ip_addr_t gw;
- for (;;)
- {
- if (osSemaphoreWait(DHCPSemaphore, osWaitForever) == osOK)
- {
- if (dm9kdev.dhcpstatus == DHCP_START)
- {
- ip_addr_set_zero_ip4(&netif->ip_addr);
- ip_addr_set_zero_ip4(&netif->netmask);
- ip_addr_set_zero_ip4(&netif->gw);
- dm9kdev.dhcpstatus = DHCP_WAIT_ADDRESS;
- dhcp_start(netif); //开启DHCP
- printf("dm9k 开启DHCP服务,请稍等...........\r\n");
- }
- else if (dm9kdev.dhcpstatus == DHCP_LINK_DOWN)
- {
- dm9kdev.dhcpstatus = DHCP_OFF;
- // dhcp_stop(netif);
- // dhcp_try_stop(netif);
- printf("dm9k 链接断开\r\n");
- }
- while (dm9kdev.dhcpstatus == DHCP_WAIT_ADDRESS)
- {
- printf("dm9k 正在获取地址...\r\n");
- if (dhcp_supplied_address(netif)) //当正确读取到IP地址的时候
- {
- dm9kdev.dhcpstatus = DHCP_ADDRESS_ASSIGNED;
- 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);
- //解析出通过DHCP获取到的IP地址
- dm9kdev.ip[3] = (uint8_t)(netif->ip_addr.addr >> 24);
- dm9kdev.ip[2] = (uint8_t)(netif->ip_addr.addr >> 16);
- dm9kdev.ip[1] = (uint8_t)(netif->ip_addr.addr >> 8);
- dm9kdev.ip[0] = (uint8_t)(netif->ip_addr.addr);
- printf("dm9k DHCP获取到IP地址.........%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
- //解析通过DHCP获取到的子网掩码地址
- dm9kdev.netmask[3] = (uint8_t)(netif->netmask.addr >> 24);
- dm9kdev.netmask[2] = (uint8_t)(netif->netmask.addr >> 16);
- dm9kdev.netmask[1] = (uint8_t)(netif->netmask.addr >> 8);
- dm9kdev.netmask[0] = (uint8_t)(netif->netmask.addr);
- printf("dm9k DHCP获取到子网掩码.......%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
- //解析出通过DHCP获取到的默认网关
- dm9kdev.gateway[3] = (uint8_t)(netif->gw.addr >> 24);
- dm9kdev.gateway[2] = (uint8_t)(netif->gw.addr >> 16);
- dm9kdev.gateway[1] = (uint8_t)(netif->gw.addr >> 8);
- dm9kdev.gateway[0] = (uint8_t)(netif->gw.addr);
- printf("dm9k DHCP获取到的网关..........%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
- }
- else
- {
- dhcp = (struct dhcp *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP);
- if (dhcp->tries > LWIP_MAX_DHCP_TRIES) //通过DHCP服务获取IP地址失败,且超过最大尝试次数
- {
- dm9kdev.dhcpstatus = DHCP_TIMEOUT;
- //使用静态IP地址
- netif_set_down(netif); //先禁用网卡
- lwip_dm9k_default_ip_set(&dm9kdev); //设置默认IP等信息
- IP4_ADDR(&ipaddr, dm9kdev.ip[0], dm9kdev.ip[1], dm9kdev.ip[2], dm9kdev.ip[3]);
- IP4_ADDR(&netmask, dm9kdev.netmask[0], dm9kdev.netmask[1], dm9kdev.netmask[2], dm9kdev.netmask[3]);
- IP4_ADDR(&gw, dm9kdev.gateway[0], dm9kdev.gateway[1], dm9kdev.gateway[2], dm9kdev.gateway[3]);
- // netif_set_addr(netif, &ipaddr, &netmask, &gw);
- netif_set_gw(netif, &gw); //重新设置网关地址
- netif_set_netmask(netif, &netmask); //重新设置子网掩码
- netif_set_ipaddr(netif, &ipaddr); //重新设置IP地址
- printf("dm9k DHCP服务超时,使用静态IP地址!\r\n");
- 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]);
- printf("dm9k 静态IP地址................%d.%d.%d.%d\r\n", dm9kdev.ip[0], dm9kdev.ip[1], dm9kdev.ip[2], dm9kdev.ip[3]);
- printf("dm9k 子网掩码..................%d.%d.%d.%d\r\n", dm9kdev.netmask[0], dm9kdev.netmask[1], dm9kdev.netmask[2], dm9kdev.netmask[3]);
- printf("dm9k 默认网关..................%d.%d.%d.%d\r\n", dm9kdev.gateway[0], dm9kdev.gateway[1], dm9kdev.gateway[2], dm9kdev.gateway[3]);
- netif_set_up(netif); //启用网卡
- }
- }
- OSTimeDly(500);
- }
- }
- }
- }
- #endif
- /**
- * @brief This function notify user about link status changement.
- * @param netif: the network interface
- * @retval None
- */
- static void ethernet_link_status_updated(struct netif *netif)
- {
- #ifdef USE_DHCP
- if (DHCPSemaphore == NULL)
- {
- osSemaphoreDef(ETH_SEM);
- DHCPSemaphore = osSemaphoreCreate(osSemaphore(ETH_SEM), 1);
- }
- #else
- ip4_addr_t ipaddr;
- ip4_addr_t netmask;
- ip4_addr_t gw;
- #endif
- if (netif_is_link_up(netif))
- {
- #ifdef USE_DHCP
- /* Update DHCP state machine */
- dm9kdev.dhcpstatus = DHCP_START;
- osSemaphoreRelease(DHCPSemaphore);
- #else
- IP4_ADDR(&ipaddr, DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
- IP4_ADDR(&netmask, DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
- IP4_ADDR(&gw, DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
- 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);
- printf("静态IP地址........................%d.%d.%d.%d\r\n", DM9K_IP_ADDR0, DM9K_IP_ADDR1, DM9K_IP_ADDR2, DM9K_IP_ADDR3);
- printf("子网掩码..........................%d.%d.%d.%d\r\n", DM9K_NETMASK_ADDR0, DM9K_NETMASK_ADDR1, DM9K_NETMASK_ADDR2, DM9K_NETMASK_ADDR3);
- printf("默认网关..........................%d.%d.%d.%d\r\n", DM9K_GW_ADDR0, DM9K_GW_ADDR1, DM9K_GW_ADDR2, DM9K_GW_ADDR3);
- netif_set_addr(netif, &ipaddr, &netmask, &gw);
- #endif
- }
- else
- {
- #ifdef USE_DHCP
- /* Update DHCP state machine */
- osSemaphoreRelease(DHCPSemaphore);
- #endif /* USE_DHCP */
- // dm9kdev.dhcpstatus = DHCP_LINK_DOWN;
- }
- }
|