手把手教你用EJTAG调试龙芯开发板:从硬件连接到GDB远程调试
龙芯开发板EJTAG调试实战:从硬件对接到源码级调试全解析
第一次接触龙芯开发板的EJTAG调试时,我盯着那排密密麻麻的接口引脚发愣——TDI、TDO、TCK、TMS这些缩写就像密码一样让人摸不着头脑。更让人崩溃的是,当你好不容易接上线缆,却发现调试器毫无反应,而开发板却开始发烫。这种经历相信不少嵌入式开发者都深有体会。本文将带你避开这些坑,从硬件连接到GDB远程调试,一步步掌握龙芯平台的底层调试技巧。
1. 认识EJTAG:龙芯调试的钥匙
EJTAG作为MIPS架构的专用调试接口,在龙芯处理器上扮演着不可替代的角色。与常见的JTAG不同,EJTAG在标准JTAG基础上扩展了更多调试功能:
- 处理器控制:暂停/恢复CPU执行、单步调试
- 寄存器访问:直接读写通用寄存器和特殊功能寄存器
- 内存操作:查看和修改任意内存地址内容
- 断点支持:硬件断点设置与触发
龙芯2K1000、3A5000等主流型号都支持完整的EJTAG功能,但需要注意早期型号如龙芯2F并不兼容。在开始调试前,建议先用cat /proc/cpuinfo确认处理器型号:
processor : 0 cpu model : Loongson-3A R4 (Loongson-3A5000) @ 2500MHz2. 硬件连接:避开那些看不见的坑
2.1 接口定义与线序
龙芯开发板通常采用2×7 2.54mm间距的排针作为EJTAG接口,实际使用中需要注意:
| 引脚 | 信号 | 方向 | 说明 |
|---|---|---|---|
| 1 | EJTAG_TMS | 输入 | 测试模式选择 |
| 3 | EJTAG_TCK | 输入 | 测试时钟(建议<10MHz) |
| 5 | EJTAG_TDI | 输入 | 测试数据输入 |
| 7 | EJTAG_TDO | 输出 | 测试数据输出 |
| 9 | EJTAG_TRST | 输入 | 测试复位(低电平有效) |
| 11 | GND | - | 接地 |
重要提示:12号引脚通常不焊接,连接时务必确认1脚位置(通常有方形焊盘标记),反接可能导致硬件损坏。
2.2 调试工具选型
市面上常见的EJTAG调试器主要有:
龙芯官方调试器:
- 兼容性最佳
- 支持USB 2.0高速传输
- 识别为
ID 2961:6688
开源方案:
- 基于FT2232H的方案
- 成本较低但需要自行编译驱动
- 适合DIY爱好者
连接后,可以通过lsusb命令确认调试器是否被正确识别:
$ lsusb Bus 001 Device 004: ID 2961:6688 Loongson EJTAG Debugger3. 软件工具链配置
3.1 安装ejtag-debug
ejtag-debug是龙芯官方提供的调试工具套件,安装步骤如下:
# 下载源码包 wget http://ftp.loongnix.org/toolchain/ejtag-debug/ejtag-debug-3.10.13.tar.gz # 解压并编译 tar zxvf ejtag-debug-3.10.13.tar.gz cd ejtag-debug-3.10.13 ./configure --prefix=/opt/ejtag make -j4 sudo make install编译依赖包括:
- flex/bison
- libusb-1.0
- readline开发包
3.2 常用调试命令
进入交互模式后,可以执行多种调试操作:
$ /opt/ejtag/bin/ejtag_debug ejtag> cpu0 ejtag> reg $a0 # 读取a0寄存器 ejtag> mem 0x80000000 # 查看内存内容 ejtag> dis 0x80001000 5 # 反汇编5条指令4. GDB远程调试实战
4.1 配置gdbserver
ejtag-debug内置了GDB server功能,启动命令如下:
ejtag_debug --gdbserver --port 2333在另一个终端中,使用交叉编译工具链中的gdb连接:
loongarch64-linux-gnu-gdb vmlinux (gdb) target remote :2333 (gdb) b start_kernel # 设置内核断点 (gdb) c # 继续执行4.2 调试技巧
硬件断点:
(gdb) hbreak *0x80001000相比软件断点,硬件断点不会修改指令,适合调试ROM代码
查看反汇编:
(gdb) layout asm (gdb) ni # 单步执行汇编指令监控变量:
(gdb) watch *(int*)0x8000ff00
5. 常见问题排查
问题1:连接后无响应
- 检查线序是否正确
- 测量TCK信号是否有波形
- 确认TRST信号是否处于无效状态(高电平)
问题2:GDB连接超时
- 确认防火墙放行了2333端口
- 检查ejtag_debug是否以root权限运行
- 尝试降低TCK频率(添加
--clock 1000000参数)
问题3:寄存器读取错误
- 确认CPU是否处于调试状态
- 检查电源稳定性
- 尝试复位目标板后重新连接
记得第一次成功通过EJTAG进入内核调试时,那种"一切尽在掌握"的感觉至今难忘。当你在凌晨三点终于捕捉到那个诡异的竞态条件,就会明白这些调试技巧的价值所在。
