功能参数配置
- GMAC 参数
&gmac0 { pinctrl-names = "default"; pinctrl-0 = <&gmac0_1000m_pins>; phy-handle = <&gmac0_phy>; phy-reset-gpios = <&gpio_d 3 GPIO_ACTIVE_HIGH>; phy-addr = <1>; phy-mode = "rgmii"; max-speed = <1000>; aic,tx-delay = <0xc>; aic,rx-delay = <0xc>; status = "okay"; gmac0_1000m_pins: gmac0-0 { pins { pinmux = <AIC16XX_PINMUX('E', 0, 6)>, <AIC16XX_PINMUX('E', 1, 6)>, <AIC16XX_PINMUX('E', 2, 6)>, <AIC16XX_PINMUX('E', 3, 6)>, <AIC16XX_PINMUX('E', 4, 6)>, <AIC16XX_PINMUX('E', 5, 6)>, <AIC16XX_PINMUX('E', 6, 6)>, <AIC16XX_PINMUX('E', 7, 6)>, <AIC16XX_PINMUX('E', 8, 6)>, <AIC16XX_PINMUX('E', 9, 6)>, <AIC16XX_PINMUX('E', 10, 6)>, <AIC16XX_PINMUX('E', 11, 6)>, <AIC16XX_PINMUX('E', 12, 6)>, <AIC16XX_PINMUX('E', 13, 6)>, <AIC16XX_PINMUX('E', 14, 6)>, <AIC16XX_PINMUX('E', 15, 6)>; bias-disable; drive-strength = <3>; }; };
- pinctrl-names
SDK 一般会把要使用的某一功能的端口组预先定义,后期直接使用即可,定义一般放在 target/d211/common/d211-pinctrl.dtsi 文件中,目前 “pinctrl-names” 均设置为 “default” 即可
- pinctrl-0
即指示 MAC 预先定义的端口组
- phy-handle
MAC 和 PHY 通过 mdio 通信,因此要设定 phy 的寄存器读写地址,phy-handle 指示具体的 PHY 的配置引用对象,该对象一般包含在 MDIO 的配置中。
- phy-reset-gpios
因为 SOC 集成了 MAC,因此 MAC 的 reset 可以通过某一个寄存器完成,但对于外挂 PHY 的 SOC,需要提供一个 gpio 做 PHY 的 reset 操作,因为 MAC 和 PHY 的 reset 操作需要尽量保持同步才能使二者的状态同步
- phy-addr
PHY 在 MII 总线上的挂载地址,一般在硬件设计原理图有标注,如果没有特殊声明,则默认设置为 1 即可,驱动中会对该 MII 总线进行查询,来确定该地址是否有 PHY 设备
- phy-mode
PHY 和 MAC 的工作模式,目前可选的配置项有:RMII,RGMII,RGMII-ID,RGMII,RGMII-RXID,RGMII-TXID,千兆网口要有延时配置,参考 工作模式 章节详细了解
- max-speed
限制的端口的最大速度
- aic,tx-delay
千兆 PHY 的发送时延,该参数对百兆 PHY 无效,如果 PHY 的 spec 上有特殊要求,则按要求填写,否则设置默认值为 0xC 即可,
- aic,rx-delay
千兆 PHY 的接收时延,该参数对百兆 PHY 无效,如果 PHY 的 spec 上有特殊要求,则按要求填写,否则设置默认值为 0xC 即可,
- aic,use_extclk
百兆 PHY 是否外部 clk,设置该项说明使用外部独立时钟,否则将使用 SOC 内部的时钟,此值需要结合硬件设计设置,参考时钟 章节详细了解
- pinctrl-names
- MDIO 参数MDIO 参数用于配置 MII Bus,其用于连接 MAC 和 PHY
gmac0_mdio: mdio { compatible = "aicmac-mdio"; gmac0_phy: ethernet-phy@1 { reg = <1>; }; }; };
- ethernet-phy
PHY 的参数信息描述,被 MAC 的配置参数中的 phy-handle 引用
- reg
PHY 的读写寄存器,PHY 设备的很多寄存器是标准的,在代码中直接定义了,此处一般设为 1 即可
- ethernet-phy
工作模式
SOC 中自带了 MAC 模块,MAC 在和 PHY 配合工作前需要协商好二者的工作模式,因此需要配置 PHY 模块的工作模式,目前 MAC 仅支持 Reduced 接口
-
RMII: 百兆模式
-
RGMII:千兆模式
千兆网络 RGMII 采用边沿触发,上升沿发送一字节数据的低四位,下降沿发送剩余的高四位数数据。接收端时钟采用双边沿采样,但是如果不做额外处理,接收端无法稳定采样,为了解决这一问题,常见的作法是为 时钟信号添加延时,使其边沿对准数据总线的稳定区间。
可以在控制器端(时钟端)或者 PHY 芯片内部添加时延,同一时间只能有一处时延,PHY 模块通过 phy-mode 设置项的参数和 MAC 端进行沟通协商
- rgmii
MAC 端进行时延设置,则在 dts 文件中 aic,tx-delay 和 aic,rx-delay 均应被配置
- rgmii-id
PHY 芯片进行时延设置,则在 dts 文件中 aic,tx-delay 和 aic,rx-delay 均不能被配置
- rgmii-rxid
PHY 芯片进行 RX 时延配置,MAC 端进行 TX 时延设置,则在 dts 文件中 aic,tx-delay 应被配置
- rgmii-txid
PHY 芯片进行 TX 时延配置,MAC 端进行 RX 时延设置,则在 dts 文件中 aic,rx-delay 应被配置
百兆功能参数配置
&gmac0 { pinctrl-names = "default"; pinctrl-0 = <&gmac0_pins>; phy-handle = <&gmac0_phy>; phy-reset-gpios = <&gpio_a 2 GPIO_ACTIVE_HIGH>; phy-addr = <1>; phy-mode = "rmii"; max-speed = <100>; aic,use_extclk; status = "okay"; gmac0_mdio: mdio { compatible = "aicmac-mdio"; gmac0_phy: ethernet-phy@1 { reg = <1>; }; }; };
千兆功能参数配置
&gmac0 { pinctrl-names = "default"; pinctrl-0 = <&gmac0_1000m_pins>, <&clk_out2_pins_b>; phy-handle = <&gmac0_phy>; phy-reset-gpios = <&gpio_f 10 GPIO_ACTIVE_HIGH>; phy-addr = <1>; phy-mode = "rgmii"; max-speed = <1000>; aic,tx-delay = <0xc>; aic,rx-delay = <0xc>; status = "okay"; gmac0_mdio: mdio { compatible = "aicmac-mdio"; gmac0_phy: ethernet-phy@1 { reg = <1>; }; }; };