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.

[参考译文] Linux/DP8.3867万IR:具有DP8.3867万IR PHY的Zynq -配置问题-无法正确接收数据-注册帮助

Guru**** 2478765 points


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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/641948/linux-dp83867ir-zynq-with-dp83867ir-phy---configuration-issue---unable-to-receive-data-correctly---register-help

部件号:DP8.3867万IR

工具/软件:Linux

您好,  

我们将系统移至TI DP8.3867万IR PHY,我似乎遇到了配置问题。 我正在寻找一些帮助来验证我的PHY是否按预期工作。 我的最终目标是解决从DHCP服务器获取IP失败的问题。 我认为这个问题与我无法正确接收数据有关。 此故障仅在Linux中出现。 详情如下。 (MAC地址被故意隐藏)  

问题:

正在发送发现...
正在发送发现...
没有租约,放弃了背景

输出:

此输出显示系统能够通过DHCP获取地址,下载引导映像以及从u-boot成功引导目标。  

U-Boot 2015.07

gem.e000b000:12连接到gem.e000b000。 正在重新连接到Gem。e000b000
gem.e000b000正在等待PHY自动协商完成.......完成
BOOTP广播1
BOOTP广播2
DHCP客户端绑定到地址XXX.XXX.XXX.XXX 6 (547毫秒)

U-boot>引导
gem.e000b000正在等待PHY自动协商完成.......完成
使用Gem.e000b000设备
TFTP来自服务器10.10 .0.2 ;我们的IP地址是10.10 .0.1
文件名'myfile'。
加载地址:0x3e0万
正在加载:T ######################################################################.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#..
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
######################################################
###########
1.3 MIB/s
完成

此输出显示MAC和PHY已在系统中正确注册。 我使用的是4.0 内核中的dp8.3867万驱动程序。  

[ 1.29.2814万 ] macb e000b000.ethernet eth0:cadence GEM rev 0x2.0118万 at 0xe000b000 IRQ 148 (XX:XX:XX:XX:XX:XX)

[ PHY] macb e000b000.ethernet eth0:连接的1.30.2722万 驱动程序[TI DP8.3867万](MII_bus:phy_addr=e000b000.etherne:0c, IRQ=-1)

此输出显示已创建接口,但无法通过DHCP获取IP地址。  

root@root# ifconfig
Eth0链路加密:以太网HWaddr XX:XX:XX:XX:XX  
运行多播MTU的UP广播:1500度量:1
Rx数据包:0错误:0丢弃:0溢出:0帧:0
Tx数据包:8错误:0已丢弃:0溢出:0运营商:0
冲突:0 queutxelen:1000
RX字节:0 (0.0 B) TX字节:2736 (2.6 KiB)
中断:148基本地址:0xb000

此输出显示有关PHY和链路状态的信息。  

root@root# mII-tool -v
ETH0:协商的1000BaseT- FD流控制,链路正常
产品信息:供应商08:00:28,型号35 rev 1
基本模式:自动协商已启用
基本状态:自动协商完成,链路正常
功能:1000BaseT-HD 1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD
广告:1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD
链接合作伙伴:1000BaseT-HD 1000BaseT-FD 100BaseTX-FD 100BaseTX-HD 10baseT-FD 10baseT-HD流量控制
root@root

此输出显示有关事务/数据包的信息。 我认为该问题以红色突出显示。 这让我相信我只是在处理系统RX的计时问题。  

root@root# ethtool -S eth0
NIC统计信息:
TX_八 位字节:42.8148万
TX_frames:6641
TX_BROADCAST_FRAMES:14
TX_multicast_frames:0
TX_PAUSE_FRAMES:0
TX_64_byte_frames:6629
TX_65_127_Byte_frames:1.
TX_128_255_Byte_frames:0
TX_256_511_BYTE_FRAMES:11
TX_512_1023_byte_frames:0
TX_1024_1518_byte_frames:1518:0
TX_greater大于1518_Byte_frames:0
TX_欠载运行:0
TX_singLE_collision_frames:0
tx_multiple_collision_frames:0
TX_exital_collisions:0
TX_LATE_Collisions:0
TX_延期 帧:0
TX_CARRER_SENSE错误:0
RX_八 位字节:1006.5099万
Rx_frames:6721
Rx_broadcast_frames:93
RX_multicast_frames:0
Rx_pause_frames:0
RX_64_Byte_frames:54
RX_65_127_Byte_frames:29
RX_128_255_byte_frames:6.
RX_256_511_Byte_frames:7
RX_512_1023_byte_frames:1.
RX_1024_1518_byte_frames:1518:6624
RX_Greate_Than 1518_Byte_frames:0
RX_undesized帧数:0
RX_USATMEL_FRAMES:0
Rx_jabbers:0
Rx_frame_check_sequence_errors:0
Rx_length_ffield_frame_errors:0
Rx_symbol_errors:0
RX_alignation_errors:0
Rx_resource_errors:0
Rx_溢出:0
RX_IP_HEADER_checksum_errors:0
RX_tcp_checksum_errors:0
RX_UDP_checksum_errors:0
root@root#

如果我手动为eth0接口分配IP地址,我就可以查看来自设备的ARP广播。 此外,如果我ping,我会看到使用数据包分析器(Wireshark )的请求和回复。 我的问题是我的系统看不到回复。  

root@root:~# ping 10.10 .0.2

Ping 10.10 .0.2 (10.10 .0.2):56个数据字节
^C
-- 10.10 .0.2 ping统计数据--
传输28个数据包,接收0个数据包,100 % 数据包丢失
根@根:~#

PHY寄存器设置。 我尝试将寄存器0x86修改为不同的值以调整Rx/TX计时,但没有运气。 寄存器的工作方式就像RO一样,而它应该是RW吗?

0x00 0x1140
0x01 0x796d
0x02 0x2000
0x03 0xa231
0x04 0x01e1
0x05 0xc5e1
0x09 0x0300
0x0A 0x3800
0x10 0x5048
0x11 0xbc02
0x14 0x29c7
0x1E 0x0002
0x32 0x0000
0x6e 0x00a8.
0x86 0x006d

具有调试打印件的TI DP8.3867万驱动程序

/*
*用于Texas Instruments DP8.3867万 PHY的驱动程序
*
版权所有(C) 2015 Texas Instruments Inc.
*
*此程序是免费软件;您可以根据

* Free Software Foundation发布的GNU通用公共许可证的条款重新分发和/或修改*它; 许可证的版本2。
*
*发布本程序的目的是希望它能发挥作用
,*但不作任何保证;甚至不作
*适销性或特定用途适用性的暗示保证。 有关
详细信息,请参阅* GNU通用公共许可证。
*/

#include <linux/ethtool.h>
#include <linux/kernel.h>
#include
<linux/module.h>
#include <linux/of_h>
#include <linux/phy.h>

#include <linux/phy.h>#include <dt-bindings/net/ti-dp8.3867万.h>#define DP867_DP8PH67#define

DP8DP832#DP8DP1810_DP338PH_DP1810#DP338PH_DP1810#DP338PH_DR_DP338PH338120</s>1810 181033.812万		
		

	
	
		
		


	
	

	
	

MICR中断位*/
#define MII_DP8.3867万_MICR_AN_ERR_INT_EN		位(15)
#define MII_DP8.3867万_MICR_SPEED CHNG_INT_EN	位(14)
#define MII_DP8.3867万_MIC_DP8_INT_BI_DP867_INT_BI_DEFALTE_MI38M38_MIC_MIC_DP8_MIC_MIC_DP7_MIC_MIC_MIC_MIC_MI_MIC_MI_MIC_DP8_MI_MI_MIC_MIC_MIC_MIC_MIC_MI_MI_MI_MI_MI_MI_867_MI_MI_MI_MI_BI_BI_DELBRO_MI_DEBRO_MI_MI_MI38_MI_MI38_MI_MI_MI_MI_867_MI_MI_MI_MI_MI_MI_MI_DEL_MI_MI_MI_MI_MI_MI_MI38_MI_MI38_MI_MI_MI_MI_MI_MI_MI_MI_867_BI_BI_BI_ 	
	
	
	
	
	
		
	
	
		


		
		

/* PHY CTRL Bits */
#define DP8.3867万_PHYCR_FIFO_DEPTY_SHIFE		14
#define DP8.3867万_MDI_crossover 5
#define DP8.3867万_MDI_Crossing_Auto 1

/* RGMIIDCTL位*/
#define DP8.3867万_RGMII_TX_CLK_DELAY_SHIFT	4

结构dp8.3867万_private {
	int rx_id_delay;
	int tx_id_delay;
	int fifo_depth;
};

静态int dp8.3867万_ack_interrupt (struct statut_device *phydev)
{ int r_dev_return
	<_diphiph = 0; r_diphiphiph; r_status_diphiphiph = r_r_r_diphiphiph; r_status_int_diphiphiphiph; r_int_status_diph

	
		

	



= r_diph =
	

	如果(phydev->interrupts == PHY_ENABLED){
		MICR_STATUS = phy_read (phydev,MII_DP8.3867万_MICR);
		如果(MICR_STATUS < 0)
			返回MICR_STATUS;

		MICR_STATUS |=(MII_DP8.3867万_MIC_MIC_INT_PHY_INT_DP3867_EN
			|3867 |
			MIC_MIC_MIC_DI_DI_DI_DI38r_DI_DI_DI_DI3867_DI_DI_DI_DI_DI_DIB_DIB_DI3867_DEF_DIB_DI_DI3867_DI_DIB_DI_DI_DI3867_DIB_DIB_DIB_DIB_DI_DIB_DIB_DIB_DIB_DIB_DIB_DI3867_DI38_DI_DI_DIB_DIB_DIB_DI3867_DIB_DI_DI_DIB_DIB_DIB_DIB_DI3867_DI_DI38_DIB_DIB_DIB_DIB_DI38</s>3867 38673867386738673867
			
			

		
	

	
	





	
	struct device *dev =&phydev->dev;
	struct device_node *of_node = dev->of_node;
	int ret;

	if (!of_node &&dev->parent->of_node)
		of_node = dev->parent->of_node = dev->of_node;

	if (!phydev->dev.of_node)
		返回-ENDEFip_DET,

	parit_8ip_DEP32; parit_DET, parit_DET, parit_DET, parit_DEP67_DET, parit_DEP32; parit_DEDIDEPART, parit_DEP32; parit_DEDIDEPART, parit_DEPART_DEPART, parit_DEP32, parit_DEP38DE38DEP38DE, parit_DEPART, parit_DEP38DE, parit_DE38DE38DE, parit_DET
				
	
		

	
				
	
		

	
				

#else
static int dp8.3867万_of_init(struct phy_device *phydev)
{
	return 0;
}
#endif /* config_of_mdio */

static int dp8.3867万_config_init(sizt phy_device *pydev)
{
	struct dp8.3867万_priv*dp83867;
	int8.3867万 int ret;
	int ret; ustruct py, pydev-{sizt

	pref, sizt=8.3867万_dev)
		
				gfp_kernel);
		if (!dp8.3867万)
			返回-ENOMEM;

		phydev->priv= dp8.3867万;
		ret = dp8.3867万_of_init(pydev);
		if (ret)
			返回ret;
	} else {
		dp8.3867万=(struct dp8.3867万_private *)phydev->priv;
	}

printk ("phy fifo depth %x\n",dp8.3867万->fifo_depth);
	if (phy_interface_is_RGMII (phydev)){
		ret = phy_write (phyret,MII_DP8.3867万_PHYCTRL,
			DP8.3867万_TRIP_AUTO<< DP8.3867万_PHYDEF_DI_DI_DEPTH <);
			p_8gf_1_p_p_1_1g_p_p_1f_p_p_<)
		
			
	

	;<podrgf_<) p_p_1_1_<p_<p_<) p_p_<p_<p_<p_<podrgf_<= p_<p_<p_<) print_<p_<p_<p_<= p_<p<= p<= p<) print_p<= p<p_

	
	(phydev->接口<= PHY_INTERFACE_MODE_RGMII_RXID){
		val = phy_read_MMD_INDIRECT (phydev,DP8.3867万_RGMIICCL,
					DP8.3867万_DEVADDR, phydev->addr);

printk ("old reg 0x32 val:%x\n",val);

		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
			val ||(DP8.3867万_RGMII_TX_CLK_DELAY _EN | DP8.3867万_RGMII_RDEF_CLIM_CLIM_R67_DP8_CLIM_RDEF_CLIM_CLIM_8_CLIM_CDIRECT_DR_DP38DEF_CLIM_CLIM_C_8_CLIM_I=

		
			

		
			

		
				DP8.3867万_DEVADDR, phydev->addr, val);

printk ("DTS Rx id Delay %x\n",dp8.3867万->rx_id_delay);
printk ("DTS TX id delay %x\n",dp8.3867万->TX_id_delay);

		Delay =(dp8.3867万->Rx_id_delay |
			(dp8.3867万->TX_id_delay << DP8.3867万_RGMII_TX_CLK_Delay_shift));

printk ("Delay %x\n",delay);

		phy_write_MMD_indirect (phydev,DP8.3867万_RGMIIDCTL,
				DP8.3867万_DEVADDR,phydev->addr,delay);

		val = phy_read_MMD_indirect (phydev,DP8.3867万_RGMIICCL,
					DP8.3867万_DEVADDR, phydev->addr);

printk ("新reg 0x32 val:%x\n",val);

		val = phy_read_md_indirect (phydev,DP8.3867万_RGMIIDCTL,
					DP8.3867万_DEVADDR, phydev->addr);

printk (“new reg 0x86 val:%x\n",val);
	}

	返回0;
}

静态int dp8.3867万_phy_reset (struct phy_device *phydev)
{
	int err;
	err = phy_write(pydev, DP8.3867万_CTRL, DP8.3867万_SW_reset);
	如果(错误<0)
		返回错误;

printk ("phy reset ... succeed\n");
	return dp8.3867万_config_init(pydev);
}

静态结构phy_driver dp8.3867万_driver[]={
	
		.phy_id		= DP8.3867万_phy_ID,
		.phy_id_mask	= 0xfffffff0,
		.name		="TI DP8.3867万_driver dp3867_driver[],py_init_py_p_p_cut_cut_d3867=,
		fy_rit_p_init_p_p_p3867= 	
				

			
			

		/* IRQ相关*/
		.ack_interrupt	= dp8.3867万_ack_interrupt,
		.config_intr	= dp8.3867万_config_intr,

		.config_aneg	= genphy_config_aneg,
		.read_status	= genphy_read_status,
		.suspend	= genphy_suspend,
		.resume		= genphy_resume,

		.driver		={.owner = his_module,}
	,
};
module_phy_driver (dp8.3867万_driver);

静态结构midio_device_id __mer_unused dp8.3867万_tbl[]={
	DP8.3867万_PHY_ID,0xfffffff0,
	{}
;

模块d38bl

module_description ("Texas Instruments DP8.3867万 PHY驱动程序");
module_author ("Dan Murphy <dmurphy@ti.com);
module_license ("GPL"); 

从代码输出(播放延迟)

[ 1.29.2634万 ] libphy:MACB_MI_BUS:探测
[ 1.30.0599万 ] phy reset ...成功
[ 1.30.375万 ] phy fifo depth 0
[ 1.30.6668万 ] reg 0x10 val:20
[ 1.30.953万 ] old reg 0x32 val:d3
[ DTS] 1.31.2696万 Rx id延迟b
[ DTS] 1.31.5576万 TX ID延迟8.
[ 1.31.8543万 ]延迟8b
[ 1.32.0925万 ] new reg 0x32 val:d3
[ 1.32.4092万 ] new reg 0x86 val:8b

谢谢,期待您的专业知识。  

-Daniel

 

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

    您正在使用的DP8.3867万驱动程序将调整TX_CLK和TX_Dx偏移。 但是,根据您对问题的描述,您可以从Linux发送数据。
    我认为您应该尝试调整RX_CLK和RX_Dx延迟,因为接收数据时出现问题。

    MAC是否能够调整延迟?

    DP8.3867万还提供调整此设置的功能,但您应在驱动程序中设置以下宏,并可尝试使用不同的值。

    #define DP8.3867万_RGMII_RX_CLK_DELAY_EN bit (0)-->设置为1。


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

    Geet,您好!  

    该位是在代码的配置部分设置的?

    IF (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
    Val ||(DP8.3867万_RGMII_TX_CLK_DELAY_EN | DP8.3867万_RGMII_RX_CLK_DELAY_EN); 

    为什么我在地址0x86写入PHY时该值不存在。 例如,我应该能够将0x0077写入地址0x86正确吗?

    谢谢!

    丹尼尔

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

    如果您仍在寻找有关此主题的信息,请告诉我。

    此致,
    很棒