linux 系统移植(第十六期)---Linux 内核移植(5)-- 修改网络驱动(1)--- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

[一、修改 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 的网络原理图)

1.2、修改驱动代码

[二、修改 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 = <&ethphy0>;
176 	status = "okay";
177 };

178
179 &fec2 {
180 	pinctrl-names = "default";
181 	......
183 	phy-handle = <&ethphy1>;
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 = <&ethphy0>;
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 = <&ethphy1>;
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"命令重新编译一下设备树。


总结

对网络驱动进行了一部分修改。

相关推荐
雾削木2 小时前
STM32 HAL库 BMP280气压计读取
linux·stm32·单片机·嵌入式硬件
峥嵘life2 小时前
Android16 EDLA【CTS】CtsNetTestCases存在fail项
android·java·linux·学习·elasticsearch
OopspoO2 小时前
lubancat-A1
嵌入式硬件
航Hang*2 小时前
计算机等级考试(三级Linux技术)--- 考纲与知识点
linux·运维·服务器·计算机三级·计算机等级考试
txinyu的博客2 小时前
虚拟内存
linux·运维·服务器
Y1rong2 小时前
STM32之ADC
stm32·单片机·嵌入式硬件
蓬荜生灰2 小时前
STM32(8)-- 自己创建库函数
stm32·单片机·嵌入式硬件
楼田莉子2 小时前
Linux进程间通信——管道
linux·运维·服务器·c++·学习
qq_401700412 小时前
基于CN3762 PWM 降压模式双节18650锂电池充电管理芯片
单片机·嵌入式硬件