当前位置: 首页 > article >正文

手把手教你写一个Linux下的mdio调试工具(附完整C代码)

从零构建Linux MDIO调试工具深入PHY寄存器操作实战当你面对一块没有预装mii-tool或ethtool的嵌入式开发板或者需要直接操作PHY芯片寄存器进行底层调试时自己动手编写一个轻量级MDIO工具会成为解决问题的关键。本文将带你深入Linux内核的MII接口机制从Socket通信到ioctl调用完整实现一个可读写PHY寄存器的命令行工具。1. MDIO工具开发基础与环境准备MDIOManagement Data Input/Output是IEEE 802.3定义的双线串行接口用于MAC与PHY之间的管理通信。在Linux系统中内核通过MII ioctl接口向用户空间暴露了这一能力。我们的工具本质上是一个精心设计的ioctl调用封装器。开发环境需要准备运行Linux的开发板或PC内核版本≥2.6GCC工具链基本的C编程知识目标网络设备的PHY芯片手册关键头文件包括#include linux/mii.h // MII相关数据结构 #include sys/ioctl.h // ioctl系统调用 #include net/if.h // 网络接口定义2. 核心架构设计与实现2.1 网络接口初始化工具首先需要绑定到特定网络接口。我们使用socket创建本地数据报套接字作为ioctl的通信通道int sockfd socket(PF_LOCAL, SOCK_DGRAM, 0); if (sockfd 0) { perror(socket creation failed); return -1; } struct ifreq ifr; memset(ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, argv[1], IFNAMSIZ - 1);2.2 PHY地址自动发现通过SIOCGMIIPHYioctl可以获取接口关联的PHY地址这避免了手动配置的麻烦int ret ioctl(sockfd, SIOCGMIIPHY, ifr); if (ret 0) { perror(Failed to get PHY address); close(sockfd); return -1; } struct mii_ioctl_data *mii (struct mii_ioctl_data*)ifr.ifr_data; printf(Discovered PHY ID: 0x%x\n, mii-phy_id);2.3 寄存器读写实现读写操作分别使用SIOCGMIIREG和SIOCSMIIREG命令。我们设计统一的错误处理机制#define CMD_READ 1 #define CMD_WRITE 2 int handle_mdio_op(int sockfd, struct ifreq *ifr, int cmd, uint16_t reg, uint16_t val) { struct mii_ioctl_data *mii (struct mii_ioctl_data*)ifr-ifr_data; mii-reg_num reg; if (cmd CMD_WRITE) { mii-val_in val; return ioctl(sockfd, SIOCSMIIREG, ifr); } else { int ret ioctl(sockfd, SIOCGMIIREG, ifr); if (ret 0) { printf(REG 0x%x: 0x%04x\n, reg, mii-val_out); } return ret; } }3. 命令行接口设计良好的CLI设计能提升工具易用性。我们支持以下命令格式mdio-tool interface read reg mdio-tool interface write reg value实现代码框架int main(int argc, char **argv) { if (argc 4 || strcmp(argv[2], read) 0 argc ! 4 || strcmp(argv[2], write) 0 argc ! 5) { print_usage(argv[0]); return 1; } // 初始化socket和ifreq... if (strcmp(argv[2], read) 0) { uint16_t reg strtoul(argv[3], NULL, 0); handle_mdio_op(sockfd, ifr, CMD_READ, reg, 0); } else if (strcmp(argv[2], write) 0) { uint16_t reg strtoul(argv[3], NULL, 0); uint16_t val strtoul(argv[4], NULL, 0); handle_mdio_op(sockfd, ifr, CMD_WRITE, reg, val); } close(sockfd); return 0; }4. 高级功能扩展4.1 批量寄存器操作添加批量读取功能方便调试时扫描寄存器空间void scan_registers(int sockfd, struct ifreq *ifr, uint16_t start, uint16_t end) { printf(Scanning registers 0x%x-0x%x:\n, start, end); for (uint16_t reg start; reg end; reg) { if (handle_mdio_op(sockfd, ifr, CMD_READ, reg, 0) 0) { // 输出已在handle_mdio_op中处理 } else { fprintf(stderr, Failed to read reg 0x%x\n, reg); } } }4.2 权限处理与错误恢复MDIO操作通常需要root权限。我们添加友好的错误提示if (geteuid() ! 0) { fprintf(stderr, Error: This tool requires root privileges\n); fprintf(stderr, Try running with sudo or as root user\n); return -EPERM; }对于常见的错误代码提供解释性信息错误代码含义建议解决方案EINVAL无效参数检查寄存器地址是否有效ENODEV设备不存在确认接口名称正确EIOPHY通信错误检查MDIO总线连接EPERM权限不足以root用户运行5. 编译与使用指南使用以下命令编译工具gcc mdio-tool.c -o mdio-tool -Wall -Wextra实际应用示例读取PHY ID寄存器通常为寄存器2sudo ./mdio-tool eth0 read 2修改PHY控制寄存器寄存器0的复位位sudo ./mdio-tool eth0 write 0 0x8000扫描前16个寄存器sudo ./mdio-tool eth0 scan 0 15调试技巧结合ethtool -d的输出对比寄存器值修改前务必记录原始值以便恢复某些寄存器位是只读的写入会失败

