Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116156
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 882
  • 用 户 组: 普通用户
  • 注册时间: 2022-03-12 10:39
个人简介

不积小流,无以成江海。

文章分类

全部博文(153)

文章存档

2023年(50)

2022年(90)

我的朋友

分类: 嵌入式

2022-06-22 09:31:02

这篇文章的原创者肯定是个高手,记录下以求自学。
https://blog.csdn.net/qq_21792169/article/details/107401688?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165585974516782388024956%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165585974516782388024956&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-107401688-null-null.142^v20^huaweicloudv1,157^v15^new_3&utm_term=bcm+shadow%E5%AF%84%E5%AD%98%E5%99%A8&spm=1018.2226.3001.4187

帮助我理解了shadow寄存器的意思。
摘录一段很精彩的部分:

2PHY扩展寄存器分析

除了IEEE802.3定义的Register0-15外,Register16-31由PHY制造商自行定义,还有制造商通过分页存储技术扩展的更多寄存器空间,在这些寄存器中制造商定义了很多PHY的功能的控制以及状态指示信息,这些信息对我们在PHY的应用以及故障诊断中有时候可以起到决定性的作用,但是由于这写寄存器不是IEEE802.3标准定义的,因此寄存器的地址以及功能名称在不同厂家的资料中有很大的差异,甚至在同一厂家的不用芯片中也不尽相同,因此下面的讨论只能就某一类的功能应用或者状态指示进行说明,但是其详细的名称和寄存器的地址要结合具体芯片具体分析,这里不能给出一个确切的答案。

目前主流的PHY都通过分页技术对PHY寄存器空间进行扩展,提供更多的寄存器空间来控制PHY更多的功能行为和提供更多的PHY状态指示信息。下面针对我司惯常使用的BCM和Marvell的PHY寄存器分页存储技术进行简单描述,至于分页扩展出来的寄存器空间其具体作用千变万化,在此不作详细讨论。

BCM的PHY绝大多数的寄存器地址空间都是单页地址,通过分页扩展的寄存器集中在0x18和0x1C两个地址上,0x18和0x1C这两个寄存器专门定义了几个bit作为页地址(Shadow Value),其他的bit则是功能位,在不同的Shadow Value这些功能位将代表不同的功能。对0x18和0x1C的读写操作需要先修改Shadow Value,然后才能访问到正确的寄存器空间。以下以以BCM5488S为例,分别说明寄存器0x18和0x1C的访问方法。

寄存器0x18寄存器的bit2:0定义为Shadow Value,在需要读寄存器0x18的某个Shadow时,先要做一个写操作来切换Shadow,这个写操作必须指定bit15=0,bit14:12等于需要访问的Shadow Value,bit2:0=111,其它bit忽略,这时候Shadow切换成功;然后再对寄存器0x18进行读操作即可读到对应Shadow的寄存器值。在进行写操作的时候,则可以直接将bit15:3等于需要写入的数据,bit2:0等于需要写入的Shadow Value即可完成需要的写操作(对Shadow 111的寄存器写操作有例外要求就是bit15=1)。

寄存器0x1C的bit14:10定义为Shadow Value,bit15定义为写使能位。在需要读寄存器0x1C的某个Shadow,先要做一个写操作来切换Shadow,这个写操作必须指定bit15=0bit1410等于需要访问的Shadow Value,其他bit忽略,即可切换Shadow成功,然后再对寄存器0x1C进行读操作即可读到对应Shadow的寄存器值。而如果需要写某个Shadow寄存器,则指定bit15=1,bit14:10等于需要写的Shadow Value,其他bit也置需要写的值,写入寄存器0x1C即可完成。

Marvell的分页方式和BCM有很大的不同,Marvell一般指定寄存器0x16(寄存器0x0-0x1c的页地址)和寄存器0x1D(寄存器0x1E和0x1F的页地址)作为页寄存器,几乎针对每个寄存器都有分页空间,因此在访问每个寄存器之前都必须弄清楚该寄存器的页地址,需要将页地址写入页寄存器中,然后再访问对应地址的寄存器即可。

注意:值得注意的是,软件的定期Linkscan操作常常会"暗中"修改Shadow Value,因此在实际操作中如果发现切换Shadow Value不成功,要关闭Linkscan再尝试一下。在端口异常问题调试的时候,我们经常通过寄存器比较来查找问题的线索,然而正常的软件读命令只会读取默认Shadow的寄存器值,而很多隐藏在其他Shadow中的信息经常被我们忽略了,这个小小的忽略有时候会让你的调试查证工作走很大的弯路,切记!


阅读(613) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~