以太網(ethernet)的調試:
Rk預設已經添加了mac驅動。網卡分為兩個層次:MAC+PHY
一般說來,MAC就是網絡控制器,如果該驅動OK,就能直接看到ifconfig資訊;
PHY是實體層,負責發送和傳輸的底層,如果PHY發生問題,ifconfig同樣有資訊,隻有up時才會連接配接PHY,down時斷開連接配接。
MAC和PHY通過MII接口傳輸以太網資料,通過MDIO接口通路PHY的配置寄存器。 PHY連不上第一可能是硬體問題,拿給做硬體的,首先檢查一下供電是否正常(最關鍵),然後檢查一下PHY所有信号是否都很正常(一般連接配接對了都沒啥問題),
Adb通過 ifconfig -a指令可以檢視是否注冊了網卡裝置eth0
rk3288:/ # ifconfig -a
sit0 Link encap:IPv6-in-IPv4
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 TX bytes:0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 TX bytes:0
eth0 Link encap:Ethernet HWaddr 46:50:6f:9d:8c:82
inet addr:192.168.2.27 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::4450:6fff:fe9d:8c82/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:908 errors:0 dropped:0 overruns:0 frame:0
TX packets:99 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:72432 TX bytes:12712
Interrupt:38
rk3288:/ #
我這裡調試的是:Rk3288_Android7.1,kernel版本是4.4, 代碼位置在drivers/net/ethernet/stmicro/stmmac/.
Dts配置:
--- a/arch/arm/boot/dts/rk3288-evb.dtsi
+++ b/arch/arm/boot/dts/rk3288-evb.dtsi
ext_gmac: external-gmac-clock {
compatible = "fixed-clock";
clock-frequency = <125000000>; //1000M網用125M
clock-output-names = "ext_gmac";
#clock-cells = <0>;
};
&gmac {
// phy-supply = <&vcc_phy>; //原理圖phy的供電PHY_PMEB直接使用pmu的ldo腳, 是以這裡注掉,不需要再配置
phy-mode = "rgmii";
clock_in_out = "input";
snps,reset-gpio = <&gpio4 8 0>; //複位pin(參考原理圖)
snps,reset-active-low;
snps,reset-delays-us = <0 10000 50000>;
assigned-clocks = <&cru SCLK_MAC>;
assigned-clock-parents = <&ext_gmac>;
pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins>;
tx_delay = <0x30>;
rx_delay = <0x10>;
max-speed = <1000>; //這裡配置最大的限速,1000就是可以達到1000M速度,100就是100M最大限速
status = "okay";
};
問題點總結:
1、萬用表量供電腳PHY_PME隻有0.4v的供電。
分析:
Phy的供電腳使用pmu(rk808)的VSWOUT2腳(對照原理圖),注意dts添加對應pin的節點配置,這樣rk808驅動才能添加對應的寄存器設定,使該pin輸出3.3v供電:
--- a/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
+++ b/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
+ vcc_lan: SWITCH_REG2 {
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc_lan";
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ };
+ };
2、報錯rk_gmac-dwmac: probe of ff290000.ethernet failed with error -1。
分析:
dwmac-rk.c驅動的上電函數phy_power_on讀取不到phy-supply的有效ldo,直接傳回-1報錯,就會無法正常識别到網卡裝置eth0,需在驅動drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c中注掉phy_power_on的上下電操作,直接傳回0即可。
static int phy_power_on(struct rk_priv_data *bsp_priv, bool enable)
{
/* struct regulator *ldo = bsp_priv->regulator;
int ret;
struct device *dev = &bsp_priv->pdev->dev;
if (!ldo) {
dev_err(dev, "no regulator found\n");
return -1;
}
if (enable) {
ret = regulator_enable(ldo);
if (ret)
dev_err(dev, "fail to enable phy-supply\n");
} else {
ret = regulator_disable(ldo);
if (ret)
dev_err(dev, "fail to disable phy-supply\n");
}
*/
return 0;
}
3、開機起來隻識别到100M的速率,相關log列印:rk_gmac-dwmac ff290000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off)
分析:
dts配置:
4、如果PHY的供電腳PHY_PMEB使用GPIO控制開關的話,dts部分還需要對照原理圖加上以下的GPIO的配置。
vcc_phy: vcc-phy-regulator {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpio0 8 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <ð_phy_pwr>;
regulator-name = "vcc_phy";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-boot-on;
};
& pinctrl {
eth_phy {
eth_phy_pwr: eth-phy-pwr {
rockchip,pins = <0 8 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
5、PHY 初始化異常
類似如下異常列印:
stmmac_open: Cannot attach to PHY
或
eth0: No PHY found
PHY 正常識别會有類似如下列印:
eth0: PHY ID 01410dd1 at 1 IRQ 0 (stmmac-0:01) active
解決思路:
A. 需要先确認硬體是否有異常,對比 RK 釋出的以太網 PHY 參考電路,或者找 RK 硬體同僚
check 下原理圖
B. 需要确認 PHY 的供電是否正常,如 VCC_LAN 等電源腳
C. 如果 PHY 有 reset 腳控制,确認是否正常控制到
D. 測量 MAC 信号腳的電平,需要工作在 3.3V
E. 還可以嘗試增加以下 delay 時間試試
6、kernel出現如下報錯列印
stmmac_open: DMA initialization failed
這種情況隻有在“clock_in_out = "input"情況下才出現。
A) 需要确認 GMAC 工作主時鐘 MAC_CLK 是否有從 PHY 供給主要:
使用 100M PHY 時,其頻率是 50M
使用 1000M PHY 時,其頻率是 125M
B) 如果有 clock,需要确認 clock 的幅度是否達标,一般需要 3.0V 以上
C) 需要确認 iomux 是否正确
注意:如果用的是100M PHY,MAC_CLK的頻率是50M;如果用的是1000M PHY,MAC_CLK的
頻率是 125M.125M clock 必須由 PHY 提供,100M clock 可由 RK 主要提供,這是因為 RK 主要分不出 125M clock 或分出的
clock 可能不精準,會造成 GMAC 丢包或無法工作。