linux网络驱动phy的读写调试方法

简介: 网络 phy 调试方法

目前嵌入式芯片支持双网卡的有很多。在调试网络驱动时,需要通过mdc 和mdio信号对phy的寄存器进行操作调试。如果每次调试都修改网络驱动的话会很麻烦。下面提供我常用的网络驱动调试方法

![image.png](https://ucc.alicdn.com/pic/developer-ecology/ee408d1dd26b4bc2b5b7a2a3cd6b16c8.png)

在驱动层,设备树绑定mac与mdio总线的关系。

在Linux应用层,编写测试程序mdio  。代码如下:

如果是写寄存器操作,就传入四个参数./mdio ethX phyId addr value.

- ethX 表示是哪个网卡,如eth0 eth1

- phyId是  phy的物理地址,一般0x00是广播地址.有些phy 的0x00不是广播地址,如marvell 的88e1512 - ID 只能时0x00 0x11,0x00不是88e1512的广播地址。

- addr  是phy手册的寄存器地址

- value 是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>

#include <unistd.h>

int main(int argc, char *argv[])

{

   int sockfd;

   struct mii_ioctl_data *mii = NULL;

   struct ifreq ifr;

   memset(&ifr, 0, sizeof(ifr));

   strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);

   sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);

   ioctl(sockfd, SIOCGMIIPHY, &ifr);

   mii = (struct mii_ioctl_data*)&ifr.ifr_data;

 

   if(argc == 4)

   {

       strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);

       sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);

       ioctl(sockfd, SIOCGMIIPHY, &ifr);

       mii = (struct mii_ioctl_data*)&ifr.ifr_data;

 

       mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);

       mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);

 

       ioctl(sockfd, SIOCGMIIREG, &ifr);

 

       printf("read --- value : 0x%x", mii->val_out);

   }

   else if(argc == 5)

   {

       strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);

       sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);

       ioctl(sockfd, SIOCGMIIPHY, &ifr);

       mii = (struct mii_ioctl_data*)&ifr.ifr_data;

       mii->phy_id    = (uint16_t)strtoul(argv[2], NULL, 0);

       mii->reg_num    = (uint16_t)strtoul(argv[3], NULL, 0);

       mii->val_in     = (uint16_t)strtoul(argv[4], NULL, 0);

 

       ioctl(sockfd, SIOCSMIIREG, &ifr);

   }else{

      printf("mdio ethX phyId addr value\n");

   }

   close(sockfd);

   return 0;

}

相关文章
|
12天前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
37 4
|
12天前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
14 1
|
22天前
|
存储 缓存 网络协议
网络丢包排查方法
网络丢包排查方法
|
24天前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
65 2
|
24天前
|
监控 安全 iOS开发
|
8天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
21 0
|
12天前
|
机器学习/深度学习 数据采集 算法
图像处理神经网络数据预处理方法
图像预处理步骤对于图像处理神经网络至关重要。这些步骤不仅保证了数据的一致性和质量,还可以通过数据增强等技术提高模型的泛化能力,从而提升模型的整体性能。每一步骤的选择和应用都基于具体任务和数据集的特性,并在模型训练和测试过程中起到关键作用。
23 0
|
15天前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
46 0
|
23天前
|
Linux 开发工具 文件存储
Linux修改主机名的两种方法
Linux修改主机名的两种方法
23 0
|
27天前
|
存储 监控 安全
确保大型组织网络安全的策略与方法
【8月更文挑战第24天】
71 0