交换芯片BCM53118如何简单设置某个寄存器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

交换芯片BCM53118如何简单设置某个寄存器

任务是:设置交换芯片53118的Page 0, Address 0xb,把这个值设置为0x7。对交换芯片没有一点概念,开始学习,记录一下下。

PHY管理接口(MDIO)

对吉比特以太网而言,串行通信总线称为管理数据输入输出(MDIO)。该总线由IEEE通过以太网标准IEEE 802.3的若干条款加以定义。MDIO是一种简单的双线串行接口,将管理器件(如MAC控制器、微处理器)与具备管理功能的收发器(如多端口吉比特以太网收发器或10GbE XAUI收发器)相连接,从而控制收发器并从收发器收集状态信息。可收集的信息包括链接状态、传输速度与选择、断电、低功率休眠状态、TX/RX模式选择、自动协商控制、环回模式控制等。除了拥有IEEE 要求的功能之外,收发器厂商还可添加更多的信息收集功能。

MDC是管理数据的时钟输入,最高速率可达8.3MHz。MDIO是管理数据的输入输出双向接口,数据是与MDC时钟同步的。MDIO的工作流程为:

MDIO接口在没有传输数据的空闲状态(IDLE)数据线MDIO处于高阻态。

MDIO出现一个2bit的开始标识码(01)一个读/写操作开始。

MDIO出现一个2bit数据来标识是读操作(10)还是写操作(01)。

MDIO出现一个5bit数据标识PHY的地址。

MDIO出现一个5bitPHY寄存器地址。

MDIO需要2个时钟的访问时间。

MDIO串行读出/写入16bit的寄存器数据。

MDIO恢复成IDLE状态,同时MDIO进入高阻状态。

通过MDIO接口访问。

2009/08/31:找到了针对硬件平台的MDIO接口访问函数,直接调用即可。

不过遇到了一个编译的错误:relocation truncated to fit : R_MIPS_....,查找了半天,才发现内核代码里MDIO的访问函数声明是static,当然外部不能访问了。把static去掉顺利编译通过。

谢谢/whitecloudbluesky1,他有一篇文章提到了这个问题

又有其它新任务,等有时间仔细看看交换芯片的资料,这家伙挺复杂。

芯片手册里有这么张图,今天经同事帮助讲解,明白什么意思了

比如我的任务是page0, 0xb,赋值0x7,那就要通过mdio写三次,第一次写register 16,设置page 0;第二次写register 24,赋值0x7;第三次写register 17,设置0xb,然后循环读register 17,看操作是否成功。

谢谢同事的耐心讲解。

#define BCM53XX_PHY_ADDR 0x1E

#define BCM53XX_REG_MII_PAGE 0x10

#define BCM53XX_REG_MII_ADDR 0x11

#define BCM53XX_REG_MII_DATA0 0x18

#define BCM53XX_REG_MII_DATA1 0x19

#define BCM53XX_REG_MII_DATA2 0x1a

#define BCM53XX_REG_MII_DATA3 0x1b

#define BCM53XX_REG_MII_PAGE_ENABLE 1

#define BCM53XX_REG_MII_ADDR_WRITE 1

#define BCM53XX_REG_MII_ADDR_READ 2

int bcm53XX_reg(struct net_device *dev, __u8 page, __u8 reg, __u8 op)

{

int i = 100;

mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_PAGE,

(page << 8) | BCM53XX_REG_MII_PAGE_ENABLE);

mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_ADDR,

(reg << 8) | op);

while (i--) {

if ((mdio_read(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_ADDR) & 3) == 0)

{

return 0;

}

}

return 0;

}

int bcm53xx_reg_write64(struct net_device *dev, __u8 page, __u8 reg, uint64_t value )

{

mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_DATA0, (int)(value & 0xffff));

mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_DATA1, (int)((value >> 16) & 0xffff)); mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_DATA2, (int)((value >> 32) & 0xffff)); mdio_write(dev, BCM53XX_PHY_ADDR, BCM53XX_REG_MII_DATA3, (int)((value >> 48) & 0xffff));

if(bcm53xx_reg(dev, page, reg, BCM53XX_REG_MII_ADDR_WRITE))

return -1;

return 0;

}

相关文档
最新文档