相关文章:

手把手教你写一个Linux下的mdio调试工具(附完整C代码)

从零构建Linux MDIO调试工具:深入PHY寄存器操作实战 当你面对一块没有预装mii-tool或ethtool的嵌入式开发板,或者需要直接操作PHY芯片寄存器进行底层调试时,自己动手编写一个轻量级MDIO工具会成为解决问题的关键。本文将带你深入Linux内核的M…...

别再让Langchain流式输出卡脖子了!FastAPI + SSE实战,附ChatGLM3完整配置

Langchain流式输出实战:FastAPI与SSE深度整合指南 引言 在当今AI应用开发领域,流式输出已成为提升用户体验的关键技术。想象一下,当用户与你的AI助手交互时,等待完整响应的时间可能长达数秒甚至更久——这种等待体验在实时交互场…...

从理论实验室到全球加密网络的技术跃迁

量子通信基于量子力学原理构建绝对安全的加密体系。其核心量子密钥分发(QKD)技术利用量子不可克隆、测量坍缩及纠缠分发三大特性,实现“窃听必留痕”的物理级防护,从根本上抵御量子计算攻击。中国在该领域实现多重突破&#xff1a…...

novel-downloader:终极小说下载指南,永久保存你的阅读时光

novel-downloader:终极小说下载指南,永久保存你的阅读时光 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾为心爱的小说突然消失而心痛?是…...

Windows风扇控制终极指南:Fan Control免费软件让电脑散热更智能

Windows风扇控制终极指南:Fan Control免费软件让电脑散热更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

Hermes Agent:2026 年最火的 AI Agent,到底牛在哪?

Hermes Agent:2026 年最火的 AI Agent,到底牛在哪?最近 AI 圈有个叫 Hermes 的东西火得一塌糊涂,GitHub 星标蹭蹭涨。很多人第一反应:“爱马仕出 AI 了?” 😂 不不不,此 Hermes 非彼…...

Windows窗口管理革命:如何用AlwaysOnTop彻底改变你的多任务工作方式

Windows窗口管理革命:如何用AlwaysOnTop彻底改变你的多任务工作方式 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在数字化工作时代,窗口管理已成为提升…...

如何永久保存网络小说:novel-downloader完整指南

如何永久保存网络小说:novel-downloader完整指南 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在数字阅读时代,网络小说已成为许多人日常娱乐的重要组成部分…...

轻量级AI聊天界面的技术实现:Ollama Web UI Lite深度解析

轻量级AI聊天界面的技术实现:Ollama Web UI Lite深度解析 【免费下载链接】ollama-webui-lite 项目地址: https://gitcode.com/gh_mirrors/ol/ollama-webui-lite 你是否曾想过,在本地部署AI模型时,如何获得既美观又高效的交互界面&am…...

