summaryrefslogtreecommitdiff
path: root/bsp/phytium/libraries/standalone/doc/reference/sdk/flwip_port.md
blob: c358fc95c50f00b882a51187e80cfb7876bf002e (plain)
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205

# Lwip Port

## 1. 概述

Lwip Port为开发者提供了一系列接口,驱动开发者在完成GMAC/XMAC 驱动之后,只需根据lwip要求的接口,将驱动内容填入,即可完成lwip port适配层功能。lwip port 会在初始化阶段,初始化协议栈,并且会根据用户传入的配置参数,并初始化netif参数。

## 2. 功能

1. 为开发者提供lwip功能与mac控制驱动耦合的相关接口
2. 统一后续mac控制器接入lwip 协议栈的方式
3. 简化mac 控制器适配lwip 的难度
4. 统一不同mac 控制器下应用程序
5. 提供上层用户配置mac 控制器的统一接口
6. 管理mac 控制器的状态(phy link status)
7. 管理lwip 中link up/down 状态
8. 提供多网卡检索功能
9. 提供巨帧模式使能
10.提供轮询模式接收数据包使能

相关源文件为:
```
lwip_port
    ├── lwip_port.c
    └── lwip_port.h
```


## 3. 配置方法

默认配置已经保存在config中,用户可根据实际需要自行扩展,该部分操作参考readme即可

## 4. 应用示例

### [lwip port](../../../baremetal/example/network/lwip_startup/)

## 5. API参考

### 5.1. 用户数据结构

- lwip_port.h

```c
typedef struct
{
	u32 magic_code;		/* LWIP_PORT_CONFIG_MAGIC_CODE */
	char name[2];		/* Used to name netif */
	u32 driver_type;	/* driver type */
	u32 mac_instance;	/* mac controler id */
	u32 mii_interface;  /* LWIP_PORT_INTERFACE_XXX */
    u32 autonegotiation; /* 1 is autonegotiation ,0 is manually set */
    u32 phy_speed;  /* LWIP_PORT_SPEED_XXX */
    u32 phy_duplex; /* 1 is LWIP_PORT_FULL_DUPLEX,0 is LWIP_PORT_HALF_DUPLE*/
} UserConfig; /*用户初始化配置数据 */

typedef struct
{
	void (*eth_input)(struct netif *netif);
	enum lwip_port_link_status (*eth_detect)(struct netif *netif);
	void (*eth_deinit)(struct netif *netif);
	void (*eth_start)(struct netif *netif);
	void (*eth_poll)(struct netif *netif);
} LwipPortOps; /*  lwip port 网卡注册函数*/

struct LwipPort {
	void *state; /* mac controler */
	LwipPortOps ops;
}; /*lwip port控制数据 */
```

### 5.2  错误码定义
无
### 5.3. 用户API接口

#### LwipPortAdd
- 作为 lwip 的netif_add 的一个封装,开发者可以通过此接口对不同mac 控制器进行初始化

```c
struct netif * LwipPortAdd(struct netif *netif,
ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw,
unsigned char *mac_ethernet_address,
UserConfig *user_config, u32 dhcp_en);
```

Note:

- begin_addr end_addr 指向为内存池指定的缓冲区的起止地址

Input:

- {struct netif } *netif, 需要初始化的网卡对象
- {ip_addr_t} *ipaddr, 分配给网卡的IP初始地址
- {ip_addr_t} *netmask, 分配给掩码的IP初始地址
- {ip_addr_t} *gw, 分配给网关的IP初始地址
- {unsigned char } *mac_ethernet_address, 分配给网卡的mac初始地址
- {UserConfig} *user_config, 网卡初始化所需要的用户配置数据
- {u32} dhcp_en, 网卡是否使用dhcp服务控制数据
Return:

- {struct netif *} 返回初始化成功的netif网卡对象,返回NULL表示初始化失败

#### LwipPortInput

-  lwip协议栈获取驱动数据包的接口,客户可以使用此接口在裸跑中运行lwip 协议栈

```c
void LwipPortInput(struct netif *netif)
```

Note:

- 需要初始化后才能调用,调用此函数后,lwip会获取网卡收到的数据包并进行处理

Input:

- {struct netif } *netif 已经实例化的网卡netif  

Return:

- 无

#### LwipPortStop

- 使用此接口可以达到两个目标:
1. 关闭当前mac 控制器工作状态
2. 将netif 移除lwip 协议栈


```c
void LwipPortStop(struct netif *netif);
```

Note:

- 需要初始化后才能调用,调用该函数后,网卡将停止功能,若想继续工作需要重新进行网卡初始化

Input:

- {struct netif } *netif 已经实例化的网卡netif  

Return:

- 无
#### LwipPortGetByName

- 通过netif名字找到netif对象

```c
struct netif* LwipPortGetByName(const char *name);
```

Note:

- 需要初始化后才能调用,调用该函数将在已经初始化的netif链表中寻找name字段相对应的netif,并返回该netif

Input:

- {const char} *name 网卡名字

Return:

- {struct netif*} 寻找到的netif对象,如果未找到返回NULL

#### LwipPortDhcpSet

- 网卡dhcp控制

```c
void LwipPortDhcpSet(struct netif *netif, boolean is_enabled);
```

Note:

- 需要初始化后才能调用,调用该函数可以打开或关闭网卡的dhcp服务

Input:

- {struct netif} *netif 网卡对象
- {boolean} is_enabled DHCP使能控制参数


Return:

- 无


#### LwipEthProcessLoop

- 网卡接收数据包底层处理

```c
void LwipEthProcessLoop(struct netif *netif);
```

Note:

- 在main函数中循环调用,轮询处理到来的网络数据包

Input:

- {struct netif} *netif 网卡对象

Return:

- 无