调试环境搭建:硬件准备与软件工具
搞网络调试,最怕什么?环境出问题。
你想想看,芯片焊好了、代码烧进去了,结果PHY死活不Link UP。这时候你怀疑是硬件问题还是软件问题?没个靠谱的调试环境,那就真成玄学了。
我自己动手搭出来的环境,心里才有底。这一章,我带你过一遍,调试PHY寄存器到底需要准备哪些东西。
硬件准备
硬件是根基。根基不牢,后面全是白忙活。我个人习惯,在动手之前先把这几样东西准备好。
1. 开发板
这是主角。你得确认板子上PHY芯片的型号。手册在哪里?原理图看明白了吗?
我在项目中遇到过,拿到的板子和原理图对不上,引脚都接反了,查了三天才发现。所以,拿到板子第一件事,对照原理图,把PHY的电源、时钟、复位、MDIO/MDC、RGMII/SGMII这些关键信号,一个一个点出来。
- 确认PHY型号:Marvell? Broadcom? Realtek? 型号不同,寄存器地址和功能差异很大。
- 管理接口:MDIO/MDC管脚连到CPU还是CPLD?电平是1.8V还是3.3V?
- 串口引出:板子上的调试串口是UART0还是UART1?波特率设多少?
2. 调试器
调试器是你的“手术刀”。
| 类型 | 用途 | 我常用的型号 |
|---|---|---|
| JTAG调试器 | 烧录、单步执行、读内存、读寄存器 | J-Link, OpenOCD + FT2232 |
| USB转I2C/SPI | 直接挂到PHY的管理接口,绕过CPU | Total Phase Aardvark, USB2ANY |
| 逻辑分析仪 | 抓MDIO时序,看波形对不对 | Saleae Logic 8/16, DSLogic |
注意:如果CPU还没跑起来,或者系统都挂了,JTAG是你的最后保障。我一般两种都备着。
3. 线缆与电源
- 网线:至少两条。一条直连PC网卡,一条做环回测试。
- 串口线:USB转TTL,千万不要买成USB转RS232,电平不一样。
- 电源:稳定的12V/5V电源,电流要够。有些板子PHY启动瞬间电流很大,电源拉垮了,寄存器都读不出来。
我的习惯:准备一个“调试工具箱”,里面就装这几样。每次开始新项目,直接拎箱子走,不用现找,效率高很多。
软件工具
硬件到位了,接下来就是软件。你想想看,光有板子,没有工具连上去,那和废铁有什么区别?
我整理一下自己电脑上必装的几样东西。
1. 串口调试工具
串口是人和板子对话的基础通道。内核起来了,uboot打印,PHY驱动初始化,都靠它。
- SecureCRT / MobaXterm:功能全,支持标签页,日志记录方便。
- PuTTY:轻量级,应急用。
- minicom(Linux下):命令行环境,我写脚本时常用。
设置参数:波特率通常是115200、8N1、无流控。这个一定要和uboot/内核的打印参数匹配。
我曾经遇到过一个坑:板子串口输出乱码。折腾了半天,最后发现是线太长,信号衰减了。后来我换了一根短粗的线,立马解决。所以,串口线别超过1米。
2. 网络抓包工具
抓包能让你看到PHY对外发的是什么数据包。是Ethernet包,还是乱码?有没有CRC错误?
说白了,PHY把模拟信号转成数字MAC帧,抓包就是在数字侧看结果。
- Wireshark:必备。装好之后,记得加载Wireshark自带的USB网卡驱动。
- tcpdump:Linux命令行抓包,适合在目标板上直接抓。
- PC网卡配置:设为固定IP,比如192.168.1.100/24。关掉防火墙和网卡省电模式。
抓包小技巧:把网卡的巨型帧(Jumbo Frame)打开,有时候能抓到一些非标帧头的数据,对调试有帮助。
3. 寄存器读写工具
这个是核心。PHY寄存器没法直接用眼睛看,必须通过工具读写。
| 工具 | 访问方式 | 适用场景 |
|---|---|---|
| mdio / mii-tool | 通过CPU的MAC控制器 | 系统已经跑起来了,可以直接在命令行操作 |
| devmem2 / /dev/mem | 直接访问内存映射地址 | 寄存器直接映射到地址空间的PHY或MAC |
| 专用I2C/SPI工具 | 通过外部调试器绕过CPU | CPU没起来,或者怀疑CPU侧的MDIO驱动有问题 |
| JTAG读写 | 通过JTAG访问CPU内部寄存器 | 系统全挂了,只能从硬件最低层开始查 |
我个人推荐,系统要是能正常跑起来,优先用mdio命令。Linux内核里很多PHY驱动都内置了这个接口,写个简单脚本就能批量读一堆寄存器。
# 举个例子,读取PHY地址1的寄存器0x00(控制寄存器)
# 一般的mdio工具用法
mdio eth0 1 0x00
# 返回示例
read from phy 1 reg 0x00 = 0x3100
如果没输出,或者返回全是0xffff,先别急。检查一下MDIO时钟是否正常,PHY地址对不对。我在项目中遇到过,同一个MDIO总线上挂了两颗PHY,地址搞混了,读的全是0。
重点:调试环境不是搭一次就行。每次换板子、换PHY、换CPU,都要重新确认一遍硬件连接和工具版本。别等到出问题才回头检查线是不是松了。
你看这张图就清楚了。PHY是核心,CPU通过MDIO访问它。PC端连了三条路:串口看log、网线抓包、调试器/工具直接读写寄存器。三条路各有各的用,缺哪条,调起来都费劲。