ARM调试接口——PART B 调试端口(DP)概述

引言

在本文中,主要介绍(翻译)ARM调试接口中调试端口(DP)的总体内容.

水平有限,难免存在出错的地方。具体还请查阅手册.

本文一共包含以下几个部分,与原文Chapter B1相对应:

  • 关于DP
  • MINDP,最小化的DP扩展
  • sticky标志与DP错误响应
  • 事务计数器
  • 推送验证与推送比较操作
  • 电源与复位控制
  • 文中出现的术语、缩写

关于DP

该部分将介绍DP实现的特性。在本标准中,DP架构的版本为DPv3。ADIv6版本仅支持DPv3.

注意: DPv3与早期的DP版本不完全向后兼容。 有关DP架构的早期版本的说明,请参见ADI架构规范的相关版本.

DP可以实现为JTAG调试端口(JTAG-DP),串行线调试端口(SW-DP)或组合使用串行线/JTAG调试端口(SWJ-DP).

有关这几种DP类型的具体信息请参阅:

  • Chapter B3 The JTAG Debug Port (JTAG-DP).
  • Chapter B4 The Serial Wire Debug Port (SW-DP).
  • Chapter B5 The Serial Wire/JTAG Debug Port (SWJ-DP).

所有DP类型的参考信息请参阅:

  • Chapter B2 DP Reference Information.

本章介绍的相关章节适用于所有类型的DP,它们是:

  • MINDP,最小化的DP扩展.
  • sticky标志与DP错误响应.
  • 事务计数器.
  • 推送验证与推送比较操作.
  • 电源与复位控制.

MINDP,最小化的DP扩展

最小调试端口(Minimal Debug Port, MINDP)编程模型是DP的简化版本,旨在用于低门数实现。MINDP的实现需要使用DPv1或更高版本.

MINDP必须移除以下DP特性:

  • 推送验证操作.
  • 推送比较操作.
  • 事务计数器.

MINDP的实现必须遵守以下约定:

  • DPIDR.MIN(寄存器DPIDR的MIN位域)必须为RAO.
  • CTRL/STAT寄存器中的相关位域必须为re0

    • TRNCNT
    • MASKLANE
    • STICKYCMP
    • TRNMODE
  • ABORT.STKCMPCLR必须为0(SBZ)。写0b1的行为将是不可预测的(UNPREDICTABLE)。

作者注:本文中出现的相关术语和缩写的具体解释均可在文末文中出现的术语、缩写一节查看.


sticky标志与DP错误响应

迟滞(sticky)标志是事务错误的信号,在事务中持久保持。当其被设置时,这个标志会一直存在(即便触发该标志的条件消失也是如此)直到调试器主动清除它.

CTRL/STAT寄存器中,相关的迟滞错误标志为:

  • STICKYERR,位[5].
  • STICKYCMP,位[4].
  • STICKYORUN,位[1].
  • WDATAERR,位[7],仅适用于SW-DP.

完成一系列APACC事务后,调试器必须检查CTRL/STAT寄存器以验证是否有错误发生。如果调试器发现sticky标志被设置,调试器将清除该标志,必要时,启动额外的APACC事务来确定sticky标志被设置的原因。由于该标志是"sticky"(迟滞的),因此调试器不必在每次事务后均检查该标志。调试器应定期检查的CTRL/STAT寄存器,这样能够减少错误检查带来的开销.

一旦产生了错误标志,其将在本次事务完成时被设置,后续到来的APACC事务将被丢弃,直至sticky标志被清除.

DP对错误的响应以及清除sticky标志的方法取决于DP的类型:

  • SW-DP: 立即作出错误响应.
  • JTAG-DP: 立即丢弃所有事务并将其标记为已完成.

有关如何清除不同DP类型所产生的sticky标志的具体做法,请参阅第B2-57页的CTRL/STAT寄存器中的sticky标志字段的说明.

如果支持推送事务(pushed transactions),则sticky标志CTRL/STAT.STICKYCMP将反馈推送操作的结果。请参阅推送验证与推送比较操作一节。CTRL/STAT.STICKYCMP的行为与本节描述的sticky标志相同.