创业团队如何利用 Taotoken 统一管理多个 AI 模型的 API 调用与成本

创业团队如何利用 Taotoken 统一管理多个 AI 模型的 API 调用与成本 1. 多模型管理的常见挑战 小型创业团队在同时接入多个大模型时,通常会面临几个典型问题。首先是密钥管理分散,不同模型的 API Key 需要分别申请、存储和轮换,增加了安全风…...

如何永久保存微信聊天记录:三步实现完整备份与深度分析

如何永久保存微信聊天记录:三步实现完整备份与深度分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...

从0到1构建奶牛行为智能监控系统(一)

这篇博客记录了我博士期间搭建的一个奶牛行为智能监控系统,系统整体由边缘侧、本地模型部署与云端界面协同的分层架构设计。系统集成了视频监控、行为识别、数据分析以及AI交互等核心功能。 目录 1.系统整体框架 2.硬件录像 3.云服务器界面 4.具体工具展示 &…...

构建企业级知识库问答系统时的大模型接入实践

构建企业级知识库问答系统时的大模型接入实践 1. 企业级知识库问答系统的技术挑战 在企业环境中构建知识库问答系统需要处理大量内部文档,包括技术手册、产品规格、会议纪要和客户支持记录等非结构化数据。这类系统通常面临三个核心挑战:模型选择灵活性…...

68.YOLOv8视频推理优化,30FPS实时检测,代码可复用

摘要 YOLO(You Only Look Once)是目标检测领域最经典的算法之一,以单阶段检测、实时性强、精度高著称。 本文从零开始,系统讲解YOLOv8的核心原理与完整实战流程,涵盖环境搭建、数据准备、模型训练、推理与部署。提供完整可运行代码,并针对常见问题给出避坑指南,帮助读者…...

AI赋能算法设计:借助快马平台生成智能车竞赛弯道模糊控制优化方案

最近在准备智能车竞赛,发现弯道控制一直是影响成绩的关键因素。传统PID控制虽然稳定,但在复杂弯道场景下适应性不够好。于是尝试用模糊控制来优化过弯速度,借助InsCode(快马)平台的AI辅助功能,快速实现了算法原型。 模糊控制设计…...

鸣潮智能剧情助手:5分钟实现后台自动跳过与多账号管理

鸣潮智能剧情助手:5分钟实现后台自动跳过与多账号管理 【免费下载链接】better-wuthering-waves 🌊更好的鸣潮 - 后台自动剧情 项目地址: https://gitcode.com/gh_mirrors/be/better-wuthering-waves 厌倦了《鸣潮》中重复冗长的剧情对话&#xf…...

特朗普孤注一掷,美国要最后的疯狂了!

坏土豆 作品首发于微信号 一个坏土豆陪我的国一起复兴特朗普要孤注一掷了,要带领美国进入最后的疯狂,未来的全球局势将发生巨大变化。5月2日,白宫发了一段堪称史诗级的神奇的视频,全世界都震惊了。视频里面就是特朗普在各种场合疯…...

新手入门CV:手把手教你下载和使用ADE20K数据集(附Python解析代码)

从零玩转ADE20K:计算机视觉新手的实战数据解析指南 推开计算机视觉的大门,ADE20K数据集就像一座藏满宝石的矿洞——但对第一次拿起数据镐的新手来说,如何准确找到矿脉入口往往比挖掘本身更令人头疼。这份指南将化身你的数字矿工手册&#xff…...

semi-utils:摄影师的终极批量水印解决方案

semi-utils:摄影师的终极批量水印解决方案 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为一张张手动添加水印而烦恼吗&#xff…...

RSSHub Radar浏览器扩展:5分钟快速上手智能RSS订阅终极指南

