前段时间对PHY芯片进行了调试,在此做个记录总结。

网络子系统是linux操作系统里很重要的一部分,这里主要说明一下phy芯片在整个子系统里的位置。从这个结构里可以看到,PHY驱动处于链路层。

其硬件连接组成如图所示:

驱动开发适配需要注意以下几点:

1.检查硬件配置,确定PHY芯片的工作模式和RGMII电平是否正确。

2.查看原理图,确定与MAC设备的接口,是gmii还是rgmii或者其它,并在MAC侧的设备树中配置正确。

3. 确定主芯片是否需要PHY芯片提供时钟。

4.Phy芯片的地址正确配置,可以通过 mdio/mdc正确访问 到 phy芯片的寄存器。

如下为网上流行的phy.c读取phy寄存器的方法,需要将其交叉编译成可执行文件后使用,可以直接通过标准网络协议栈读写phy芯片的寄存器值,方便于调试PHY芯片。

#include <stdio.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;
}

用法如下:

(1) Phy 寄存器读

./phyreg eth0 0x1e

(2) Phy 寄存器写

./phyreg eth0 0x1e 0xc

(3) 读 ext 寄存器

例:读 ext reg 0xc:

./phyreg eth0 0x1e 0xc && ./phyreg eth0 0x1f

(4) 写 ext 寄存器

例:写 ext reg 0xc 值为 0x80f6:

./phyreg eth0 0x1e 0xc && ./phyreg eth0 0x1f 0x80f6

5.操作mac侧寄存器,调试tx_delay参数,测试丢包率。

phy 如果工作在含有RGMII 接口的模式,按照业内惯例,tx clk delay 由MAC 来完成;rx clk delay 由phy 来完成。所以一般PHY芯片的rx clk delay默认是 2ns, tx clk delay默认是750ps。

但不排除有些mac会对tx delay 不做配置,或对rx delay 也做配置等情况。就需要针对mac 的配置情况,来相应的在PHY芯片上电初始化时做适配。

PHY寄存器驱动调试总结相关推荐

  1. 驱动调试之自制工具——寄存器编辑器

    转自http://liu1227787871.blog.163.com/blog/static/2053631972012610101614610/ 当我们调试驱动程序的时候,可能要调整寄存器的设置. ...

  2. 网络驱动->PHY驱动调试

    1. Linux 系统网络协议层架构 网络协议框架图: 网络子系统是 linux 操作系统里很重要的一部分.关于这部分有很多的参考资料.这里主要说明一下 phy 芯片在整个子系统里的位置.从这个结构里 ...

  3. PHY驱动调试之 --- PHY控制器驱动(二)

    1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...

  4. 展锐UDX710:LAN7800 PHY驱动调试

    展锐UDX710:LAN7800 PHY驱动调试 1. 前期准备 1.1 调试环境 1.2 预置条件 1.3 硬件连接 2. 驱动适配 2.1 开启内核驱动支持 2.2 驱动加载验证 2.3 配置网络 ...

  5. 以太网PHY寄存器分析

    以太网PHY寄存器分析    1 1.以太网PHY标准寄存器分析    2 1.1 Control Register    2 1.2 Status register    5 1.3 PHY Ide ...

  6. 嵌入式软件之裸板与驱动调试

    目录 一.裸板调试 1.1 点灯法 1.2 串口调试 1.3 JTAG原理 1.4 JTAG调试 二.驱动调试 2.1 printk调试 2.1.1 printk原理 2.1.2 printk的使用 ...

  7. [linux kernel] 内核下ksz8081驱动调试

    系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 - ...

  8. 10 怎么写USB驱动,Cadence USB 2.0 Controller和PHY IP驱动移植

    怎么写USB驱动,Cadence USB 2.0 Controller和PHY IP驱动移植 作者 将狼才鲸 日期 2022-03-26 本子文档所属的上级文档(Gitee仓库): 才鲸 / 嵌入式知 ...

  9. 【A113】网卡芯片Realtek RTL8201驱动调试

    前言: 这一篇是对自己调试的一个过程记录,代码看的算是比较熟悉了,过程中一直没调过,没后询问原厂FAE,修改了一下dts一个地址参数,就可以了,最终没有太多成就感,修改了PHY芯片的一个状态寄存器.. ...

  10. 以太网PHY寄存器分析【转】

    转自:https://blog.csdn.net/Firefly_cjd/article/details/79825869 以太网PHY寄存器分析    1 1.以太网PHY标准寄存器分析    2 ...

最新文章

  1. MyBatis之ResultMap标签
  2. 实现Unity编辑器模式下的旋转
  3. 输出某个目录下的所有文件和文件夹,包括子文件夹中的内容
  4. DELL安装不了mysql_Windows 版本 Mysql 8.x 安装
  5. python多用户登录_python多用户
  6. SQLServr添加数据列
  7. linux中的定时器检测按键,STM32单片机利用定时器实现按键采集
  8. Android应用模块之间通信模式
  9. APP、软件版本号的命名规范与原则
  10. android 优秀控件以及开源项目
  11. Google黑客常用搜索语法
  12. 如何培养孩子一年读100本书
  13. 处理行内元素行内块元素中间空隙
  14. 思维导图工具之Freeplane(上篇)
  15. 设置samba密码时提示failed to find entry for user
  16. 浅谈——业务逻辑漏洞
  17. Win10电脑的快捷键有哪些?Windows10常用组合快捷键大全
  18. 今日新闻简报 十二条微语早报 每天一分钟 知晓天下事 3月2日
  19. 苹果党福利!手机数据备份恢复使用攻略
  20. 嵌入式系统工程师工资怎么样?

热门文章

  1. Java Web目前主流的框架以及正在兴起的框架
  2. Ubuntu18新系统火狐浏览器无法播放音乐和视频
  3. iOS编程比较好开源的完整项目iOS编程比较好开源的完整项目
  4. Qt Creator使用Valgrind代码分析工具
  5. 如何安装biopython_Biopython安装
  6. 平安普惠系统上线申请表模板
  7. python文件查重_海量文件查重SimHash和Minhash
  8. django提供的admin后台增加用户时提示:“Table ‘login.login_user‘ doesn‘t exist“
  9. aspose.words生成pdf字体乱码为方框
  10. SDL Trados外部审阅无法正常导入并显示修订的问题