DP使用CTRL/STAT寄存器中的sticky标志来响应以下事务错误:

1. 读写错误

读或写错误可能发生在DP、AP或被访问的资源中。在任何情况下检测到错误时,CTRL/STAT.STICKYERR被设置为0b1.

例如,当调试电源域断电时调试器尝试发出AP事务请求,可能会引发读或写错误。有关电源域的信息,请见电源与复位控制一节.

2. 超时检测(overrun detection)

DP支持一种超时检测(overrun detection)模式,允许调试器使用高延迟和高吞吐量的的连接来发送命令块。这些命令的发送需要具备足够的线上延迟(in-line delay),以降低发生超时错误的概率。为了实现超时检测,DP将在超时错误发生时设置迟滞超时(sticky overrun)标志,即将CTRL/STAT.STICKYORUN设置为0b1,这一操作将在每次APACC事务序列完成时进行.

超时检测模式通过设置超时检测位来启用,即将CTRL/STAT.ORUNDETECT位设置为0b1.

由于JTAG-DP和SW-DP间存在差异,二者关于超时检测模式的行为由数据链路定义(DATA LINK DEFINED):

a. 对于JTAG-DP

如果任意事务的响应不为OK,迟滞超时标志CTRL/STAT.STICKORUN设置为0b1.

在之前的AP事务完成之前,对事务的响应始终为WAIT。一旦AP事务完成,响应为FAULT.

由于此时STICKORUN标志被设置为0b1,后续的APACC事务的响应均为FAULT。不过,对于后续的DPACC事务,尤其是对CTRL/STAT寄存器的访问事务仍可获得OK响应,这将用于确认迟滞超时标志的状态,并在收集完导致该标志被设置的原因后清除该标志.

请参阅: Sticky overrun behavior on DPACC and APACC accesses on

page B3-102

b. 对于SW-DP

如果对任意事务的响应不为OK,迟滞超时标志CTRL/STAT.STICKORUN设置为0b1.

如果先前的AP事务未完成,那么首次的事务响应为WAIT。由于CTRL/STAT.STICKORUN被设置为0b1,后续的事务响应均为FAULT.

请参阅Sticky overrun behavior on page B4-119.

迟滞错误标志CTRL/STAT.STICKYERR的值不会改变.


注意: 清除STICKYORUN标志的方法取决于具体的DP类型(JTAG-DP或SW-DP)。请见 CTRL/STAT, Control/Status register on page B2-57中的相关位域信息.

如果一个新的事务导致超时错误而先前的事务尚未完成,先前尚未完成的事务将会正常完成,不过在完成时多个sticky标志可能被设置为0b1.

STICKYORUN0b1时,如果调试器尝试清除ORUNDETECT标志(作者注:即在发生超时错误的情况下尝试关闭超时检测功能),则最终STICKYORUN的值是未知的(UNKNOWN).

要退出超时检测模式,调试器需要遵循以下步骤:

  1. 检查CTRL/STAT.STICKYORUN标志的值.
  2. 如果STICKYORUN标志为0b1,将其清除为0b0.
  3. ORUNDETECT标志清除为0b0以退出超时检测模式.

3. 协议错误(仅用于SW-DP)

SW-DP可以产生协议错误,例如在发生线路错误的情况下.

注意: 虽然协议错误只能发生在SW-DP中,但由于它们是sticky标志错误处理机制的一部分,本章也将对它们进行描述.

所需的响应如下:

  • 如果SW-DP在数据包请求中检测到协议错误,将不响应任何信息.
  • 如果SW-DP在写事务的数据传输阶段检测到奇偶校验错误,则SW-DP将设置迟滞写数据错误标志(Sticky Write Data Error Flag),CTRL/STAT.WDATAERR.该错误标志的处理方式与本节所述的其他sticky标志相同.

更多信息请参阅:ARM调试接口——PART B.4 SWD协议解析 中的
奇偶校验
协议协议错误响应


事务计数器

除了MINDP,DP的实现均需要包含一个AP事务计数器(transaction counter),对应CTRL/STAT寄存器的TRNCNT位域。事务计数器使调试器能够通过单个AP事务请求产生一系列的AP事务。对于MEM-AP访问,事务计数器使AP事务产生对连接上的内存系统的访问序列.

