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 驱动配置
GMAC 配置说明
GMAC 控制器描述如下图所示,其支持最高千兆网络。
注意
备注
注意
备注
部分芯片硬件只引出了 RMII 接口,仅支持外接百兆以太网 PHY,仅支持百兆网络。
:::

内核配置项目为:
CONFIG_AW_GMAC
CONFIG_AW_GMAC_MDIO
设备树配置项目:
mdio0: mdio@44500048 {
compatible = "allwinner,sunxi-mdio";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x0 0x44500048 0x0 0x8>;
status = "okay";
};
gmac0: gmac@44500000 {
compatible = "allwinner,sunxi-gmac";
reg = <0x0 0x44500000 0x0 0x1000>,
<0x0 0x43000030 0x0 0x160>;
interrupts-extended = <&plic0 47 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "gmacirq";
clocks = <&ccu CLK_BUS_GMAC>, <&ccu CLK_GMAC_FANOUT>, <&ccu CLK_HBUS_GMAC>, <&ccu CLK_MBUS_GMAC>;
clock-names = "gmac", "phy25m", "hbus", "mbus";
assigned-clocks = <&ccu CLK_GMAC_27M>, <&ccu CLK_GMAC_FANOUT>;
assigned-clock-parents = <&aon_ccu CLK_PLL_VIDEO_1X>, <&ccu CLK_GMAC_27M>;
assigned-clock-rates = <25000000>;
resets = <&ccu RST_BUS_GMAC>;
/*
* max-mtu < tx_fifo - head_size
* tx_fifo: 1024 (platform-dependent)
* head_size: 18 (fixed)
*/
max-mtu = <950>;
status = "disabled";
};
compatible表征具体的设备,用于驱动和设备的绑定;reg设备使用的地址;interrupts设备使用的中断;clocks设备使用的时钟;status是否使能该设备节点;phy-handlephy器件句柄;
板级设备树配置:
&pio {
gmac0_pins_default: gmac_pins@0 {
pins = "PD1", "PD2", "PD3",
"PD4", "PD5", "PD6", "PD7",
"PD8", "PD9", "PD10", "PD11";
function = "rmii";
allwinner,drive = <3>;
bias-pull-up;
};
gmac0_pins_sleep: gmac_pins@1 {
pins = "PD1", "PD2", "PD3",
"PD4", "PD5", "PD6", "PD7",
"PD8", "PD9", "PD10", "PD11";
function = "io_disabled";
};
};
&mdio0 {
status = "okay";
phy0: ethernet-phy@0 {
/* JL11x1 */
compatible = "ethernet-phy-id937c.4024",
"ethernet-phy-ieee802.3-c22";
reg = <0>;
max-speed = <100>; /* Max speed capability for rmii */
reset-gpios = <&pio PC 16 GPIO_ACTIVE_LOW>;
/* PHY datasheet rst time */
reset-assert-us = <200000>;
reset-deassert-us = <150000>;
status = "okay";
};
};
&gmac0 {
phy-mode = "rmii";
pinctrl-names = "default", "sleep";
pinctrl-0 = <&gmac0_pins_default>;
pinctrl-1 = <&gmac0_pins_sleep>;
sunxi,phy-clk-type = <0>;
phy-handle = <&phy0>;
tx-delay = <0>;
rx-delay = <0>;
status = "okay";
};
phy-modeGMAC与PHY之间的物理接口,如MII、RMII、RGMII等;pinctrl-0设备active状态下的GPIO配置;sunxi,phy-clk-type配置phy使用的时钟,0表示使用soc内置的25 M 时钟;tx-delaytx时钟延迟,tx-delay取值0-7,一档约536 ps(皮秒);rx-delayrx时钟延迟,rx-delay取值0-31,一档约186 ps(皮秒);gmac3v3-supplygmac电源脚,根据实际情况配置;status是否使能该设备节点。- phy子节点配置(注:更换PHY器件需要更改此属性):
reg表征phy地址,max-speed表征phy的最大速率,reset-gpios表征phy硬件复位的引脚,reset-assert-us硬件复位拉低时间,reset-deassert-us硬件复位拉
调试说明
常用以太网调试的软件包:
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
udhcpcethtool
常用测试方法
查看网络设备信息
- 查看网口状态:
ifconfig eth0 -a - 查看收发包统计:
cat /proc/net/dev - 查看当前速率:
cat /sys/class/net/eth0/speed