如何使用gpio模拟mdio通信?
一、前言
实际项目开发中,由于设计原因,会将phy的mdio引脚连接到SoC的2个空闲gpio上,
这样就无法通过Gmac自有的架构实现修改phy,
因此只能通过GPIO模拟的方式实现MDIO,
好在Linux支持MDIO via GPIO功能。
该功能需要用到内核驱动mdio-bitbang.c和mdio-gpio.c。
本例 :
- 平台:
复旦微
- kernel 版本:
linux 4.14.55-xxxxx
- phy芯片
yt8521
- phy连接到
gmac0
- mdio总线连接到:
gpioc 2
portc 3
二、mdio基础概念
1、SMI接口
SMI是MAC内核访问PHY寄存器接口,它由两根线组成,双工:
-
MDC(Management Data Clock)为时钟,
-
MDIO(Management Data Input/Output)为双向数据通信,
原理上跟I2C总线很类似,也可以通过总线访问多个不同的phy。
MDIO协议是以太网标准IEEE802.3中专门用于MAC和PYH之间管理的串行接口总线,该接口主要用于MAC控制器对PYH层的状态读取和设置(寄存器操作)、获取链路状态,控制物理层协商等操作。
MDC/MDIO基本特性:
- 两线制 :MDC(时钟线)和MDIO(数据线)。分主从设备。
- 时钟频率:2.5MHz
- 通信方式:总线制,可同时接入的PHY数量为32个
- 通过SMI接口,MAC芯片主动的轮询PHY层芯片,获得状态信息,并发出命令信息。
其中主设备称作STA,从设备称作MDI,一个主设备可以对多个从设备进行命令读写操作。

三、mdio协议波形
1、MDIO接口数据帧
在IEEE802.3协议中,把MDIO接口数据帧分为两种,一种是Clause22,另一种是Clause45。
前者主要用于百兆千兆以太网,后者用于千兆以上的以太网。
2、Clause22

MDIO 接口的读写通信协议如下图所示:

-
Preamble:
32 位前导码,由 MAC 端发送 32 位逻辑“1”,用于同步 PHY 芯片。
-
ST(Start of Frame):
2 位帧开始信号,用 01 表示。
-
OP(Operation Code):
2 位操作码,读:10 写:01。
-
PHYAD(PHY Address):
5 位 PHY 地址,用于表示与哪个 PHY 芯片通信,因此一个 MAC 上可以连 接多个 PHY 芯片。
-
REGAD(Register Address):
5 位寄存器地址,可以表示共 32 位寄存器。
-
TA(Turnaround):
2 位转向,
在读命令中,MDIO 在此时由 MAC 驱动改为 PHY 驱动,在第一个 TA 位,MDIO 引脚为高阻状态,第二个 TA 位,PHY 将 MDIO 引脚拉低,准备发送数据;
在写命令中,不需 要 MDIO 方向发生变化,MAC 固定输出 2’b10,随后开始写入数据。
-
DATA:
16 位数据,在读命令中,PHY 芯片将读到的对应 PHYAD 的 REGAD 寄存器的数据写到 DATA 中;在写命令中,PHY 芯片将接收到的 DATA 写入 REGAD 寄存器中。需要注意的是,在 DATA 传 输的过程中,高位在前,低位在后。
-
IDLE:
空闲状态,此时 MDIO 为无源驱动,处于高阻状态,但一般用上拉电阻使其上拉至高电平。
波形举例
向phy:3 寄存器0x00 写入 数据0x4140

3、Clause45

四、YT8521
YT8521S是一款高度集成的以太网收发器,符合10BASE-Te、100BASE-TX和1000BASE-T IEEE 802.3标准。
1、引脚

其中与mdio相关引脚:
14 MDC Management Data Clock
15 MDIO Input/Output of Management Data.Pull up 3.3V/2.5V/1.8V for 3.3V/2.5V/1.8V I/O respectively
2、模块图

3、MDIO协议时序-[重要]
下面YT8521的SMI时序图:


上升沿读数据,下降沿写数据
五、驱动移植
1、驱动文件及移植
mdio-gpio.c
mdio-bitbang.c

