三 Linux 网络驱动-MAC、PHY层驱动框架( 二 )

<1>;fsl,num-rx-queues=<1>;fsl,magic-packet;fsl,wakeup_irq = <0>;status = "disabled";};
fec1 和 fec2 分别对应 I. 的 ENET1 和 ENET2 , 至于节点的具体属性就不分析了 ,  上面在讲解绑定文档的时候就已经详细的讲过了 。示例代码 69.4.1.1 是 NXP 官方编写的 , 我们 不需要去修改 , 但是示例代码 69.4.1.1 是不能工作的 , 还需要根据实际情况添加或修改一些属 性 。打开 --emmc.dts , 找到如下内容:
&fec1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_enet1&pinctrl_enet1_reset>;phy-mode = "rmii";phy-handle = <ðphy0>;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-mode = "rmii";phy-handle = <ðphy1>;phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;phy-reset-duration = <200>;status = "okay";mdio {#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0>;};ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";reg = <1>;};};
第 1~10 行:ENET1 网口的节点属性 , 第 3、4 行设置 ENET1 所使用的引脚节点信 息 , 第 5 行设置网络对应的 PHY 芯片接口为 RMII , 这个要根据实际的硬件来设置 。第 6 行设 置 PHY 芯片的句柄为  , MDIO 节点会设置 PHY 信息 。其他的属性信息就很好理解了 ,  基本已经在上面讲解绑定文档的时候说过了 。
第 12~36 行:ENET2 网口的节点属性 , 基本和 ENET1 网口一致 , 区别就是多了第 22~35 行的 mdio 子节点 , 前面讲解绑定文档的时候说了 , mido 子节点用于描述 MIDO 总线 , 在此子 节点内会包含 PHY 节点信息 。这里一共有两个 PHY 子节点: 和  , 分别对应 ENET1 和 ENET2 的 PHY 芯片 。比如第 26 行的“: -phy@0”就是 ENET1 的 PHY 节点名字 , “@”后面的 0 就是此 PHY 芯片的芯片地址 , reg 属性也是描述 PHY 芯片地址的 ,  这点和 IIC 设备节点很像 。其他地方就没什么好多的了 , 绑定文档已经讲解的很清楚了 。
最后就是设备树中网络相关引脚的描述 , 打开 --emmc.dts , 找到如下所示内容:
1 pinctrl_enet1: enet1grp {2fsl,pins = <3MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b04MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b05MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b06MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b07MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b08MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b09MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b010MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b00911 >;12 };1314 pinctrl_enet2: enet2grp {15fsl,pins = <16MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b017MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b018MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b019MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b020MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b021MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b022MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b023MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b024MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b025MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b00926>;27 };2829 /*enet1 reset zuozhongkai*/30 pinctrl_enet1_reset: enet1resetgrp {31fsl,pins = <32 /* used for enet1 reset */33MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 34>;35 };3637 /*enet2 reset zuozhongkai*/38 pinctrl_enet2_reset: enet2resetgrp {39fsl,pins = <40 /* used for enet2 reset */41MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 42>;43 };
和是 ENET1 所有的 IO 引脚信息 , 之所以分两部分 主 要 是 因 为 ENET1 的 复 位 引 脚 为 ,  而对 应 的 引 脚 就 是  , 要放到节点下 , 所以就分成了两部分 。注意第 16、17 行 , 这两行设置和为 ENET2 的 MDC 和 MDIO ,  大家可能会疑问 , 为什么不将其设置为 ENET1 的 MDC 和 MDIO 呢?经过笔者实测 , 在开启两 个网口的情况下 , 将和设置为 ENET1 的 MDC 和 MDIO 会对导致网 络工作不正常 。前面说了 , 一个 MDIO 接口可以管理 32 个 PHY , 所以设置 ENET2 的 MDC 和 MDIO 以后也是可以管理 ENET1 上的 PHY 芯片 。