注意: 每个AP定义了哪些寄存器用于支持事务序列。如果AP寄存器不支持事务序列,或者SELECT.APSEL指定了不存在的AP,则该寄存器的事务序列结果将是不可预测的(UNPREDICTABLE)。保留的AP寄存器和公共AP的IDR寄存器不支持事务序列.

下面列举一些使用事务计数器的例子:

1. 内存填充

为了便于进行内存填充操作,事务计数器可以重复写入AP事务请求中提供的单个数据值。MEM-AP包含一种机制,它可以发起一系列AP访问,并在每次AP访问后自动增加访问的地址,从而使提供的数据值写入事务计数器控制下的内存地址序列.

更多信息,请参见Packed transfers on page C2-183.

2. 快速搜索和内存校验

为了在内存中的一块区域进行快速搜索或是校验操作,当启用了推送验证或推送比较功能时,从DRW寄存器中读取数据时可以利用事务寄存器.

此应用的例子请见推送验证与推送比较操作一节.
更多相关信息,请见Example of using the transaction counter for a pushed-compare operation on a MEM-AP on page C2-192.

将非零值写入CTRL/STAT.TRNCNT字段(即事务计数器)将产生多个AP事务。例如,向此字段写入0x01将产生2个事务,写入0x02将产生3个事务.

如果事务计数器的值不为零,则其值将在每次事务成功后自行递减。若满足以下任意条件,则其值不递减,事务不会重复:

  • 事务计数器的值为0.
  • CTRL/STAT.STICKYERR标志位为0b1.
  • CTRL/STAT.STICKYCMP标志位为0b1.

如果一个操作序列因迟滞错误(Sticky Error)或迟滞比较(Sticky Compare)标志被设置为0b1而终止,事务计数器将保持最后一次成功完成事务的值,以使软件能够从错误位置恢复过来,或决定比较与验证操作在何处终止.

事务计数器的值计数到0时,不会自动重装载值.


推送验证与推送比较操作

DP支持推送(pushed)操作。 在写操作可能比读操作快的情况下,推送操作提高了性能。它们被用作在线测试(in-line test)的一部分,例如Flash ROM编程和通信监控.

推送操作采用以下的机制:

  1. 调试器发起AP写事务,待写入的值将存储在DP中.
  2. DP从AP中读取一个值.

注意: 每当在启用推送比较或推送验证的情况下执行AP写事务时,引发的AP访问都是读操作,而不是写操作.

  1. 随后DP将比较上述的两个值,并根据比较的结果更新迟滞比较标志CTRL/STAT.STICKYCMP。如果这一操作使得CTRL/STAT.STICKYCMP置为0b1,任何未完成的重复事务均将被取消.

注意:

  1. 当启用了推送比较或推送验证时,执行AP读事务将导致不可预测的(UNPREDICTABLE)行为。
  2. 如果SW-DP在推送比较或推送验证启用时执行了AP读事务,将返回一个未知(UNKNOWN)值,即使线级协议保持一致,读也会产生不可预测(UNPREDICTABLE)的副作用.
  3. 由各个AP来决定哪些寄存器支持推送事务。如果AP寄存器不支持推送事务,或者SELECT.APSEL指定了不存在的AP,那么推送事务会将STICKYCMP设置为一个未知(UNKNOWN)值。保留的AP寄存器和公共AP的IDR寄存器不支持推送操作.

要配置推送操作,请使用CTRL/STAT寄存器:

  1. 使用传输模式(transfer mode, TRNMODE)字段以确定合适的传输模式:

    • TRNMODE设置为0b01以选择推送验证操作:如果数值匹配,将设置STICKYCMP标志位为0b1.
    • TRNMODE设置为0b10以选择推送比较操作:如果比较值不一致,将设置STICKYCMP标志位为0b1.
  2. 使用byte lane掩码字段MASKLANE来选择byte lane中哪些部分用于比较操作。MASKLANE中第n个位设置为0b1,将APACC操作所写值的第n个字节和当前AP值进行比较.

