差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
digi:arm-embedded:ccmp2:dt-eth-analysis [2024/10/20 17:22] robindigi:arm-embedded:ccmp2:dt-eth-analysis [2024/10/22 11:49] (当前版本) robin
行 1: 行 1:
 ====CCMP25 PLC方案之基于Realtec PHY的三网口设备树修改==== ====CCMP25 PLC方案之基于Realtec PHY的三网口设备树修改====
-CCMP25系列开发板使用Marvell的以太网PHY,它的设备树片段位于[https://github.com/digi-embedded/linux/blob/v6.1/stm/dey-4.0/maint_ccmp2-cc91-beta/arch/arm64/boot/dts/digi/ccmp25-dvk.dts|ccmp25-dvk.dts]]+CCMP25系列开发板使用Marvell的以太网PHY,它的设备树片段位于[[https://github.com/digi-embedded/linux/blob/v6.1/stm/dey-4.0/maint_ccmp2-cc91-beta/arch/arm64/boot/dts/digi/ccmp25-dvk.dts|ccmp25-dvk.dts]]
  
-和以太网口有关的设备树片段主要是&eth1和&eth2,这&表时是对上游的定义的修改,如果溯源的话,eth2可以在stm32mp253.dtsi(该文件由stm32mp255.dtsi引用)里找到原始定义。 eth1则在stm32mp251.dtsi中。+和以太网口有关的设备树片段主要是&eth1和&eth2,这&表时是对上游的定义的修改,如果溯源的话,eth2可以在stm32mp253.dtsi(该文件由stm32mp255.dtsi引用)里找到原始定义。 eth1则在stm32mp251.dtsi中。
  
-我们再看看和STM32MP257 EVK板子的设备树,这是使用Realtec的PHY芯片,文件在:stm32mp257f-ev1.dts, 它的源定义同样是stm32mp253.dtsi,而eth2的源定义同样位于stm32mp251.dtsi内。+我们再看看和STM32MP257 EVK板子的设备树,这是使用Realtec的PHY芯片,文件在ST官方源码文件:stm32mp257f-ev1.dts, 它的源定义同样是stm32mp253.dtsi,而eth2的源定义同样位于stm32mp251.dtsi内。
  
-因此Digi开发板和ST的EVK板子的以太网口源定义同源。修改部分相应的板级设备树+因此Digi开发板和ST的EVK板子的以太网口源定义同源,需要注意的是,如是是用stm32mp257,支持三个以太网口,其中第三个网口是交换机芯片作用的结果,它是switch0这个节点定义的,这个定义stm32mp257.dtsi中. 对于Digi MP255开发设备树,它只添加stm32mp255.dtsi,不过可以看到用SmartIOMUX生成的设备树引用的是stm32mp257.dtsi。因为对ST的不同型号,高阶功能的片子设备树dtsi文件会引用低层的芯片设备树dtsi文件。所以这个添加最高阶的dtsi文件已经可以满足三网口的要求
  
-需要注意如是是stm32mp257,支持三个以太网口,它大概是switch0这个节点定义,这个定义stm32mp257.dtsi中. 对于Digi MP255的开发板设备树只添加stm32mp255.dtsi所以如果使用的是Digi ConnectCore MP257的模块可以相应地把设备树引文件换成stm32mp257.dtsi。因为对ST的不同型号,高阶功能的片子设备树dtsi文件会引用低层级的芯片设备树dtsi文件。所只需添加最高阶的dtsi即可+板级设备树对网口芯片定义中会引相关网口的pin脚定义,这部分一般是stm32mp25-pinctrl.dtsi中Digi的开发板则会在Digi的板级设备树中用新的节点名来定义它,如果不和Digi使用一样PHY则直接用ST官方pin脚定义就可
  
-对于PLC参考设计,以太网PHY可以参考基于ST官方一发板的设备树来修改,具体来说,就是引用stm32mp257.dtsi,并把板级的&switch0引用也复制过来到自己的板级设备树文件上。需要注意的是,以太网的数据接口一般无需更改,但相关的reset pin脚,Digi开发板和ST EVK开发板有所不同,而PLC参考设计用的reset pin脚是基于Digi开发板的,因此,相关的修主要是在这reset pin脚的变动。 下面是PLC参考设计中改好以太网设备树片段,支持三个以太网口。+1、Digi开发板Marvell 88E1512-A0-NNP2C000 PHY的设备树解读:
  
-如果你使用CCMP255,仅支持双以太网口,则可以删除不用switch0并为用stm32mp255.dtsi即可设备树段完全相同+Digi的开发板使用Marvell的PHY它有多种型号,开发板上用的是仅支持双以太网口的型号。 88E1512芯片上有一个CONFIG引脚(pin15)它虽然只有一个脚 ,但连接不同的电压源会产生不同的双比特配置也就是的连接决定了: 
 +[CONGIG0,CONFIG1]的值。这两个比特位又决定了PHYAD[0]和VDDO_LEVEL的值 。在MDIO通讯协议中,PHY地址一般是5位,对于开发板上的PHY的PHYAD[4:1]默认是0000。因此双网口的PHY默认地址一般是0和1。但Marvel的88E1512PB提供更多的PHY地址的支持。更多细节请参考PHY芯的datasheet
  
 +2、ST的PLC参考设计板Realtek RTL8211F-CG PHY的设备树解读:
  
 +使用SmartIOmux最大的好处是,但凡定义的引脚,相关的pinmux定义都已经有了,并且可以从软件上快速找到相关接口的引脚定义。如果想用回开发板定义的节点,也完全没有冲突,只是涉及节点中label引用源的不同而已。
  
 +对于PLC参考设计,以太网PHY可以参考基于ST官方一发板的设备树来修改,具体来说,就是引用stm32mp257.dtsi,并把板级的&switch0引用也复制过来到自己的板级设备树文件上。需要注意的是,以太网的数据接口一般无需更改,但相关的reset pin脚,Digi开发板和ST EVK开发板有所不同,而PLC参考设计用的reset pin脚是基于Digi开发板的,因此,相关的修主要是在这reset pin脚的变动。
  
 +PLC参考设计来自ST官方评估板,其Realtek的PHY地址由引脚决定,有三个相关的引脚:RXCTL_PHYAD2,RXCLK_PHYAD1,RXD3_PHYAD0,这三个引脚在开发板上的ETH1组成PHYAD[2:0]=[100],即地址4。同理,ETH2的地址是1,ETH3地址是5。从开发板设备树可以看出它是相匹配的。
  
 +下面是PLC参考设计中改好的以太网设备树片段,支持三个以太网口。如果你使用CCMP255,仅支持双以太网口,则可以删除不用的switch0,并为引用stm32mp255.dtsi即可,其它设备树片段完全相同。
  
 +把网口的相关设备数改好后,还需要把eth3相关的gpio删除(根据双网口的Digi MP25开发板模板来设计三网口,因此设计时用gpio取代了网口3,如果设备树改好,可以删除这些gpio。
  
 +不过,需要注意的是,ST开发板引用的网口的pin脚定义是:stm32mp25-pinctrl.dtsi ,它替代Digi开发板网口pin的定义片段,默认这个设备树也include了,除非编译时出错查得缺失(比如版本因素),一般无需复制相关的pinctrl定义,只需删除Digi开发板设备树中没用的网口引脚pinctrl定义。其实不删除也没多大关系,因为没用到的节点不会起作用,另外像reset等pin脚用到和开发板不同的,还是要保留部分gpio的定义。所以这一步涉及的关键字和拷贝替代方法:
  
  
 +a)删除原digi开发板的网口的设备树引用pinctrl的节点,比如:ccmp25_ethernet1_pins,ccmp25_ethernet1_sleep_pins, ccmp25_ethernet2_pins,ccmp25_ethernet2_sleep_pins,因为这些已经被上面的定义替代。 
 + 
 +b)删除原预留eth3的接口lock的gpio节点定义,因为这些同样会在上面eth3的pinctrl节点中定义。eth3网口pin脚有这些:PH2,PA3,PA6,PA7,PH6,PH3,PA5,PA2,PA9,PA10,PH7,PH8。
 +
 +c) 检查bug并适当修改,由于https://github.com/digi-embedded/linux/blob/v6.1/stm/dey-4.0/maint_ccmp2-cc91-beta/arch/arm64/boot/dts/st/stm32mp25-pinctrl.dtsi 并不是用最新的,所以需要把缺失的定义(主要是eth2,3的休眠引脚定义从官方应用了patch的最新版本片拷过来,具体参考项目内完整的源码。
 +
 +完整的[[https://github.com/peyoot/ccmp25_dt/blob/main/ccmp25-plc.dts|CCMP25 PLC设备树源码]]托管在github上,点击即可查看。
 +
 +以下是板级设备树中三网口Realtec phy相关定义内容:
 +(注:因为Digi源码树中的ST源码截至2024-10-21前尚未应用patch更新为最新版,eth2,3的sleep休眠状态引脚定义缺失,所以上面项目源码在板级设备树还额外添加了相关节点pimux定义,将来Digi官方更新后,其实只需下面这三部分)
  
 <code> <code>
 +
 +&switch0 {
 + status = "disabled";
 + pinctrl-0 = <&eth1_rgmii_pins_a>, <&eth3_rgmii_pins_a>;
 + pinctrl-1 = <&eth1_rgmii_sleep_pins_a>, <&eth3_rgmii_sleep_pins_a>;
 + pinctrl-names = "default", "sleep";
 + phy-mode = "rgmii";
 + st,ethsw-internal-125;
 +};
 +
 +
 &eth1 { &eth1 {
 +
  status = "okay";  status = "okay";
  pinctrl-0 = <&eth1_rgmii_pins_a &eth1_mdio_pins_a>;  pinctrl-0 = <&eth1_rgmii_pins_a &eth1_mdio_pins_a>;
行 32: 行 62:
  max-speed = <1000>;  max-speed = <1000>;
  phy-handle = <&phy1_eth1>;  phy-handle = <&phy1_eth1>;
 + st,eth-clk-sel;
  snps,ext-systime;  snps,ext-systime;
  
- /* ETH1 connected to the mdio bus ETH1_MDIO */ 
  mdio1 {  mdio1 {
  #address-cells = <1>;  #address-cells = <1>;
  #size-cells = <0>;  #size-cells = <0>;
  compatible = "snps,dwmac-mdio";  compatible = "snps,dwmac-mdio";
- + phy1_eth1: ethernet-phy@
- phy1_eth1: ethernet-phy@+ compatible = "ethernet-phy-id001c.c916"; 
- compatible = "ethernet-phy-id0141.0dd0"; /* PHY ID for Marvell 88E1512 */ + reset-gpios =  <&gpiob 2 GPIO_ACTIVE_LOW>; 
- reset-gpios =  <&gpiob 2 GPIO_ACTIVE_LOW>; /* ETH1_RST */ + reset-assert-us = <10000>; 
- reset-assert-us = <1000>; + reset-deassert-us = <80000>
- reset-deassert-us = <2000>; + realtek,eee-disable
- reg = <0>;+ reg = <4>;
  };  };
  };  };
行 51: 行 81:
  
 &eth2 { &eth2 {
 +
  status = "okay";  status = "okay";
  pinctrl-0 = <&eth2_rgmii_pins_a>;  pinctrl-0 = <&eth2_rgmii_pins_a>;
- pinctrl-names = "default";+ pinctrl-1 = <&eth2_rgmii_sleep_pins_a>; 
 + pinctrl-names = "default", "sleep";
  phy-mode = "rgmii-id";  phy-mode = "rgmii-id";
  max-speed = <1000>;  max-speed = <1000>;
行 59: 行 91:
  st,eth-ptp-from-rcc;  st,eth-ptp-from-rcc;
  
- /* ETH2 connected to mdio bus ETH2_MDIO */ 
  mdio1 {  mdio1 {
  #address-cells = <1>;  #address-cells = <1>;
行 65: 行 96:
  compatible = "snps,dwmac-mdio";  compatible = "snps,dwmac-mdio";
  phy1_eth2: ethernet-phy@1 {  phy1_eth2: ethernet-phy@1 {
- compatible = "ethernet-phy-id0141.0dd0"; /* PHY ID for Marvell 88E1512 */ + compatible = "ethernet-phy-id001c.c916"; 
- reset-gpios =  <&gpiog 6 GPIO_ACTIVE_LOW>; /* ETH2_RST */ + reset-gpios =  <&gpiog 6 GPIO_ACTIVE_LOW>; 
- reset-assert-us = <1000>; + reset-assert-us = <10000>; 
- reset-deassert-us = <2000>;+ reset-deassert-us = <80000>
 + realtek,eee-disable;
  reg = <1>;  reg = <1>;
  };  };
  };  };
 +
 +
 }; };
 </code> </code>