- SOC:bcm47623L
- PHY:bcm50210S (RGMII)
- SDK:ESDK6.5ga
- kernel:linux-4.19
需要SOC提供一个RGMII的port给这个PHY
配置switch的寄存器就可以实现切换
在phy init阶段配置修改初始化寄存器可以实现auto功能
- 添加PHY信息到DTS,开放RGMII接口给PHY
# 添加 RGMII pinctrl
+ pinctrl-names = "default", "rgmii";
+ pinctrl-0 = <&a_rgmii_mdc_pin_68 &a_rgmii_mdio_pin_69 &rgmii_pins>;
+ pinctrl-1 = <&rgmii_pins>;
# 添加 RGMII PORT1
+ port1@1 {
+ phy-handle = <&phy_rgmii>;
+ mii-pinctrl-state = "rgmii";
+ phy-mode = "rgmii";
+ rgmii-3p3v;
+ status = "okay";
+ };
# 修改 PHYAD
phy_rgmii:rgmii {
+ reg = <0>;
- 初始化中添加修改寄存器的程序段:实现AUTO功能
static int phy_init (phy_dev_t *phy_dev)
{
...
+ if (0x0 == phy_dev->addr) // PHYAD
+ {
+ int ret = 0;
+ ret = rgmii_to_copper_fiber_auto_detect(phy_dev);
+ if (ret)
+ printk("rgmii_to_copper_fiber_auto_detect have error\n");
+ }
# 配置寄存器函数rgmii_to_copper_fiber_auto_detect():
phy_dev_write(phy_dev, RDB_ACCESS | 0x..... 0x....); // EXT REG
...
phy_dev_write(phy_dev, MII_BMCR, 0x....); // MII
....
PS: 上述配置寄存器时,具体寄存器参数需要更具bcm50210S寄存器文档说明来修改。
- 驱动中添加1000Base-X支持
# 添加1000Base-X宏
+#define ESTATUS_1000_XFULL 0x8000 /* Can do 1000BX Full */
+#define ESTATUS_1000_XHALF 0x4000 /* Can do 1000BX Half */
# 驱动
# 1. mii驱动中添加phy_drv_brcm.h的头文件,
# 2. mii_caps_get()中添加Fiber判断程序,并初始化1000BX标志信息
# 2.1 判断EXT REG | 0x21 的标志位,判断是否为Fiber。
# 2.2 判断Fiber后修改adv标志 & 1000BX = xxxxxx
# 2.3 修改链接状态位,添加判断程序。(1000 0100与电口标志位不重合)
# 3. mii_cpas_set()与上述方式类似,添加对Fiber的判断与标志位修改。(注意不要移除非光口程序段)
- 添加PHY信息到DTS,开放RGMII接口给PHY
- 初始化中添加修改寄存器的程序段
- 驱动中添加1000Base-X支持