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;

}

相关文章
|
20天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
46 11
|
3月前
|
机器学习/深度学习 数据采集 人工智能
未来的守护神:AI驱动的网络安全之盾,如何用智慧的光芒驱散网络黑暗势力?揭秘高科技防御系统背后的惊天秘密!
【10月更文挑战第3天】随着网络技术的发展,网络安全问题日益严峻,传统防御手段已显不足。本文探讨了构建AI驱动的自适应网络安全防御系统的必要性及其关键环节:数据采集、行为分析、威胁识别、响应决策和执行。通过Python库(如scapy、scikit-learn和TensorFlow)的应用实例,展示了如何利用AI技术提升网络安全防护水平。这种系统能够实时监控、智能分析并自动化响应,显著提高防护效率与准确性,为数字世界提供更强大的安全保障。
73 2
|
26天前
|
机器学习/深度学习 数据采集 人工智能
基于Huffman树的层次化Softmax:面向大规模神经网络的高效概率计算方法
层次化Softmax算法通过引入Huffman树结构,将传统Softmax的计算复杂度从线性降至对数级别,显著提升了大规模词汇表的训练效率。该算法不仅优化了计算效率,还在处理大规模离散分布问题上提供了新的思路。文章详细介绍了Huffman树的构建、节点编码、概率计算及基于Gensim的实现方法,并讨论了工程实现中的优化策略与应用实践。
66 15
基于Huffman树的层次化Softmax:面向大规模神经网络的高效概率计算方法
|
9天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
48 6
|
19天前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
46 11
|
18天前
|
域名解析 缓存 网络协议
优化Lua-cURL:减少网络请求延迟的实用方法
优化Lua-cURL:减少网络请求延迟的实用方法
|
24天前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
46 14
|
2月前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
252 6
Linux调试
|
2月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
151 1
|
2月前
|
安全 算法 网络安全
量子计算与网络安全:保护数据的新方法
量子计算的崛起为网络安全带来了新的挑战和机遇。本文介绍了量子计算的基本原理,重点探讨了量子加密技术,如量子密钥分发(QKD)和量子签名,这些技术利用量子物理的特性,提供更高的安全性和可扩展性。未来,量子加密将在金融、政府通信等领域发挥重要作用,但仍需克服量子硬件不稳定性和算法优化等挑战。