勾选 下面几项:
│ │ <*> Bitbanged MDIO buses │ │ │ │ <*> GPIO controlled MDIO bus multiplexers │ │ │ │ <*> MMIO device-controlled MDIO bus multiplexers │ │
2、移植设备树
aliases {…………mdio-gpio0 = &mdio0;};mdio0: mdio {compatible = "virtual,mdio-gpio";gpios = <&portc 2 0 >,<&portc 3 0>; #address-cells = <1>;#size-cells = <0>;phy0: ethernet-phy@7 {reg = <0x7>;yt,phy-delay = <0xfc>;phy-connection-type = "rgmii-id";};};&gmac0 {status = "okay";phy-handle = <&phy0>;};
由设备树可知,
- 我们创建了1个独立的mdio设备节点,
- 当用命令mdio修改phy时,就会根据gmac0的phy-handle,
- 找到mdio0节点从而调用mdio-gpio驱动模块来配置phy:8521。
下图,是phy直接连接到gmac0的mdio接口,mdio命令执行的通路:

下图是phy连接到gpio口,mdio命令执行的通路:

3、查看log
开机有以下log,说明驱动 移植成功:
# dmesg | grep MDIO
[ 3.257270] libphy: GPIO Bitbanged MDIO: probed
[ 3.274202] libphy: Fixed MDIO Bus: probed
# cd /sys/class/mdio_bus/
# ls
fixed-0 gpio-0 stmmac-0 stmmac-1
# cd gpio-0/
# ls
device gpio-0:03 of_node power subsystem uevent
# cd gpio-0\:03/
# ls
attached_dev phy_has_fixups power
driver phy_id subsystem
of_node phy_interface uevent
4、操作

修改eth0为百兆速率,则设置Speed_Selection位为01,同时自动协商为Autoneg_En要禁用,即设置该寄存器值为0x2140:
# mdio eth0 0x00 0x2140write phy addr: 0x3 reg: 0x0 value : 0x2140
抓取波形如下:

相关文章:
如何使用gpio模拟mdio通信?
一、前言 实际项目开发中,由于设计原因,会将phy的mdio引脚连接到SoC的2个空闲gpio上, 这样就无法通过Gmac自有的架构实现修改phy, 因此只能通过GPIO模拟的方式实现MDIO, 好在Linux支持MDIO via GPIO功能。 该功能…...
C# 中的事件和委托:构建响应式应用程序
C#中的事件和委托。事件和委托是C#中用于实现观察者模式和异步回调的重要机制,它们在构建响应式和交互式应用程序中发挥着重要作用。以下是一篇关于C#中事件和委托的文章。 引言 事件和委托是C#语言中非常重要的特性,它们允许你实现观察者模式和异步回…...
科技赋能健康:多商户Java版商城系统引领亚健康服务数字化变革
在当今社会,随着生活节奏的加快和工作压力的增大,越来越多的人处于亚健康状态。据《The Lancet》期刊2023年的统计数据显示,全球亚健康状态的人群比例已高达82.8%,这一数字背后,隐藏着巨大的健康风险和社会成本。亚健康…...
区块链网络示意图;Aura共识和Grandpa共识(BFT共识)
目录 区块链网络示意图 Aura共识和Grandpa共识(BFT共识) Aura共识 Grandpa共识(BFT共识) Aura与Grandpa的结合 区块链网络示意图 CP Blockchain:这是中央处理区块链(或可能指某种特定的处理单元区块链)的缩写。它可能代表了该区块链网络的主要处理或存储单元。在这…...
Javaweb梳理18——JavaScript
今日目标 掌握 JavaScript 的基础语法掌握 JavaScript 的常用对象(Array、String)能根据需求灵活运用定时器及通过 js 代码进行页面跳转能通过DOM 对象对标签进行常规操作掌握常用的事件能独立完成表单校验案例 18.1 JavaScript简介 JavaScript 是一门跨…...
面向对象-接口的使用
1. 接口的概述 为什么有接口? 借口是一种规则,对于继承而言,部分子类之间有共同的方法,为了约束方法的使用,使用接口。 接口的应用: 接口不是一类事物,它是对行为的抽象。 2. 接口的定义和使…...
失落的Apache JDBM(Java Database Management)
简介 Apache JDBM(Java Database Management)是一个轻量级的、基于 Java 的嵌入式数据库管理系统。它主要用于在 Java 应用程序中存储和管理数据。这个项目已经过时了,只是发表一下以示纪念,现在已经大多数被SQLite和Derby代替。…...
Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统
sa-token支持分布式token 前后端代码,地球号: bright12389...
MySQL 三大日志详解
在 MySQL 数据库中,binlog(二进制日志)、redo log(重做日志)和 undo log(回滚日志)起着至关重要的作用。它们共同保障了数据库的高可用性、数据一致性和事务的可靠性。下面将对这三大日志进行详…...
Java 岗面试八股文及答案整理(2024最新版)
春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能…...
Web3.0安全开发实践:Clarity最佳实践总结
在过去的一段时间里,CertiK团队对比特币生态系统及其发展进行了深入研究。同时,团队还审计了多个比特币项目以及基于不同编程语言的智能合约,包括OKX的BRC-20钱包和MVC DAO的sCrypt智能合约实现。 现在,我们的研究重点转向了Clar…...
基于Springboot+Vue动漫推荐平台管理系统(源码+lw+讲解部署+PPT)
前言 详细视频演示 论文参考 系统介绍 系统概述 核心功能 用户角色与功能 具体实现截图 1. 热门动漫功能 2. 文章专栏功能 3. 会员分享功能 4. 热门动漫管理功能(管理员端) 5. 动漫分类管理功能 技术栈 后端框架SpringBoot 前端框架Vue …...
秋意浓,森林披金装
秋意浓,森林披金装, 枫叶如火,漫山遍野狂。 松间轻风送寒意, 鸟鸣悠扬入云翔。 林间小径蜿蜒行, 落叶铺成金色毯。 溪水潺潺绕石转, 映出天边一抹霞。 野菊点缀在草间, 白云悠悠随意闲。…...
Chrome离线安装包下载
1、问Chrome的官网:https://www.google.cn/chrome/ 直接下载的是在线安装包,安装需要联网。 2、如果需要在无法联网的设备上安装Chrome,需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址:https://www.google.c…...
安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案
问题环境 在某个长期停留的位置(例如:躺平)使用手机时网络突然从5G跳到4G,偶尔跳来跳去导致网络体验很差,经过调整5G网络情况下网速及其他体验都要更好,基于这样的情况使用一种简单的操作,锁定5…...
使用LLaMA-Factory微调时的问题与解决方案记录
文章目录 如何指定微调使用的显卡如何解决显卡通信导致的报错模型微调的实际epoch和step如何计算如何实现多卡全量微调模型微调后的结果如何查看模型测试后的指标如何理解如何指定微调使用的显卡 启动网页时使用这种执行命令 CUDA_VISIBLE_DEVICES=5,6,7 llamafactory-cli we…...
Go语言switch语句
在Go语言中,switch,是一个高度灵活,其功能强大的控制结构,相比较Java中的switch,更受到语言重视。 目录 1.基础用法2.多值匹配3.不指定表达式的 switch4.使用 fallthrough 强制进入下一个分支5.使用类型断言的 switch…...
JavaScript DOM使用
DOM Document Object Model 简单而言,就是JavaScript将HTML文档的各个组成部分封装为对象。 封装的对象分别为: Document:整个HTML的文档对象 Element:元素对象(也就是HTML中的标签) Attribute:…...
人工智能|计算机视觉——微表情识别(Micro expression recognition)的研究现状
一、简述 微表情是一种特殊的面部表情,与普通的表情相比,微表情主要有以下特点: 持续时间短,通常只有1/25s~1/3s;动作强度低,难以察觉;在无意识状态下产生,通常难以掩饰或伪装;对微表情的分析通常需要在视频中,而普通表情在图像中就可以分析。由于微表情在无意识状态…...
耿恭坚守城池的方法
疏勒城之战中,耿恭坚守城池的方法主要有以下几点: 选择有利地势:耿恭深知疏勒城依山傍水、地势险要,易守难攻,于是果断放弃金满城,移师至疏勒城据守,为长期坚守创造了良好的地理条件.运用心理战…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
