热度 17
2020-2-20 11:50
1890 次阅读|
0 个评论
By Toradex 秦海 1). 简介 NXP iMX7 是 NXP 基于 Cortex-A7 和 Coretex-M4 异构多核架构的 ARM 处理器,其中 iMX7 Dual 型号 SoC 支持两路 MAC 控制器,可以通过外置百兆或者千兆 PHY 芯片扩展两路以太网接口,本文就基于 Toradex 基于 NXP iMX7 Dual SoC 的 ARM 核心板模块 Colibri iMX7D 示例扩展两路以太网。 2). 第一路以太网 a). Colibri iMX7D 模块已经通过模块上面部署的一个 Microchip KSZ8041NL 百兆 PHY 芯片默认支持了第一路百兆以太网 b). KSZ8041NL 的参考电路请参考 这里 (原理图示例的 SoC MAC 端来自 Toradex VF61 ARM 模块的定义,在 iMX7 或者其他平台上面不能直接引用,请只参考 PHY 一侧的连接) c). 由于选择的 iMX7D ENET1 MAC RMII 接口 50MHz 参考时钟输出引脚 GPIO1_IO12 和另外一个 M4 核心的 NMI 输入引脚冲突,因此最终在设计中,这一路的 KSZ8041PHY 使用了外部参考时钟,没有使用 iMX7 ENET1 的参考时钟输出 d). 基于上述配置的第一步以太网对应的 device tree 节点定义和 pinmux 定义请参考如下,内核基于 4.9.166 版本 --------------------------------------- # arch/arm/boot/dts/imx7-colibri.dtsi …… &fec1 { pinctrl-names = "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; clocks = , , , ; clock-names = "ipg", "ahb", "ptp", "enet_clk_ref"; assigned-clocks = , ; assigned-clock-parents = ; assigned-clock-rates = , ; phy-mode = "rmii"; phy-supply = ; 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 ; }; --------------------------------------- 3). 第二路以太网 a). 第二路以太网通过模块预留的 RMII 或者 RGMII 接口连接百兆 PHY 或者千兆 PHY 来扩展, Colibri iMX7D RMII 或者 RGMII 接口管脚定义请参考 手册 5.4 章节。 b). 同样使用 KSZ8041NL 百兆 PHY 扩展的参考电路请参考 这里 (原理图示例的 SoC MAC 端来自 Toradex VF61 ARM 模块的定义,在 iMX7 或者其他平台上面不能直接引用,须按照上面手册定义连接),如需要连接千兆 PHY ,请参考所使用的千兆 PHY (如 Microchip KSZ9031RNL )手册进行连接 c). 通过 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 的更多说明请参考 这里 。 d). 通过 RGMII 连接千兆 PHY 的 device tree 配置请参考 这里 4). 总结 本文基于 iMX7 示例了双路以太网的设计和配置思路,同时对于其他支持双路 MAC 的 NXP i.MX ARM 处理器(如 iMX8 )的配置思路也都是一致的,只是具体的 clock 和 pinmux 定义等要做对应的适配