Edit online

参数配置

3 Dec 2024
Read time: 5 minute(s)

内核配置

内核配置主要是通过 make kmmake kernel_menuconfig) 命令进行 kernel 的功能选择:

  1. 网络功能配置
    内核中要使用以太网功能,需要首先打开和配置网络相关功能
    [*] Networking support
                        Networking options
                        <*> Packet socket
                        <*> Unix domain sockets
                        [*] TCP/IP networking
                        <*>   INET: socket monitoring interface
                        <*> DNS Resolver support
                        <*> NETLINK: socket monitoring interface
  2. 模块驱动配置
    Device Drivers
                            [*] Network device support
                            [*] Ethernet driver support
                            [*] ArtInChip Gigabit Ethernet driver

系统参数配置

系统参数主要在文件 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";
};

功能参数配置

功能参数主要针对某一个使用方案而定,因此随着方案的不同,参数很可能不同,这些参数主要在文件 target/d211/xxx/board.dts中,功能参数的设置必须和硬件原理图相匹配:
注: 关于详细的参数描述,可查看功能参数描述
  • 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 = <AIC_PINMUX('E', 0, 6)>,
             <AIC_PINMUX('E', 1, 6)>,
             <AIC_PINMUX('E', 2, 6)>,
             <AIC_PINMUX('E', 3, 6)>,
             <AIC_PINMUX('E', 4, 6)>,
             <AIC_PINMUX('E', 5, 6)>,
             <AIC_PINMUX('E', 6, 6)>,
             <AIC_PINMUX('E', 7, 6)>,
             <AIC_PINMUX('E', 8, 6)>,
             <AIC_PINMUX('E', 9, 6)>,
             <AIC_PINMUX('E', 10, 6)>,
             <AIC_PINMUX('E', 11, 6)>,
             <AIC_PINMUX('E', 12, 6)>,
             <AIC_PINMUX('E', 13, 6)>,
             <AIC_PINMUX('E', 14, 6)>,
             <AIC_PINMUX('E', 15, 6)>;
             bias-disable;
             drive-strength = <3>;
         };
     };
  • MDIO 参数
    MDIO 参数用于配置 MII Bus,其用于连接 MAC 和 PHY
    gmac0_mdio: mdio {
                compatible = "aicmac-mdio";
                gmac0_phy: ethernet-phy@1 {
                        reg = <1>;
                };
        };
    };
  • 配置 PHY 模块的工作模式,目前 MAC 仅支持 Reduced 接口:

    • RMII: 百兆模式

    • RGMII:千兆模式

    SOC 中自带了 MAC 模块,MAC 在和 PHY 配合工作前需要协商好二者的工作模式。

  • 百兆功能参数配置
    参考方案为 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>;
                };
        };
    };
  • 千兆功能参数配置
    参考方案为 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>;
                };
        };
    };

时钟配置

MAC 和 PHY 的协同工作共牵涉到以下时钟:
  • MAC 工作时钟
    1. 配置代码
      MAC 的内部工作时钟通过 PLL_INT1 分频获得,为 50M, 工作时钟不会因为方案的不同而不同,为一固定值。
      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);
    2. 寄存器查验
      reg-dump -a 0x18020440 -c 4
      0x18020440: 00003117 00003117 00000000 00000000
  • 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>;
    }
  • MDC 时钟
    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;
    2. 寄存器查验
      BIT(2,5) 为 0100150-250MHz
      
      reg-dump -a 0x10280090 -c 4
      0x10280090: 00000a90 00000000 00000000 00000000
  • MDATA 时钟
    MDATA 时钟 (TXC) 为 MAC 和 PHY 进行数据传输的时钟,对于百兆和千兆有不同的使用方式
    • 百兆网络:可以是 MAC 供给 PHY, 也可以是 PHY 供给 MAC

    • 千兆网络:只能是 MAC 供给 PHY,RGMII0-TXCK 端口

    1. PHY 提供给 MAC
      • dts 中设置 aic,use_extclk;

      • 寄存器:0x18000410 值为 00000002

    2. MAC 提供给 PHY
      • dts 中不设置 aic,use_extclk;

      • 寄存器:0x18000410 值为 00000000

MAC 地址配置

MAC 地址的使用优先级是

  1. 调试配置

    board.dts 的 gmac 配置域中添加: local-mac-address = [2e f6 01 e3 76 b6];

  2. 用户配置

    用户生产时配置在特殊数据分区中的 MAC 地址,

  3. 加密 CHIPID

    uboot 中获取 chipID,加密成 mac 地址,并通过 dts 的 local-mac-address 配置给 kernel 使用

  4. Random

    kernel 驱动中在无法从以上获得 mac 地址的时候,会 random 一个值作为 mac 地址使用