iMX6 SoloX千兆以太网Linux PHY驱动调试

最近在iMX6 SoloX平台上调试千兆以太网Linux PHY驱动调试,使用的是RGMII接口类型。RGMIIReduced GMII,是RGMII的简化版本,将接口信号线数量从24根减少到14根(COL/CRS端口状态指示信号,这里没有画出),时钟频率仍旧为125MHz,TX/RX数据宽度从8为变为4位,为了保持1000Mbps的传输速率不变,RGMII接口在时钟的上升沿和下降沿都采样数据。
iMX6 SoloX千兆以太网Linux PHY驱动调试_第1张图片
在这里有一点需要特别说明下,那就是发送参考时钟GTX_CLK,它和MII接口中的TX_CLK是不同的,MII接口中的TX_CLK是由PHY芯片提供给MAC芯片的,而RGMII接口中的GTX_CLK是由MAC芯片提供给PHY芯片的。
接下来是调试过程以及解决问题:

  • 首先确保MAC控制器驱动fec_main.c和PHY驱动正常加载
  • 根据硬件原理图以及参考板dts文件配置fec1如下:
&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1>;
	phy-mode = "rgmii";
	phy-handle = <ðphy1>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy1: ethernet-phy@1 {
			reg = <1>;
		};

	};
};
pinctrl_enet1: enet1grp {
	fsl,pins = <
		MX6SX_PAD_ENET1_MDIO__ENET1_MDIO	0xa0b1
		MX6SX_PAD_ENET1_MDC__ENET1_MDC		0xa0b1
		MX6SX_PAD_RGMII1_TXC__ENET1_RGMII_TXC	0xa0b9
		MX6SX_PAD_RGMII1_TD0__ENET1_TX_DATA_0	0xa0b1
		MX6SX_PAD_RGMII1_TD1__ENET1_TX_DATA_1	0xa0b1
		MX6SX_PAD_RGMII1_TD2__ENET1_TX_DATA_2	0xa0b1
		MX6SX_PAD_RGMII1_TD3__ENET1_TX_DATA_3	0xa0b1
		MX6SX_PAD_RGMII1_TX_CTL__ENET1_TX_EN	0xa0b1
		MX6SX_PAD_RGMII1_RXC__ENET1_RX_CLK	0x3081
		MX6SX_PAD_RGMII1_RD0__ENET1_RX_DATA_0	0x3081
		MX6SX_PAD_RGMII1_RD1__ENET1_RX_DATA_1	0x3081
		MX6SX_PAD_RGMII1_RD2__ENET1_RX_DATA_2	0x3081
		MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3	0x3081
		MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN	0x3081
	>;
};
  • 编译烧录后在启动过程的log中可以看到网卡可以正常识别和启动,并且和PC端网口自协商成功,工作模式是1Gbps/Full
Micrel KSZ9031 Gigabit PHY 2188000.ethernet-1:01: attached PHY driver [Micrel KSZ9031 Gigabit PHY] (mii_bus:phy_addr=2188000.ethernet-1:01)
IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
fec 2188000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
  • 使用示波器抓取MDIO信号,波形是正常的,这时候使用ethtool工具可以读取网卡eth0的工作状态(也可以使用类似mdio的工具直接读取PHY的寄存器值)
# ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                             100baseT/Half 100baseT/Full 
                                             1000baseT/Full 
        Link partner advertised pause frame use: Symmetric
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: d
        Wake-on: d
        Link detected: yes
  • 到了这里调试工作已经完成一大半了,不过还是不能和PC互相ping通,通过ifconfig工具看到板子可以接收PC发过来的包,但是发送出去的包PC接收不到。使用示波器抓取TXCRXC的信号,发现RXC的频率是125M,而TXC的频率只有50M(正常工作频率是125M)。结合前文提到的注意点:RXC来自于PHY,而TXC来自于MAC,然后我们可以查到clk-imx6sx.c里面有MAC参考频率设置,把50M(MII接口网卡工作频率)修改为125M(RGMII接口网卡工作频率),重新编译内核烧录到板子就可以和PC端互相ping通了,到此千兆网卡驱动基本调试完成。:
imx_clk_set_rate(clks[IMX6SX_CLK_ENET_REF], 50000000);

你可能感兴趣的:(Linux驱动)