88E15xx寄存器配置

我们先来了解一下88E15xx官方文档的寄存器类型,该类型决定我们要做什么操作
88E15xx的寄存器类型
图中可以看到如果寄存器中有Retain或者Update都不在软件重启之前生效。这就意味着你在设置寄存时看到这两个标识需要额外进行PHY的软件复位。那么什么寄存器在哪里写复位信息呢?那就看下图:
Reset Control Bits
上面这张图告诉你,你要想哪个寄存器设置生效,那么你就需要在对应的复位寄存器中的对应bit写1,写完后PHY会自动重启。重启后你设置的值就会生效。可能有读者会不明白0_0.15、0_0.15、20_18.15是什么意思。下面我就来解析一下。
拿20_18.15来说,这段数字描述的意思是18页的第20个寄存器的第15位,那么可以推广一下0_0.15就是0页的第0个寄存器的第15位。我们可以使用Register_Page.Bit来表示。至于为什么会有页,这是由于IEEE802.3中定义了标准的寄存器只有0到15。厂家为了拓展就使用了分页分寄存器来管理PHY和把PHY的状态通过寄存器的方式对外暴露。
说完了上面的图,现在就举个例子来说明一下88E15xx寄存器的配置。这里以配置20_18.2:0为例,第一步需要切换到第18页,怎么切换呢?来看图
Page Register
图中红色的框框表示切换页面的寄存,你要切换到哪一页,那么就往这个寄存器写对应的页数就行了。
我们要切换到18页,那么就往第22个寄存器写18,那么就可以切换过去第18页了,接着再往第20个寄存器的低3位写对应模式数据。看图
PHY MODE
下面展示内核代码中路径为drivers/net/phy/marvell.c实现配置寄存器的代码

static int marvell_of_reg_init(struct phy_device *phydev)
{
	const __be32 *paddr;
	int len, i, saved_page, current_page, page_changed, ret;

	if (!phydev->dev.of_node)
		return 0;

	paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len);		//从设备树中查找marvell,reg-init的属性,一般设备树中会有 marvell,reg-init = <page reg mask bit>字样
	if (!paddr || len < (4 * sizeof(*paddr)))
		return 0;

	saved_page = phy_read(phydev, MII_MARVELL_PHY_PAGE);		//该宏就是22,页转换寄存器,先读原来的页,后面会切换回去
	if (saved_page < 0)
		return saved_page;
	page_changed = 0;
	current_page = saved_page;

	ret = 0;
	len /= sizeof(*paddr);
	for (i = 0; i < len - 3; i += 4) {
		u16 reg_page = be32_to_cpup(paddr + i);		//获取页值
		u16 reg = be32_to_cpup(paddr + i + 1);			//获取寄存器值
		u16 mask = be32_to_cpup(paddr + i + 2);		//你要哪些内容不变
		u16 val_bits = be32_to_cpup(paddr + i + 3);	//你要设置的参数
		int val;

		if (reg_page != current_page) {
			current_page = reg_page;
			page_changed = 1;
			ret = phy_write(phydev, MII_MARVELL_PHY_PAGE, reg_page);
			if (ret < 0)
				goto err;
		}

		val = 0;
		if (mask) {
			val = phy_read(phydev, reg);
			if (val < 0) {
				ret = val;
				goto err;
			}
			val &= mask;
		}
		val |= val_bits;

		ret = phy_write(phydev, reg, val);
		if (ret < 0)
			goto err;

	}
err:
	if (page_changed) {
		i = phy_write(phydev, MII_MARVELL_PHY_PAGE, saved_page);	//配置完切换回去原来的页
		if (ret == 0)
			ret = i;
	}
	return ret;
}

还是用上面的20_18.2:0为例子,我需要设置RGMII to 1000BASE-X模式,那么就在设备树中配置如下:

marvell,reg-init = <0x12 0x14 0xFFF7 0x2> //第18页 第20页 你只需要改低3位,其他不变 1000BASE-X对应2

上面的设置了没有生效,因为有Update字样。所以还要添加如下

marvell,reg-init = <0x12 0x14 0xFFF7 0x2> //第18页 第20页 你只需要改低3位,其他不变 1000BASE-X对应2
							<0x12 0x14 0x7FFF 0x8000>	//第18页 第20页 你只需要改最高位,其他不变	最高位职位对应0x8000,也就是重启PHY

最后介绍一下phytool的使用,phytool read ethx/add/reg可以从网卡号为ethx、MDIO地址为add、寄存器地址为reg读取数据。phytool write ethx/add/reg value把value写进网卡为ethx、MDIO地址为add、寄存器地址为reg的地方。

如果博客中有什么错误,欢迎指出~~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TekInsight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值