Linux内核移植之网络驱动更改说明一

一.  简介

本文学习 NXP官方Linux内核移植网络驱动的更改。

为了方便后面 Linux驱动的开发调试,所以,必须要把网络驱动调试好。

如果在做 Linux驱动开发时,写了一个 app或驱动,就需要将系统全部文件(即 uboot,kernel,.dtb文件,filesystem文件系统)烧写到开发板上,这个烧写过程是很慢的,filesystem根文件系统是很大的。

网络调试的话,可以将所有文件存放在 ubuntu系统下,开发板系统启动后,将 ubuntu系统下的 某个文件目录挂载在开发板上。如果更新了某个程序或文件,可以将其直接拷贝到该文件目录下,开发板就可以直接运行调试。这样调试十分方便。

二.   Linux内核移植之网络驱动更改

在学习 uboot 移植的时候就已经说过了,正点原子开发板的网络和 NXP(恩智浦) 官方的网络硬件上 不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A ,两个网络 PHY 芯片的复位 IO 也不同。 所以, NXP官方的 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修 改。

网络驱动的更改大体有五个方面更改。下面具体说明更改点。

1.  修改 LAN8720 的复位引脚驱动 与 网络时钟引脚驱动

(1) 删除 LAN8720(PHY芯片)的复位引脚做别的功能

结合IMX6ULL参考手册与网络硬件原理图可以知道,网络 ENET1 复位引脚 ENET1_RST 连接在 I.M6ULL SNVS_TAMPER7 这个引脚上。网络ENET2 的复位引脚 ENET2_RST 连接在 I.MX6ULL SNVS_TAMPER8 上。

这里我所使用的开发板是 nand-Flash版,对应的设备树配置文件为 imx6ull-alientek-nand.dts(之前添加ALPHA开发板添加的)。因为 imx6ull-alientek-nand.dts调用了imx6ull-14x14-evk.dts文件。

打开设备树文件 imx6ull-14x14-evk.dts,如下代码:

		pinctrl_spi4: spi4grp {
                        fsl,pins = <
                                MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1
                                MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1
                               /* MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07      0x70a1 */
                               /* MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08      0x80000000 */
                        >;
                };
5 行和 第 6 行,就是初始化 SNVS_TAMPER7 SNVS_TAMPER8 这两个 引脚的,这里是作为了 SPI4 IO ,这不是我们想要的,所以将第5行 第6行 代码 删除掉!

继续在 imx6ull-14x14-evk.dts 文件中,找到如下代码:

spi4 {
		compatible = "spi-gpio";
....................................
	/*	pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
		status = "okay";
		gpio-sck = <&gpio5 11 0>;
		gpio-mosi = <&gpio5 10 0>;
	/*	cs-gpios = <&gpio5 7 0>;  */
		num-chipselects = <1>;
...................................
}

如上所示:4 行,设置 GPIO5_IO08 SPI4 的一个功能引脚(我也不清楚具体作为什么功能用)GPIO5_IO08 就是 SNVS_TAMPER8 GPIO 功能引脚。

8 行,设置 GPIO5_IO07 作为 SPI4 的片选引脚,而 GPIO5_IO07 就是 SNVS_TAMPER7 GPIO 功能引脚。
现在我们需要 GPIO5_IO07 GPIO5_IO08 分别作为 ENET1 ENET2 的复位引脚,而不 SPI4 的功能引脚,因此,需要将上面第 4 行与第 8 行 处的代码删除掉!! 否则会干扰到网络复位引脚!

(2) 添加网络复位引脚,配置网络时钟

imx6ull-14x14-evk.dts 文件中找到名为 “ iomuxc_snvs ” 的节点 ,然后在 此节点下添加网络复位引脚信息,添加完成以后的 “ iomuxc_snvs ” 的节点内容如下:

&iomuxc_snvs {
	pinctrl-names = "default_snvs";
        pinctrl-0 = <&pinctrl_hog_2>;
        imx6ul-evk {
...............................    
        /*enet1 reset zuozhongkai*/
        pinctrl_enet1_reset: enet1resetgrp {
                       fsl,pins = <
                                /* used for enet1 reset */
                                MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 
                        >;
               };

        /*enet2 reset zuozhongkai*/
        pinctrl_enet2_reset: enet2resetgrp {
                        fsl,pins = <
                                /* used for enet2 reset */
                                MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 
                        >;
               };

        };
};

