基于imx6ul调试DP83848以太网PHY控制器笔记

发布于:2022-10-26 ⋅ 阅读:(385) ⋅ 点赞:(0)

1、开发环境

虚拟机:Ubuntu16.04
内核版本:kernel4.1.15
驱动:driver/net/phy/dp83848.c
driver/net/ethernet/freescale/fec_main.c

2、问题

在同一个固件的情况下,有部分板子无法识别到网线的插拔动作。

3、问题初步分析

驱动能成功识别加载,然后系统起来后,插拔网线,系统却没有打印信息。感觉是没有信号传输到PHY控制器上,一开始我是还以底板上的差分信号线的问题,然后看了下原理图,看到了DP83848芯片中X1引脚是使用外部晶振的同时还用了CPU内部输出时钟频率,有可能导致了两个频率冲突了。
在这里插入图片描述

4、解决问题

首先是用示波器测量一下X1处的时钟频率,发现虽然有50MHZ输出,但是波形却有点杂乱,更加让我觉得是这个影响了网口通信。
然后将外部晶振拆除,再次用示波器测量得出的波形是稳定的,因为imx6ul默认是让MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2引脚输出50MHZ时钟频率的。
最后,就是在MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2替换成MX6UL_PAD_ENET2_TX_CLK__ENET2_TX_CLK。然后测试一下是否还有频率输出?如果没有,把外部晶振再焊接回去。然后网口就可以检测到了。
如下图:

pinctrl_enet2: enet2grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
				MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
				MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
				MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01	0x1b0b0
				-//MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b031
				/*添加*/MX6UL_PAD_ENET2_TX_CLK__ENET2_TX_CLK    0x4001b009
				MX6UL_PAD_ENET1_TX_DATA1__GPIO2_IO04    0x1b0b0
			>;
		};

说明了如果使用外部晶振向DP83848芯片提供时钟的话,需要把TX_CLK引脚屏蔽为输入模式,而不是说出频率模式。两者二选一。

5、扩展

这次为了解决这个问题,其实看了不少的资料,收获颇多。

如reg = <1>;地址是由以下五个引脚决定的。一般都会设为00001
在这里插入图片描述

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-reset-gpios = <&gpio2 4 GPIO_ACTIVE_LOW>;
	status = "okay";
	
	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@1 {
			compatible = "ethernet-phy-id2000.5ca0";
			reg = <1>;
		};
	};
};

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

微信公众号

今日签到

点亮在社区的每一天
去签到