一. 简介
前面一篇文章说明了 I.MX6ULL的MAC网络外设设备树编写时,必需写的属性与可选的属性信息,以及NXP 官方编写的IMX6ULL的MAC网络外设的设备节点信息,文章如下:
I.MX6ULL的MAC网络外设设备树实现说明一-CSDN博客
NXP 官方编写的IMX6ULL的MAC网络外设的设备节点还不完整,不能正常工作,还需要添加针对实际使用所要添加的信息。本文在 此基础上添加ALPHA开发板上有线网络的设备节点信息。
二. I.MX6ULL的MAC网络外设设备树实现说明二
这里在 NXP官方编写的MAC网络外设的设备节点的基础上,添加ALPHA开发板上有线网络的设备节点信息。例如,网络 所使用的引脚 pinctrl 节点信 息, 设置网络对应的 PHY 芯片接口为 MII还是RMII,复位IO等等信息。
1.追加的MAC网络外设的节点信息
打开内核源码(NXP官方提供),打开源码根目录下 arch/arm/boot/dts/imx6ull-14x14-evk.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";smsc,disable-energy-detect;reg = <0>;};ethphy1: ethernet-phy@1 {compatible = "ethernet-phy-ieee802.3-c22";smsc,disable-energy-detect;reg = <1>;};};
};
上面的( IMX6ULL的MAC网络外设的设备节点 )网络设备节点是作者在移植 Linux 内核的时候已经根据 ALPHA 开发板修改后的,并 不是 NXP 官方原版节点信息,所以会有一点出入。
说明如下:
第 1~10 行: ENET1 网口的节点属性。
第 3 、 4 行,设置 ENET1 所使用的引脚 pinctrl 节点信 息,
第 5 行设置网络对应的 PHY 芯片接口为 RMII ,这个要根据实际的硬件来设置。
第 6 行设 置 PHY 芯片的句柄为 ethphy0 , MDIO 节点会设置 PHY 信息。其他的属性信息就很好理解了, 基本已经在上面讲解绑定文档的时候说过了。
第 12~36 行: ENET2 网口的节点属性,基本和 ENET1 网口一致。
区别就是多了第 22~35 行的 mdio 子节点,前面讲解绑定文档的时候说了, mido 子节点用于描述 MIDO 总线,在此子 节点内会包含 PHY 节点信息。这里一共有两个 PHY 子节点: ethphy0 和 ethphy1 ,分别对应 ENET1 和 ENET2 的 PHY 芯片。
比如,第 26 行的 “ ethphy0: ethernet-phy@0 ” 就是 ENET1 的 PHY 节点名字,“ @ ” 后面的 0 就是此 PHY 芯片的芯片地址, reg 属性也是描述 PHY 芯片地址的, 这点和 IIC 设备节点很像。
2.设备树中网络相关引脚的描述
最后就是设备树中网络相关引脚的描述,打开 arch/arm/boot/dts/imx6ull-14x14-evk.dts ,找到如下所示内容:
pinctrl_enet1: enet1grp {fsl,pins = <MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009>;};pinctrl_enet2: enet2grp {fsl,pins = <MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0 MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009 >;};
上面的网络相关引脚的描述编写在 &iomuxc下。
注意第 16 、 17 行,这两行设置 GPIO1_IO07 和 GPIO1_IO06 为 ENET2 的 MDC 和 MDIO ,
大家可能会疑问,为什么不将其设置为 ENET1 的 MDC 和 MDIO 呢?
经过笔者实测,在开启两 个网口的情况下,将 GPIO1_IO07 和 GPIO1_IO06 设置为 ENET1 的 MDC 和 MDIO 会对导致网 络工作不正常。
前面说了,一个 MDIO 接口可以管理 32 个 PHY ,所以设置 ENET2 的 MDC 和 MDIO 以后也是可以管理 ENET1 上的 PHY 芯片。
3. MAC网络外设的复位IO
打开arch/arm/boot/dts/imx6ull-14x14-evk.dts ,找到复位IO:
/*enet1 reset WeiWuXian*/pinctrl_enet1_reset: enet1resetgrp {fsl,pins = </* used for enet1 reset */MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 >;};/*enet2 reset WeiWuXian*/pinctrl_enet2_reset: enet2resetgrp {fsl,pins = </* used for enet2 reset */MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0 >;};
pinctrl_enet1 和 pinctrl_enet1_reset 问 ENET1 所有的 IO 引脚 pinctrl 信息,之所以分两部分主 要 是 因 为 ENET1 的 复 位 引 脚 为 GPIO5_IO07 , 而 GPIO5_IO07 对 应 的 引 脚 就 是 SNVS_TAMPER7,要放到 iomuxc_snvs 节点下,所以就分成了两部分。