Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
由于在 RK 系列的 SoC 中内置了以太網 MAC 控制器,是以隻需要搭配一顆以太網 PHY 晶片, 即可實作以太網卡功能。
按照規範,即使是不同廠家的 PHY,仍然有一部分寄存器的定義是通用的, 隻要配置了這些通用的寄存器,基本上 PHY 就可以正常工作。是以,如果不需要使用PHY廠家提供的自定義的寄存器,那麼PHY驅動就不用修改。
在 Linux 驅動中有通用的 PHY 驅動,當然 SoC 中的 MAC 驅動是需要實作的(控制器不一樣)。
10/100M 以太網 PHY 與 MAC 之間的接口主要有 MII 和 RMII。 10/100/1000M 以太網 PHY 與 MAC 之間的接口主要有 RGMII。 各個系列SoC支援的PHY接口如下:
Kernel控制器及版本配置如下:
網卡使用的是RTL8211,和參考設計一緻,是以隻要配置一下DTS就可以了。
原理圖:
配置添加:
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-eco.dts b/arch/arm64/boot/dts/rockchip/rk3399-eco.dts
index e984dee..e39f165 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399-eco.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3399-eco.dts
@@ -136,6 +136,15 @@
enable-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
};
+ //Kris,180709, add support for eth.
+ clkin_gmac: external-gmac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <125000000>;
+ clock-output-names = "clkin_gmac";
+ #clock-cells = <0>;
+ };
+
+
vcc_phy: vcc-phy-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc_phy";
@@ -304,6 +313,23 @@
status = "okay";
};
+//Kris,180709, add support for eth.
+&gmac {
+ phy-supply = <&vcc_phy>;
+ phy-mode = "rgmii";
+ clock_in_out = "input";
+ snps,reset-gpio = <&gpio3 15 GPIO_ACTIVE_LOW>;
+ snps,reset-active-low;
+ snps,reset-delays-us = <0 10000 50000>;
+ assigned-clocks = <&cru SCLK_RMII_SRC>;
+ assigned-clock-parents = <&clkin_gmac>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&rgmii_pins>;
+ tx_delay = <0x28>;
+ rx_delay = <0x11>;
+ status = "okay";
+};
+
&sdhci {
bus-width = <8>;
mmc-hs400-1_8v;
參數說明:
- phy-mode: 根據闆上所使用的 PHY 的接口進行配置,一般千兆 PHY 為 RGMII, 百兆 PHY 為 RMII。
- clock_in_out : input 表示由 PHY 提供,output 表示由 GMAC 提供。
- clock-frequency:隻有在時鐘方向為input時才會使用到,RMII接口時,設為 50M,RGMII接口時設為125M。125M由外部 PHY 提供,這是因為 RK 主要分出的 clock 不精準,會造成 GMAC 丢包或無法工作。由外部輸入的時鐘相對于内部 PLL 産生的時鐘更加獨立,不受内部分頻政策的影響,是以更加穩定。而對于 PHY 來說,本身就需要一個 25M 的晶振作為時鐘源。
- tx_delay/rx_delay: RGMII 接口才需要去配置時序,因為時鐘頻率更高後更容易受到 PCBlayout走線,電磁幹擾等影響,需要更加精确調整。如果有出現測試吞吐率不足的情況,可以适當調整這兩個值,範圍是 0x0—0x7F。
從kernel 4.4 版本開始,各驅動盡可能使用官方 Linux kernel 的代碼,官方kernel 中已包含了支援 RK 所使用的 GMAC 的代碼架構(很多RK的驅動已經上傳到官方kernel,也包括GMAC)。是以往後晶片的 GMAC 驅動會套用此架構。
代碼位置在 drivers/net/ethernet/stmicro/stmmac/。
RK 平台相關代碼主要位于dwmac-rk.c中。
參考:
Rockchip 以太網 開發指南 V2.3.1-20160708.pdf
Documentation/devicetree/bindings/net/rockchip-dwmac.txt