RK3288_Android7.1调试以太网ethernet

以太网(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配置:

max-speed = <1000>; //这里配置最大的限速
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 = <&eth_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 丢包或无法工作。

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 7.1 的源码中,您可以通过修改 fstab 文件或 init.rc 文件来添加一个可被电脑识别的分区。具体来说,您可以按照以下步骤进行操作: 1. 确定您要挂载的分区的设备节点名称,例如 `/dev/sdb1`。 2. 打开设备的 fstab 文件,例如 `/vendor/etc/fstab.rk3288`,在其中添加一行类似于以下内容的条目: `/dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro 0 0` 这个条目的意思是将 `/dev/block/sdb1` 这个设备节点挂载到 `/mnt/usb_storage` 这个挂载点,使用 vfat 文件系统,具有一系列选项,例如读写权限、字符集等。 3. 如果您想要在设备启动时自动挂载该分区,可以修改设备的 init.rc 文件。具体来说,您可以在文件中添加以下内容: ``` mount /dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro ``` 这个命令的意思是在设备启动时将 `/dev/block/sdb1` 挂载到 `/mnt/usb_storage`,使用 vfat 文件系统,具有一系列选项。 请注意,上述操作可能需要 root 权限才能执行,同时修改系统文件可能会导致系统不稳定或无法正常启动,请谨慎操作,并备份好您的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零意@

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值