本文学习 NXP官方Linux内核移植网络驱动的更改。
为了方便后面 Linux驱动的开发调试,所以,必须要把网络驱动调试好。
如果在做 Linux驱动开发时,写了一个 app或驱动,就需要将系统全部文件(即 uboot,kernel,.dtb文件,filesystem文件系统)烧写到开发板上,这个烧写过程是很慢的,filesystem根文件系统是很大的。
网络调试的话,可以将所有文件存放在 ubuntu系统下,开发板系统启动后,将 ubuntu系统下的 某个文件目录挂载在开发板上。如果更新了某个程序或文件,可以将其直接拷贝到该文件目录下,开发板就可以直接运行调试。这样调试十分方便。
网络驱动的更改大体有五个方面更改。下面具体说明更改点。
(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 */
>;
};
继续在 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 功能引脚。
(2) 添加网络复位引脚,配置网络时钟
&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
>;
};
&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>;
...........................
};
在 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>;
};
};
};
开发板设置好通过 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驱动已经正常工作。
但是,正点原子视频学习中左神说,网络可能有时候还是存在一些问题。所以,还需要做一些其他的更改。下一篇继续学习网络其他方面的更改。