如何在U-boot中访问NXP MPC8308 MDIO总线的CFP非以太网PHY
解决U-boot访问NXP MPC8308上Clause45非以太网PHY(CFP模块)的方案
首先得明确:U-boot默认的mii命令主要针对IEEE 802.3 Clause 22的以太网PHY设计,而你的CFP模块遵循的是Clause 45的MDIO规范,两者的寄存器访问机制不同,而且tsec.c里的phy_info数组是专门匹配以太网PHY的标识,所以直接用现有逻辑识别不了很正常。下面是几个可行的方案:
方案1:使用U-boot原生的mdio命令(如果支持)
有些较新的U-boot版本已经内置了mdio命令,专门支持Clause45设备的读写操作。你可以在U-boot命令行尝试:
- 读取Clause45设备寄存器:
mdio read <phy_addr> <dev_addr> <reg_addr>
比如你的CFP地址是6,假设要读设备0的寄存器0x10,就输入:mdio read 6 0 0x10 - 写入Clause45设备寄存器:
mdio write <phy_addr> <dev_addr> <reg_addr> <value>
如果你的U-boot版本没有这个命令,就需要自己添加或者用下面的方案。
方案2:扩展U-boot的mii命令支持Clause45设备
你可以修改U-boot的命令代码,给mii命令添加Clause45的操作选项:
- 打开
cmd/mii.c,在do_mii函数里添加新的命令分支(比如mii c45read和mii c45write)。 - 实现Clause45的读写逻辑:对于MPC8308的TSEC控制器,需要操作TSEC的MDIO寄存器:
- 先向
TSEC_MDIO_ADDR寄存器写入设备地址、寄存器地址以及操作类型(读/写)。 - 然后通过
TSEC_MDIO_DATA寄存器读取或写入数据。
具体的寄存器格式可以参考MPC8308的参考手册,确保符合Clause45的时序要求。
- 先向
- 编译更新U-boot后,就可以用扩展后的
mii命令直接访问CFP模块的寄存器。
方案3:修改TSEC驱动的探测逻辑,让mii info识别CFP设备
如果你希望mii info能列出这个CFP模块,可以修改tsec.c里的探测逻辑,不需要把它加到phy_info数组(因为不是以太网PHY):
- 在
tsec_phy_probe函数中,除了现有的Clause22 PHY探测逻辑,添加Clause45设备的探测步骤:- 尝试读取Clause45设备的标识寄存器(比如设备0的寄存器0x0和0x1,对应OUI和设备型号)。
- 如果读取成功且匹配CFP模块的标识,就把这个设备加入到TSEC的PHY列表中,标记为非以太网PHY类型。
- 修改
mii info的显示逻辑,让它能显示非以太网PHY的设备信息。
方案4:临时手动寄存器操作(适合快速测试)
如果只是临时调试,可以直接通过U-boot的mw和md命令操作TSEC的MDIO寄存器:
- 先查看MPC8308手册,找到TSEC的MDIO基地址(比如假设是0xE000E000)。
- 写入地址寄存器(以读操作为例):
mw 0xE000E004 0x60010000 # 假设地址寄存器是0xE000E004,这里设置PHY地址6,设备0,寄存器0x10,读操作 - 读取数据寄存器:
注意:具体的寄存器位定义要严格参考MPC8308的手册,确保地址和操作位的设置正确。md 0xE000E008 1 # 数据寄存器是0xE000E008,读取1个32位值
最后要注意,Clause45和Clause22的MDIO操作不能混用,必须严格遵循对应的规范,否则会导致读写失败或者设备异常。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

