国科解决YT8521网不通的方法

国科解决YT8521网不通的方法

前言

第一次移植PHY驱动,几经波折终于是调好了,写个blog来记录这一次遇到的问题以及解决方案,以防之后遇到类似的问题忘记了如何解决。

调试准备

硬件调试

根据硬件原理图确保管脚复用正确,可使用bspmm查看。

内核配置

这个步骤可以参考裕泰给出的文档进行操作。

比如我的目标板开发环境Linux是在如下目录:
  ~/motocomm/kernel/linux-rt-4.19.94
就将motorcomm.c和头文件motorcomm_phy.h(新版本中不需要此文件了)copy到各自的目录:
  cp motorcomm.c  		~/motocomm/kernel/linux-rt-4.19.94/drivers/net/phy/.
  cp motorcomm_phy.h 	~/motocomm/kernel/linux-rt-4.19.94/ include/linux/.
cp: cannot stat '/tmp/use_code': No such file or directory
注意Kconfig和Makefile不能直接copy过去而要与当前系统里的这二个文件做合并:
Kconfig是合并下面的部分:
config MOTORCOMM_PHY
tristate "Motorcomm PHYs"
---help---
 Supports the YT8010, YT8510, YT8511, YT8512 PHYs.
Makefile合并下面的部分:
obj-$(CONFIG_MOTORCOMM_PHY) += motorcomm.o
修改完成后(编译链因板而异)
make ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- menuconfig
device drivers -> Network device support -> PHY Device support and infrastructure
在上述路径下选中 motorcomm模块,最后重新编译内核即可。

编译内核

make ARCH=arm64 CROSS_COMPILE=aarch64-mix210-linux- uImage -j 20

运行内核并测试网口情况

编译完成后,重新烧录。
正常情况下,板端会出现以下驱动和eth0网络设备:

~ # ls /sys/bus/mdio_bus/drivers
Generic 10G PHY             YT8521 Ethernet
Generic PHY                 YT8531 Gigabit Ethernet
YT8010 Automotive Ethernet  YT8531S Ethernet
YT8510 100!10Mb Ethernet    YT8614 Ethernet
YT8511 Gigabit Ethernet     YT8618 Ethernet
YT8512 Ethernet             YT8821 2.5Gb Ethernet
YT8512B Ethernet
~ # ls /sys/class/net/
eth0  lo

出现的问题:
1.net下面并没有eth0设备
分析:PHY地址没有设置正确。板端默认PHY地址为1,但是YT8521对应PHY0,正确配置gmac以及PHY地址后,解决问题。

● U-boot下配置方式
U-boot下可通过修改U-boot配置文件include/configs/ss928v100.h中宏定义
CONFIG_GMAC_PHY0_ADDR和CONFIG_GMAC_PHY1_ADDR的值来配置不同的
PHY地址。
● Kernel下配置方式
在Kernel下可通过修改 arch/arm64/boot/dts/vendor下的dts配置文件
ss928v100-demb.dts配置PHY地址。“reg = <1>”中的数值1表示
PHY地址。

2.ping不通
板端只发不收,这个问题困扰了我好几天,还好看到了这个帖子。网络驱动->PHY驱动调试.按照文章提供的思路逐个排查,发现之前的硬件版提供了2ns的RX_DELAY,新板是没有的。由于设备树内并没有配置RX_DELAY的部分,因此使用寄存器加长RX_DELAY。
根据YT的文档:

实际使用中若需要加长 rx_delay,以改善 setup 时间,也可以通过配置 common 扩展寄存器来配置:
Write_ext_reg0xa003[13:10]: 默认为 4’b0,每加 1,则 rx_delay 延长约 150ps。(无论 RGMII 工作在
125MHz/25MHz/2.5MHz)

加长接收延时后问题解决!

./phyreg eth0 0x1e 0xa003 && ./phyreg eth0 0x1f 0x3cf1

phyreg源码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <linux/mii.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <linux/types.h>
#include <netinet/in.h>
#define reteck(ret) \
 if(ret < 0){ \
 printf("%m! \"%s\" : line: %d\n", __func__, __LINE__); \
 goto lab; \
 }
#define help() \
 printf("mdio:\n"); \
 printf("read operation: mdio reg_addr\n"); \
 printf("write operation: mdio reg_addr value\n"); \
 printf("For example:\n"); \
 printf("mdio eth0 1\n"); \
 printf("mdio eth0 0 0x12\n\n"); \
 exit(0);
int sockfd;
int main(int argc, char *argv[]){

 if(argc == 1 || !strcmp(argv[1], "-h")){
 help();
 }

 struct mii_ioctl_data *mii = NULL;
 struct ifreq ifr;
 int ret;
 memset(&ifr, 0, sizeof(ifr));
 strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);
 sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
 reteck(sockfd);
 //get phy address in smi bus
 ret = ioctl(sockfd, SIOCGMIIPHY, &ifr);
 reteck(ret);
 mii = (struct mii_ioctl_data*)&ifr.ifr_data;
 if(argc == 3){
 mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0);

 ret = ioctl(sockfd, SIOCGMIIREG, &ifr);
 reteck(ret);

 printf("read phy addr: 0x%x reg: 0x%x value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_out);
}else if(argc == 4){
 mii->reg_num = (uint16_t)strtoul(argv[2], NULL, 0);
 mii->val_in = (uint16_t)strtoul(argv[3], NULL, 0);
 ret = ioctl(sockfd, SIOCSMIIREG, &ifr);
 reteck(ret);
 printf("write phy addr: 0x%x reg: 0x%x value : 0x%x\n", mii->phy_id, mii->reg_num, mii->val_in);
 }
lab:
 close(sockfd);
 return 0;
}


参考链接:
海思YT8511千兆网不通的解决方法
网络驱动->PHY驱动调试

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值