一文读懂Marvell交换芯片

简介: 一文读懂Marvell交换芯片

该芯片作为PHY和SERDES使用

基础知识

MII

MII 是一个标准接口,用于连接 MAC 和 PHY。MII 是 IEEE-802.3 定义的以太网标准, MII 接口可以同时控制多个 PHY。

c789c3f36a2b92d6c2e120b965d3f138_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

MII包含两个接口:

1.一个数据接口,用户 MAC 和 PHY 之间收发 Ethernet 数据
2.一个管理接口,这个管理接口通常称为 MDIO,MIIM 或者 SMI。

  这个接口用于 MAC 从 PHY 读取相关管理寄存器的值,或者往 PHY 管理寄存器上写入数据。

8c8d4741a38dc5b985fd0bf296d7352f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

MDIO

MDIO 也被称为 MIIM,或者 SMI,它是 IEEE802.3 定义标准 MII 接口的一部分,用于 MAC 配置 PHY。MDIO 具有两个信号线,分别如下:

1. MDC 时钟线:MDIO 的时钟信号,由 MAC 驱动 PHY

2. MDIO 数据线:双向数据线,用于在 MAC 和 PHY 之间传输配置信息

MDIO 总线只支持 MAC 作为主设备,PHY 作为从设备。MIDO 支持两种时序,分别为 Clause 22Clause 45.

MDIO接口最初是由IEEE RFC802.3中的22号条款定义的,在最初的定义中,一个单独的MDIO接口可以访问32个不同的PHY设备中的32个寄存器,这些寄存器提供状态和控制信息,例如:连接状态、传输速度能力、当前选择的传速、低压消耗时的下电情况、全双工还是半双工、自动协商、错误提示以及反馈信息等等。

 

为了满足10G以太网设备的普及发展,在IEEE 802.3ae 的45号条款中为MDIO接口提供了额外的规范:

1)能够通过32个端口访问32个不同设备的65536个寄存器;

2)为访问10G以太网提供额外的OP码和ST码,从而可以直接访问寄存器地址;

3)端到端的报错信号;

4)环回模式控制;

5)低压电气标准。

22号条款

22号条款的MDIO通信的帧格式定义如下:

21dd3d3dc77ece67c15f139b27ab8546_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

               77c739422047c3ba6fdec9be3e502bfa_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

45号条款

为了弥补22号的条款中定义的缺陷,45号条款中增添了对低压设备的支持,最低可到1.2V,同时扩充了帧格式,能够访问更多的设备和寄存器。

 

45号MDIO通信帧格式如下:

2feb5b304e0c65682e9abc816e173efe_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

         

第45号条款的主要变化是如何访问寄存器。在第22中,一个单独的帧指定要读或写的地址和数据,同时完成了这些工作。45号中改变这种范式,第一个地址帧发送到指定的MMD和寄存器,然后发送第二帧来执行读或写。

 

工作模式

该芯片有两种寻址模式:单芯片寻址和多芯片寻址。

多芯片寻址

  对于多芯片寻址,需要给芯片设置一个非零的SMI地址(ADDR[4:0]的反码)。在多芯片寻址模式下,仅有两个寄存器(0x00:SMI Command Register 0x01:SMI Data Register)能够使用,内部各PORT的寄存器均由这两个寄存器间接访问。

  通过向SMI Command Register的[9:5]写入内部SMI设备地址,[4:0]写入内部SMI寄存器地址来访问各个Port的内部寄存器,[11:10]决定决前是写入还是读出操作。

e9a0b7cd07ae87ac9bda0eecf169b72c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

  通过向SMI Data Register的[15:0]位写入或读取SMI Command Register设定的寄存器内容。

53c2bca021239539fe47a65a9d47206e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

单芯片寻址

  对于单芯片寻址,其SMI地址为0x00(针对整个芯片),即ADDR[4:0]=0x1F。

d91ee911997ac9a8596a843b45904aa8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 6ecaa573525c29fc3ce82bdeb2f74963_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

在单芯片寻址模式下,每个Port都有各自的SMI地址(针对内部每个Port),Port0-Port9对应的SMI地址分别为0x0-0x9(直接访问),port10对应0xA。

若Port0、1、2等接有外部PHY,则必须使用以下SMI地址,0x00对应Port0,0x01对应Port1,这样PPU才能自动的轮询各个PHY获取各自的连接状况,速度,双工情况,流控状态等信息,这些外部PHY需要使用Global2 offset 0x18、0x19进行访问。对于Port3a、Port4的内部PHY地址映射为0x03、0x04;Port9、Port10的内部SERDES映射为0x9、0xa,同样的,也是需要使用Global2 offset 0x18、0x19进行访问。

Global2 寄存器的 Offset24,25 寄存器

前文提到,两个非常重要的寄存器,即Global2 offset 0x18、0x19寄存器,在单芯片寻址模式下PHY和SERDES寄存器的访问都必须通过这两个寄存器间接访问。

Global2 offset 0x18 (SMI PHY Command Register)寄存器

64ce172aa3c967a65407888752e0dc7a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

bit[12]指定了帧协议是22号时序还是45号时序。22号协议下,与多芯片存储能够访问的Command Register寄存器一样,[9:5]写入SMI设备地址,[4:0]写入SMI寄存器地址来访问各个Port的内部寄存器,[11:10]决定当前是写入还是读出操作。45号协议,[9:5]指定port,[4:0]指定设备类别。

Global2 offset 0x19 (SMI PHY Data Register)寄存器

985b7b7cd912f224f1f0350272c1029c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

与SMI Data Register相同,通过[15:0]位写入或读取SMI Command Register设定的寄存器内容。

