“Ethernet device tree configuration”的版本间的差异
Zhouyuebiao(讨论 | 贡献) |
|||
(未显示2个用户的9个中间版本) | |||
第1行: | 第1行: | ||
− | + | == Article purpose == | |
+ | 本文介绍如何在将 [[ETH internal peripheral|Ethernet]] 分配给Linux<sup>®</sup> 操作系统时对其进行配置。 在这种情况下,它由[[Ethernet overview|Ethernet framework]]控制。 | ||
− | [[ | + | 使用[[Device tree|device tree]] 机制执行配置,该机制提供STM32 DWMAC驱动程序使用的以太网外围设备的硬件描述。 |
− | [[ | + | |
− | + | == DT bindings documentation == | |
− | [[ | + | “以太网”是一种多功能设备。 |
− | [[ | + | 每个函数由一个单独的绑定文档表示: |
+ | * “通用”以太网设备树绑定 <ref>{{CodeSource | Linux kernel | Documentation/devicetree/bindings/net/stmmac.txt}}</ref> | ||
+ | * 特定的STM32 ETH设备树绑定<ref>{{CodeSource | Linux kernel | Documentation/devicetree/bindings/net/stm32-dwmac.txt}}</ref> | ||
+ | |||
+ | == DT configuration == | ||
+ | 本硬件描述是'''STM32微处理器'''设备树文件(".dtsi"扩展名)和 '''板卡'''设备树文件(".dts"扩展名)的组合。有关设备树文件分割的说明,请参见 [[Device tree]]。 | ||
+ | |||
+ | === DT configuration (STM32 level) === | ||
+ | |||
+ | 以太网外围节点位于stm32mp157c.dtsi<ref>{{CodeSource | Linux kernel | arch/arm/boot/dts/stm32mp157c.dtsi | arch/arm/boot/dts/stm32mp157c.dtsi}}, STM32MP157C device tree file</ref> 文件,该文件具有禁用状态和一些必需的属性,例如: | ||
+ | * 物理基址和设备寄存器映射的大小 | ||
+ | * STMMAC中断 | ||
+ | * stmmaceth时钟和Rx,Tx时钟 | ||
+ | |||
+ | 这是一组属性,这些属性对于给定的STM32MP器件可能不会改变,例如:寄存器地址,中断,时钟等。 | ||
+ | |||
+ | <pre> | ||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_NONE>; | ||
+ | interrupt-names = "macirq"; | ||
+ | clock-names = "stmmaceth", | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp", | ||
+ | "syscfg-clk"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>, | ||
+ | <&rcc SYSCFG>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | </pre> | ||
+ | |||
+ | 必需属性和可选属性在 [[Ethernet device tree configuration#DT bindings documentation|bindings files]]中有详细描述。 | ||
+ | {{Warning|该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。}} | ||
+ | |||
+ | === Ethernet DT configuration (board level) === | ||
+ | |||
+ | 设备树板文件(.dts)包含与板设计有关的所有硬件配置。 DT节点(''' ethernet''')应该更新为: | ||
+ | * 通过设置'''status = okay'''启用以太网块。 | ||
+ | * 通过 [[Pinctrl overview|pinctrl]],通过 '''pinctrl-0''' (默认管脚), '''pinctrl-1''' (睡眠管脚) and '''pinctrl-names'''来配置正在使用的管脚。 | ||
+ | * 配置以太网接口使用 '''phy-mode = "rgmii".''', (rmii, mii, gmii). | ||
+ | * 配置以太网最大速度 '''max-speed = <1000>".'''. | ||
+ | |||
+ | <pre> | ||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rgmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rgmii"; | ||
+ | max-speed = <1000>; | ||
+ | phy-handle = <&phy0>; | ||
+ | |||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@1 { | ||
+ | reg = <1>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | </pre> | ||
+ | |||
+ | === DT configuration examples === | ||
+ | 以下示例显示了如何在板级配置和启用以太网实例: | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; {{highlight|/* enable ethernet0 */}} | ||
+ | pinctrl-0 = <ðernet0_rmii_pins_a>; {{highlight|/* configure pinctrl modes for ethernet0 */}} | ||
+ | pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; {{highlight|/* configure ethernet0_rmii_pins_sleep_a as sleep pinctrl configuration for ethernet0 */}} | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rmii"; {{highlight|/* configure ethernet phy mode for ethernet0 */}} | ||
+ | max-speed = <100>; {{highlight|/* configure ethernet max speed for ethernet0 */}} | ||
+ | phy-handle = <&phy0>; | ||
+ | |||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@1 { | ||
+ | reg = <1>; {{highlight|/* configure ethernet phy @ for ethernet0 */}} | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | 如何为以下配置以太网: | ||
+ | * RMII with Crystal on PHY: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rmii"; | ||
+ | max-speed = <100>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | * RMII with 25MHz on ETH_CLK (no PHY Crystal), REF_CLK from PHY: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | '''"eth-ck",''' | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | '''<&rcc ETHCK_K>,''' | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rmii"; | ||
+ | max-speed = <100>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | + update Pinctrl to add ETHCK pin:<br> | ||
+ | For example: | ||
+ | <STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */ | ||
+ | |||
+ | 还需要更新 TFA 以生成25Mhz 时钟(从 PLL4P 或 PLL3Q) : < br > | ||
+ | |||
+ | 例如如果PLL4P: | ||
+ | st,pkcs = < | ||
+ | CLK_CKPER_HSE | ||
+ | CLK_FMC_ACLK | ||
+ | CLK_QSPI_ACLK | ||
+ | '''- CLK_ETH_DISABLED''' | ||
+ | '''+ CLK_ETH_PLL4P''' | ||
+ | ... | ||
+ | /* VCO = 600.0 MHz => P = 25, Q = 50, R = 50 */ | ||
+ | pll4: st,pll@3 { | ||
+ | '''cfg = < 1 49 23 11 11 PQR(1,1,1) >;''' | ||
+ | }; | ||
+ | |||
+ | * RMII with 50MHz on ETH_CLK (no PHY Crystal), internal REF_CLK from RCC: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | '''"eth-ck",''' | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | '''<&rcc ETHCK_K>,''' | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | '''st,eth_ref_clk_sel;''' | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rmii"; | ||
+ | max-speed = <100>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | + update Pinctrl to add ETHCK pin:<br> | ||
+ | 例如: | ||
+ | <STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */ | ||
+ | |||
+ | 还需要更新 TFA 以生成50Mhz 时钟(从 PLL4P 或 PLL3Q) :<br> | ||
+ | 例如如果PLL4P: | ||
+ | st,pkcs = < | ||
+ | CLK_CKPER_HSE | ||
+ | CLK_FMC_ACLK | ||
+ | CLK_QSPI_ACLK | ||
+ | '''- CLK_ETH_DISABLED''' | ||
+ | '''+ CLK_ETH_PLL4P''' | ||
+ | ... | ||
+ | /* VCO = 508.0 MHz => P = 50, Q = 60, R = 60 */ | ||
+ | pll4: st,pll@3 { | ||
+ | '''cfg = < 1 49 11 9 9 PQR(1,1,1) >;''' | ||
+ | }; | ||
+ | |||
+ | 4- RGMII with Crystal on PHY, CLK125 from PHY: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rgmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rgmii"; | ||
+ | max-speed = <1000>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | 5- RGMII with 25MHz on ETH_CLK (no PHY Crystal), CLK125 from PHY: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | '''"eth-ck",''' | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | '''<&rcc ETHCK_K>,''' | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rgmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rgmii"; | ||
+ | max-speed = <1000>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | + update Pinctrl to add ETHCK pin:<br> | ||
+ | 例如: | ||
+ | <STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */ | ||
+ | |||
+ | 还需要更新TFA以生成25Mhz时钟(来自PLL4P或PLL3Q):<br> | ||
+ | 例如,如果PLL4P: | ||
+ | st,pkcs = < | ||
+ | CLK_CKPER_HSE | ||
+ | CLK_FMC_ACLK | ||
+ | CLK_QSPI_ACLK | ||
+ | '''- CLK_ETH_DISABLED''' | ||
+ | '''+ CLK_ETH_PLL4P''' | ||
+ | ... | ||
+ | /* VCO = 600.0 MHz => P = 25, Q = 50, R = 50 */ | ||
+ | pll4: st,pll@3 { | ||
+ | '''cfg = < 1 49 23 11 11 PQR(1,1,1) >;''' | ||
+ | }; | ||
+ | |||
+ | 6- RGMII with Crystal on PHY, no 125Mhz from PHY: | ||
+ | |||
+ | ethernet0: ethernet@5800a000 { | ||
+ | compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; | ||
+ | reg = <0x5800a000 0x2000>; | ||
+ | reg-names = "stmmaceth"; | ||
+ | interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, | ||
+ | <&exti 70 1>; | ||
+ | interrupt-names = "macirq", | ||
+ | "eth_wake_irq", | ||
+ | "stm32_pwr_wakeup"; | ||
+ | clock-names = "stmmaceth", | ||
+ | '''"eth-ck",''' | ||
+ | "mac-clk-tx", | ||
+ | "mac-clk-rx", | ||
+ | "ethstp"; | ||
+ | clocks = <&rcc ETHMAC>, | ||
+ | '''<&rcc ETHCK_K>,''' | ||
+ | <&rcc ETHTX>, | ||
+ | <&rcc ETHRX>, | ||
+ | <&rcc ETHSTP>; | ||
+ | st,syscon = <&syscfg 0x4>; | ||
+ | snps,mixed-burst; | ||
+ | snps,pbl = <2>; | ||
+ | snps,en-tx-lpi-clockgating; | ||
+ | '''st,eth_clk_sel;''' | ||
+ | snps,axi-config = <&stmmac_axi_config_0>; | ||
+ | snps,tso; | ||
+ | power-domains = <&pd_core>; | ||
+ | status = "disabled"; | ||
+ | }; | ||
+ | |||
+ | ðernet0 { | ||
+ | status = "okay"; | ||
+ | pinctrl-0 = <ðernet0_rgmii_pins_a>; | ||
+ | pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; | ||
+ | pinctrl-names = "default", "sleep"; | ||
+ | phy-mode = "rgmii"; | ||
+ | max-speed = <1000>; | ||
+ | phy-handle = <&phy0>; | ||
+ | mdio0 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <0>; | ||
+ | compatible = "snps,dwmac-mdio"; | ||
+ | phy0: ethernet-phy@0 { | ||
+ | reg = <0>; | ||
+ | }; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | + update Pinctrl to delete CLK125 pin (also no need of ETHCK pin) | ||
+ | |||
+ | 还需要更新TFA以生成125Mhz时钟(来自PLL4P或PLL3Q):<br> | ||
+ | 例如,如果PLL4P: | ||
+ | st,pkcs = < | ||
+ | CLK_CKPER_HSE | ||
+ | CLK_FMC_ACLK | ||
+ | CLK_QSPI_ACLK | ||
+ | '''- CLK_ETH_DISABLED''' | ||
+ | '''+ CLK_ETH_PLL4P''' | ||
+ | ... | ||
+ | /* VCO = 750.0 MHz => P = 125, Q = 62.5, R = 62.5 */ | ||
+ | |||
+ | pll4: st,pll@3 { | ||
+ | '''cfg = < 3 124 5 11 11 PQR(1,1,1) >;''' | ||
+ | }; | ||
+ | |||
+ | == How to configure Ethernet using CubeMX == | ||
+ | [[STM32CubeMX]] 工具可用于配置STM32MPU设备并获取相应的 [[Device_tree#STM32|platform configuration device tree]] 文件。<br /> | ||
+ | STM32CubeMX可能不支持以上 [[#DT bindings documentation|DT bindings documentation]]段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入 '''用户部分''' 。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见[[STM32CubeMX]]用户手册。 | ||
+ | |||
+ | ==References== | ||
+ | <references /> |
2020年11月6日 (五) 14:29的最新版本
目录
Article purpose
本文介绍如何在将 Ethernet 分配给Linux® 操作系统时对其进行配置。 在这种情况下,它由Ethernet framework控制。
使用device tree 机制执行配置,该机制提供STM32 DWMAC驱动程序使用的以太网外围设备的硬件描述。
DT configuration
本硬件描述是STM32微处理器设备树文件(".dtsi"扩展名)和 板卡设备树文件(".dts"扩展名)的组合。有关设备树文件分割的说明,请参见 Device tree。
DT configuration (STM32 level)
以太网外围节点位于stm32mp157c.dtsi[3] 文件,该文件具有禁用状态和一些必需的属性,例如:
- 物理基址和设备寄存器映射的大小
- STMMAC中断
- stmmaceth时钟和Rx,Tx时钟
这是一组属性,这些属性对于给定的STM32MP器件可能不会改变,例如:寄存器地址,中断,时钟等。
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_NONE>; interrupt-names = "macirq"; clock-names = "stmmaceth", "mac-clk-tx", "mac-clk-rx", "ethstp", "syscfg-clk"; clocks = <&rcc ETHMAC>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>, <&rcc SYSCFG>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
必需属性和可选属性在 bindings files中有详细描述。
该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。 |
Ethernet DT configuration (board level)
设备树板文件(.dts)包含与板设计有关的所有硬件配置。 DT节点( ethernet)应该更新为:
- 通过设置status = okay启用以太网块。
- 通过 pinctrl,通过 pinctrl-0 (默认管脚), pinctrl-1 (睡眠管脚) and pinctrl-names来配置正在使用的管脚。
- 配置以太网接口使用 phy-mode = "rgmii"., (rmii, mii, gmii).
- 配置以太网最大速度 max-speed = <1000>"..
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii"; max-speed = <1000>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@1 { reg = <1>; }; }; };
DT configuration examples
以下示例显示了如何在板级配置和启用以太网实例:
ðernet0 { status = "okay"; /* enable ethernet0 */ pinctrl-0 = <ðernet0_rmii_pins_a>; /* configure pinctrl modes for ethernet0 */ pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; /* configure ethernet0_rmii_pins_sleep_a as sleep pinctrl configuration for ethernet0 */ pinctrl-names = "default", "sleep"; phy-mode = "rmii"; /* configure ethernet phy mode for ethernet0 */ max-speed = <100>; /* configure ethernet max speed for ethernet0 */ phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@1 { reg = <1>; /* configure ethernet phy @ for ethernet0 */ }; }; };
如何为以下配置以太网:
- RMII with Crystal on PHY:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rmii_pins_a>; pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rmii"; max-speed = <100>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
- RMII with 25MHz on ETH_CLK (no PHY Crystal), REF_CLK from PHY:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "eth-ck", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHCK_K>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rmii_pins_a>; pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rmii"; max-speed = <100>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
+ update Pinctrl to add ETHCK pin:
For example:
<STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */
还需要更新 TFA 以生成25Mhz 时钟(从 PLL4P 或 PLL3Q) : < br >
例如如果PLL4P:
st,pkcs = < CLK_CKPER_HSE CLK_FMC_ACLK CLK_QSPI_ACLK - CLK_ETH_DISABLED + CLK_ETH_PLL4P ... /* VCO = 600.0 MHz => P = 25, Q = 50, R = 50 */ pll4: st,pll@3 { cfg = < 1 49 23 11 11 PQR(1,1,1) >; };
- RMII with 50MHz on ETH_CLK (no PHY Crystal), internal REF_CLK from RCC:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "eth-ck", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHCK_K>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; st,eth_ref_clk_sel; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rmii_pins_a>; pinctrl-1 = <ðernet0_rmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rmii"; max-speed = <100>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
+ update Pinctrl to add ETHCK pin:
例如:
<STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */
还需要更新 TFA 以生成50Mhz 时钟(从 PLL4P 或 PLL3Q) :
例如如果PLL4P:
st,pkcs = < CLK_CKPER_HSE CLK_FMC_ACLK CLK_QSPI_ACLK - CLK_ETH_DISABLED + CLK_ETH_PLL4P ... /* VCO = 508.0 MHz => P = 50, Q = 60, R = 60 */ pll4: st,pll@3 { cfg = < 1 49 11 9 9 PQR(1,1,1) >; };
4- RGMII with Crystal on PHY, CLK125 from PHY:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii"; max-speed = <1000>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
5- RGMII with 25MHz on ETH_CLK (no PHY Crystal), CLK125 from PHY:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "eth-ck", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHCK_K>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii"; max-speed = <1000>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
+ update Pinctrl to add ETHCK pin:
例如:
<STM32_PINMUX('G', 8, AF2)>, /* ETH_RMII_ETHCK */
还需要更新TFA以生成25Mhz时钟(来自PLL4P或PLL3Q):
例如,如果PLL4P:
st,pkcs = < CLK_CKPER_HSE CLK_FMC_ACLK CLK_QSPI_ACLK - CLK_ETH_DISABLED + CLK_ETH_PLL4P ... /* VCO = 600.0 MHz => P = 25, Q = 50, R = 50 */ pll4: st,pll@3 { cfg = < 1 49 23 11 11 PQR(1,1,1) >; };
6- RGMII with Crystal on PHY, no 125Mhz from PHY:
ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&intc GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 1>; interrupt-names = "macirq", "eth_wake_irq", "stm32_pwr_wakeup"; clock-names = "stmmaceth", "eth-ck", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHCK_K>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; st,eth_clk_sel; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; };
ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii"; max-speed = <1000>; phy-handle = <&phy0>; mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; };
+ update Pinctrl to delete CLK125 pin (also no need of ETHCK pin)
还需要更新TFA以生成125Mhz时钟(来自PLL4P或PLL3Q):
例如,如果PLL4P:
st,pkcs = < CLK_CKPER_HSE CLK_FMC_ACLK CLK_QSPI_ACLK - CLK_ETH_DISABLED + CLK_ETH_PLL4P ... /* VCO = 750.0 MHz => P = 125, Q = 62.5, R = 62.5 */
pll4: st,pll@3 { cfg = < 3 124 5 11 11 PQR(1,1,1) >; };
How to configure Ethernet using CubeMX
STM32CubeMX 工具可用于配置STM32MPU设备并获取相应的 platform configuration device tree 文件。
STM32CubeMX可能不支持以上 DT bindings documentation段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入 用户部分 。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见STM32CubeMX用户手册。
References
- ↑ Documentation/devicetree/bindings/net/stmmac.txt| |}} Documentation/devicetree/bindings/net/stmmac.txt
- ↑ Documentation/devicetree/bindings/net/stm32-dwmac.txt| |}} Documentation/devicetree/bindings/net/stm32-dwmac.txt
- ↑ arch/arm/boot/dts/stm32mp157c.dtsi | |}} arch/arm/boot/dts/stm32mp157c.dtsi , STM32MP157C device tree file