NXP iMX7雙以太網(wǎng)配置
1). 簡介
NXP iMX7是NXP基于Cortex-A7和Coretex-M4異構(gòu)多核架構(gòu)的ARM處理器,其中iMX7 Dual型號SoC支持兩路MAC控制器,可以通過外置百兆或者千兆PHY芯片擴展兩路以太網(wǎng)接口,本文就基于Toradex基于NXP iMX7 Dual SoC的ARM核心板模塊Colibri iMX7D示例擴展兩路以太網(wǎng)。
2). 第一路以太網(wǎng)
a). Colibri iMX7D模塊已經(jīng)通過模塊上面部署的一個Microchip KSZ8041NL 百兆PHY芯片默認支持了第一路百兆以太網(wǎng)
b). KSZ8041NL的參考電路請參考這里(原理圖示例的SoC MAC端來自Toradex VF61 ARM模塊的定義,在iMX7或者其他平臺上面不能直接引用,請只參考PHY一側(cè)的連接)
c). 由于選擇的iMX7D ENET1 MAC RMII接口 50MHz 參考時鐘輸出引腳GPIO1_IO12和另外一個M4核心的NMI輸入引腳沖突,因此最終在設(shè)計中,這一路的KSZ8041PHY使用了外部參考時鐘,沒有使用iMX7 ENET1的參考時鐘輸出
d). 基于上述配置的第一步以太網(wǎng)對應(yīng)的device tree節(jié)點定義和pinmux定義請參考如下,內(nèi)核基于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 = <?_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
>;
};
---------------------------------------
3). 第二路以太網(wǎng)
a). 第二路以太網(wǎng)通過模塊預(yù)留的RMII或者RGMII接口連接百兆PHY或者千兆PHY來擴展,Colibri iMX7D RMII或者RGMII接口管腳定義請參考手冊5.4章節(jié)。
b). 同樣使用KSZ8041NL 百兆PHY擴展的參考電路請參考這里(原理圖示例的SoC MAC端來自Toradex VF61 ARM模塊的定義,在iMX7或者其他平臺上面不能直接引用,須按照上面手冊定義連接),如需要連接千兆PHY,請參考所使用的千兆PHY(如Microchip KSZ9031RNL)手冊進行連接
c). 通過ENET2 RMII接口連接KSZ8041NL百兆PHY的device tree配置參考如下patch,和上面第一路以太網(wǎng)不同,這次使用的iMX7 SoC內(nèi)部的參考時鐘輸出給PHY,因此在clock項目配置會有不同
// 對于 &fec2節(jié)點中的 “fsl,mii-exclusive” 參數(shù),因為ENET1和ENET2分別使用其對應(yīng)的MDIO總線,而不是共享一個MDIO總線,在4.9 kernel下,如果不配置這個參數(shù),驅(qū)動會默認都使用ENET1的MDIO去配置ENET2,因此在這里是必須的。但在其他i.MX平臺或者mainline kernel下則不一定需要。
// MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2 配置為0x40000073,因為使用iMX7 SoC內(nèi)部參考時鐘,這個時鐘要同時給PHY和MAC提供參考時鐘,因此Input和Output都要配置使能,因此需要為 0x40000073,關(guān)于pinctrl的更多說明請參考這里。
d). 通過RGMII連接千兆PHY的device tree配置請參考這里
4). 總結(jié)
本文基于iMX7示例了雙路以太網(wǎng)的設(shè)計和配置思路,同時對于其他支持雙路MAC的NXP i.MX ARM處理器(如iMX8)的配置思路也都是一致的,只是具體的clock和pinmux定義等要做對應(yīng)的適配
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試