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器件需要更改此属性