#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; } }