一. 简介
本文学习 NXP官方Linux内核移植网络驱动的更改。
为了方便后面 Linux驱动的开发调试,所以,必须要把网络驱动调试好。
如果在做 Linux驱动开发时,写了一个 app或驱动,就需要将系统全部文件(即 uboot,kernel,.dtb文件,filesystem文件系统)烧写到开发板上,这个烧写过程是很慢的,filesystem根文件系统是很大的。
网络调试的话,可以将所有文件存放在 ubuntu系统下,开发板系统启动后,将 ubuntu系统下的 某个文件目录挂载在开发板上。如果更新了某个程序或文件,可以将其直接拷贝到该文件目录下,开发板就可以直接运行调试。这样调试十分方便。
二. Linux内核移植之网络驱动更改
网络驱动的更改大体有五个方面更改。下面具体说明更改点。
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 0x70a1MX6ULL_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 >;};};
};
2. 修改 fec1 和 fec2 节点的 pinctrl-0 属性
&fec1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_enet1&pinctrl_enet1_reset>; phy-mode = "rmii";
............................phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;phy-reset-duration = <200>;status = "okay";
};&fec2 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_enet2&pinctrl_enet2_reset>;
...........................phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;phy-reset-duration = <200>;status = "okay";
};