ZHCAES5 July   2024 DP83822H , DP83822HF , DP83822I , DP83822IF , DP83826E , DP83826I , DP83848-EP , DP83848Q-Q1 , DP83867CR , DP83867CS , DP83867E , DP83867IR , DP83867IS , DP83TC812R-Q1 , DP83TC812S-Q1 , DP83TC813R-Q1 , DP83TC813S-Q1 , DP83TC814R-Q1 , DP83TC814S-Q1 , DP83TG720R-Q1 , DP83TG720S-Q1 , DP83TG721R-Q1 , DP83TG721S-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1德州仪器 (TI) 以太网 PHY 驱动程序
  5. 2以太网 PHY 驱动程序概述
    1. 2.1 了解 Linux 驱动程序类型
      1. 2.1.1 U-Boot 驱动程序
      2. 2.1.2 内核驱动程序
  6. 3驱动程序集成
    1. 3.1 Linux 器件树
    2. 3.2 集成式驱动程序
  7. 4常见终端命令
    1. 4.1 初始化命令
      1. 4.1.1 dmesg | grep -i mdio
      2. 4.1.2 ifconfig
    2. 4.2 功能命令
      1. 4.2.1 Phytool
      2. 4.2.2 ethtool
      3. 4.2.3 强制执行主/从配置
    3. 4.3 诊断命令
      1. 4.3.1 SQI
      2. 4.3.2 TDR
      3. 4.3.3 吞吐量测试 - ping 和 iPerf
  8. 5总结
  9. 6参考资料

Linux 器件树

Linux 器件树是用于描述嵌入式系统中硬件组件和配置的数据结构。器件树为操作系统提供了一种标准化方式来了解硬件布局,包括有关处理器、内存、总线和外设的详细信息。器件树数据通常以二进制格式(.dtb 文件)存储,并在启动期间传递给 Linux 内核。然后,内核使用此信息来动态绑定器件树节点并初始化硬件组件,从而允许在不同的嵌入式平台上提供高效灵活的硬件支持,而无需将硬件详细信息硬编码到内核中。

器件树代码块示例说明了如何在器件树文件中配置子卡上的四个以太网 PHY。CPSW 是指处理器的 MAC 接口,要考虑的主要节点定义如下:

  • &cpsw0 {},初始化四个 RGMII 接口
  • cpsw0_portn {},初始化每个端口的更多详细信息
    • phy-mode:设置该端口的 MAC 接口
    • phy-handle:定义如何设置 PHY
      • <&cpsw9g_phyx> 用于设置 PHY 地址
        • 请注意,x 不设置 PHY 地址,只是一种命名约定。该地址在器件树代码块中分配到较低的位置,位于 cpsw9g_mdio{} 定义内部。
          • reg = <x>;
      • 这里也可以设置 RGMII 延迟,在 J721E 通用处理器板 dts 文件第 744 行和 RGMII 代码块中可以看到示例。
        • 通常,我们的 RGMII 延迟建议是,将 PHY 配置为 TX 和 RX CLK 延迟 2.0ns(称为移位模式),而处理器设置为 0 延迟(称为对齐模式)。有关更多信息,请参阅表 3-1
          • 然而,许多 TI 处理器的 TX 线路内部有无法禁用的 2.0ns 延迟。因此在 RGMII 代码块中,PHY 上仅配置了 RX 延迟。
    • phys
      • 设置为每个端口分配的 eth#
        • <&cpsw0_phy_gmii_sel n>
表 3-1 RGMII 移位配置
MAC 配置 所需的 PHY 配置
在 RX 上对齐 在 RX 上移位
在 RX 上移位 在 RX 上对齐
在 TX 上对齐 在 TX 上移位
在 TX 上移位 在 TX 上对齐

RGMII 代码块:

&davinci_mdio {
	phy0: ethernet-phy@0 { //PHY0 is defined and passed to phy-handle
		reg = <0>;
		ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
	};
};

&cpsw_port1 {
	phy-mode = "rgmii-rxid";
	phy-handle = <&phy0>;
};

器件树代码块:

&cpsw0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&mdio_pins_default
             &rgmii1_pins_default
             &rgmii2_pins_default
             &rgmii3_pins_default
             &rgmii4_pins_default
             >;
};

&cpsw0_port1 {
    phy-handle = <&cpsw9g_phy0>;
    phy-mode = "rgmii-rxid";
    mac-address = [00 00 00 00 00 00];
    phys = <&cpsw0_phy_gmii_sel 1>;
};

&cpsw0_port2 {
    phy-handle = <&cpsw9g_phy4>;
    phy-mode = "rgmii-rxid";
    mac-address = [00 00 00 00 00 00];
    phys = <&cpsw0_phy_gmii_sel 2>;
};

&cpsw0_port3 {
    phy-handle = <&cpsw9g_phy5>;
    phy-mode = "rgmii-rxid";
    mac-address = [00 00 00 00 00 00];
    phys = <&cpsw0_phy_gmii_sel 3>;
};

&cpsw0_port4 {
    phy-handle = <&cpsw9g_phy8>;
    phy-mode = "rgmii-rxid";
    mac-address = [00 00 00 00 00 00];
    phys = <&cpsw0_phy_gmii_sel 4>;
};
&cpsw9g_mdio {
	bus_freq = <1000000>;
	#address-cells = <1>;
	#size-cells = <0>;

	cpsw9g_phy0: ethernet-phy@0 {
		reg = <0>;
	};
	cpsw9g_phy4: ethernet-phy@4 {
		reg = <4>;
	};
	cpsw9g_phy5: ethernet-phy@5 {
		reg = <5>;
	};
	cpsw9g_phy8: ethernet-phy@8 {
		reg = <8>;
	};
};

当电路板正在运行时,可以使用终端命令 dmesg grep | mdio 确认 PHY 地址 (phy[x]) 和 eth 端口 (ethn)。

davinci_mdio c000f00.mdio: phy[0]: device c000f00.mdio:00, driver TI DP83TG720CS1.1
davinci_mdio c000f00.mdio: phy[4]: device c000f00.mdio:04, driver TI DP83TG721CS1.0
davinci_mdio c000f00.mdio: phy[5]: device c000f00.mdio:05, driver TI DP83TC812CS2.0
davinci_mdio c000f00.mdio: phy[8]: device c000f00.mdio:08, driver TI DP83TC814CS2.0
am65-cpsw-nuss c000000.ethernet eth4: PHY [c000f00.mdio:08] driver [TI DP83TC814CS2.0] (irq=POLL)
am65-cpsw-nuss c000000.ethernet eth3: PHY [c000f00.mdio:05] driver [TI DP83TC812CS2.0] (irq=POLL)
am65-cpsw-nuss c000000.ethernet eth2: PHY [c000f00.mdio:04] driver [TI DP83TG721CS1.0] (irq=POLL)
am65-cpsw-nuss c000000.ethernet eth1: PHY [c000f00.mdio:00] driver [TI DP83TG720CS1.1] (irq=POLL)