Linux MDIO子系统深度剖析:从原理到实践(5)
接前一篇文章Linux MDIO子系统深度剖析从原理到实践4五、用户空间访问实例1. 使用ioctl访问PHY寄存器虽然大多数情况下PHY的管理由内核驱动自动处理但在调试或特殊应用场景中用户空间程序可能需要直接访问PHY寄存器。Linux提供了通过socket ioctl接口访问PHY寄存器的能力这为用户空间工具提供了底层的PHY管理功能。主要的ioctl命令包括SIOCGMIIPHY获取MDIO总线上的当前PHY地址。SIOCGMIIREG读取指定PHY寄存器的值。SIOCSMIIREG设置指定PHY寄存器的值。这些ioctl命令使用struct mii_ioctl_data作为数据传输结构其定义如下struct mii_ioctl_data { __u16 phy_id; // PHY 设备地址 __u16 reg_num; // 寄存器地址 __u16 val_in; // 写入的值用于写操作 __u16 val_out; // 读取的值用于读操作 };这种用户空间的访问机制类似于提供了一个硬件调试终端让开发者和系统管理员能够直接与PHY芯片对话检查状态、修改配置或进行故障诊断。2. 完整代码示例以下是一个完整的用户空间MDIO工具实现支持读取和写入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: 一个用户空间 MDIO 调试工具\n); \ printf(读取操作: mdio 接口名 寄存器地址\n); \ printf(写入操作: mdio 接口名 寄存器地址 数值\n); \ printf(示例:\n); \ printf(mdio eth0 1\t# 读取 eth0 的 PHY 寄存器 1\n); \ printf(mdio eth0 0 0x1120\t# 向 eth0 的 PHY 寄存器 0 写入 0x1120\n\n); \ int sockfd; int main(int argc, char *argv[]){ if(argc 1 || !strcmp(argv[1], -h)){ help(); return 0; } 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); // 获取 PHY 地址 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(读取 PHY 地址: 0x%x 寄存器: 0x%x 值: 0x%x\n, mii-phy_id, mii-reg_num, mii-val_out); // 检查链路状态寄存器 1 的第 2 位 if (mii-reg_num 1) { if (mii-val_out 0x0004) { printf(链路状态: UP\n); } else { printf(链路状态: DOWN\n); } } } 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(sockwd, SIOCSMIIREG, ifr); reteck(ret); printf(写入 PHY 地址: 0x%x 寄存器: 0x%x 值: 0x%x\n, mii-phy_id, mii-reg_num, mii-val_in); } else { help(); } lab: if (sockfd 0) close(sockfd); return 0; }3. 编译与运行这个MDIO工具可以很容易地编译和使用1编译gcc -o mdio mdio_tool.c2安装可选sudo cp mdio /usr/local/bin/3使用示例读取PHY状态寄存器寄存器 1./mdio eth0 1输出结果读取 PHY 地址: 0x1 寄存器: 0x1 值: 0x796d 链路状态: UP写入PHY控制寄存器寄存器0./mdio eth0 0 0x1140输出结果写入 PHY 地址: 0x1 寄存器: 0x0 值: 0x1140检查链路状态./mdio eth0 1然后检查输出中的值寄存器1的第2位从0开始计数表示链路状态1表示链路UP0表示链路DOWN。这个工具提供了对PHY寄存器的底层访问能力对于调试网络连接问题、验证PHY配置或学习 MDIO总线工作原理都非常有用。但需要注意的是不当的寄存器修改可能会导致网络连接中断因此在生产环境中使用需要格外小心。更多内容请看下回。

相关新闻

基于MATLAB的8个OFDM-Chirp波形时频域及模糊函数分析

基于MATLAB的8个OFDM-Chirp波形时频域及模糊函数分析

一、核心原理与算法设计 1. OFDM-Chirp波形生成信号结构:将线性调频(Chirp)信号作为OFDM子载波,通过IFFT实现多载波调制。数学表达:其中,ααα为Chirp斜率,fkf_kfk​为子载波频率,T…

2026/7/6 7:33:22 阅读更多 →
MemOS 产品更新|知识库检索更精准,记忆更省、更智能

MemOS 产品更新|知识库检索更精准,记忆更省、更智能

在 v2.0.2 中,我们围绕「知识库问答效果」与「记忆系统内部机制」两条主线,对检索、工具记忆与事实记忆处理流程进行了进一步优化,同时补充了官方最佳实践文档,帮助开发者更快构建可落地的 MemOS 应用。 本次发布汇总一、优化知识…

2026/7/5 2:52:08 阅读更多 →
2026新规落地,网络安全迎来“大考”!这6大专业是未来高薪领域

2026新规落地,网络安全迎来“大考”!这6大专业是未来高薪领域

建议收藏:2026网络安全法修订后,这6大专业让你轻松入行高薪领域! 2026年修订后的《网络安全法》正式施行,标志着我国网络安全治理进入"智能时代"。文章详细介绍6大网络安全相关专业:网络空间安全、信息安全…

2026/7/4 18:12:33 阅读更多 →

最新新闻

SDF在游戏开发中的创新应用:Dreams与Claybook技术案例分析

SDF在游戏开发中的创新应用:Dreams与Claybook技术案例分析

SDF在游戏开发中的创新应用:Dreams与Claybook技术案例分析 【免费下载链接】SDF Collection of resources (papers, links, discussions, shadertoys,...) related to Signed Distance Field 项目地址: https://gitcode.com/gh_mirrors/sdf/SDF 有符号距离场…

2026/7/6 21:22:23 阅读更多 →
Python异步编程的革命性突破:nest_asyncio 嵌套事件循环完全指南

Python异步编程的革命性突破:nest_asyncio 嵌套事件循环完全指南

Python异步编程的革命性突破:nest_asyncio 嵌套事件循环完全指南 【免费下载链接】nest_asyncio Patch asyncio to allow nested event loops 项目地址: https://gitcode.com/gh_mirrors/ne/nest_asyncio 在Python异步编程领域,asyncio库为开发者…

2026/7/6 21:22:23 阅读更多 →
Miniworld开发指南:贡献代码与参与社区建设的完整路径

Miniworld开发指南:贡献代码与参与社区建设的完整路径

Miniworld开发指南:贡献代码与参与社区建设的完整路径 【免费下载链接】Miniworld Simple and easily configurable 3D FPS-game-like environments for reinforcement learning 项目地址: https://gitcode.com/gh_mirrors/mi/Miniworld Miniworld作为一款面…

2026/7/6 21:22:23 阅读更多 →
【计算机工具类-CI和CD工具Skills】appdeploy 技能

【计算机工具类-CI和CD工具Skills】appdeploy 技能

部署具有后端API、数据库和文件存储的Web应用。当用户要求部署或发布网站或Web应用并希望获得公共URL时使用。通过curl使用HTTP API。 技能概述 appdeploy 技能通过HTTP API将Web应用部署到AppDeploy平台。它支持前端和后端API、数据库和文件存储的部署,并提供公共URL。该技能…

2026/7/6 21:20:23 阅读更多 →
PCF8591与MSP432P401R的ADC/DAC应用指南

PCF8591与MSP432P401R的ADC/DAC应用指南

1. 项目背景与硬件选型解析在嵌入式系统开发中,模拟信号与数字信号的相互转换是基础且关键的技术环节。PCF8591作为一款经典的8位ADC/DAC转换芯片,与MSP432P401R这款高性能ARM Cortex-M4微控制器的组合,能够为开发者提供灵活可靠的信号处理解…

2026/7/6 21:20:23 阅读更多 →
如何实现Material Menu与Navigation Drawer的联动动画:打造流畅的Android交互体验

如何实现Material Menu与Navigation Drawer的联动动画:打造流畅的Android交互体验

如何实现Material Menu与Navigation Drawer的联动动画:打造流畅的Android交互体验 【免费下载链接】material-menu [deprecated] Animations for Android L drawer, back, dismiss and check icons 项目地址: https://gitcode.com/gh_mirrors/ma/material-menu …

2026/7/6 21:20:23 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