?? lwiplib.c
字號:
netif_set_default(&lwip_netif);
g_ulIPMode = ulIPMode; /* 指示正在運行者靜態IP模式*/
#if LWIP_DHCP /* 如果使能了DHCP, 則運行它*/
if(g_ulIPMode == IPADDR_USE_DHCP)
{
dhcp_start(&lwip_netif);
}
#endif
#if LWIP_AUTOIP /* 如果使能了AutoIP而禁能了DHCP,則運行AutoIP*/
if(g_ulIPMode == IPADDR_USE_AUTOIP)
{
autoip_start(&lwip_netif);
}
#endif
netif_set_up(&lwip_netif); /* 添加使能建立的網絡接口 */
}
/*********************************************************************************************************
** Function name: lwIPTimer
** Descriptions: TCP/IP協議棧——LwIP對周期性定時事件的處理 。本函數將通過參數ulTimeMS更新本地定時器。如果系統配置為
** 沒有使用操作系統,這里將產生一個以太網軟中斷,以允許在以太網中斷服務程序里處理LwIP的周期性定時事件
** Input parameters: ulTimeMS:周期性中斷的時間增量
** Output parameters: None 無
** Returned value: None 無
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void lwIPTimer(unsigned long ulTimeMS)
{
g_ulLocalTimer += ulTimeMS; /* 更新本地定時器 */
#if NO_SYS
/*********************************************************************************************************
**如果系統沒有使用RTOS,則編譯產生一個以太網中斷。這將會去執行檢查并處理周期性的定時事件。這是必須的,否則以太網將不會工作,
**這還允許將所有的lwip調用都放在以太網中斷服務程序里面,以確保所有的lwip調用都來自一個相同的上下文,以避免任何可重入性的事件。
**將所有的lwip調用都放在以太網的中斷服務程序里面,可以避免使用信號量來保護臨界區
*********************************************************************************************************/
HWREG(NVIC_SW_TRIG) |= INT_ETH - 16;
#else
/*********************************************************************************************************
**如果系統運行在一個RTOS下,那么就應該發送一個信號量或者時間控制塊來喚醒主處理進程。是否采用這種方法必須明確地確定。如果
**該模塊在一個基于RTOS的系統下編譯,那么將會出現一個錯誤。
*********************************************************************************************************/
#error "lwIPTimer does not yet support an RTOS!"
#endif
}
/*********************************************************************************************************
** Function name: lwIPEthernetIntHandler
** Descriptions: TCP/IP協議棧——LwIP的以太網中斷服務程序。該函數必須設置為一個最低的優先級,所有接收的數據包都被放入
** 到數據包隊列中等待一個高平臺的任務處理。同時,它還將檢查發送數據包隊列,并根據需要通過以太網MAC發送
** 數據。如果系統被配置為沒有使用RTOS,那么額外的處理將會在中斷中。數據包隊列是被TCP/IP源碼處理的,并
** 且需要周期性的定時服務事件來處理。
** Input parameters: ulTimeMS:周期性中斷的時間增量
** Output parameters: None 無
** Returned value: None 無
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void lwIPEthernetIntHandler(void)
{
unsigned long ulStatus;
ulStatus = EthernetIntStatus(ETH_BASE, false); /* 讀取并清除中斷狀態 */
EthernetIntClear(ETH_BASE, ulStatus);
if(ulStatus) /* 如果發送的是一個TX/RX中斷,那么調用底層的中斷處理函數*/
{
stellarisif_interrupt(&lwip_netif);
}
#if NO_SYS
/*********************************************************************************************************
**如果系統沒有使用一個RTOS,那么我們將所有的lwip處理都放在中斷服務程序里面。在接收隊列上服務任何的數據包
*********************************************************************************************************/
stellarisif_input(&lwip_netif);
lwIPServiceTimers(); /* LWIP的定時器事件服務*/
#endif
}
/*********************************************************************************************************
** Function name: lwIPLocalIPAddrGet
** Descriptions: 讀取并返回當前以太網接口的IP地址
** Input parameters: None 無
** Output parameters: None 無
** Returned value: 該以太網接口的IP地址
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned long lwIPLocalIPAddrGet(void)
{
return((unsigned long)lwip_netif.ip_addr.addr);
}
/*********************************************************************************************************
** Function name: lwIPLocalNetMaskGet
** Descriptions: 讀取并返回當前以太網接口的子網掩碼
** Input parameters: None 無
** Output parameters: None 無
** Returned value: 該以太網接口的子網掩碼
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned long lwIPLocalNetMaskGet(void)
{
return((unsigned long)lwip_netif.netmask.addr);
}
/*********************************************************************************************************
** Function name: lwIPLocalGWAddrGet
** Descriptions: 讀取并返回當前以太網接口的網關地址
** Input parameters: None 無
** Output parameters: None 無
** Returned value: 該以太網接口的網關地址
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned long lwIPLocalGWAddrGet(void)
{
return((unsigned long)lwip_netif.gw.addr);
}
/*********************************************************************************************************
** Function name: lwIPLocalMACGet
** Descriptions: 讀取并返回當前以太網接口的硬件MAC地址
** Input parameters: None 無
** Output parameters: pucMAC:該以太網接口的硬件MAC地址
** Returned value: None 無
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void lwIPLocalMACGet(unsigned char *pucMAC)
{
EthernetMACAddrGet(ETH_BASE, pucMAC);
}
/*********************************************************************************************************
** Function name: lwIPNetworkConfigChange
** Descriptions: 改變LwIP網絡接口的配置。該函數將評估一個新的配置信息。如果允許的話,網絡接口將被重新配置,從此以后
** 網絡使用新的網絡配置。
** Input parameters: ulIPAddr:新配置的IP地址
** ulNetMask:新配置的子網掩碼
** ulGWAddr:新配置的網關地址
** ulIPMode:新配置IP地址的獲取方式
** Output parameters: None 無
** Returned value: None 無
** Created by: 任海波
** Created Date: 2008.8.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void lwIPNetworkConfigChange(struct ip_addr ip_addr, struct ip_addr net_mask,
struct ip_addr gw_addr, unsigned long ulIPMode)
{
struct ip_addr IPAddr;
struct ip_addr NetMask;
struct ip_addr GwAddr;
#if LWIP_DHCP && LWIP_AUTOIP /* 檢驗參數的設置 */
ASSERT((ulIPMode == IPADDR_USE_STATIC) ||
(ulIPMode == IPADDR_USE_DHCP) ||
(ulIPMode == IPADDR_USE_AUTOIP))
#elif LWIP_DHCP
ASSERT((ulIPMode == IPADDR_USE_STATIC) ||
(ulIPMode == IPADDR_USE_DHCP))
#elif LWIP_AUTOIP
ASSERT((ulIPMode == IPADDR_USE_STATIC) ||
(ulIPMode == IPADDR_USE_AUTOIP))
#else
ASSERT(ulIPMode == IPADDR_USE_STATIC)
#endif
if(ulIPMode == IPADDR_USE_STATIC) /* 設置網絡IP地址等*/
{
IPAddr = ip_addr;
NetMask = net_mask;
GwAddr = gw_addr;
}
#if LWIP_DHCP || LWIP_AUTOIP
else
{
ip_addr.addr = 0;
net_mask.addr = 0;
gw_addr.addr = 0;
}
#endif
switch(g_ulIPMode) /* 切換當前IP地址的獲取方式 */
{
case IPADDR_USE_STATIC: /* 使用靜態IP模式*/
{
netif_set_addr(&lwip_netif, &IPAddr, &NetMask, &GwAddr);
#if LWIP_DHCP
if(ulIPMode == IPADDR_USE_DHCP)
{
dhcp_start(&lwip_netif);
}
#endif
#if LWIP_AUTOIP
if(ulIPMode == IPADDR_USE_AUTOIP)
{
autoip_start(&lwip_netif);
}
#endif
g_ulIPMode = ulIPMode;
break;
}
#if LWIP_DHCP
case IPADDR_USE_DHCP:
{
if(ulIPMode == IPADDR_USE_STATIC)
{
dhcp_stop(&lwip_netif);
netif_set_addr(&lwip_netif, &IPAddr, &NetMask, &GwAddr);
}
#if LWIP_AUTOIP
else if(ulIPMode == IPADDR_USE_AUTOIP)
{
dhcp_stop(&lwip_netif);
netif_set_addr(&lwip_netif, &IPAddr, &NetMask, &GwAddr);
autoip_start(&lwip_netif);
}
#endif
break;
}
#endif
#if LWIP_AUTOIP
case IPADDR_USE_AUTOIP:
{
if(ulIPMode == IPADDR_USE_STATIC)
{
autoip_stop(&lwip_netif);
netif_set_addr(&lwip_netif, &IPAddr, &NetMask, &GwAddr);
}
#if LWIP_DHCP
else if(ulIPMode == IPADDR_USE_AUTOIP)
{
autoip_stop(&lwip_netif);
netif_set_addr(&lwip_netif, &IPAddr, &NetMask, &GwAddr);
dhcp_start(&lwip_netif);
}
#endif
break;
}
#endif
}
}
/**********************************************************************
**函數原型: void InitNic()
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 對芯片的工作寄存器進行設置,各個寄存器的用法可參考LM3S8962的數據手冊
************************************************************************/
void InitNic(void)
{
struct ip_addr xIpAddr, xNetMask, xGateway;
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); /* 復位并使能以太網控制器*/
SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); /* 使能以太網控制器的指示燈*/
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, GPIO_DIR_MODE_HW);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3,
GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
IntMasterEnable(); /* 使能總的中斷*/
IP4_ADDR(&xIpAddr,IPAddress[0],IPAddress[1],IPAddress[2],IPAddress[3]);
IP4_ADDR(&xNetMask,NetMaskAddr[0],NetMaskAddr[1],NetMaskAddr[2],NetMaskAddr[3]);
IP4_ADDR(&xGateway,GwWayAddr[0],GwWayAddr[1],GwWayAddr[2],GwWayAddr[3]);
lwIPInit(MACAddress,xIpAddr, xNetMask, xGateway,IPADDR_USE_STATIC); /* 初始化協議棧*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -