CPU用的是Armada-3720,内核是https://github.com/MarvellEmbeddedProcessors/linux-marvell 里面18.12版本,uboot使用的是https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/tree/u-boot-2018.03-armada-18.12。两路网口,一路是RGMII模式(lan1),另外一路是SGMII模式(lan2)。最近发现有时系统起来后用PC去ping lan2会ping不通,phy可以正常识别,执行ifconfig down/up也可以看到正常的打印信息。
另外起来后lan2 ping的通时就一直ping的通,也不会出现丢包、断掉现象(起来后ping的通时测试了两天时间左右)。rgmii的lan1一直比较稳定,未发现ping不通的时候,所以认为phy这侧应该是好的。总之感觉就是lan2初始化不稳定。
看了88e1512的datesheet后,发现18页的第18个寄存器可以配置一下看数据包的接收状态。
在网上找了一个miitool工具(https://github.com/kontron/miitool),可以通过mdio读写phy寄存器,第22个寄存器是选择寄存器页数的。
测试出来系统启动后lan2 ping不通的情况下是没有包的,17_18寄存器值为0,系统起来lan2正常时是有数据包的,17_18寄存器值会一直增长(测试时PC一直ping lan2)。大概率是mac层这一侧没有接收到数据。
找了marvell代理商的技术支持问了下,后来怀疑是我们uboot没有正确配置Serdes,查了下Serdes的说明,
我发现已经在内核的dts里配置了,并且已经禁用了usb3.0,难道系统起来后重新配置没有起作用,一定要在uboot里配置?
看了下uboot的Serdes配置,里面comphy0默认是usb3.0,参照arch/arm/dts/armada-3720-ddr3-db-v2-B.dts中的配置修改了comphy0。
修改arch/arm/dts/armada-3720-espressobin.dts,重新编译了uboot。
重新烧写uboot系统起来后,连续插拔电六十次进行测试,发现lan2不会出现ping不通的情况了,问题解决!后来又看了文档有说到GPIO和serdes的初始化一定要放在uboot里。
版权属于:咖啡走糖
本文链接:https://cloud.tencent.com/developer/article/2152379
若无注明,本文皆咖啡走糖原创,转载时必须注明出处及本声明!