Jtag一直是传说中的神器. 以前刷dd-wrt变砖的时候就想用它玩玩,结果当时把无线路由忙刷好了, 买回来的线就一直在抽屉中沉睡. 这几天玩嵌入系统, 把那根简陋的线找出来, 看看原理, 准备施展一番, 没想到居然左右连不上设备...今天终于连接成功, 整理一下遇到的问题. 因为是公司的设备, 还好能找到电路图.
1. JTAG插座引脚标准混乱, 每个厂家板上的接口都不一样, 有5脚的, 有10针, 14针, 20针, 脚距也有2.5和2.0之分, 更要命的针数一样了, 每个针的定义还不一样, 吐血啊. 一定要找来电路图看看清楚再接. 虽然都是弱信号(没电源)烧不坏, 接错了还是挺费神的.
2. 别相信电路板的上JTAG标志. 有的设备有两个三个JTAG接口,有的Jtag结构被隐藏到很多排线中间. 一开始看到一个口就插, 结果后来问问专家, 那个不是cpu的.
3. 别相信网上的软件, 很可能他们对驱动的支持不好. 比如h-jtag就不能识别我的mips设备, 又没log, 报个错误就退出, 看不出哪里的问题. h-jtag可以自定义并口管脚, 但还是不行. 最后还是openocd帮忙搞定, 因为还有源码可以看.
4. 用并口线, 我的因为是当初刷路由用的, 非常简陋, 能肉眼看出接线方法:
TDI: 2
TDO: 13
TCK: 3
TMS: 4
bin\openocd-0.6.0-rc2.exe -f parport.cfg 运行提示如下:
引用
Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 3 kHz
Info : clock speed 3 kHz
Warn : There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
Error: JTAG scan chain interrogation failed: all ones
Error: Check JTAG interface, timings, target power, etc.
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
Warn : gdb services need one or more targets defined
反正看到all ones就是没连接成功.
配置文件如下:
引用
interface parport
parport_port $_PARPORTADDR
parport_cable wiggler
adapter_khz 3
通过openocd文档可以看到它支持很多类型的并口, 但是并未给出这些并口的接线图.
网上做wiggler的电路图找来看看, 居然跟我不一样, 但是我这个鸟接法属于神马接法呢?
看看源码: http://openocd.sourceforge.net/doc/doxygen/html/parport_8c_source.html
这里面用二维数组定义了设备引脚, 但是这些1/2/4/0x10/0x40/0x80都代表什么脚呢? 特别是TDO, 我接在13脚, 怎么看都没有. 再往后看源码, 原来这些数字代表了IO操作中的bit位.
看这里: http://www.elecfans.com/baike/computer/taishiji/20100309183757.html
第二脚是并口的D0, 是电脑数据寄存器的0位, 掩码是1, 所以tck掩码2, tms掩码4, 并口13脚是select输入信号,对应状态寄存器的bit4, 掩码0x10. 所以去源码里面对应一下, 就tmd是DLC5, 这就是broadcom无线路由常用jtag连线的引脚. 上网一搜, 果然tjtag这个软件支持dlc5和wiggler, 估计早期版本缺省就是dlc5, 所以大家都用这种线救砖. 国内bjtag是不是说也是它?
现在改改配置文件:
parport_cable dlc5
然后认真的把线按照机器电路图接上去, 运行openocd, 成功:
引用
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x....... ..."
Warn : AUTO auto0.tap - use "... -irlen 5"
Warn : gdb services need one or more targets defined
好了, 后面可以慢慢把玩jtag命令, 然后加载cpu配置, 用gdb调试.
折腾了半天, 最好去淘宝买个标准的wiggler接口, 输出5根线做成散的, 想用什么接口自己插, 万能!