参数配置
以太网配置
内核配置主要是通过 scons --menuconfig 命令进行 以太网的功能配置, 配置完成后的项目存储在 “target/configs/xxx_defconfig” 文件中
MAC参数配置
内核中要使用以太网功能,首先需要配置 MAC 的属性参数。MAC 的参数随着板卡的不同而不同 以下是展开后 MAC 的所有的配置选项及其介绍
为防止配置错误,实际的 MAC 配置有一套依赖规则,不会同时出现以下全部的配置选项
Board options --->
[*] Using Gmac0
gmac0 parameter --->
(PE.6) gmac0 PHY reset GPIO
Select gmac0 bus (RMII) --->
Select PHY clk (external clk) --->
(0) gmac0 rx delay
(0) gmac0 tx delay
(192.168.1.2) gmac0 IPv4 addr
(192.168.1.1) gmac0 Gateway
(255.255.255.0) gmac0 Subnet Mask
[*] gmac0 MAC address use chip-id
(002244887766) gmac0 MAC addr
(1) gmac0 PHY MDIO addr
Clocks Options --->
...
[ ] Enable CLK_OUT0
[ ] Enable CLK_OUT1
[*] Enable CLK_OUT2
(25000000) Clk CLK_OUT2 frequence
[ ] Enable CLK_OUT3
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- gmac0 PHY reset GPIO
外部 PHY 芯片的复位脚相连接的IO引脚,根据板卡设计决定
- Select gmac0 bus
选择 MAC 与 PHY 相连接的接口类型,根据板卡决定是 RGMII 还是 RMII
- Select PHY clk
选择MAC使用的总线参考时钟类型是 external clk (外部时钟)还是 internal clk (内部时钟)。这个配置需要根据电路设计决定。如果MAC的时钟参考时钟是来自 PHY 芯片 (即 GMAC_CLKIN 引脚接到 PHY 芯片)则这里选择 external clk,否则选择 internal clk
- gmac0 rx delay
gmac0 的接收时延,适用于 RGMII 接口模式下, MAC 匹配 PHY 芯片的数据建立时间和保留时 间(单位:0.17 ns), 需要根据外部使用的PHY芯片调整。一般情况下,设置为 12 ,即 2.04 ns
- gmac0 tx delay
gmac0的发送时延,适用于 RGMII 接口模式下,MAC 匹配 PHY 芯片的数据建立时间和保留时间 (单位:0.17 ns),需要根据外部使用的PHY芯片调整。一般情况下,可设置为12,即2.04 ns
- gmac0 IPv4 addr
当前网卡的初始静态IP地址,如打开DHCP功能,此处设置无效
- gmac0 Gateway
当前网卡的初始静态网关地址,如打开DHCP功能,此处设置无效
- gmac0 Subnet Mask
当前网卡初始静态子网掩码,如打开DHCP功能,此处设置无效
- gmac0 MAC address use chip-id
使用芯片的chip-id作为 MAC 地址,使能此选项后会使用chip-id的低六位经过加密后作为 MAC 地址。这样的好处是同一系列产品的 MAC 地址基本不会重复。
- gmac0 MAC addr
gmac0默认MAC地址,当不使能 gmac0 MAC address use chip-id 时,即用户需要自定义 MAC 地址时可以在这里配置用户自己的MAC地址。
- gmac0 PHY MDIO addr
PHY 在 总线上的挂载地址,PHY芯片地址一般取决于PHY芯片外部电路设计,请根据板卡设计决定
- Clocks Options
如果 PHY 的工作时钟由主控芯片的 CLK_OUTx 提供,则需要在这里使能 CLK_OUT。 具体使能哪一个CLK_OUT,取决于硬件设计
- Clk CLK_OUT2 frequence CLK_OUTx的输出时钟频率,对于常用的 PHY 芯片,一般是 25 MHz
LwIP协议配置
Luban-Lite内置LwIP2.1.3协议栈,用户可以根据自身需求通过 scons --menuconfig 进行裁剪。 Luban-Lite提供的可裁剪属性如下,如有其他特别需求,可自行配置 “packages/third-party/lwip/lwipopts.h” 配置文件
Local packages options --->
Third-party packages options --->
[*] lwIP: light weight TCP/IP stack --->
[ ] IPv6 protocol
[*] lwIP Example
[*] Using net tools
[ ] IGMP protocol
[*] ICMP protocol
[ ] SNMP protocol
[ ] Enable DNS for name resolution
[ ] Enable alloc IP address through DHCP
[*] UDP protocol
[*] TCP protocol
[*] RAW protocol
[ ] PPP protocol
(8) the number of struct netconns
(16) the number of PBUF
(15360) the size of lwIP's dynamic memory
(4) the number of raw connection
(4) the number of UDP socket
(4) the number of TCP socket
(40) the number of TCP segment
(8196) the size of send buffer
(8196) the size of TCP send window
(10) the priority level value of lwIP thread
(8) the number of mail in the lwIP thread mailbox
(3072) the stack size of lwIP thread
[ ] Enable IP reassembly and frag
[ ] Enable lwIP statistics
[ ] Enable tx hardware generate checksum
[ ] Enable rx hardware check checksum
[ ] Enable ping features ----
[ ] Using socket interface during ping requests
( ) the priority level value of ping thread
[ ] Using MQTT protocol
[ ] USing DHCP server
(192.168.1.1) DHCP server IP addresss
(2) Start address of DHCP allocation(Last byte)
(254) End address of DHCP allocation(Last byte)
[ ] Enable lwIP Debugging Options ----
IPv6 protocol
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
- LwIP支持IPV6协议 LwIP支持IPV6协议
- lwIP Example
SDK 提供的初始化以太网示例,示例程序源码在“packages/third-party/lwip/contrib/examples/example_app/” 目录下的 test.c netif_start.c netif_start.h。打开此选项后,SDK会在启动过程中自动 初始化以太网。用户可根据自身需求定义以太网初始化流程。如果不开启此选项,则需要用户自己编写以太网 的初始化程序
- Using net tools
使用网络调试命令,ifconfig, dhcpc …
IGMP protocol
以太网支持IGMP协议,使用组播功能时打开
ICMP protocol
以太网支持ICMP协议,使用ping命令时打开
SNMP protocol
以太网支持SNMP协议,需要时打开
- Enable DNS for name resolution
支持DNS客户端功能,需要时打开
- Enable alloc IP address through DHCP
支持DHCP客户端功能,需要时打开。如果打开DHCP选项,默认IP地址会失效,如果IP申请失败,则此时IP地址为0.0.0.0
- UDP protocol
支持UDP协议,默认打开
- TCP protocol
支持TCP协议,默认打开
- RAW protocol
支持原始套接字接口,如需要编写基于RAW套接字的程序时,需要打开
- PPP protocol
支持PPP协议,需要时打开
- the number of struct netconns
struct netconns接口的数量,默认为8个,可根据需求自行修改
the number of PBUF pbuf 结构的数量,如果需要发送较多的ROM类型消息,可自行修改
the size of lwIP’s dynamic memory
LwIP堆空间大小,与数据发送有关,不建议修改
- the number of raw connection
RAW 控制块数量,根据需求修改
- the number of UDP socket
UDP 控制块数量,根据需求修改
- the number of TCP socket
TCP 控制块数量,根据需求修改
- the number of TCP segment
TCP等待队列的个数,这个值应该不小于TCP的发送队列的个数
- the size of send buffer
TCP发送缓存大小,如无特别需求,请保持默认值
- the size of TCP send window
TCP滑动窗口大小,如无特别需求,请保持默认值
- the priority level value of lwIP thread
LwIP协议栈任务优先级,为防止网络丢包,建议保持较高优先级
- the number of mail in the lwIP thread mailbox
消息邮箱数量,如无特别需求,不建议修改此数量
- the stack size of lwIP thread
LwIP协议栈任务的栈空间大小,如没有添加基于RAW接口的应用程序,不建议修改任务栈。 否则,应该加大协议栈任务的栈空间
- Enable IP reassembly and frag
使能IP包的分片重装功能
- Enable lwIP statistics
使能LwIP统计信息
- Enable tx hardware generate checksum
使能发送时自动生成硬件校验和
- Enable rx hardware check checksum
使能接收时硬件检查校验和
- Enable ping features —-
ping命令支持,使能此选项后,可在终端中使用ping命令
- Using MQTT protocol
支持MQTT协议
- USing DHCP server
使用dhcp server服务。使能此选项后可以使用 dhcpd 命令开启dhcp服务端
- DHCP server IP addresss
做dhcp服务端时的IP地址
- Start address of DHCP allocation(Last byte)
dhcp服务端分配给客户端的起始ip地址的低八位
- End address of DHCP allocation(Last byte)
dhcp服务端分配给客户端的结束ip地址的低八位
- Enable lwIP Debugging Options —-
LwIP调试信息选项,可根据自身需求进行打开
时钟
MAC 和 PHY 的协同工作共牵涉到四组时钟, Luban-Lite已将时钟部分处理完整,不需要用户除 scons --menuconfig 配置MAC使用 external clk 或 internal clk 之外的其 他任何修改
MAC 工作时钟
MAC 的内部工作时钟通过 PLL 分频获得,为 50M, 工作时钟不会因为方案的不同而不同,为一固定值 配置代码在 “packages/third-party/lwip/contrib/ports/drv/aic/aic_mac_ll.c” 中。
void aicmac_low_level_init(uint32_t port, bool en)
{
uint32_t id = CLK_GMAC0 + port;
/* MAC clock */
if (en) {
/* Set clock frequence = 50M */
hal_clk_set_freq(id, 50000000);
/* clock enable & reset deassert */
hal_clk_enable_deassertrst_iter(id);
} else {
/* clock enable & reset deassert */
hal_clk_disable_assertrst(id);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MDC 时钟
MDC 时钟是 MDIO 的工作时钟,是 MAC 和 PHY 进行配置的工作时钟,双方在使用初期会有一个协 商,一般是 MAC 通知 PHY,该时钟为 MAC 通过模块的内部工作时钟处理生成,也不会因为方案的 不同而不同,为一固定值。MDIO时钟初始化在 “packages/third-party/lwip/contrib/ports/drv/aic/aicmac.c” 文件的aicmac_init函数中
int aicmac_init(uint32_t port)
{
...
/* MDCIO Internal Clock Select */
tmpreg = readl(MAC(port, mdioctl));
tmpreg &= ~(ETH_MDIOCTL_CR_MSK);
ahbclk = hal_clk_get_freq(CLK_AHB0);
if ((ahbclk >= 20000000) && (ahbclk < 35000000)) {
tmpreg |= ETH_MDIOCTL_CR_Div16;
} else if ((ahbclk >= 35000000) && (ahbclk < 60000000)) {
tmpreg |= ETH_MDIOCTL_CR_Div26;
} else if ((ahbclk >= 60000000) && (ahbclk < 100000000)) {
tmpreg |= ETH_MDIOCTL_CR_Div42;
} else if ((ahbclk >= 100000000) && (ahbclk < 150000000)) {
tmpreg |= ETH_MDIOCTL_CR_Div62;
} else if ((ahbclk >= 150000000) && (ahbclk < 250000000)) {
tmpreg |= ETH_MDIOCTL_CR_Div102;
} else /* ((ahbclk >= 250000000)&&(ahbclk <= 300000000)) */
{
tmpreg |= ETH_MDIOCTL_CR_Div124;
}
writel(tmpreg, MAC(port, mdioctl));
...
...
}
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
MDC 时钟配置错误,则 MAC 和 PHY 的通信不通,呈现的现象是 MAC 无法发现 PHY 设备
PHY 工作时钟
一般 PHY 的工作时钟是 25M, 一般的设计是外挂一个晶振提供时钟给 PHY 模组, AIC不同型号芯片都对外提供几组时钟(CLK_OUT),也可以使用该时钟供给 PHY 模块工作。
该时钟 (CLK_OUT) 使能在 “target/soc name/board name/sys_clk.c” 中配置。如果需要可以打开
struct aic*sysclk aic_sysclk_config[] = {
...
#ifdef AIC_USING_CLK_OUT0
{AIC_CLK_OUT0_FREQ, CLK_OUT0, 0},
#endif /* AIC*USING_CLK_OUT0 */
#ifdef AIC*USING_CLK_OUT1
{AIC_CLK_OUT1_FREQ, CLK_OUT1, 0},
#endif /* AIC*USING_CLK_OUT1 */
#ifdef AIC*USING_CLK_OUT2
{AIC_CLK_OUT2_FREQ, CLK_OUT2, 0},
#endif /* AIC*USING_CLK_OUT2 */
#ifdef AIC*USING_CLK_OUT3
{AIC_CLK_OUT3_FREQ, CLK_OUT3, 0},
#endif /* AIC*USING_CLK_OUT3 */
...
};
void aic_board_sysclk_init(void)
{
uint32_t i = 0;
for (i=0; i<sizeof(aic_sysclk_config)/sizeof(struct aic_sysclk); i++) {
hal_clk_set_freq(aic_sysclk_config[i].clk_id, aic_sysclk_config[i].freq);
}
/* Enable sys clk */
hal_clk_enable_deassertrst_iter(CLK_GPIO);
hal_clk_enable_deassertrst_iter(CLK_GTC);
}
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
MDATA 时钟
MDATA 时钟 为 MAC 和 PHY 进行数据传输的时钟,对于百兆和千兆有不同的使用方式
百兆网络:可以是 MAC 供给 PHY, 也可以是 PHY 供给 MAC
千兆网络:只能是 MAC 供给 PHY,RGMII0-TXCK 端口
代码中会根据 scons --menuconfig 中的配置来决定MAC使用的时钟来源是内部时钟还是外部时钟
static s32 syscfg_gmac_init(u32 ch)
{
#ifdef AIC_SYSCFG_DRV_V10
u32 cfg_reg = ch ? SYSCFG_GMAC1_CFG : SYSCFG_GMAC0_CFG;
#else
u32 cfg_reg = SYSCFG_GMAC0_CFG;
#endif
s32 cfg;
cfg = syscfg_readl(cfg_reg);
if (ch == 0) {
#ifdef AIC_SYSCFG_DRV_V10
#ifdef AIC_DEV_GMAC0_RGMII
cfg |= SYSCFG_GMAC_PHY_RGMII_1000M;
#else
cfg &= ~SYSCFG_GMAC_PHY_RGMII_1000M;
#endif
#endif
#ifdef AIC_DEV_GMAC0_PHY_EXTCLK
cfg |= SYSCFG_GMAC_RMII_EXTCLK_SEL;
#endif
#if AIC_DEV_GMAC0_TXDELAY
cfg |= (AIC_DEV_GMAC0_TXDELAY << SYSCFG_GMAC_TXDLY_SEL_SHIFT);
#endif
#if AIC_DEV_GMAC0_RXDELAY
cfg |= (AIC_DEV_GMAC0_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
#endif
} else if (ch == 1) {
#ifdef AIC_SYSCFG_DRV_V10
#ifdef AIC_DEV_GMAC1_RGMII
cfg |= SYSCFG_GMAC_PHY_RGMII_1000M;
#else
cfg &= ~SYSCFG_GMAC_PHY_RGMII_1000M;
#endif
#endif
#ifdef AIC_DEV_GMAC1_PHY_EXTCLK
cfg |= SYSCFG_GMAC_RMII_EXTCLK_SEL;
#endif
#if AIC_DEV_GMAC1_TXDELAY
cfg |= (AIC_DEV_GMAC1_TXDELAY << SYSCFG_GMAC_TXDLY_SEL_SHIFT);
#endif
#if AIC_DEV_GMAC1_RXDELAY
cfg |= (AIC_DEV_GMAC1_RXDELAY << SYSCFG_GMAC_RXDLY_SEL_SHIFT);
#endif
}
syscfg_writel(cfg, cfg_reg);
return 0;
}
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
pinmux配置
在 target/soc name/board name/pinmux.c 中设置 MAC 端口的 pinmux, 需要根据开发板板的不同进行不同的设置
#ifdef AIC*USING_GMAC0
/* gmac0 _/
{6, PIN_PULL_DIS, 3, "PE.0"},
{6, PIN_PULL_DIS, 3, "PE.1"},
{6, PIN_PULL_DIS, 3, "PE.2"},
{6, PIN_PULL_DIS, 3, "PE.3"},
{6, PIN_PULL_DIS, 3, "PE.4"},
{6, PIN_PULL_DIS, 3, "PE.5"},
{6, PIN_PULL_DIS, 3, "PE.7"},
{6, PIN_PULL_DIS, 3, "PE.8"},
{6, PIN_PULL_DIS, 3, "PE.9"},
/_ phy0 reset GPIO \_/
{1, PIN_PULL_DIS, 3, "PE.6"},
#endif
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如果PHY工作时钟是由主控芯片的 CLK_OUT 提供,则还需要配置 CLK_OUT 引脚的pinmux
#ifdef AIC_USING_CLK_OUT0
{6, PIN_PULL_DIS, 3, "PD.21"},
#endif
#ifdef AIC_USING_CLK_OUT1
{5, PIN_PULL_DIS, 3, "PE.11"},
#endif
#ifdef AIC_USING_CLK_OUT2
{6, PIN_PULL_DIS, 3, "PE.10"},
#endif
#ifdef AIC_USING_CLK_OUT3
{6, PIN_PULL_DIS, 3, "PF.10"},
#endif
2
3
4
5
6
7
8
9
10
11
12
13