在45号协议下,第一个地址帧发送到指定的MMD和寄存器,我们要把PHY Command Reg中的[11:10]置为0x00=write Address register,即在第一个帧中的最后16位数据中,指定要操作的寄存器的地址。随后在第二个数据帧中,要把PHY Command Reg中的[11:10]置为0x01=write data register,即第二个帧中的最后16位写入的是数据。

Uboot 中访问 MDIO (SMI/MIIM)

项目开发中,经常要在 uboot 阶段通过 MDIO 总线去配置 PHY 或者 SWITCH。

fb9d88751e89232d35eb30a7bb712efd_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

 

更多指令

示例:

6390x config
**配置端口10**
//0xa:P10  
//0x34a:
//      bit[3:0]-0xa-接口配置模式-SGMII
//        bit[6]  -0x1-EEE(Energy Efficient Ethernet)Enabled
//        bit[9:8]-0x3 = 10Gb or 2500Mbps
miiwrite 0xa 0 0x34a
**配置端口5** 
//p5        p177  p355
//addr:0x1c  
//regi:0x19  SMI Data register
//regi:0x18  SMI Command register
//在45号条款中
//第一个地址帧发送到指定的MMD和寄存器,然后发送第二帧来执行读或写。
miiwrite 0x1c 0x19 0x2000   //将数据0x2000写到PHY data寄存器0x19中
miiwrite 0x1c 0x18 0x82a4    //将数据0x82a4写到PHY Command寄存器中
//0x82a4 
//bit[15]:0x1——此位在首次操作SMI时,要置为1,并且在操作SMI完毕之后会自动清零
//bit[14:13]:0x0——内部访问-用于访问包含在这个设备中的内部PHYs和/或serde。
//bit[12]:0x0——SMI MODE——Generate IEEE 802.3 Clause 45 SMI frames
//bit[11:10]:0x0—— Write Address Register
//bit[9:5]:写入SMI设备地址-0x15——Port 10 Lane 1 = Port 5 & its registers are accessed at SMI address 0x15
//bit[4:0]:device class(clause 45)
//第一个地址帧的后16位为Addr,即data register中的数据0x2000
miiwrite 0x1c 0x19 0x8140    //将数据0x8140写到PHY data寄存器0x19中
miiwrite 0x1c 0x18 0x86a4    //将数据0x86a4写到PHY Command寄存器中
////bit[11:10]:0x01—— Write data Register
//第二个帧,后16位为要写入的数据,即data register中的数据0x8140
复制代码


相关文章
|
5月前
|
存储 机器学习/深度学习 人工智能
一文读懂ChatGPT的工作原理
【7月更文挑战第24天】.一文读懂ChatGPT的工作原理
186 2
|
7月前
|
C语言 开发者
【C 言专栏】C 语言中的模块化编程思想
【5月更文挑战第3天】本文探讨了C语言中的模块化编程思想,阐述了其概念和实现方式,如函数和头文件。模块化编程能提升代码可读性,便于维护和复用,增强程序可靠性。实践中应合理划分模块,明确接口,保持独立性和内聚性。以计算器程序为例说明模块化应用,并展望了未来发展趋势。模块化编程是构建高质量C程序的关键,有助于提高开发效率。
184 3
【C 言专栏】C 语言中的模块化编程思想
|
7月前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
75 0
【C 言专栏】C 语言函数的高效编程技巧
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
技术小白能看懂的ChatGPT原理介绍
网上有关 ChatGPT 的原理介绍文章一大堆,要么是从 NLP 的历史开始讲起,要么是上数 GPT 3 代,内容都相对冗长和复杂。其实 ChatGPT 的原理并不难理解,我将以最通俗易懂的方式为技术小白解读,帮助大家更好地了解这一技术
630 1
技术小白能看懂的ChatGPT原理介绍
|
7月前
|
算法
【软件设计师—基础精讲笔记9】第九章 算法设计与分析
【软件设计师—基础精讲笔记9】第九章 算法设计与分析
60 1
|
机器学习/深度学习 人工智能 自然语言处理
为什么ChatGPT这么强?—— 一文读懂ChatGPT原理!
为什么ChatGPT这么强?—— 一文读懂ChatGPT原理!
|
Rust 算法 安全
【密码学】一文读懂MurMurHash第一版
我来填坑了,之前说来讲一下MurMurHash算法,然后本文来简单描述一下这个算法的主要过程。MurMurHash这个哈希算法在2011年3月1日第一版被提出来,第一版呢最终输出的是一个32bit的哈希值,第一版已经不推荐使用了,本文先来讲一下第一版的算法过程,由于我只找到了这个第一版算法的代码,没有找到对应的参考文献,所以本文的算法流程是我根据Google提供的代码来说的,有哪里说的不对的地方,也欢迎读者指正。
【密码学】一文读懂MurMurHash第一版
|
机器学习/深度学习 存储 算法
【入门必看-算法基础知识讲解】小白都也能看得懂
【入门必看-算法基础知识讲解】小白都也能看得懂
800 0
【入门必看-算法基础知识讲解】小白都也能看得懂
|
消息中间件 存储 缓存
一文读懂架构整洁之道
相信大家都非常清楚,如何编写可读性强的代码是一个合格程序员的必修课。 我在之前的文章《谈谈什么是好的代码》中谈了一些自己对整洁代码的感悟,代码并不是独立存在的,成百上千个类的系统在企业应用中非常常见,如何将代码进行有效的组织,保持高可读性,高可维护性,则是一个好的架构需要考虑的事情。本文从原则切入,聊聊组件的分层和解耦,浅谈下Bob大叔提出的整洁架构,感兴趣的同学也可以发表下自己的看法。
6602 0
一文读懂架构整洁之道
|
Web App开发 存储 数据采集