lwip_comm.c
3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#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,ðernetif_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.
}