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;

}

相关文章
|
7月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
565 0
|
8月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
7月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
209 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
6月前
|
机器学习/深度学习 数据采集 边缘计算
基于灰色神经网络的预测方法
基于灰色神经网络的预测方法
417 0
|
8月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
571 18
|
8月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
408 5
|
8月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2217 10
|
7月前
|
算法 Python
【EI复现】考虑网络动态重构的分布式电源选址定容优化方法(Matlab代码实现)
【EI复现】考虑网络动态重构的分布式电源选址定容优化方法(Matlab代码实现)
287 0
|
8月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
452 0
|
9月前
|
存储 Linux 容器
【Container App】在容器中抓取网络包的方法
本文介绍在Azure Container App中安装tcpdump抓取网络包,并通过Storage Account上传抓包文件的方法。内容包括使用curl和nc测试外部接口连通性、长Ping端口、安装tcpdump、抓取网络包、以及通过crul命令上传文件至Azure Storage。适用于需要分析网络请求和排查网络问题的场景。
272 1