NXP iMX7双以太网配置

Thursday, February 20, 2020

简介

NXP iMX7 是 NXP 基于 Cortex-A7 和 Coretex-M4 异构多核架构的 Arm 处理器,其中 iMX7 Dual 型号 SoC 支持两路 MAC 控制器,可以通过外置百兆或者千兆 PHY 芯片扩展两路以太网接口,本文就基于 Toradex 基于 NXP iMX7 Dual SoC 的 Arm 核心板模块 Colibri iMX7D 示例扩展两路以太网。

第一路以太网

Colibri iMX7D 模块已经通过模块上面部署的一个 Microchip KSZ8041NL  百兆 PHY 芯片默认支持了第一路百兆以太网。

KSZ8041NL 的参考电路请参考这里(原理图示例的 SoC MAC 端来自 Toradex VF61 Arm 模块的定义,在 iMX7 或者其他平台上面不能直接引用,请只参考 PHY 一侧的连接)。

由于选择的 iMX7D ENET1 MAC RMII 接口 50MHz 参考时钟输出引脚 GPIO1_IO12 和另外一个 M4 核心的 NMI 输入引脚冲突,因此最终在设计中,这一路的KSZ8041PHY 使用了外部参考时钟,没有使用iMX7 ENET1的参考时钟输出。

基于上述配置的第一步以太网对应的 device tree 节点定义和 pinmux 定义请参考如下,内核基于4.9.166版本

arch/arm/boot/dts/imx7-colibri.dtsi

&fec1 {
       pinctrl-names = "default", "sleep";
       pinctrl-0 = <&pinctrl_enet1>;
       pinctrl-1 = <&pinctrl_enet1_sleep>;
       clocks = <&clks IMX7D_ENET1_IPG_ROOT_CLK>,
               <&clks IMX7D_ENET_AXI_ROOT_CLK>,
               <&clks IMX7D_ENET1_TIME_ROOT_CLK>,
               <&clks IMX7D_PLL_ENET_MAIN_50M_CLK>;
       clock-names = "ipg", "ahb", "ptp", "enet_clk_ref";
       assigned-clocks = <&clks IMX7D_ENET1_TIME_ROOT_SRC>,
                         <&clks IMX7D_ENET1_TIME_ROOT_CLK>;
       assigned-clock-parents = <&clks IMX7D_PLL_ENET_MAIN_100M_CLK>;
       assigned-clock-rates = <0>, <100000000>;
       phy-mode = "rmii";
       phy-supply = <&reg_LDO1>;
       fsl,magic-packet;
};

&iomuxc {

pinctrl_enet1: enet1grp {
               fsl,pins = <
                       MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL 0x73
                      MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0       0x73
                       MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1       0x73
                      MX7D_PAD_ENET1_RGMII_RXC__ENET1_RX_ER           0x73

                       MX7D_PAD_ENET1_RGMII_TX_CTL__ENET1_RGMII_TX_CTL 0x73
                       MX7D_PAD_ENET1_RGMII_TD0__ENET1_RGMII_TD0       0x73
                       MX7D_PAD_ENET1_RGMII_TD1__ENET1_RGMII_TD1       0x73、
                      MX7D_PAD_GPIO1_IO12__CCM_ENET_REF_CLK1          0x73
                       MX7D_PAD_SD2_CD_B__ENET1_MDIO                   0x3
                       MX7D_PAD_SD2_WP__ENET1_MDC                      0x3
               >;
       };

pinctrl_enet1_sleep: enet1sleepgrp {
               fsl,pins = <
                       MX7D_PAD_ENET1_RGMII_RX_CTL__GPIO7_IO4          0x0
                       MX7D_PAD_ENET1_RGMII_RD0__GPIO7_IO0             0x0
                       MX7D_PAD_ENET1_RGMII_RD1__GPIO7_IO1     0x0
                       MX7D_PAD_ENET1_RGMII_RXC__GPIO7_IO5     0x0

                       MX7D_PAD_ENET1_RGMII_TX_CTL__GPIO7_IO10 0x0
                       MX7D_PAD_ENET1_RGMII_TD0__GPIO7_IO6     0x0
                      MX7D_PAD_ENET1_RGMII_TD1__GPIO7_IO7     0x0
                       MX7D_PAD_GPIO1_IO12__GPIO1_IO12         0x0
                       MX7D_PAD_SD2_CD_B__GPIO5_IO9            0x0
                       MX7D_PAD_SD2_WP__GPIO5_IO10             0x0
               >;
       };


第二路以太网

第二路以太网通过模块预留的 RMII 或者 RGMII 接口连接百兆 PHY 或者千兆 PHY 来扩展,Colibri iMX7D RMII 或者 RGMII接 口管脚定义请参考手册5.4章节。

同样使用 KSZ8041NL 百兆 PHY 扩展的参考电路请参考这里(原理图示例的 SoC MAC 端来自 Toradex VF61 Arm 模块的定义,在 iMX7 或者其他平台上面不能直接引用,须按照上面手册定义连接),如需要连接千兆 PHY,请参考所使用的千兆PHY(如 Microchip KSZ9031RNL )手册进行连接。

通过 ENET2 RMII 接口连接 KSZ8041NL 百兆 PHY 的 device tree 配置参考如下 patch,和上面第一路以太网不同,这次使用的 iMX7 SoC 内部的参考时钟输出给 PHY,因此在 clock 项目配置会有不同。

https://github.com/simonqin09/colibri_imx7_2nd_ethernet/blob/master/0001-imx7d-2nd-ethernet-support_update_20200218.patch

对于 &fec2 节点中的  “fsl,mii-exclusive” 参数,因为 ENET1 和 ENET2 分别使用其对应的 MDIO 总线,而不是共享一个 MDIO 总线,在 4.9 kernel 下,如果不配置这个参数,驱动会默认都使用 ENET1 的 MDIO 去配置 ENET2,因此在这里是必须的。但在其他 i.MX 平台或者 mainline kernel 下则不一定需要。

MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2 配置为 0x40000073,因为使用 iMX7 SoC 内部参考时钟,这个时钟要同时给 PHY 和 MAC 提供参考时钟,因此 Input 和 Output 都要配置使能,因此需要为 0x40000073,关于 pinctrl 的更多说明请参考这里

通过 RGMII 连接千兆 PHY 的 device tree 配置请参考这里

总结

本文基于 iMX7 示例了双路以太网的设计和配置思路,同时对于其他支持双路 MAC 的 NXP i.MX Arm 处理器(如iMX8)的配置思路也都是一致的,只是具体的 clock 和 pinmux 定义等要做对应的适配。

Author 秦海,技术销售工程师,韬睿(上海)

Leave a comment

Your email ID will be kept confidential. Required fields are marked *

Please enter the letters as they are shown in the image above. Letters are not case-sensitive.



* Your comment will be reviewed and then added. Thank you.