对华为HG255D路由器进行JTAG调试的进一步研究
网上对于HG255D路由器进行救砖的方法时有时会失败,特别是引导代码uboot完全被破坏或者flash被清空的情况下,除了把flash焊下来,就只能使用jtag的方式进行恢复了。网上关于华为HG255D路由器的JTAG定义只有GND,TDO,TDI,TMS,TCLK,VREF,NTRST共7根线的连接方式,由于缺少NSRST的连线定义,使得当引导代码uboot完全被破坏或者flash被清空的情况下,有时候甚至通过jtag也不能救砖,比如运行某个命令时,在telnet界面只是增加一行空白行,没有预期的运行结果输出,或者看到pc为0x00000000的输出。
经过对RT3052 CPU的datasheet引脚定义发现PORST_N引脚为CPU的复位引脚,在JTAG接口里面对应于NSRST。将该引脚连接到JTAG,可以使用JTAG软件让CPU复位,而jtag的TAP不复位,从而使CPU一开始就进入调试状态。使用的JTAG调试软件为openocd 0.9.0,JTAG硬件可以是Jlink v8或者BusBlaster V3C。
在OpenOCD配置文件中需要增加关于复位的引脚定义,表明cpu的复位和jtag的TAP复位是分别控制的。如下:
adapter_nsrst_delay 100
jtag_ntrst_delay 100
reset_config trst_and_srst
在OPENOCD的Telnet连接中输入reset halt,就可以使CPU复位并暂停于第一条指令地址0xbfc00000处,此时再执行ralink_init,load_image uboot-ram.bin 0x200000,resume 0x200000等命令就可以将RAM版boot程序导入到内存执行了。然后可以通过内存运行的uboot进行flash的重新写入操作。这样就算原来flash中的代码完全被破坏也可以进行修复了。
最初的目的是能够用来学习路由相关的嵌入式软件开发,而不是救砖。利用openocd提供的gdb功能可以实现软件的单步调试和增加断点等功能。由于现在hg255d路由器在网上的价格非常便宜(10-20元),加上一个jtag仿真器就可以组成一套性价比较高的嵌入式开发学习设备了。可以用来学习MIPS的嵌入式软件开发,如uboot和路由器操作系统OpenWrt等。
最后说下,在改写flash之前要先把flash整个备份下来,之后不管怎么操作都可以利用这个备份文件将hg255d恢复到原来的样子,以便进行比较研究。特别是有关无线配置参数部分的内容,如果没有备份,从别的hg255d板子上拷贝的无线配置参数不一定适合现在的板子。
图1
图1为HG255D板子上关于JTAG引脚的连线点定义。
图2
图2为焊接好JTAG连线后的样子。
图3
图3 为启动openocd后运行reset命令后jtag响应情况。
图4
图4为运行内存板uboot后的过程。此时启用了work-area-phys,速度达到85KB/s。
图5
图5为关闭work-aera-phys,速度降为2KB/s。
图6
图6为拷贝hg255d的flash中数据到PC机上过程。
图7
图7为向hg255d中flash写入uboot过程。执行命令前要关闭work-area-phys。每次只写256字节,比较慢。
图8
图8为openocd后台进程情况。
图9
图9为擦除flash过程。一个sector为128K字节。
图10
图11
图10和图11为rt3052的datasheet中关于jtag引脚和复位引脚的定义。