📄 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 + -