型号:JL3111A2-NA
Phy address: 0x03
1.首先在uboot下读取下phy的id
uboot$ mii write 0x03 0x0d 0x0001 uboot$ mii write 0x03 0x0e 0x0002 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii read 0x03 0x0e 937C
查看datasheet,可以发现上面读出来的数值和datasheet一致,至少说明mdio接口是好的。

2.由于景略phy对端的phy设备是主,所以我们这里设置为slave
uboot$ mii write 0x03 0x0d 0x0001 //设置为slave uboot$ mii write 0x03 0x0e 0x0834 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii write 0x03 0x0e 0x8000
mii write 0x03 0x0e 0xc000 (设置为master)
mii write 0x03 0x0e 0x8000 (设置为slave)

景略提供的sample code代码体现如下
// Master or Slave [1.0x834] #define REG_BASE_T1_PMAPMD_CONTROL 0x0834 #define PMA_MASTER_SLAVE BIT(14) #define CFG_FORCE_MASTER 0x1 #define CFG_FORCE_SLAVE 0x0
3.由于我们想设置成千兆,看下目前的phy是否为千兆
uboot$ mii write 0x03 0x0d 0x0001 //上电默认,读出来千兆 uboot$ mii write 0x03 0x0e 0x0000 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii read 0x03 0x0e 0040
mii write 0x03 0x0e 0x2000(设置为百兆)

景略提供的sample code代码体现如下
// Speed [1.0x0] #define REG_PMAPMD_CONTROL1 0x0000 #define PMA_SOFT_RESET BIT(15) #define PMA_SPEED_MASK (BIT(13) | BIT(6)) #define PMA_SPEED_1000 BIT(6) #define PMA_SPEED_100 BIT(13) #define CFG_FORCE_SPEED_1000 0x1 #define CFG_FORCE_SPEED_100 0x0
4.由于我们想使用rgmii模式,看下现在的模式
uboot$ mii write 0x03 0x0d 0x0003 //上电默认,rgmii uboot$ mii write 0x03 0x0e 0x8000 uboot$ mii write 0x03 0x0d 0x4003 uboot$ mii read 0x03 0x0e 0240 //已经是默认rgmii
景略提供的sample code代码体现如下
// PHY Mode [3.0x8000] #define REG_COMMON_USER_CONFIG0 0x8000 #define USER_SYSTEM_MODE_MASK (BIT(3) | BIT(2) | BIT(1) | BIT(0)) #define ENABLE_TSEN BIT(5) #define ENABLE_LED_0 BIT(6) #define ENABLE_LED_1 BIT(7) #define RGMII_COPPER 0x0 #define SGMII_COPPER BIT(0) #define MII_COPPER BIT(1) #define RvMII_COPPER (BIT(1) | BIT(0)) #define RGMII_SGMII_PHY BIT(2) #define RGMII_SGMII_MAC (BIT(2) | BIT(0)) #define RMII_COPPER (BIT(2) | BIT(1))
5.一切设定已经结束,下面最终的一步是 通过softreset生效刚刚的配置
uboot$ mii write 0x03 0x0d 0x0001 //soft reset uboot$ mii write 0x03 0x0e 0x0000 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii write 0x03 0x0e 0x8040
由于是通过softreset bit位 self clean,自动清除来告知我们soft reset生效,所以可以查看一下是否已经self clean
uboot$ mii write 0x03 0x0d 0x0001 //check soft reset self clean uboot$ mii write 0x03 0x0e 0x0000 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii read 0x03 0x0e 0040
景略提供的sample code代码体现如下
// soft reset [1.0x0] #define REG_PMAPMD_CONTROL1 0x0000 #define PMA_SOFT_RESET BIT(15) #define PMA_SPEED_MASK (BIT(13) | BIT(6)) #define PMA_SPEED_1000 BIT(6) #define PMA_SPEED_100 BIT(13) #define CFG_FORCE_SPEED_1000 0x1 #define CFG_FORCE_SPEED_100 0x0
6.好了,现在就可以看下link status了
uboot$ mii write 0x03 0x0d 0x0001 //check link status uboot$ mii write 0x03 0x0e 0x0001 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii read 0x03 0x0e 0000
注意这里显示失败了,确实显示失败了,为什么?
link状态是低锁存,第一次读把低(0)的状态清除,第二次读到的是正确状态。
所以我们需要再读一次才能看到现在的link状态。
这一种设计并不是景略独有的,各大phy都通过这种精妙的设计来反映 曾经发生过link down,这样才能捕获是否以前快速发生过link down
uboot$ mii write 0x03 0x0d 0x0001 //check link status uboot$ mii write 0x03 0x0e 0x0001 uboot$ mii write 0x03 0x0d 0x4001 uboot$ mii read 0x03 0x0e 0004

景略提供的sample code代码体现如下
// Link Status [1.0x1] #define REG_PMAPMD_STATUS1 0x0001 #define PMA_LINK_STATUS BIT(2)
7.至此一个完整的通过uboot命令行让phy link up的过程结束。
整个过程截图如下

