文章目录
前言
- 定制化开发本文比较适合在内核 arch/arm/boot/dts/ 定制化开发没有对应芯片设备树的场景调试。
- 定制化开发若内核已有对应芯片的设备树,定制化开发调试会相对简单一些,定制化开发在这里就不描述了,定制化开发不过解决问题的思路类同。
1、YT8511是什么?
简介:
- 定制化开发在外围不断打压国内芯定制化开发片的背景下,2017定制化开发年裕太微电子成立于苏州市,定制化开发它是国内唯一自主以太网PHY芯片!
YT8511定制化开发是裕太微旗下的一款支定制化开发持千兆以太网PHY芯片。
特性
- 兼容10BASE-Te/100BASE-Tx/1000base
- 支持WoL (wake -on- lan)定制化开发检测魔术报文,通知休眠系统唤醒强大的电缆放电事件
- 支持RGMII接口到MAC设备,宽I/0电压等级选项2.5V,兼容3.3V 1/0
- 全双工
- 自动极性校正RGMll定时模式
- 符合IEEE 802.3u的自协商
- 软件可编程LED模式
- 多种Loopback模式用于诊断
- 前馈均衡器,反馈均衡器和定时恢复,以提高信号在嘈杂环境中的性能
2、调试准备工作
1.主控芯片:Hi3536
2.双网卡硬件(原理图)说明:
- 千兆网口1:
型号: YT8511
RGMII口: RGMII0
PHY地址: 1
时钟: EPHY0_CLK
通信: MDIO,MDCK
复位: EPHY_RSTN0- 千兆网口2:
型号: YT8511
RGMII口: RGMII1
PHY地址: 0
时钟: EPHY1_CLK
通信: MDIO,MDCK
复位: EPHY_RSTN0
特别声明:千兆网口1 和 千兆网口2 的 MDIO, MDCK, EPHY_RSTN0 是共用一套复用管脚的。
3、千兆网口不通,是否需要移植裕太微官方驱动?
关于移植已否取决于你的实际需求。但是我想告诉你的是,其实内核是有一个通用驱动的,如果是为了
调通千兆网口
,是不需要移植
的。
4、开始调试网口
4.1 硬件调试
首先根据硬件原理图,确保一些关键的管脚复用是正确的。海思平台可通过 himm 命令来查看:
4.1.1 查看 EPHY0_CLK 复用
# himm 0x120F0044*** Board tools : ver0.0.1_20121120 *** [debug]: {source/utils/cmdshell.c:166}cmdstr:himm====dump memory 0X120F0044====0x120F0044: 0x00000001 //01 表示已复用为 EPHY0_CLK
- 1
- 2
- 3
- 4
- 5
4.1.2 查看 EPHY1_CLK 复用
# himm 0x120F008c*** Board tools : ver0.0.1_20121120 *** [debug]: {source/utils/cmdshell.c:166}cmdstr:himm====dump memory 0X120F008C====0x120F008c: 0x00000001 //01 表示已复用为 EPHY1_CLK
- 1
- 2
- 3
- 4
- 5
4.1.3 查看 MDCK 复用
# himm 0x120F0090*** Board tools : ver0.0.1_20121120 *** [debug]: {source/utils/cmdshell.c:166}cmdstr:himm====dump memory 0X120F0090====0x120F0090: 0x00000001 //01 表示已复用为 MDCK
- 1
- 2
- 3
- 4
- 5
4.1.4 查看 MDIO 复用
# himm 0x120F0094*** Board tools : ver0.0.1_20121120 *** [debug]: {source/utils/cmdshell.c:166}cmdstr:himm====dump memory 0X120F0090====0x120F0090: 0x00000001 //01 表示已复用为 MDIO
- 1
- 2
- 3
- 4
- 5
若以上的管脚复用不对,可以在 uboot 或 kernel 里把它们配置好(推荐在 uboot 配置)
4.2 内核配置
# make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfigDevice Drivers ---> [*] Network device support ---> [*] Ethernet driver support ---> <M> STMicroelectronics 10/100/1000 Ethernet driver, TNK added --->
- 1
- 2
- 3
- 4
- 5
- 6
根据硬件 PHY地址 和 RGMII口 的说明在内核里一一对应配置。若板子上的硬件没有问题,把内核运行起来后千兆网口是必定能 ping 通的。
4.2 内核编译
# make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- uImage -j16# make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- modules -j16
- 1
- 2
编译完成后:
- 生成内核文件:arch/arm/boot/uImage
- PHY通用驱动:drivers/net/ethernet/stmmac/stmmac.ko (替换到根目录的/hitoe/)
5、运行内核并测试网口
5.1 内核启动后会自动检测 mdio 总线上的 phy_id 和 phy_addr,正确打印如下:
stmmac_associate_phy: phy 0 mode=6 eth0 - (dev. name: stmmaceth - id: 0, IRQ #55 IO base addr: 0xfc020000)libphy: STMMAC MII Bus: probedeth0: PHY ID 0000010a at 0 IRQ 0 (1:00)eth0: PHY ID 0000010a at 1 IRQ -6 (1:01) active //检测到eth0的phy_id(0x10a),phy_addr(1)设备挂载在mdio总线上 DWMAC1000 - user ID: 0x10, Synopsys ID: 0x36 Enhanced descriptor structureMACADDR in get is ff:ff:ff:ff:ff:ff no valid MAC address for MAC 1;please, use ifconfig or nwhwconfig!stmmac_associate_phy: phy 1 mode=6 eth1 - (dev. name: stmmaceth - id: 0, IRQ #55 IO base addr: 0xfc024000)eth1: PHY ID 0000010a at 0 IRQ 0 (1:00) active //检测到eth1的phy_id(0x10a),phy_addr(0)设备挂载mdio总线上eth1: PHY ID 0000010a at 1 IRQ -6 (1:01)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
备注说明:
1)如果(4.2 内核配置)PHY地址 配置有误
,则 ethX (X表示:0, 1, …) 打印的信息是没有 active 的;
2)这种情况下,可根据硬件说明
重新核对(4.2 内核配置)PHY地址 配置项
。
5.2 测试网口:
- 5.2.1 如果
PHY地址 和 RGMII口 配置都正确
,测试网口能正常 ping 通(以eth1为例):
# route add default gw 192.168.32.1 //设置eth1网关# ifconfig eth1 192.168.32.78 netmask 255.255.254.0 broadcast 192.168.32.255 up //设置eth1 IP地址、mask地址、广播地址# ping 192.168.32.1 //测试网关(正常ping通信息如下):PING 192.168.32.1 (192.168.32.1): 56 data bytes64 bytes from 192.168.32.1: seq=0 ttl=254 time=18.156 ms64 bytes from 192.168.32.1: seq=0 ttl=254 time=18.156 ms
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 5.2.2 错误示范: 假设我们将
eth1 PHY地址 配置为 2
,重新编译并运行内核,尝试启动 eth1 网口时提示信息如下:
# ifconfig eth1 uplibphy: PHY 1:02 not foundeth1: Could not attach to PHYstmmac_open: Cannot attach to PHY (error: -19)ifconfig: SIOCSIFFLAGS: No such device
- 1
- 2
- 3
- 4
- 5
这就是典型的 PHY地址 配置有误的情况!!!
6、例外说明
6.1 PHY地址 和 RGMII口 配置都正确,但是网口还是无法 ping 通:
- 场景: 千兆双网口同时连接不同速率的交换机或通信设备(1个千兆、1个百兆)
- 现象: 连接千兆设备的网口能 ping 通,而连接百兆设备的网口无法 ping 通,这种情况就要检查网口的自协商功能了(大概如下):
drivers/net/ethernet/stmmac/stmmac_main.c --> stmmac_dvr_probe --> stmmac_mdio_register --> mdiobus_register //drivers/net/phy/mdio_bus.c --> mdiobus_scan --> get_phy_device //drivers/net/phy/phy_device.c --> get_phy_id --> phy_device_create //初始化phy设备自协商等参数信息 --> INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); //其中phy_state_machine会不断的检查网口状态,并回调stmmac_adjust_link调整链接参数 drivers/net/phy/phy_device.c --> genphy_read_status //检查链路状态并更新当前链路状态drivers/net/ethernet/stmmac/stmmac_main.c --> stmmac_adjust_link //调整链接参数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
6.2 PHY芯片自协商功能修改:
- 预览 (6.1) PHY 芯片大概的工作流程:很容易看出,当我们拔插网线时 genphy_read_status 会最新检查到链路状态的更新。
- 连接千兆设备的网口能 ping 通,而连接百兆设备的网口无法 ping 通,不排除在硬件上千兆网口干扰了百兆网口。如果连接百兆设备的网口不需要自协商,可考虑在此函数内做特殊处理(针对特定的 PHY地址 禁止自协商功能并设置固定的速率)。在 genphy_update_link 函数之后添加:
if (CONFIG_STMMAC_PHY1_ID == phydev->addr){ phydev->speed = SPEED_100; //设定PHY1速率只适配100MB phydev->duplex = DUPLEX_FULL; //全双工 phydev->autoneg = AUTONEG_DISABLE; //禁止自协商功能 phydev->pause = 1; phydev->asym_pause = 1; return 0;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
总结
- 调试 YT8511 PHY芯片时,一般情况下是不需要移植裕太微官方驱动的,除非你有其他特殊的功能需要添加;
- 再次声明关于 “6.2 PHY芯片自协商功能修改”,大家必须要确保是不需要自协商功能才做的修改,否则百兆设备不能适配的情况,还是需要检查硬件上的网口间是否有干扰,或内核配置是否有误等情况并重新做调整。
- 关于 PHY 和 MAC 之间的工作原理与联系,网上已有很多大神写的很详细了,在这里我就不过多陈述了。如果大家感兴趣,推荐几篇博文与大家共勉: