This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VH-Q1:CPSW9G 本机 Linux 驱动程序的 SerDes4 PLL 锁定问题

Guru**** 2556460 points
Other Parts Discussed in Thread: AM69A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1421561/tda4vh-q1-serdes4-pll-locking-issue-with-cpsw9g-native-linux-driver

器件型号:TDA4VH-Q1
主题中讨论的其他器件:TDA4VHAM69A

工具与软件:

您好:

    我使用 TDA4VH SERDES4为4个 Realtek RTL8211FS 以太网 SGMII PHY 芯片提供4个 LAN SGMII 信号。  

现在、我可以 通过 MDIO 与 RTL8211FS PHY 通信。 但连接 MAIN_cpsw0和 Phy 之间的链路

未启动。 SEDES PLL 有时可以被锁定、但并非总是如此。 我使用 TI SDK "ti-processor-sdk-linux-am69-sk-10_00_07_06"

内核)。 您可以帮助我检查我的 DTS 文件设置吗?

非常感谢~

我的 DTS 设置:

// SPDX-License-Identifier: GPL-2.0
/*
 * DT Overlay for CPSW9G in SGMII mode using ROVY-M2-M-SGMII with ROVY-EVM board
 *
 * Copyright (C) 2024 Texas Instruments Incorporated - https://www.ti.com/
 * Copyright 2024 Technexion Ltd.
 *
 * Author: Alex Fang <alex.fang@technexion.com>
 *
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/mux/ti-serdes.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/phy/phy.h>
#include <dt-bindings/phy/phy-cadence.h>
#include "k3-pinctrl.h"

&{/} {
	model = "TechNexion ROVY-4VH and EVM baseboard with 4xSGMII";
	aliases {
		ethernet1 = "/bus@100000/ethernet@c000000/ethernet-ports/port@5";
		ethernet2 = "/bus@100000/ethernet@c000000/ethernet-ports/port@6";
		ethernet3 = "/bus@100000/ethernet@c000000/ethernet-ports/port@7";
		ethernet4 = "/bus@100000/ethernet@c000000/ethernet-ports/port@8";
	};
};

&serdes_ln_ctrl {
	idle-states = <J784S4_SERDES0_LANE0_PCIE1_LANE0>, <J784S4_SERDES0_LANE1_PCIE1_LANE1>,
		<J784S4_SERDES0_LANE2_PCIE3_LANE0>, <J784S4_SERDES0_LANE3_USB>,
		<J784S4_SERDES1_LANE0_PCIE0_LANE0>, <J784S4_SERDES1_LANE1_PCIE0_LANE1>,
		<J784S4_SERDES1_LANE2_PCIE2_LANE0>, <J784S4_SERDES1_LANE3_PCIE2_LANE1>,
		<J784S4_SERDES2_LANE0_IP4_UNUSED>, <J784S4_SERDES2_LANE1_IP4_UNUSED>,
		<J784S4_SERDES2_LANE2_IP4_UNUSED>, <J784S4_SERDES2_LANE3_IP4_UNUSED>,
		<J784S4_SERDES4_LANE0_QSGMII_LANE5>, <J784S4_SERDES4_LANE1_QSGMII_LANE6>,
		<J784S4_SERDES4_LANE2_QSGMII_LANE7>, <J784S4_SERDES4_LANE3_QSGMII_LANE8>;
};

&serdes_wiz4 {
	status = "okay";
};

&serdes4 {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	serdes4_sgmii_link: phy@0 {
		reg = <0>;
		resets =  <&serdes_wiz4 1>, <&serdes_wiz4 2>,
			 		<&serdes_wiz4 3>, <&serdes_wiz4 4>;
		cdns,phy-type = <PHY_TYPE_SGMII>;
		cdns,num-lanes = <4>;
		#phy-cells = <0>;
	};
};

&main_cpsw0 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&mdio_pins_default>;
};

&main_cpsw0_port1 {
	status = "disabled";
};

&main_cpsw0_port2 {
	status = "disabled";
};

&main_cpsw0_port3 {
	status = "disabled";
};

&main_cpsw0_port4 {
	status = "disabled";
};

&main_cpsw0_port5 {
	status = "okay";
	phy-mode = "sgmii";
	mac-address = [00 00 00 00 00 00];
	phys = <&cpsw0_phy_gmii_sel 5>, <&serdes4_sgmii_link>;
	phy-names = "mac", "serdes";
	phy-handle = <&main_cpsw0_phy0>;
};

&main_cpsw0_port6 {
	status = "okay";
	phy-mode = "sgmii";
	mac-address = [00 00 00 00 00 00];
	phys = <&cpsw0_phy_gmii_sel 6>, <&serdes4_sgmii_link>;
	phy-names = "mac", "serdes";
	phy-handle = <&main_cpsw0_phy1>;
};

&main_cpsw0_port7 {
	status = "okay";
	phy-mode = "sgmii";
	mac-address = [00 00 00 00 00 00];
	phys = <&cpsw0_phy_gmii_sel 7>, <&serdes4_sgmii_link>;
	phy-names = "mac", "serdes";
	phy-handle = <&main_cpsw0_phy2>;
};

&main_cpsw0_port8 {
	status = "okay";
	phy-mode = "sgmii";
	mac-address = [00 00 00 00 00 00];
	phys = <&cpsw0_phy_gmii_sel 8>, <&serdes4_sgmii_link>;
	phy-names = "mac", "serdes";
	phy-handle = <&main_cpsw0_phy3>;
};

&main_cpsw0_mdio {
	status = "okay";
	bus_freq = <1000000>;
	#address-cells = <1>;
	#size-cells = <0>;

	main_cpsw0_phy0: ethernet-phy@4 {
		reg = <4>;
		reset-gpios = <&pca9554_sgmii 0 GPIO_ACTIVE_LOW>;
		reset-assert-us = <35000>;
		reset-deassert-us = <75000>;
		rtl821x,aldps-disable;
		rtl821x,clkout-disable;
		realtek,phy-mode-eee-disable;
	};
	main_cpsw0_phy1: ethernet-phy@5 {
		reg = <5>;
		reset-gpios = <&pca9554_sgmii 1 GPIO_ACTIVE_LOW>;
		reset-assert-us = <35000>;
		reset-deassert-us = <75000>;
		rtl821x,aldps-disable;
		rtl821x,clkout-disable;
		realtek,phy-mode-eee-disable;
	};
	main_cpsw0_phy2: ethernet-phy@6 {
		reg = <6>;
		reset-gpios = <&pca9554_sgmii 2 GPIO_ACTIVE_LOW>;
		reset-assert-us = <35000>;
		reset-deassert-us = <75000>;
		rtl821x,aldps-disable;
		rtl821x,clkout-disable;
		realtek,phy-mode-eee-disable;
	};
	main_cpsw0_phy3: ethernet-phy@7 {
		reg = <7>;
		reset-gpios = <&pca9554_sgmii 3 GPIO_ACTIVE_LOW>;
		reset-assert-us = <35000>;
		reset-deassert-us = <75000>;
		rtl821x,aldps-disable;
		rtl821x,clkout-disable;
		realtek,phy-mode-eee-disable;
	};
};

&main_pmx0 {
	mdio_pins_default: mdio-pins-default {
		pinctrl-single,pins = <
			J784S4_IOPAD(0x05c, PIN_INPUT, 4) /* (AC36) MCASP2_AXR0.MDIO1_MDIO */
			J784S4_IOPAD(0x058, PIN_INPUT, 4) /* (AE37) MCASP2_AFSX.MDIO1_MDC */
		>;
	};
};