最后还需要修改一下 ENET1 ENET2 网络时钟引脚配置,继续在imx6ull-14x14-evk.dts 文件中,找到如下代码:

		pinctrl_enet1: enet1grp {
			fsl,pins = <
				MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN	0x1b0b0
...............................
                MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
       
            
			>;
		};

		pinctrl_enet2: enet2grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
...............................
                MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
             
			>;
		};
 MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1与MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 分别为 ENET1 和 ENET2 的网络时钟引脚配置信息,将这两个引脚的电 气属性值改为 0x4001b009 ,原来默认值为 0x4001b031

2.  修改 fec1 和 fec2 节点的 pinctrl-0 属性

在 imx6ull-14x14-evk.dts 文件中,找到名为 “ fec1 ” 和 “ fec2 ” 的这两个节点,修改其中的 “ pinctrl-0 ”属性值,修改以后如下所示:
&fec1 {
	pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1
                &pinctrl_enet1_reset>; 
	phy-mode = "rmii";
............................
};

&fec2 {
	pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet2
                &pinctrl_enet2_reset>;  
...........................
};

3~4 行,修改后的 fec1 节点“ pinctrl-0 ”属性值。
14~15 行,修改后的 fec2 节点“ pinctrl-0 ”属性值。

3.  修改 LAN8720A 的 PHY 地址

imx6ull-alientek-emmc.dts 中,找到 "&fec1 " 与 "&fec2" 如下代码

&fec1 {
	pinctrl-names = "default";
.................................
    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
..................................
    phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
	status = "okay";

	mdio {
..................................

		ethphy0: ethernet-phy@0 {
			compatible = "ethernet-phy-ieee802.3-c22";
            smsc,disable-energy-detect;
			reg = <0>;
		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-ieee802.3-c22";
            smsc,disable-energy-detect;
			reg = <1>;
		};
	};
};

4 行,添加了 ENET1 网络复位引脚所使用的 IO GPIO5_IO07 ,低电平有效。 复位低电平信号持续时间为 200ms
12 行, ENET2 网络复位引脚所使用的 IO GPIO5_IO08 ,同样低电平有效,持 续时间同样为 200ms
smsc,disable-energy-detect ”表明 PHY 芯片是 SMSC 公司的,这样 Linux 内核就会找到 SMSC 公司的 PHY 芯片驱动来驱动 LAN8720A
mdio节点处, 注意 “ ethernet-phy@ ” 后面的数字是 PHY 的地址, ethphy0 PHY 地址为 0 所以“ @ ”后面更改为 0 。 同理,ethphy1的 PHY地址为 1。
reg 的值也表示 PHY 地址, ethphy0 PHY 地址为 0 ,所以 reg=0 。ethphy1的 PHY地址为 1,则 对应的 reg=1。

至此, LAN8720A PHY 地址就改好了,保存一下 imx6ull-alientek-emmc.dts 文件。然后
使用“ make dtbs ”命令重新编译一下设备树。

三. 测试是否 ping的通 ubuntu系统

其实到这里,开发板应该可以 ping的通 ubuntu系统了。

开发板设置好通过 tftp服务下载 zImage与 设备树文件后,也设置了 ip地址后。开发板上电启动。

进入开发板的根文件系统,设置 eth0 的 ip地址。操作如下:


root@ATK-IMX6U:~# ifconfig eth0 192.168.1.50

然后 进行ping ubuntu的操作:

root@ATK-IMX6U:~# ping 192.168.1.66
PING 192.168.1.66 (192.168.1.66) 56(84) bytes of data.
64 bytes from 192.168.1.66: icmp_seq=1 ttl=64 time=1.13 ms
64 bytes from 192.168.1.66: icmp_seq=2 ttl=64 time=1.28 ms
64 bytes from 192.168.1.66: icmp_seq=3 ttl=64 time=0.907 ms

可以看出,至此网络基本可以 Ping通 ubuntu系统。

修改网络复位IO和PHY ID以后,Linux内核内部通用PHY驱动已经正常工作。

但是,正点原子视频学习中左神说,网络可能有时候还是存在一些问题。所以,还需要做一些其他的更改。下一篇继续学习网络其他方面的更改。

你可能感兴趣的:(系统移植篇,Kernel,linux,arm开发)