RV1126 Linux 以太网MAC PHY 芯片8201f gmac dts配置

发布时间 2023-07-05 19:23:05作者: 阿风小子

RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY芯片, 即可实现以太网卡功能。 按照规范, 即使是不同厂家的 PHY,同样有一部分寄
存器的定义是通用的, 只要配置了这些通用的寄存器, 基本上 PHY 就可以正常工作。在 Linux 驱动中有通用的 PHY 驱动, 目前的芯片所配套的 SDK 中使用的都是通用驱动, 当然 SoC 中的 MAC 驱动是需要实现。

menuconfig 一般无需去改动。

我这边调试的是百兆以太芯片,根据原理图引脚是RMII。

时钟配置

RMII 接口需要 50M 参考时钟来保证 MAC 和 PHY 之间数据传输的同步。50M 时钟, 可以由 MAC 来提供, 也可以由 PHY 来提供。 50M 时钟必须是精确的, 且必须保证尽可能小的 jitter, 太大的 jitter 会导致较大的传输的错包率。 SDK 默认使用MAC, 也就是 RK 芯片内部的 MAC 控制器来提供时钟。 一般情况下, 并不需要使用PHY 来提供参考时钟, 因为这样需要额外增加一颗晶振来实现。 除非由于分频的原因,MAC 无法给出符合要求的 50M 参考时钟, RK3188T 上即存在这样的问题, 所以需要由 PHY 来提供参考时钟。

gmac配置

&gmac {
phy-mode = "rmii";
clock_in_out = "output";
 
snps,reset-gpio = <&gpio2 RK_PC5 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 50000 10000>;
 
assigned-clocks = <&cru CLK_GMAC_SRC_M1>, <&cru CLK_GMAC_SRC>, <&cru CLK_GMAC_TX_RX>;
assigned-clock-rates = <0>, <50000000>;
assigned-clock-parents = <&cru CLK_GMAC_RGMII_M1>, <&cru CLK_GMAC_SRC_M1>, <&cru RMII_MODE_CLK>;
pinctrl-names = "default";
pinctrl-0 = <&rmiim1_pins &gmac_clk_m1_pins &gmac_clk_m1_drv_level0_pins>;
 
phy-handle = <&phy>;
status = "okay";
 
fixed-link {
speed = <100>;
full-duplex;
};
};

rmii pin脚配置

rmii {
/omit-if-no-ref/
rmiim0_pins: rmiim0-pins {
rockchip,pins =
/* rmii_mdc_m0 */
<3 RK_PC4 2 &pcfg_pull_none_drv_level_0>,
/* rmii_mdio_m0 */
<3 RK_PC3 2 &pcfg_pull_none>,
/* rmii_rxd0_m0 */
<3 RK_PB6 2 &pcfg_pull_none>,
/* rmii_rxd1_m0 */
<3 RK_PB7 2 &pcfg_pull_none>,
/* rmii_rxdv_m0 */
<3 RK_PC1 2 &pcfg_pull_none>,
/* rmii_rxer_m0 */
<3 RK_PC2 2 &pcfg_pull_none>,
/* rmii_txd0_m0 */
<3 RK_PB3 2 &pcfg_pull_none_drv_level_0>,
/* rmii_txd1_m0 */
<3 RK_PB4 2 &pcfg_pull_none_drv_level_0>,
/* rmii_txen_m0 */
<3 RK_PB5 2 &pcfg_pull_none_drv_level_0>;
};
/omit-if-no-ref/
rmiim1_pins: rmiim1-pins {
rockchip,pins =
/* rmii_mdc_m1 */
<2 RK_PC2 2 &pcfg_pull_none_drv_level_0>,
/* rmii_mdio_m1 */
<2 RK_PC1 2 &pcfg_pull_none>,
/* rmii_rxd0_m1 */
<2 RK_PB5 2 &pcfg_pull_none>,
/* rmii_rxd1_m1 */
<2 RK_PB6 2 &pcfg_pull_none>,
/* rmii_rxdv_m1 */
<2 RK_PB4 2 &pcfg_pull_none>,
/* rmii_rxer_m1 */
<2 RK_PC0 2 &pcfg_pull_none>,
/* rmii_txd0_m1 */
<2 RK_PC3 2 &pcfg_pull_none_drv_level_0>,
/* rmii_txd1_m1 */
<2 RK_PC4 2 &pcfg_pull_none_drv_level_0>,
/* rmii_txen_m1 */
<2 RK_PC6 2 &pcfg_pull_none_drv_level_0>;
};
};

gmac 时钟pin脚配置,一般这些都是默认好,只需要你去选使用的哪一组pin脚就可。

gmac_clk {
/omit-if-no-ref/
gmac_clk_m0_pins: gmac-clk-m0-pins {
rockchip,pins =
/* rgmii_clk_m0 */
<3 RK_PC0 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac_clk_m0_drv_level0_pins: gmac-clk-m0-drv-level0-pins {
rockchip,pins =
/* rgmii_clk_m0 */
<3 RK_PC0 2 &pcfg_pull_none_drv_level_0>;
};
/omit-if-no-ref/
gmac_clk_m0_drv_level3_pins: gmac-clk-m0-drv-level3-pins {
rockchip,pins =
/* rgmii_clk_m0 */
<3 RK_PC0 2 &pcfg_pull_none_drv_level_3>;
};
/omit-if-no-ref/
gmac_clk_m1_pins: gmac-clk-m1-pins {
rockchip,pins =
/* rgmii_clk_m1 */
<2 RK_PB7 2 &pcfg_pull_none>;
};
/omit-if-no-ref/
gmac_clk_m1_drv_level0_pins: gmac-clk-m1-drv-level0-pins {
rockchip,pins =
/* rgmii_clk_m1 */
<2 RK_PB7 2 &pcfg_pull_none_drv_level_0>;
};
/omit-if-no-ref/
gmac_clk_m1_drv_level3_pins: gmac-clk-m1-drv-level3-pins {
rockchip,pins =
/* rgmii_clk_m1 */
<2 RK_PB7 2 &pcfg_pull_none>;
};
};

mdio匹配置

&mdio {
status = "okay";
phy: phy@0 {
status = "okay";
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x0>;
//clocks = <&cru CLK_GMAC_ETHERNET_OUT>;
};
};