RSSHub Radar浏览器扩展:5分钟快速上手智能RSS订阅终极指南 【免费下载链接】RSSHub-Radar 🧡 Browser extension that simplifies finding and subscribing RSS and RSSHub 项目地址: https://gitcode.com/gh_mirrors/rs/RSSHub-Radar 在信息爆炸…...

AISMM认证不是考试,是合规博弈:基于2026 SITS2026真题库的4层证据链构建法

更多请点击: https://intelliparadigm.com 第一章:SITS2026分享:AISMM认证流程 AISMM(AI System Maturity Model)是由SITS2026大会正式发布的AI系统成熟度评估框架,其认证流程强调可验证性、可审计性与工程…...

Linux内核调优笔记:调整tcp_sack与tcp_dsack参数,对高并发服务网络性能的实际影响测试

Linux内核TCP调优实战:SACK与D-SACK对高并发服务的性能影响量化分析 在游戏服务器、实时通信系统等高并发场景中,网络性能的细微差异可能直接导致用户体验的分水岭。当服务器需要处理数万并发连接时,TCP协议栈的默认配置往往成为性能瓶颈的隐…...

从WSDM顶会论文看2024时空预测新趋势:CityCAN、CreST这些模型到底解决了啥实际问题?

从WSDM顶会论文看2024时空预测新趋势:CityCAN、CreST这些模型到底解决了啥实际问题? 清晨6点的城市交通调度中心,大屏上闪烁的红点正在蔓延——这是早高峰拥堵的前兆。但今天的系统给出了不同以往的预警:基于CreST模型的不确定性量…...

OpenCL 3.1 正式发布:强制集成 SPIR-V,多项特性成核心规范要求

【导语:在 OpenCL 3.0 临时版本发布六年后,Khronos Group 正式发布 OpenCL 3.1,将成熟功能整合到核心规范,在性能、开发效率等方面带来诸多提升,且相关扩展功能也即将推出。】强制集成 SPIR-V:消除工具采用…...

在多模型间切换时如何通过用量看板透明管理API成本

在多模型间切换时如何通过用量看板透明管理API成本 1. 用量看板的核心功能 Taotoken平台提供的用量看板是开发者管理API成本的核心工具。该看板以小时为单位更新数据,展示当前账户下所有模型调用的详细记录。主要数据维度包括调用次数、输入输出token总量、各模型…...

2026 年微软 Xbox 新 CEO 宣布:终止 Copilot AI 游戏开发,启动领导层大重组!

2026 年 5 月 5 日,微软 Xbox 部门新任 CEO Asha Sharma 发备忘录,宣布终止 Copilot AI 在游戏领域开发,启动大规模领导层重组,以扭转收入下滑局面。 新官上任三把火 Sharma 今年 2 月接替 Phil Spencer 成为 Xbox CEO。她 2024 年…...

ARM TrustZone与AHB5总线安全机制详解

1. ARM TrustZone安全机制深度解析 在嵌入式系统安全领域,ARM TrustZone技术已经成为硬件级安全方案的行业标准。我第一次接触这项技术是在开发一款金融支付终端时,当时我们需要在同一个Cortex-A53处理器上同时运行支付应用和第三方应用,而Tr…...

5分钟学会Unity游戏去马赛克:六大插件完全指南

5分钟学会Unity游戏去马赛克:六大插件完全指南 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics 你…...

从哈工大论文到你的DSP:ESO谐波抑制算法移植实战,附C代码核心片段与调试心得

ESO谐波抑制算法在永磁同步电机控制中的工程实现 永磁同步电机(PMSM)因其高效率、高功率密度等优势,在工业驱动、电动汽车等领域广泛应用。然而在实际运行中,逆变器非线性特性(如死区效应)和电机本体特性(如磁链谐波)会导致相电流中出现5、7次谐波&#…...

魔兽地图格式转换终极指南:如何用w3x2lni解决地图兼容性问题

魔兽地图格式转换终极指南:如何用w3x2lni解决地图兼容性问题 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 如果你是一名魔兽争霸III地图开发者,是否经常遇到这样的困扰:精心制…...