&main_i2c5 { /* I2C_E */
	#address-cells = <1>;
	#size-cells = <0>;
	clock-frequency = <400000>;

	pca9554_sgmii: pca9554_sgmii@27 {
		compatible = "nxp,pca9554";
		reg = <0x27>;
		gpio-controller;
		#gpio-cells = <2>;
		status = "okay";
	};
};

设计 PLL 锁定成功:

SEDES PLL 锁定失败:

此致

  Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    设备树配置看起来正常。

    一条信息是、对于所有 CPSW 端口、无需提及"serdes4_SGMII_link"、提及端口5就足够了。

    您能否共享整个 A72日志(如果 PLL 锁定成功、PLL 锁定失败)以查看流程。
    此外、确保没有为相同的串行器/解串器4配置添加覆盖层。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    从日志来看、在非 PLL 锁定的情况下似乎未启用端口自动协商。

    您能否检查 MDIO 节点下的 PHY 配置。

    &main_cpsw0_mdio {
    	status = "okay";
    	bus_freq = <1000000>;
    	#address-cells = <1>;
    	#size-cells = <0>;
    
    	main_cpsw0_phy0: ethernet-phy@4 {
    		reg = <4>;
    		reset-gpios = <&pca9554_sgmii 0 GPIO_ACTIVE_LOW>;
    		reset-assert-us = <35000>;
    		reset-deassert-us = <75000>;
    		rtl821x,aldps-disable;
    		rtl821x,clkout-disable;
    		realtek,phy-mode-eee-disable;
    	};
    	main_cpsw0_phy1: ethernet-phy@5 {
    		reg = <5>;
    		reset-gpios = <&pca9554_sgmii 1 GPIO_ACTIVE_LOW>;
    		reset-assert-us = <35000>;
    		reset-deassert-us = <75000>;
    		rtl821x,aldps-disable;
    		rtl821x,clkout-disable;
    		realtek,phy-mode-eee-disable;
    	};
    	main_cpsw0_phy2: ethernet-phy@6 {
    		reg = <6>;
    		reset-gpios = <&pca9554_sgmii 2 GPIO_ACTIVE_LOW>;
    		reset-assert-us = <35000>;
    		reset-deassert-us = <75000>;
    		rtl821x,aldps-disable;
    		rtl821x,clkout-disable;
    		realtek,phy-mode-eee-disable;
    	};
    	main_cpsw0_phy3: ethernet-phy@7 {
    		reg = <7>;
    		reset-gpios = <&pca9554_sgmii 3 GPIO_ACTIVE_LOW>;
    		reset-assert-us = <35000>;
    		reset-deassert-us = <75000>;
    		rtl821x,aldps-disable;
    		rtl821x,clkout-disable;
    		realtek,phy-mode-eee-disable;
    	};
    };


    [报价 userid="540868" url="~/support/processors-group/processors/f/processors-forum/1421561/tda4vh-q1-serdes4-pll-locking-issue-with-cpsw9g-native-linux-driver/5447834 #5447834"]一条信息、对于所有 CPSW 端口、无需提及"serdes4_SGMII_link"、提及端口5就足够了。

    此外、您能否通过从所有端口中删除"serdes4_SGMII_link"并仅从端口5中进行检查。

    除上述内容外、您还可以转储端口5、端口6、端口8寄存器信息。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    苏德尔先生:

        我尝试 从"main_cpsw0_port6~8"中删除了"serdes4_SGMII_link"。 仍然无法建立链路。

    端口5寄存器:

    端口6寄存器:

    端口7寄存器:

    端口8寄存器:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有时端口7 PLL 成功锁定

    端口5:

    端口6:

    端口7:

    端口8:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否可以在驱动程序(从"am65-cpsw-nuss.c"文件中的"am65_cpsw_nuss_mac_config"API 中)中添加打印 内容、并检查 SGMII 寄存器是否正在更新?  

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    苏德尔先生:

        我尝试转储寄存器(

    AM65_CPSW_SGMII_MR_ADV_ABILITY REG/
    AM65_CPSW_SGMII_CONTROL_REG)(位于中)   
    am65_cpsw_nuss_mac_config API。 该值与"j7_devmem2_cpsw9g_check_status.sh"脚本的值相同。

    我是否需要检查 SEDES PLL 以 确定为何无法锁定?  

    此致

     Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如何打印值?

    您是否使用过仿造产品 读数 写入以确认后、写入是否成功? 应为广播设置该位(MR_ADV 应设置位1)、SGMII_CONTROL 也应设置位0。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Doredla 您好:

        是的、我在写入 MR_ADV 和 SGMII_CONTROL 之前使用 readl 读取寄存器的值、并在  写入 MR_ADV 和 SGMII_CONTROL 后再次读取该值。

    static void am65_cpsw_nuss_mac_config(struct phylink_config *config, unsigned int mode,
    				      const struct phylink_link_state *state)
    {
    	u32				reg_tmp,reg_tmp1;
    	struct am65_cpsw_slave_data *slave = container_of(config, struct am65_cpsw_slave_data,
    							  phylink_config);
    	struct am65_cpsw_port *port = container_of(slave, struct am65_cpsw_port, slave);
    	struct am65_cpsw_common *common = port->common;
    	printk("Alex:am65_cpsw_nuss_mac_config extra_modes=%llu interface=%u\n",common->pdata.extra_modes,state->interface);
    	if (common->pdata.extra_modes & BIT(state->interface)) {
    		if (state->interface == PHY_INTERFACE_MODE_SGMII) {
    			reg_tmp=readl(port->sgmii_base + AM65_CPSW_SGMII_MR_ADV_ABILITY_REG);
    			printk("Alex:PHY_INTERFACE_MODE_SGMII[Origin]:AM65_CPSW_SGMII_MR_ADV_ABILITY_REG address=0x%x value=%lu\n",port->sgmii_base+AM65_CPSW_SGMII_MR_ADV_ABILITY_REG,reg_tmp);
    			
    			writel(ADVERTISE_SGMII,
    			       port->sgmii_base + AM65_CPSW_SGMII_MR_ADV_ABILITY_REG);
    		
    			reg_tmp=readl(port->sgmii_base + AM65_CPSW_SGMII_MR_ADV_ABILITY_REG);
    			printk("Alex:PHY_INTERFACE_MODE_SGMII[Current]:AM65_CPSW_SGMII_MR_ADV_ABILITY_REG address=0x%x value=%lu\n",port->sgmii_base+AM65_CPSW_SGMII_MR_ADV_ABILITY_REG,reg_tmp);
    			cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN);
    		} else {
    			cpsw_sl_ctl_clr(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN);
    			printk("Alex:PHY_INTERFACE_MODE_SGMII not\n");
    		}
    
    		if (state->interface == PHY_INTERFACE_MODE_USXGMII) {
    			cpsw_sl_ctl_set(port->slave.mac_sl,
    					CPSW_SL_CTL_XGIG | CPSW_SL_CTL_XGMII_EN);
    			printk("Alex:PHY_INTERFACE_MODE_USXGMII\n");
    		} else {
    			cpsw_sl_ctl_clr(port->slave.mac_sl,
    					CPSW_SL_CTL_XGIG | CPSW_SL_CTL_XGMII_EN);
    			printk("Alex:PHY_INTERFACE_MODE_USXGMII not\n");
    		}
    		reg_tmp=readl(port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG);
    		printk("Alex:AM65_CPSW_SGMII_CONTROL_MR_AN_ENABLE[Before] AM65_CPSW_SGMII_CONTROL_REG address=0x%x value=%lu\n",port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG, reg_tmp);
    		writel(AM65_CPSW_SGMII_CONTROL_MR_AN_ENABLE,
    		       port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG);
    		reg_tmp=readl(port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG);
    		printk("Alex:AM65_CPSW_SGMII_CONTROL_MR_AN_ENABLE[After] AM65_CPSW_SGMII_CONTROL_REG address=0x%x value=%lu\n",port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG, reg_tmp);
    	}
    }

    我注意到 eth3有时可以 成功启用  MR_ADV 和 SGMII_CONTROL、其他(eth1/2/4)也会失败。

    当 ETH3成功 启用 MR_ADV 和 SGMII_CONTROL 后、 链路 仍然未建立、但 SERDES PLL 已锁定

    自协商完成。

    此致

     Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alex、

    我注意到 eth3有时可以 成功启用  MR_ADV 和 SGMII_CONTROL、其他用户(eth1/2/4)失败。

    对于所有其他已配置的端口、应该都可以成功执行此操作。

    此外、确保 PHY 配置为 SGMII 主模式、默认 MAC 配置为从模式。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    苏德尔先生:

      我可以通过什么方法检查 MAC 的模式状态吗? 谢谢您~

    此致

     Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     苏德尔先生:

      在哪里可以找到完整的信息? 我在 TI SDK 包中找不到它。

    谢谢您~

    此致

      Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alex、

    在哪里可以找到完整的信息? 我在 TI SDK 软件包中找不到它。

    "SDK 文档"页面中的 TRM 未提供寄存器规范。
    https://www.ti.com/lit/zip/spruj52

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     苏德尔先生:

       我查看"SPRUJ52 - J84S4 AM69A TRM.pdf"、但文档中没有您发布的表12-2174?

    此致

      Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

       我选择"SPRUJ52 - J84S4 AM69A TRM.pdf"、但您发布的表12-2174不在文档中?

    寄存器规格来自 Excel 文件、而不是 PDF。 在 Excel 文件中、请转至 cpsw9g 工作表、检查 SGMII 控制和状态寄存器。

    我发布的内容来自不同的 SoC、位字段和地址  与 TDA4VH 相同。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    苏德尔先生:

       您能为我提供文档吗? 谢谢您~

    此致

      Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alex、

    您能为我提供此文档吗? 谢谢~[/报价]

    我在 NDA 文档中共享了哪些文档捕获。 无法共享。
    您可以参阅 TRM Link 下载的 Zip 文件中的 Excel 文件。 Excel 文件包含寄存器信息。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    苏德尔先生:

        我尝试检查来自 SERDES4的 SGMII 信号、 引脚上没有信号。

    您是否曾在  TDA4VH 的 SERDES4上启用过 SGMII?

    此致

      Alex Fang

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [报价 userid="625110" url="~/support/processors-group/processors/f/processors-forum/1421561/tda4vh-q1-serdes4-pll-locking-issue-with-cpsw9g-native-linux-driver/5466687 #54666687"]

       我尝试检查来自 SERDES4的 SGMII 信号、 引脚上没有信号。

    您是否曾在  TDA4VH 的 SERDES4上启用过 SGMII?

    [报价]

    我们没有需要使用 SerDes4的硬件。
    TI EVM 仅提供串行器/解串器2。 因此、默认 TI SDK 还支持串行器/解串器2连接端口配置(端口1 /端口7或端口2 /端口8)。

    但是、许多客户启用了串行器/解串器4并在定制板上进行了验证。

    此致、
    Sudheer