7.5.2. 使用指南¶
7.5.2.1. 内核配置¶
内核配置主要是通过 make km(make kernel_menuconfig) 命令进行 kernel 的功能选择,配置完成后的项目存储在 “source/linux-5.10/arch/riscv/configs/d211_xxx_defconfig” 文件中
7.5.2.1.1. 网络功能配置¶
内核中要使用以太网功能,需要首先打开和配置网络相关功能
[*] Networking support
    Networking options
        <*> Packet socket
        <*> Unix domain sockets
        [*] TCP/IP networking
        <*>   INET: socket monitoring interface
        <*> DNS Resolver support
        <*> NETLINK: socket monitoring interface
7.5.2.1.2. 模块驱动配置¶
Device Drivers
    [*] Network device support
        [*] Ethernet driver support
            [*] ArtInChip Gigabit Ethernet driver
7.5.2.2. 模块系统参数配置¶
这些参数主要在文件 target/d211/common/d211.dtsi 中,模块系统参数随 SOC 的设定而定,一般不能进行更改,除非更换了新的 SOC,则需要在专业人士的指导下进行更改。
gmac0: ethernet@10280000 {
    compatible = "artinchip,aic-mac-v1.0";
    reg = <0x10280000 0x10000>;
    interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
    interrupt-names = "macirq";
    clocks = <&ccu CLK_GMAC0>;
    clock-names = "gmac";
    resets = <&rst RESET_GMAC0>;
    reset-names = "gmac";
};
7.5.2.3. 功能参数配置¶
功能参数主要针对某一个使用方案而定,因此随着方案的不同,参数很可能不同,
这些参数主要在文件 target/d211/xxx/board.dts中,功能参数的设置必须和硬件原理图相匹配
7.5.2.3.1. 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 内部的时钟,此值需要结合硬件设计设置,参考 时钟 章节详细了解 
 
7.5.2.3.2. 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即可 
 
7.5.2.3.3. 工作模式¶
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 应被配置 
 
7.5.2.3.4. 百兆功能参数配置¶
参考方案为 per2-spinand,MAC 工作在百兆模式下
&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>;
            };
    };
};
7.5.2.3.5. 千兆功能参数配置¶
参考方案为 per1,MAC 工作在千兆模式下
&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>;
            };
    };
};
7.5.2.4. 时钟¶
MAC 和 PHY 的协同工作共牵涉到三组时钟
7.5.2.4.1. MAC 工作时钟¶
MAC 的内部工作时钟通过 PLL_INT1 分频获得,为 50M, 工作时钟不会因为方案的不同而不同,为一固定值
7.5.2.4.1.1. 配置代码¶
plat->aicmac_clk = devm_clk_get(&pdev->dev, AICMAC_RESOURCE_NAME);
clk_set_rate(plat->aicmac_clk, CSR_F_50M);
clk_prepare_enable(plat->aicmac_clk);
7.5.2.4.1.2. 寄存器查验¶
MAC 内部工作时钟的在 CMU 模块中统一管理,寄存器值为 0x3117 模块才能正常工作
reg-dump -a 0x18020440 -c 4
0x18020440: 00003117 00003117 00000000 00000000
7.5.2.4.2. PHY 工作时钟¶
一般 PHY 的工作时钟是 25M, 一般的设计是外挂一个晶振提供时钟给 PHY 模组,d211 对外提供几组时钟,也可以使用该时钟供给 PHY 模块工作。
该时钟 (clk-out) 使能在 CMU 中配置,IO 在 MAC 中配置
&cmu {
    clk-out0 = <25000000>;
    clk-out1 = <25000000>;
    clk-out2 = <25000000>;
    clk-out3 = <25000000>;
    // clk-out0-enable;
    // clk-out1-enable;
    /* Enable clock out2 */
    clk-out2-enable;
    // clk-out3-enable;
};
&gmac0 {
    pinctrl-names = "default";
    pinctrl-0 = <&gmac0_1000m_pins>, <&clk_out2_pins_b>;
}
7.5.2.4.3. MDC 时钟¶
MDC 时钟是 mdio 的工作时钟,是 MAC 和 PHY 进行配置的工作时钟,双方在使用初期会有一个协商,一般是 MAC 通知 PHY, 该时钟为 MAC 通过模块的内部工作时钟处理生成,也不会因为方案的不同而不同,为一固定值, 目前是 AHB 总线的时钟,240M
MDC 时钟配置错误,则 MAC 和 PHY 的通信不通,呈现的现象是 MAC 无法发现 PHY 设备
7.5.2.4.3.1. 配置代码¶
define AICMAC_CSR_DEFAULT      AICMAC_CSR_150_250M
value |= (priv->plat->clk_csr << mdio_data->mii_reg.clk_csr_shift) &
        mdio_data->mii_reg.clk_csr_mask;
7.5.2.4.3.2. 寄存器查验¶
BIT(2,5) 为 0100,150-250MHz
reg-dump -a 0x10280090 -c 4
0x10280090: 00000a90 00000000 00000000 00000000
7.5.2.4.4. MDATA 时钟¶
MDATA 时钟 (TXC) 为 MAC 和 PHY 进行数据传输的时钟,对于百兆和千兆有不同的使用方式
- 百兆网络:可以是 MAC 供给 PHY, 也可以是 PHY 供给 MAC 
- 千兆网络:只能是 MAC 供给 PHY,RGMII0-TXCK 端口 
7.5.2.4.4.1. PHY 提供给 MAC¶
- dts 中设置 aic,use_extclk; 
- 寄存器:0x18000410 值为 00000002 
7.5.2.4.4.2. MAC 提供给 PHY¶
- dts 中不设置 aic,use_extclk; 
- 寄存器:0x18000410 值为 00000000 
7.5.2.5. MAC地址¶
MAC地址的使用优先级是
- 调试配置
- 在 dts 的 gmac 配置域中添加: local-mac-address = [2e f6 01 e3 76 b6]; 
 
- 用户配置
- 用户生产时配置在特殊数据分区中的 MAC 地址, 
 
- 加密 CHIPID
- uboot 中获取 chipID,加密成 mac 地址,并通过 dts 的 local-mac-address 配置给 kernel 使用 
 
- Random
- kernel 驱动中在无法从以上获得 mac 地址的时候,会 random 一个值作为 mac 地址使用