如何识别和使用 JTAG?

逆向工程 硬件 标签
2021-06-27 01:20:42

我是一个彻头彻尾的软件人。但是当我拆开硬件时,我知道要定期寻找 JTAG 端口和 RS232 端口。到目前为止,我一直很幸运,能够将引脚焊接到 RS232 端口并获得串行连接。

对于未来我不走运的时代,有人可以向我解释 JTAG 是什么(即是否只有一种类型的 JTAG,我可以期望将其连接到单一类型的端口,例如用于串行的 DB-9 ?) 以及我将如何使用它从嵌入式系统中转储固件,还是所有制造商都特定于?

4个回答

有几个 JTAG 连接器可用,所以很难分辨是哪一个,以及引脚是如何定位的。

我建议你拿放大镜阅读微控制器模型。使用该模型,您将能够在 Internet 上找到数据表。看看微控制器的 PIN,看看它有多少 JTAG 输出。一些较新的芯片具有跟踪输出,有些则没有。这确实可以缩小您的选择范围。

您可能想看看这里,快速了解各种 JTAG 连接器。

另一件值得一提的是,各种微控制器都有一个特定的位,当它设置时,JTAG 连接器被禁用。这是在发布时完成的,以确保没有人试图窃取固件或调试系统。再次启用 JTAG 的唯一方法是硬复位微控制器。这将导致内部闪存完全重置,因此所有固件都将丢失...

JTAG 最初是为了测试/验证硬件设备而创建的。这个过程被称为边界扫描和JTAG是工作组后命名为:Ĵ oint Ť ESTction G ^ roup,一些时间在20世纪80年代。

这个想法是定义一个可用于测试硬件(制造后的微控制器和连接的外围设备)的接口。即在硬件开发和随后的生产之后。

用于根据 JTAG 进行边界扫描的设备称为JTAG 探针它们曾经连接到您机器的并行端口,但现在更常通过 USB 连接并基于其中一种 FTDI 芯片。

在 PCB 上,芯片和外围设备形成连接到 TAP(测试访问端口)的“菊花链”。因此,您可以通过一个端口测试各种组件。该指令BYPASS用于告诉链上较早的设备忽略您的命令并将其传递。IDCODE用于识别设备和一些基本特征。

一些技术细节的简洁概述可以在这里找到:JTAG - 技术概述,但维基百科文章及其参考列表也提供了有价值的信息。请记住,这是在 WWW 出现之前建立的,并且关于它的许多信息已被禁止在死树上。

术语边界扫描仍然用于描述该过程并构成首字母缩略词 BSDL(边界扫描描述语言)的一部分,如果您要对设备/芯片进行边界扫描并且供应商希望您这样做,您通常会接触到它去做。否则,他们往往对此非常保密。保密的原因是他们本质上泄露了他们硬件设计的一部分,这些硬件供应商中的大多数都认为这是商业机密。我有幸在 NDA 下访问了 BSDL 文件,即使它不是针对我正在调试的确切芯片修订版。但是我确信 BSDL 文件可以很好地与我拥有的芯片的硅版本配合使用。但是除非你有能力破坏你的硬件,否则你必须确保您的 BSDL 数据与您连接的硬件相匹配

不过,如今 JTAG 不仅仅用于测试当然,硬件调试是测试的一个子集,所以这不是我的意思。我的意思是 JTAG 探针还允许您在其他已失效的硬件上刷新固件。对于拆除砖砌硬件至关重要

可能的问题

除了识别连接器,您还必须克服使用 JTAG 的几个问题我会忽略他的回答中提到的一点Mellowcandle

你必须确信你做对了,否则你可能会炸毁你的硬件,而不是,例如,把它拆掉。

识别 JTAG 引脚

通常您会发现 TMS、TCK、TDI 等刻在您的 PCB 上,因此您知道您正在处理支持 JTAG 的设备。放大镜可能会有所帮助;)

但这并不是一门神秘的艺术 - 当引脚没有标记并且您需要依赖第三方文档时,它会变得更加困难。

当然,您的电路板也可能有JTAG 接头,而不仅仅是引脚/触点。

识别微控制器

是的,您确实需要确定您拥有的芯片类型并找出它期望的电压,否则您可能会炸毁您的芯片或 JTAG 探针,或两者兼而有之

如果幸运的话,您的设备上有一个 JTAG 接头,它可以帮助您找出它是什么以及它所期望的隐式电压等等。据我所知,ARM 和 MIPS 有准标准。对于前者,请参阅 Mellowcandle 的回答,对于后者,请参阅thisthis

使用您可以找到的任何和所有可用文档来验证您所做的任何假设。DSL 路由器中通常有 MIPS CPU,但 ARM 也很常见,可能还有其他的。OpenWRT等项目有大量关于硬件的可用信息,甚至是它们不直接支持的硬件。

JTAG 探针

通常硬件供应商会声称他们支持 McCraigor Wiggler 或其他一些非常昂贵的 JTAG 探针。这意味着,如果您不使用“不受供应商支持的”(供应商提供的)JTAG 探针,您就只能靠自己了!这并不意味着它不起作用,而是意味着您必须确定自己在做什么(电压、发送的 JTAG 命令等)。

工具

FLOSS 使用 JTAG

GDB () 可以在某些情况下与这些结合使用(例如OpenOCD)。

“便宜”的 JTAG 探针

注意:有时您会听到 JTAG 探针本身的术语调试器或仿真器。

  • AVR JTAGICE、Atmel - 如果您使用 AVR 控制器,这些是首选的探头
  • JTAGkey2 和朋友们,Amontec
  • PicoTAP,Gopel - PicoTAP 前段时间也在学习工具包中免费赠送(附带 CD 等)
  • Olimex 提供了几种廉价的 JTAG 解决方案(如果您使用 OpenOCD,则特别有用)
  • BusBlaster by Dangerous Prototypes
  • 最后但并非最不重要的:如果您喜欢焊接:OpenJTAG

为了找出 JTAG 引脚排列,谷歌上有很多关于“JTAG Finder”的点击。我也有自己的实现:

http://mbed.org/users/igorsk/code/JTAG_Search/

它适用于 mbed,但我试图使其易于携带(原始版本用于 Stellaris 板)。

这是描述基本方法的评论中的引用:

 The overall idea:
 1) choose any 2 pins as TMS and TCK
 2) using them, reset TAP and then shift DR, while observing the state of all other pins
 3) for every pin that received anything like a TAP ID (i.e. bit 0 is 1):
 4)   using the pin as TDI, feed in a known pattern into the TAP
 5)   keep shifting and monitor the rest of the pins
 6)   if any of the remaining pins received the pattern, it is TDO

我创建了一个视频,如何用万用表识别可能的 JTAG 连接。这是一张图片,显示连接了哪些引脚,它与VCCGND的标准 JTAG 引脚排列相匹配这表明它可能是 JTAG,尽管它不一定是。

JTAG 连接器示例