I.MX6ULL的MAC网络外设设备树实现说明二

发布于:2024-04-04 ⋅ 阅读:(118) ⋅ 点赞:(0)

一.  简介

前面一篇文章说明了 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 = <&ethphy0>;
    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 = <&ethphy1>;
    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	0x1b0b0
				MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER	0x1b0b0
				MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00	0x1b0b0
				MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01	0x1b0b0
				MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN	0x1b0b0
				MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00	0x1b0b0
				MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01	0x1b0b0
                MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
          
            
			>;
		};

		pinctrl_enet2: enet2grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
				MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
				MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
				MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
				MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
				MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
				MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
				MX6UL_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 节点下,所以就分成了两部分。


网站公告

今日签到

点亮在社区的每一天
去签到