⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lwiplib.c

📁 lm3s下lwip的udp
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -