android 以太网调试

Android 以太网的调试主要分gmac的和pcie接口的,主要的代表是RealTek的8211 系列,和8111系列等,本文主要在Gmac连接的8211上做出分析,

例如8211F 为GMAC 连接的Phy,这一点在原理图上体现出来,19-22 IO 都是连接在主控IC 的GMAC上

 上图注意的是GMAC连接的都是GMAC1,一般像rockchip 3568 都有2组GMAC 接口,分别为GMAC0, GMAC1

例如:使用GMAC1

 未使用的GMAC0,未使用的GMAC0 IO 都用做其他的功能,这里就是io的复用功能。

 以上只要注意到以太网芯片也就是这颗PHY 和主控连接的接口是那个就可以了。

下面举例出来的原理图是需要注意1 电源控制 2 复位控制 3其他控制

1 电源部分需要拉高LAN_WAKE_EN_N这样8211 才能供电,这一步很重要。

 2 有关reset 很多IC 在开机的时候需要进行一次复位的动作才可以正常工作,这个步骤也很重要。

这里原理图所示的是高有效,默认是低

DTS的配置:

之所以讲述以上原理图的东西,就是为了在DTS中进行配置在以上讲述中提及到连接的端口是GMAC1  ,power 控制IO ,和reset 控制IO

DTS 中snps,reset-gpio 为复位IO 填入对应的管脚。IC 的power会根据原理图的差异来自己实现,默认的原理图是没有这个控制,如果有自己写一个驱动在开机的时候拉高IO

&gmac1 {
	phy-mode = "rgmii";
	clock_in_out = "input";

	snps,reset-gpio = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>;
	snps,reset-active-high;
	/* Reset time is 20ms, 100ms for rtl8211f */
	snps,reset-delays-us = <0 20000 100000>;

	assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
	assigned-clock-parents =  <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>;
	
	pinctrl-names = "default";
	pinctrl-0 = <&gmac1m1_miim
                    &gmac1m1_tx_bus2
                    &gmac1m1_rx_bus2
                    &gmac1m1_rgmii_clk
                    &gmac1m1_rgmii_bus
                    &gmac1m1_clkinout>;
//8211
	tx_delay = <0x63>;
	rx_delay = <0x31>;
	
	phy-handle = <&rgmii_phy1>;
	status = "okay";
};
&gmac {
	phy-supply = <&vcc_phy>; ---PHY 供电由&vcc_phy 提供,见后续说明
	phy-mode = "rgmii"; --- rgmii 或 rmii, pinctrl-0 字段必须与此字段相匹配
	clock_in_out = "input"; --- input: 时钟由 PHY 输入给 MAC,output: 与 input 相反
	snps,reset-gpio = <&gpio2 15 GPIO_ACTIVE_LOW>; ---用于复位 PHY 的 GPIO
	snps,reset-active-low; ---复位 PHY 的GPIO 低有效
	snps,reset-delays-us = <0 10000 50000>; ---表示复位PHY 前的延时为 0ms,拉低维持的时间为 10ms, 拉高后延时 50ms
	assigned-clocks = <&cru SCLK_MAC>; ---MAC 的时钟源
	assigned-clock-parents = <&ext_gmac>; ---MAC 父时钟由&ext_gmac 提供,见后续说明
	pinctrl-names = "default";
	pinctrl-0 = <&rgmii_pins>; ---设为&rgmii_pins 或&rmii_pins, 必须和 phy-mode 字段匹配

	
	tx_delay = <0x30>;
	rx_delay = <0x10>;
	status = "okay";
	};

这里重点介绍一下pinctrl-0 下的gmac1m1_miim ...的一些IO 复用配置,这个一般先看原理图,连接到主控上是那个,如上图GMAC1 中所示 

GPIO3_D6 ~ GPIO4_B1 都为GMAC1的部分,打开kernel\arch\arm64\boot\dts\rockchip 下的

rk3568-pinctrl.dtsi 查看3 RK_PD6 这里发现在gmac1 中:

gmac1 {
		/omit-if-no-ref/
		gmac1m0_miim: gmac1m0-miim {
			rockchip,pins =
				/* gmac1_mdcm0 */
				<3 RK_PC4 3 &pcfg_pull_none>,
				/* gmac1_mdiom0 */
				<3 RK_PC5 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m0_clkinout: gmac1m0-clkinout {
			rockchip,pins =
				/* gmac1_mclkinoutm0 */
				<3 RK_PC0 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m0_rx_er: gmac1m0-rx-er {
			rockchip,pins =
				/* gmac1_rxerm0 */
				<3 RK_PB4 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m0_rx_bus2: gmac1m0-rx-bus2 {
			rockchip,pins =
				/* gmac1_rxd0m0 */
				<3 RK_PB1 3 &pcfg_pull_none>,
				/* gmac1_rxd1m0 */
				<3 RK_PB2 3 &pcfg_pull_none>,
				/* gmac1_rxdvcrsm0 */
				<3 RK_PB3 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m0_tx_bus2: gmac1m0-tx-bus2 {
			rockchip,pins =
				/* gmac1_txd0m0 */
				<3 RK_PB5 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txd1m0 */
				<3 RK_PB6 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txenm0 */
				<3 RK_PB7 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m0_rgmii_clk: gmac1m0-rgmii-clk {
			rockchip,pins =
				/* gmac1_rxclkm0 */
				<3 RK_PA7 3 &pcfg_pull_none>,
				/* gmac1_txclkm0 */
				<3 RK_PA6 3 &pcfg_pull_none_drv_level_1>;
		};

		/omit-if-no-ref/
		gmac1m0_rgmii_bus: gmac1m0-rgmii-bus {
			rockchip,pins =
				/* gmac1_rxd2m0 */
				<3 RK_PA4 3 &pcfg_pull_none>,
				/* gmac1_rxd3m0 */
				<3 RK_PA5 3 &pcfg_pull_none>,
				/* gmac1_txd2m0 */
				<3 RK_PA2 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txd3m0 */
				<3 RK_PA3 3 &pcfg_pull_none_drv_level_2>;
		};

		/omit-if-no-ref/
		gmac1m1_miim: gmac1m1-miim {
			rockchip,pins =
				/* gmac1_mdcm1 */
				<4 RK_PB6 3 &pcfg_pull_none>,
				/* gmac1_mdiom1 */
				<4 RK_PB7 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m1_clkinout: gmac1m1-clkinout {
			rockchip,pins =
				/* gmac1_mclkinoutm1 */
				<4 RK_PC1 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m1_rx_er: gmac1m1-rx-er {
			rockchip,pins =
				/* gmac1_rxerm1 */
				<4 RK_PB2 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m1_rx_bus2: gmac1m1-rx-bus2 {
			rockchip,pins =
				/* gmac1_rxd0m1 */
				<4 RK_PA7 3 &pcfg_pull_none>,
				/* gmac1_rxd1m1 */
				<4 RK_PB0 3 &pcfg_pull_none>,
				/* gmac1_rxdvcrsm1 */
				<4 RK_PB1 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m1_tx_bus2: gmac1m1-tx-bus2 {
			rockchip,pins =
				/* gmac1_txd0m1 */
				<4 RK_PA4 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txd1m1 */
				<4 RK_PA5 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txenm1 */
				<4 RK_PA6 3 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		gmac1m1_rgmii_clk: gmac1m1-rgmii-clk {
			rockchip,pins =
				/* gmac1_rxclkm1 */
				<4 RK_PA3 3 &pcfg_pull_none>,
				/* gmac1_txclkm1 */
				<4 RK_PA0 3 &pcfg_pull_none_drv_level_1>;
		};

		/omit-if-no-ref/
		gmac1m1_rgmii_bus: gmac1m1-rgmii-bus {
			rockchip,pins =
				/* gmac1_rxd2m1 */
				<4 RK_PA1 3 &pcfg_pull_none>,
				/* gmac1_rxd3m1 */
				<4 RK_PA2 3 &pcfg_pull_none>,
				/* gmac1_txd2m1 */
				<3 RK_PD6 3 &pcfg_pull_none_drv_level_2>,
				/* gmac1_txd3m1 */
				<3 RK_PD7 3 &pcfg_pull_none_drv_level_2>;
		};
	};

最后一个 gmac1m1_rgmii_bus 中有包含3 RK_PD6 并且有3 RK_PD7  4 RK_PA1 4 RK_PA2 这3个io都在原理图范围内,对应的几个IO 都能在gmac1m1_xxx中找到相关的IO ,则DTS 中填入对应的gmac1m1_xxx

tx_delay rx_delay的测试可以参考Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf

找到phy_lb_scan 进行echo 1000 > phy_lb_scan 就能得到对应的值。

以上都是顺利的情况,以太网可以工作了,这里分享几个特例:

1 配置好后开机以太网无法使用,测量硬件发现复位IO 一直为高,检查log发现复位IO 已经被其他地方使用,去掉后正常。

2 rgmii-rxid 模式

当硬件启用 PHY 的 RX delay,比如 RTL8211F

 就需要关闭主控的 RX delay, dts 配置的模式变成 “rgmii-rxid”, 例如

&gmac0 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = "rgmii-rxid";
clock_in_out = "output";
......
tx_delay = <0x43>;
/* rx_delay = <0x42>; */
phy-handle = <&rgmii_phy>;
status = "okay";
}

猜你喜欢

转载自blog.csdn.net/m0_56343264/article/details/131420814