EMAC - 以太网络
以太网是一种局域网通信技术,遵循IEEE802.3协议规范,包括10 Mbps、100 Mbps、1000 Mbps和10 Gbps等多种速率的以太网。以太网与TCP/IP协议族的物理层(L1)和数据链路层(L2)相关,其中数据链路层包括逻辑链路控制(LLC)和媒体访问控制(MAC)子层。以太网在TCP/IP协议族中的位置如下图所示:
Linux 内核中网络设备框架如下图所示:
- 网络协议接口层:向网络协议层提供统一的数据包收发接口,通过dev_queue_xmit()发送数据,并通过netif_rx()接收数据
- 网络设备接口层:向协议接口层提供统一的用于描述网络设备属性和操作的结构体net_device,该结构体是设备驱动层中各函数的容器。
- 网络设备驱动层:实现net_device中定义的操作函数指针(通常不是全部),驱动硬件完成相应动作。
- 网络设备媒介层:完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介。
模块配置
Kernel 协议栈配置
对于 Linux 系统,使用以太网需要配置以太网协议栈,包括如下配置项
CONFIG_PACKET
CONFIG_UNIX
CONFIG_UNIX_DIAG
CONFIG_NET_KEY
CONFIG_INET
CONFIG_IP_MULTICAST
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_FIB_TRIE_STATS
CONFIG_IP_MULTIPLE_TABLES
Kernel 驱动配置
对于 EMAC 的驱动,由于芯片存在多套以太网IP,包括 EMAC,GMAC,GMAC-200。其适配的以太网驱动为不同驱动框架。这里分开说明
EMAC 配置说明
EMAC 控制器描述如下图所示,其主要特点为最高支持百兆网络。
内核配置项目为
CONFIG_AW_EMAC
CONFIG_AW_EMAC_MDIO
内核设备树配置项
mdio1: mdio1@1c0b080 {
compatible = "allwinner,sun4i-mdio";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x0 0x01c0b080 0x0 0x14>;
status = "okay";
phy1: ethernet-phy@1 {
reg = <1>;
};
};
emac0: emac0@1c0b000 {
compatible = "allwinner,sunxi-emac";
reg = <0x0 0x01c0b000 0x0 0x0c000>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "emacirq";
clocks = <&ccu CLK_BUS_EMAC>;
clock-names = "emac";
resets = <&ccu RST_BUS_EMAC>;
pinctrl-names = "default";
pinctrl-0 = <&emac_pins_a>;
phy-rst = <&pio PH 27 1 1 1 0>;
phy-handle = <&phy1>;
status = "disabled";
};
-
compatible
表征具体的设备,用于驱动和设备的绑定; -
reg
设备使用的地址; -
interrupts
设备使用的中断; -
clocks
设备使用的时钟; -
pinctrl-0
设备active状态下的GPIO配置; -
pinctrl-1
设备sleep状态下的GPIO配置; -
phy-rst
(注:更换PHY器件需要更改此属性) PHY复位脚; -
phy-handle
phy器件句柄; -
phy子节点配置(注:更换PHY器件需要更改此属性):
reg
表征phy地址。
板级配置项目,主要是配置 emac 的 PHY RST 控制脚,和配置启用节点。
&mdio1 {
status = "okay";
};
&emac0 {
pinctrl-names = "default";
pinctrl-0 = <&emac_pins_a>;
phy-rst = <&pio PH 27 GPIO_ACTIVE_LOW>;
status = "okay";
};
GMAC 配置说明
GMAC 控制器描述如下图所示,其支持最高千兆网络。
内核配置项目为:
CONFIG_AW_GMAC
CONFIG_AW_GMAC_MDIO
设备树配置项目:
mdio0: mdio0@4500048 {
compatible = "allwinner,sunxi-mdio";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x0 0x04500048 0x0 0x8>;
status = "disabled";
gmac0_phy0: ethernet-phy@1 {
/* RTL8211F (0x001cc916) */
reg = <1>;
max-speed = <1000>; /* Max speed capability */
reset-gpios = <&pio PH 19 GPIO_ACTIVE_LOW>;
/* PHY datasheet rst time */
reset-assert-us = <10000>;
reset-deassert-us = <150000>;
};
};
gmac0: gmac0@4500000 {
compatible = "allwinner,sunxi-gmac";
reg = <0x0 0x04500000 0x0 0x10000>,
<0x0 0x03000030 0x0 0x4>;
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "gmacirq";
clocks = <&ccu CLK_GMAC0>, <&ccu CLK_GMAC0_25M>;
clock-names = "gmac", "phy25m";
resets = <&ccu RST_BUS_GMAC0>;
phy-handle = <&gmac0_phy0>;
status = "disabled";
};
compatible
表征具体的设备,用于驱动和设备的绑定;reg
设备使用的地址;interrupts
设备使用的中断;clocks
设备使用的时钟;status
是否使能该设备节点;phy-handle
phy器件句柄;- phy子节点配置(注:更换PHY器件需要更改此属性):
reg
表征phy地址,max-speed
表征phy的最大速率,reset-gpios
表征phy硬件复位的引脚,reset-assert-us
硬件复位拉低时间,reset-deassert-us
硬件复位拉
板级设备树配置:
&mdio0 {
status = "okay";
};
&gmac0 {
phy-mode = "rgmii";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&gmac0_pins_default>;
pinctrl-1 = <&gmac0_pins_sleep>;
sunxi,phy-clk-type = <0>;
tx-delay = <3>;
rx-delay = <4>;
gmac3v3-supply = <®_cldo3>;
status = "okay";
};
phy-mode
GMAC与PHY之间的物理接口,如MII、RMII、RGMII等;pinctrl-0
设备active状态下的GPIO配置;sunxi,phy-clk-type
配置phy使用的时钟,0表示使用soc内置的25 M 时钟;tx-delay
tx时钟延迟,tx-delay取值0-7,一档约536 ps(皮秒);rx-delay
rx时钟 延迟,rx-delay取值0-31,一档约186 ps(皮秒);gmac3v3-supply
gmac电源脚,根据实际情况配置;status
是否使能该设备节点。
GMAC-200 配置说明
GMAC-200 控制器描述如下,其支持标准更新更丰富,其使用的是内核标准 stmmac 驱动。
内核配置项目为:
CONFIG_AW_STMMAC_ETH
设备树配置项目:
gmac1: ethernet@4510000 {
compatible = "allwinner,sunxi-gmac-200", "snps,dwmac-4.20a";
reg = <0x0 0x04510000 0x0 0x10000>,
<0x0 0x03000034 0x0 0x4>;
interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq";
clocks = <&ccu CLK_GMAC1>, <&ccu CLK_GMAC1_MBUS_GATE>, <&ccu CLK_GMAC1_25M>;
clock-names = "stmmaceth", "pclk", "phy25m";
resets = <&ccu RST_BUS_GMAC1>;
reset-names = "stmmaceth";
phy-handle = <&gmac1_phy0>;
status = "disabled";
snps,fixed-burst;
snps,axi-config = <&gmac1_stmmac_axi_setup>;
snps,mtl-rx-config = <&gmac1_mtl_rx_setup>;
snps,mtl-tx-config = <&gmac1_mtl_tx_setup>;
gmac1_stmmac_axi_setup: stmmac-axi-config {
snps,wr_osr_lmt = <0xf>;
snps,rd_osr_lmt = <0xf>;
snps,blen = <256 128 64 32 16 8 4>;
};
gmac1_mtl_rx_setup: rx-queues-config {
snps,rx-queues-to-use = <1>;
queue0 {};
};
gmac1_mtl_tx_setup: tx_queues-config {
snps,tx-queues-to-use = <1>;
queue0 {};
};
mdio1: mdio1@1 {
compatible = "snps,dwmac-mdio";
#address-cells = <1>;
#size-cells = <0>;
gmac1_phy0: ethernet-phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x1>;
max-speed = <1000>; /* Max speed capability */
reset-gpios = <&pio PJ 27 GPIO_ACTIVE_LOW>;
/* PHY datasheet rst time */
reset-assert-us = <10000>;
reset-deassert-us = <150000>;
};
};
};
compatible
: 表征具体的设备,用于驱动和设备的绑定;reg
: 设备使用的地址;interrupts
: 设备使用的中断;clocks
: 设备使用的时钟;status
: 是否使能该设备节点;phy-handle
: phy器件句柄;- phy子节点配置(注:更换PHY器件需要更改此属性):
reg
: 表征phy地址,max-speed
: 表征phy的最大速率,reset-gpios
: 表征phy硬件复位的引脚,reset-assert-us
: 硬件复位拉低时间,reset-deassert-us
: 硬件复位拉高时间;
snps,axi-config
: AXI总线模式参数;snps,mtl-rx-config
: rx队列参数;snps,mtl-tx-config
: tx队列参数。
板级设备树配置:
&gmac1 {
phy-mode = "rgmii";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&gmac1_pins_default>;
pinctrl-1 = <&gmac1_pins_sleep>;
aw,soc-phy25m;
tx-delay = <3>;
rx-delay = <4>;
dwmac3v3-supply = <®_cldo3>;
status = "okay";
mdio1: mdio1@1 {
gmac1_phy0: ethernet-phy@1 {
reset-gpios = <&pio PI 5 GPIO_ACTIVE_LOW>;
};
};
};
phy-mode
: GMAC与PHY之间的物理接口,如MII、RMII、RGMII等;pinctrl-0
: 设备active状态下的GPIO配置;aw,soc-phy25m
: 属性表示使用SOC供的25M时钟给PHY;tx-delay
: tx时钟延迟,tx-delay取值0-7,一档约536 ps(皮秒);rx-delay
: rx时钟延迟,rx-delay取值0-31,一档约186 ps(皮秒);dwmac3v3-supply
: gmac-200电源脚,根据实际情况配置;status
: 是否使能该设备节点。
调试说明
常用以太网调试的软件包:
ifconfig
使用ifconfig -h
查看支持的参数,如下所示:
/ # ifconfig -h
Usage:
ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]
[add <address>[/<prefixlen>]]
[del <address>[/<prefixlen>]]
[[-]broadcast [<address>]] [[-]pointopoint [<address>]]
[netmask <address>] [dstaddr <address>] [tunnel <address>]
[outfill <NN>] [keepalive <NN>]
[hw <HW> <address>] [mtu <NN>]
[[-]trailers] [[-]arp] [[-]allmulti]
[multicast] [[-]promisc]
[mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]
[txqueuelen <NN>]
[[-]dynamic]
[up|down] ...
<HW>=Hardware Type.
List of possible hardware types:
loop (Local Loopback) slip (Serial Line IP) cslip (VJ Serial Line IP)
slip6 (6-bit Serial Line IP) cslip6 (VJ 6-bit Serial Line IP) adaptive (Adaptive Serial Line IP)
ash (Ash) ether (Ethernet) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) rose (AMPR ROSE) tunnel (IPIP Tunnel)
ppp (Point-to-Point Protocol) hdlc ((Cisco)-HDLC) lapb (LAPB)
arcnet (ARCnet) dlci (Frame Relay DLCI) frad (Frame Relay Access Device)
sit (IPv6-in-IPv4) fddi (Fiber Distributed Data Interface) hippi (HIPPI)
irda (IrLAP) x25 (generic X.25) infiniband (InfiniBand)
eui64 (Generic EUI-64)
<AF>=Address family. Default: inet
List of possible address families:
unix (UNIX Domain) inet (DARPA Internet) inet6 (IPv6)
ax25 (AMPR AX.25) netrom (AMPR NET/ROM) rose (AMPR ROSE)
ipx (Novell IPX) ddp (Appletalk DDP) ash (Ash)
x25 (CCITT X.25)
- -a:显示全部接口信息;
- -s:显示摘要信息;
- add/del:添加对应网口的ipv6地址;
- netmask:设置子网掩码;
- hw:设置mac地址;
- arp:打开或者关闭对应网口是否支持arp功能,如下图所示,关闭arp协议,ping不通,打开之后就可以ping通;
route
设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:
# route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
其中:
- add:添加一条路由规则;
- del:删除一条路由规则;
- -net:目的地址是一个网络;
- -host:目的地址是一个主机;
- target:目的网络或主机;
- netmask:目的地址的网络掩码;
- gw:路由数据包通过的网关;
- dev:为路由指定的网络接口。
示例:
route add -host 192.168.200.9 dev eth0 #添加eth0的目的地址为192.168.200.9
route add -host 192.168.200.9 gw 192.168.200.1 #添加到目的地址192.168.200.9经过网关192.168.200.1
mii_reg
mii_reg
工具是GMAC驱动中提供的调试节点,其主要作用是对外部PHY寄存器地址进行读写操作。
启动网卡:
ifconfig eth0 up
进入操作目录:
cd sys/devices/platform/soc@3000000/450000.eth
注:不同的目录可能会因板卡不同有差异,此处为大致路径。
读取对应的phy寄存器:
addr: PHY地址
reg: PHY寄存器
val: 数据
写操作:
echo addr reg val > mii_write; cat mii_write
eg:
echo 0x00 0x1f 0xa43 > mii_write; cat mii_write
读操作:
echo addr reg > mii_read; cat mii_read
eg:
echo 0x10 0x06 > mii_read; cat mii_read
一次读多位寄存器操作: 0x01~0x0a
cat mii_reg
udhcpc
ethtool
常用测试方法
查看网络设备信息
- 查看网口状态:
ifconfig eth0 -a
- 查看收发包统计:
cat /proc/net/dev
- 查看当前速率:
cat /sys/class/net/eth0/speed