lwip_comm.c 3.34 KB
#include "lwip_comm.h" 
#include "netif/etharp.h"
#include "lwip/dhcp.h"
#include "ethernetif.h" 
#include "lwip/timers.h"
#include "lwip/tcp_impl.h"
#include "lwip/ip_frag.h"
#include "lwip/tcpip.h" 
#include "malloc.h"
#include "delay.h"
#include "usart.h"  
#include <stdio.h>
#include "ucos_ii.h" 
#include "tcp_client_demo.h"
#include "all_value.h"
#include "hardware.h"

__lwip_dev F_lwip;                        
struct netif lwip_netif;                

extern u32 memp_get_memorysize(void);
extern u8_t *memp_memory;                
extern u8_t *ram_heap;                    

u8 F_LocalIp[4];				//本地IP		
u8 F_SubnetMask[4];			//子网掩码		
u8 F_Gateway[4];				//默认网关		

u8 F_RemoteIp[4];				//远端IP		
u16 F_RemoteProt;		//端口号			

/////////////////////////////////////////////////////////////////////////////////
OS_STK * TCPIP_THREAD_TASK_STK;     

#define LWIP_DHCP_TASK_PRIO               7
#define LWIP_DHCP_STK_SIZE              200
OS_STK * LWIP_DHCP_TASK_STK;    
void lwip_dhcp_task(void *pdata); 


void lwip_pkt_handle(void)
{
    ethernetif_input(&lwip_netif);
}
u8 lwip_comm_mem_malloc(void)
{
    u32 mempsize;
    u32 ramheapsize; 
    mempsize=memp_get_memorysize();            
    memp_memory=mymalloc(SRAMIN,mempsize);    
    ramheapsize=LWIP_MEM_ALIGN_SIZE(MEM_SIZE)+2*LWIP_MEM_ALIGN_SIZE(4*3)+MEM_ALIGNMENT;
    ram_heap=mymalloc(SRAMIN,ramheapsize);    
    TCPIP_THREAD_TASK_STK=mymalloc(SRAMIN,TCPIP_THREAD_STACKSIZE*4);
    LWIP_DHCP_TASK_STK=mymalloc(SRAMIN,LWIP_DHCP_STK_SIZE*4);        
    if(!memp_memory||!ram_heap||!TCPIP_THREAD_TASK_STK||!LWIP_DHCP_TASK_STK)
    {
        lwip_comm_mem_free();
        return 1;
    }
    return 0;    
}
void lwip_comm_mem_free(void)
{     
    myfree(SRAMIN,memp_memory);
    myfree(SRAMIN,ram_heap);
    myfree(SRAMIN,TCPIP_THREAD_TASK_STK);
    myfree(SRAMIN,LWIP_DHCP_TASK_STK);
}
//u8 macmamcam[6];
void lwip_comm_default_ip_set(__lwip_dev *lwipx)
{
    u32 sn0;
    sn0=*(vu32*)(0x1FFF7A10);

    
    lwipx->mac[0]=2;
    lwipx->mac[1]=0;
    lwipx->mac[2]=0;
    lwipx->mac[3]=(sn0>>16)&0XFF;
    lwipx->mac[4]=(sn0>>8)&0XFFF;;
    lwipx->mac[5]=sn0&0XFF; 	
 
    lwipx->dhcpstatus=0;
} 


u8 lwip_comm_init(void)
{
	OS_CPU_SR cpu_sr;
	struct netif *Netif_Init_Flag;		//调用netif_add()函数时的返回值,用于判断网络初始化是否成功
	struct ip_addr ipaddr;  			//ip地址
	struct ip_addr netmask; 			//子网掩码
	struct ip_addr gw;      			//默认网关 
	
	if(ETH_Mem_Malloc())return 1;		//内存申请失败
	if(lwip_comm_mem_malloc())return 1;	//内存申请失败
	if(LAN8720_Init())return 2;			//初始化LAN8720失败 
	tcpip_init(NULL,NULL);				//初始化tcp ip内核
	lwip_comm_default_ip_set(&F_lwip);

	
	IP4_ADDR(&ipaddr,F_lwip.ip_Loca[0],F_lwip.ip_Loca[1],F_lwip.ip_Loca[2],F_lwip.ip_Loca[3]);
	IP4_ADDR(&netmask,F_lwip.netmask[0],F_lwip.netmask[1] ,F_lwip.netmask[2],F_lwip.netmask[3]);
	IP4_ADDR(&gw,F_lwip.gateway[0],F_lwip.gateway[1],F_lwip.gateway[2],F_lwip.gateway[3]);

	OS_ENTER_CRITICAL();  //进入临界区
	Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&tcpip_input);//向网卡列表中添加一个网口
	OS_EXIT_CRITICAL();  //退出临界区
	if(Netif_Init_Flag==NULL)return 3;//网卡添加失败 
	else//网口添加成功后,设置netif为默认值,并且打开netif网口
	{
		netif_set_default(&lwip_netif); //设置netif为默认网口
		netif_set_up(&lwip_netif);		//打开netif网口
	}
	return 0;//操作OK.
}