Linux 网络驱动 phy 读写寄存器调试方法

简介: Linux 网络驱动 phy 读写寄存器调试方法

Linux 网络 phy 调试方法

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

在驱动层,设备树绑定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地址要写入的值

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

#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>
 
//#include <QDebug>
 
 
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;
}

————————————————
版权声明:本文为CSDN博主「Eric_Xi_BJ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yafeixi/article/details/112958722

目录
相关文章
|
12月前
|
人工智能 运维 安全
配置驱动的动态 Agent 架构网络:实现高效编排、动态更新与智能治理
本文所阐述的配置驱动智能 Agent 架构,其核心价值在于为 Agent 开发领域提供了一套通用的、可落地的标准化范式。
5455 121
|
12月前
|
人工智能 安全 数据可视化
配置驱动的动态Agent架构网络:实现高效编排、动态更新与智能治理
本文系统性地提出并阐述了一种配置驱动的独立运行时Agent架构,旨在解决当前低代码/平台化Agent方案在企业级落地时面临困难,为Agent开发领域提供了一套通用的、可落地的标准化范式。
817 18
配置驱动的动态Agent架构网络:实现高效编排、动态更新与智能治理
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
758 18
|
12月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
315 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
565 5
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
1445 5
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
480 19
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
293 0
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
669 0
|
运维 网络协议 安全
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
【Shell 命令集合 网络通讯 】Linux 网络抓包工具 tcpdump命令 使用指南
833 0