更多有关MASKLANE的信息,请见CTRL/STAT, Control/Status register on page B2-57.

下面是MEM-AP中使用推送验证和推送比较操作的应用实例:

  • 您可以使用推送验证操作来验证系统内存中的内容。在AP事务中写入一系列预期的值。在每次写操作时,推送验证逻辑就会发起一次AP读访问,并将读访问的结果与本次写的预期值进行比较。如果值不匹配,那么CTRL/STAT.STICKYCMP标志将被设置为0b1。这个例子将在这一节中详细描述:Example of using a pushed-verify operation on a MEM-AP on page C2-191.
  • 您可以使用推送比较操作在系统内存中搜索一给定值。然而,此功能在使用AP事务计数器执行时最有用,如这一节所描述的那样:The transaction counter on page B1-45。更多详细的操作请见:Example of using the transaction counter for a pushed-compare operation on a MEM-AP on page C2-192.

下面以一个例子来描述对特定AP采取推送操作,有助于您理解推送操作的实现方式。现在考虑一个AP写事务,其对MEM-AP中的数据读写(Data Read/Write, DRW)寄存器进行写操作,此时TRNMODE值为0b10(即启用推送比较),MASKLANE的值为0b0101。将采取以下的操作:

  1. DP在推送比较逻辑中保存来自AP写事务的数据值,见ARM调试接口——PART A概述 中图A1-3 ADIv6实现的结构.
  2. AP从MEM-AP传输地址寄存器(Transfer address register, TAR)指示的地址读取.
  3. 本次读取操作返回的值将与推送比较逻辑中保存的值进行比较。比较的值还将采用掩码操作。在本例中MASKLANE的掩码值为0b0101,这将采用byte lane的第0和第2字节进行比较。比较的结果要么匹配,要么不匹配.
  4. 在本例中,TRNMODE设置为0b10表明使用推送比较操作:

    • 如果得到不匹配的比较结果,那么CTRL/STAT.STICKYCMP标志将设置为0b1,且任何未完成的事务都将被取消.
    • 如果得到匹配的比较结果,那么不会发生任何事情.

电源与复位控制

CTRL/STAT寄存器中,DP支持以下电源和复位控制字段:

  • 系统电源和调试电源的控制字段,CDBGPWRUPREQCDBGPWRUPACKCSYSPWRUPREQCSYSPWRUPACK。更多信息请见:System and debug power control behavior on page B2-81.
  • 调试复位的控制字段,CDBGRSTREQCDBGRSTACK。更多信息请见Debug reset control behavior on page B2-86.

这些控制位可由调试器编程,驱使信号进入目标系统。

当受CTRL/STAT寄存器中的电源和复位控制字段控制时,可以通过CDBGRSTREQ字段来实现调试逻辑复位,但CTRL/STAT不提供任何请求系统复位的控制位。不过,调试器的物理接口通常包括一个系统复位引脚nSRST,其可以向现有的电源和复位控制器提交复位请求或促使其进行复位。更多有关如何实现系统重置引脚的信息,请见System reset control behavior on page B2-88.

ARM建议仅将CDBGRSTREQ作为解除锁定系统的最后手段。CDBGRSTREQ可能影响的不仅仅是锁定逻辑,必须谨慎使用.

nSRST也可能引起调试逻辑的复位,但需要释放对调试逻辑的复位操作以允许调试器在保持系统复位的状态下对调试逻辑进行编程.

ADI并没有取代系统电源和复位控制器,ADI规范没有对系统电源和复位控制器的操作提出任何要求.

文中出现的术语、缩写

本部分将对文中出现的术语、缩写进行简单介绍。更详细的信息请见:ARM调试接口——术语


DATA LINK DEFINED

由数据链路层定义的行为.

RAO

硬件上实现读操作的结果始终为1。软件可以得到读取的值为1的保证.

re0

保留为0值.

SBZ

硬件必须忽略写操作。软件需始终写0值.

UNPREDICTABLE

不可预测的行为.

UNKNOWN

不包含有效数据,可能随着时刻、架构、实现的不同而变化的值.