提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
[一、修改 LAN8720 的复位以及网络时钟引脚驱动](#一、修改 LAN8720 的复位以及网络时钟引脚驱动)
[1.1、I.MX6U-ALPHA 开发板网络接口网络原理图](#1.1、I.MX6U-ALPHA 开发板网络接口网络原理图)
[1.1.1、ENET1 的网络原理图](#1.1.1、ENET1 的网络原理图)
[1.1.2、ENET1 的网络原理图](#1.1.2、ENET1 的网络原理图)
[二、修改 LAN8720网络时钟引脚驱动](#二、修改 LAN8720网络时钟引脚驱动)
[三、修改 fec1 和 fec2 节点的 pinctrl-0 属性](#三、修改 fec1 和 fec2 节点的 pinctrl-0 属性)
[四、修改 LAN8720A 的 PHY 地址](#四、修改 LAN8720A 的 PHY 地址)
前言
前两期把cpu主频以及EMMC驱动进行了修改,这一期开始修改网络驱动(因为开发板的网络芯片改了)。
一、修改 LAN8720 的复位以及网络时钟引脚驱动
之前也讲过I.MX6U-ALPHA开发板,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A,两个网络 PHY 芯片的复位 IO 也不同。 所以 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修改。
1.1、I.MX6U-ALPHA 开发板网络接口网络原理图
1.1.1、ENET1 的网络原理图
首先咱们可以先看看I.MX6U-ALPHA 开发板网络接口的网络原理图, ENET1 的网络原理图如下图所示:

可以看出 ENET1 复位引脚ENET1_RST 接到了 I.M6ULL 的 SNVS_TAMPER7 这个引脚上
1.1.2、ENET1 的网络原理图
ENET2 的网络原理图如下图所示:

ENET2 的复位引脚,从上图可以看出,ENET2 的复位引脚 ENET2_RST 接到了I.MX6ULL 的 SNVS_TAMPER8 上。
1.2、修改驱动代码
打开设备树文件 imx6ull-alientek-emmc.dts,找到以下代码:
584 pinctrl_spi4: spi4grp {
585 fsl,pins = <
586 MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
587 MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
588 MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1
589 MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000
590 >;
591 };
上述代码第 588 和 589 行就是初始化 SNVS_TAMPER7 和 SNVS_TAMPER8 这两个引脚,这里好像是作为了SPI4的IO,所以将588,589两行删除掉。
删除掉以后在imx6ull-alientek-emmc.dts 中找到如下所示代码:
125 spi4 {
126 compatible = "spi-gpio";
127 pinctrl-names = "default";
128 pinctrl-0 = <&pinctrl_spi4>;
129 pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
130 ......
133 cs-gpios = <&gpio5 7 0>;
134 };
第 129 行,设置 GPIO5_IO08 为 SPI4 的一个功能引脚, 而 GPIO5_IO08 就是 SNVS_TAMPER8 的 GPIO 功能引脚。
第 133 行,设置 GPIO5_IO07 作为 SPI4 的片选引脚,而 GPIO5_IO07 就是 SNVS_TAMPER7
的 GPIO 功能引脚。
而我们需要 GPIO5_IO07 和 GPIO5_IO08 分别作为 ENET1 和 ENET2 的复位引脚,而不是 SPI4 的什么功能引脚,因此将第 129 行和第 133 行处的代码删除掉,以免干扰到网络复位引脚。
在 imx6ull-alientek-emmc.dts 里面找到名为"iomuxc_snvs"的节点,然后在此节点下添加网络复位引脚信息,添加完成以后的"iomuxc_snvs"的节点内容如下:
&iomuxc_snvs {
pinctrl-names = "default_snvs";
pinctrl-0 = <&pinctrl_hog_2>;
imx6ul-evk {
......
/*省略掉其他*/
/*enet1 reset */
pinctrl_enet1_reset: enet1resetgrp {
fsl,pins = <
/* used for enet1 reset */
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
>;
};
/*enet2 reset*/
pinctrl_enet2_reset: enet2resetgrp {
fsl,pins = <
/* used for enet2 reset */
MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
>;
};
};
};
二、修改 LAN8720 网络时钟引脚驱动
最后还需要修改一下 ENET1 和 ENET2 的网络时钟引脚配置,继续在 imx6ull-alientek-emmc.dts 中找到如下所示代码:
309 pinctrl_enet1: enet1grp {
310 fsl,pins = <
311 MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
312 MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
313 MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
314 MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
315 MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
316 MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
317 MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
318 MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
319 >;
320 };
321 pinctrl_enet2: enet2grp {
322 fsl,pins = <
323 MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
324 MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
325 MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0
326 MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0
327 MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
328 MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
329 MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0
330 MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
331 MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
332 MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
333 >;
334 };
318行和332行分别为 ENET1 和 ENET2 的网络时钟引脚配置信息,将这两个引脚的电气属性值改为 0x4001b009,原来默认值为 0x4001b031。
修改完成以后记得保存一下 imx6ull-alientek-emmc.dts,网络复位以及时钟引脚驱动就修改好了。
三、修改 fec1 和 fec2 节点的 pinctrl-0 属性
在 imx6ull-alientek-emmc.dts 文件中找到名为"fec1"和"fec2"的这两个节点,修改其中的 "pinctrl-0"属性值,修改以后如下所示:
1 &fec1 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_enet1
4 &pinctrl_enet1_reset>;
5 phy-mode = "rmii";
6 ......
9 status = "okay";
10 };
12 &fec2 {
13 pinctrl-names = "default";
14 pinctrl-0 = <&pinctrl_enet2
15 &pinctrl_enet2_reset>;
16 phy-mode = "rmii";
17 ......
36 };
第 3~4 行,修改后的 fec1 节点"pinctrl-0"属性值。
第 14~15 行,修改后的 fec2 节点"pinctrl-0"属性值。
四、修改 LAN8720A 的 PHY 地址
在网络接口原理图中,我们可以看到 ENET1 的 LAN8720A 地址为 0x0,ENET2 的 LAN8720A 地址为 0x1。在 imx6ull-alientek-emmc.dts 中找到如下代码:
171 &fec1 {
172 pinctrl-names = "default";
173 ......
175 phy-handle = <ðphy0>;
176 status = "okay";
177 };
178
179 &fec2 {
180 pinctrl-names = "default";
181 ......
183 phy-handle = <ðphy1>;
184 status = "okay";
185
186 mdio {
187 #address-cells = <1>;
188 #size-cells = <0>;
189
190 ethphy0: ethernet-phy@0 {
191 compatible = "ethernet-phy-ieee802.3-c22";
192 reg = <2>;
193 };
194
195 ethphy1: ethernet-phy@1 {
196 compatible = "ethernet-phy-ieee802.3-c22";
197 reg = <1>;
198 };
199 };
200 };
第 171~177 行,ENET1 对应的设备树节点。
第 179~200 行,ENET2 对应的设备树节点。第 186~198 行的 mdio 节点描述了 ENET1 和 ENET2 的 PHY 地址信息。将上述代码改为如下内容:
171 &fec1 {
172 pinctrl-names = "default";
173 pinctrl-0 = <&pinctrl_enet1
174 &pinctrl_enet1_reset>;
175 phy-mode = "rmii";
176 phy-handle = <ðphy0>;
177 phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
178 phy-reset-duration = <200>;
179 status = "okay";
180 };
181 &fec2 {
182 pinctrl-names = "default";
183 pinctrl-0 = <&pinctrl_enet2
184 &pinctrl_enet2_reset>;
185 phy-mode = "rmii";
186 phy-handle = <ðphy1>;
187 phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
188 phy-reset-duration = <200>;
189 status = "okay";
190
191 mdio {
192 #address-cells = <1>;
193 #size-cells = <0>;
194
195 ethphy0: ethernet-phy@0 {
196 compatible = "ethernet-phy-ieee802.3-c22";
197 smsc,disable-energy-detect;
198 reg = <0>;
199 };
200
201 ethphy1: ethernet-phy@1 {
202 compatible = "ethernet-phy-ieee802.3-c22";
203 smsc,disable-energy-detect;
204 reg = <1>;
205 };
206 };
208 };
第 177 和 178 行,添加了 ENET1 网络复位引脚所使用的 IO 为 GPIO5_IO07,低电平有效。
复位低电平信号持续时间为 200ms。
第 187 和 188 行,ENET2 网络复位引脚所使用的 IO 为 GPIO5_IO08,同样低电平有效,持
续时间同样为 200ms。
第 197 和 203 行,"smsc,disable-energy-detect"表明 PHY 芯片是 SMSC 公司的,这样 Linux
内核就会找到 SMSC 公司的 PHY 芯片驱动来驱动 LAN8720A。
第 195 行,注意"ethernet-phy@"后面的数字是 PHY 的地址,ENET1 的 PHY 地址为 0,
所以"@"后面是 0(默认为 2)。
第 198行,reg 的值也表示 PHY 地址,ENET1 的 PHY 地址为 0,所以 reg=0。
第 201 行,ENET2 的 PHY 地址为 1,因此"@"后面为 1。
第 204 行,因为 ENET2 的 PHY 地址为 1,所以 reg=1。
至此,LAN8720A 的 PHY 地址就改好了,保存一下 imx6ull-alientek-emmc.dts 文件。然后
使用"make dtbs"命令重新编译一下设备树。
总结
对网络驱动进行了一部分修改。