泰州城乡建设局网站,做网站如何自动采集图片,wordpress实现单点登录,河南最新新闻事件15条一、前言
实际项目开发中#xff0c;由于设计原因#xff0c;会将phy的mdio引脚连接到SoC的2个空闲gpio上#xff0c;
这样就无法通过Gmac自有的架构实现修改phy#xff0c;
因此只能通过GPIO模拟的方式实现MDIO#xff0c;
好在Linux支持MDIO via GPIO功能。
该功能…一、前言
实际项目开发中由于设计原因会将phy的mdio引脚连接到SoC的2个空闲gpio上
这样就无法通过Gmac自有的架构实现修改phy
因此只能通过GPIO模拟的方式实现MDIO
好在Linux支持MDIO via GPIO功能。
该功能需要用到内核驱动mdio-bitbang.c和mdio-gpio.c。
本例
平台
复旦微kernel 版本
linux 4.14.55-xxxxxphy芯片
yt8521phy连接到
gmac0mdio总线连接到
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 芯片。 STStart of Frame 2 位帧开始信号用 01 表示。 OPOperation Code 2 位操作码读10 写01。 PHYADPHY Address 5 位 PHY 地址用于表示与哪个 PHY 芯片通信因此一个 MAC 上可以连 接多个 PHY 芯片。 REGADRegister Address 5 位寄存器地址可以表示共 32 位寄存器。 TATurnaround 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 为无源驱动处于高阻状态但一般用上拉电阻使其上拉至高电平。
波形举例
向phy3 寄存器0x00 写入 数据0x41403、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 respectively2、模块图 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-phy7 {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驱动模块来配置phy8521。
下图是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 uevent4、操作 修改eth0为百兆速率则设置Speed_Selection位为01同时自动协商为Autoneg_En要禁用即设置该寄存器值为0x2140
# mdio eth0 0x00 0x2140write phy addr: 0x3 reg: 0x0 value : 0x2140抓取波形如下