gpt4 book ai didi

embedded - 如何使用 OpenOCD ping 芯片(检测芯片是否已连接)

转载 作者:行者123 更新时间:2023-12-03 06:29:33 27 4
gpt4 key购买 nike

1.问题说明

我正在尝试将 OpenOCD 用于不常见的事情。而不是 连接对于芯片,我只想检测 芯片。
我想到的程序如下所示:

  1. Start OpenOCD with the probe config file (eg. stlink.cfg ) given as -f parameter. So OpenOCD knows what probe to use, but doesn't know what chip it will find.

  2. OpenOCD detects a chip and reports this somehow (eg. write something to stdout). If possible, this action should not be intrusive to the chip (like resetting it).

  3. OpenOCD shuts down.



以下是有关该过程的更多说明:

注 1:如果 OpenOCD 没有达到我需要设置 Telnet 或 GDB 客户端以与其交互的服务器状态,那就太好了。我很乐意以更方便的方式报告芯片检测,例如在标准输出 channel 上获取芯片信息。

注 2:检测应该对芯片无干扰。但是,如果 OpenOCD 没有找到任何东西,我想有一个备份方法,OpenOCD 尝试更积极地找到芯片(例如按住 nRST 引脚)。如果需要,我可以自己调用另一种方法(因此 OpenOCD 不需要自动执行此操作)。

注 3:起初,我只会在带有 STLinkV2 或 STLinkV3 探针的 STM32 芯片上应用这种“芯片检测”,稍后也将应用于其他探针和芯片。

注释 4:有些板子只有 SWD 连接(没有 JTAG)。

注释 5:我正在使用 Windows 10 计算机,并从 https://www.playembedded.org/blog/download/ 下载了一个最新的 OpenOCD 版本(版本 0.10.0_dev00921,于 2019 年 7 月 6 日构建)

2. 到目前为止我尝试过的

Tommy Murphy 先生向我介绍了 OpenOCD 引用手册中的第 10.7 节(参见 http://openocd.org/doc/pdf/openocd.pdf)。我已经阅读了该部分并观察了以下示例:

# openocd.cfg file
# -----------------
source [find interface/olimex-arm-usb-tiny-h.cfg]
reset_config trst_and_srst
jtag_rclk 8

因为我的芯片是通过 连接的STLink 探头 并使用 社署运输 协议(protocol)(而不是 JTAG),我对示例做了一些修改:

# openocd.cfg file
# -----------------
source [find interface/stlink.cfg]
transport select hla_swd
reset_config srst_only
adapter_khz 480

我连接了 NUCLEO_F303K8 连接到我的 PC 进行此测试。然后我在控制台中发出以下命令:

> openocd -s "C:\...\scripts" -f "C:\...\openocd.cfg"



OpenOCD 输出以下内容,然后终止:
Open On-Chip Debugger 0.10.0+dev-00921-gef8c69ff9 (2019-07-06-01:00)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 480 kHz

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 480 kHz
Error: BUG: current_target out of bounds

所以我最终提出了一些关于自动探测的问题。

3. 我的问题

问题一:
“自动探测”(如第 10.7 节所述)真的是我在这里需要的吗?如果答案是 ,请忽略接下来的问题。

问题2:
我试图模仿第 10.7 节中给出的示例,并进行了一些小的修改,以使该示例适合我的 Nucleo 板。不幸的是,自动探测失败了。这是因为 OpenOCD 不支持使用 SWD 协议(protocol)进行自动探测吗?或者我只是在我的 .cfg 中犯了一个错误文件?

问题三:
我注意到第 10.7 节中的 Autoprobing 示例配置了 OpenOCD 的重置行为。这是否意味着自动探测在重置芯片的意义上将始终是“侵入性的”?

问题 4:
10.7 节中的 Autoprobing 示例似乎无论如何都将 OpenOCD 带入了服务器状态。有没有可能避免这种情况?我想让这个“芯片检测”事情变得简单,不需要 Telnet 或 GDB 客户端。

编辑

谢谢@nattgris 的出色回答。不过,我还有一些更实际的问题。

1. 使用 ST-Link

假设我们正在使用 ST-Link,尽管它与 OpenOCD 的合作并不理想。你说:

.. if all you need is to know is whether a chip is there at all, in some configurations the ST-Link can probably be persuaded to give you that info.



我如何实际说服 ST-Link 这样做?换句话说,我应该在我的 openocd.cfg 中放什么?文件来实现这一点?

2. 带 SWD-probe(但不带 ST-Link)

假设我们使用的是真正的 SWD 探针。你说:

Autoprobing, as described in Section 10.7, is only relevant for JTAG [...]. Simply connecting via SWD prints the corresponding information (the DPIDR register instead of the TAP IDCODE). So either way, you can get similar info about the chip over both protocols. [...]
For all Cortex-chips, you will basically get "ARM" instead of the actual manufacturer of the chip (e.g. "ST"). Though ST (and perhaps other manufacturers) chips have a separate boundary scan TAP (i.e. JTAG only) that provides an actual ST IDCODE that can be used for chip identification.



由此,我得出结论:
  • 第 10.7 节中描述的自动探测仅适用于 JTAG,不适用于 SWD。
  • 由于自动探测不适用于 SWD,替代方法是简单地连接到芯片,然后 OpenOCD 自动打印 DPIDR登记。此 DPIDR寄存器是 JTAG TAP 的 SWD 等效项 IDCODE ,可以这么说,在一定程度上可以识别芯片。
    但是,如果人们一开始不知道 PC 上连接的是什么芯片,那么如何简单地连接到芯片上呢?如果我没记错的话,OpenOCD 总是需要特定的配置文件,比如 stm32f7x.cfg , stm32f4x.cfg , stm32l0.cfg , ... 连接到芯片。
  • 显然,JTAG IDCODE和 SWD 等效项 DPIDR寄存器提供芯片设计者,对于 ARM-Cortex 芯片,它总是“ARM”。这对于完整的芯片识别来说是不够的。但是,您说 ARM 芯片具有单独的边界扫描 TAP,可进一步提供 IDCODE注册以获得更完整的身份证明。不幸的是,这些仅适用于 JTAG。这意味着SWD在芯片识别方面处于死胡同?
  • 使用 JTAG 进行自动探测(因此阅读 IDCODE reg)可以是完全非侵入性的。因此,可以使系统复位信号不可用:reset_config none你说阅读DPIDR通过 SWD(我认为它是 JTAG 自动探测的 SWD 等效项)也是非侵入性的。我是否也可以通过使重置信号不可用来强制执行“非侵入性”?


  • 3. 使用 JTAG-probe(但不是 ST-Link)

    JTAG 协议(protocol)似乎为芯片识别提供了最好的支持(使用 Autoprobing)。我的结论:
  • 第 10.7 节中描述的自动探测将打印 TAP IDCODE从芯片。对于只会打印“ARM”而不是实际制造商(如“ST”)和芯片名称(如“STM32F767ZI”)的 ARM 芯片。
  • 我实际上如何确保该程序还打印这些进一步的信息,尤其是实际的芯片名称?换句话说,我应该在我的 openocd.cfg 中放什么?文件(可能还有 openocd 启动命令)来实现这一点?

  • 非常感谢 :-)

    最佳答案

    问题一:

    这是你需要的吗?要看。自动探测,如 10.7 节所述,仅与 JTAG 相关。因此,它本身并不能满足您的需求。但简单地通过 SWD 连接会打印相应的信息(DPIDR 寄存器而不是 TAP IDCODE),因此无论哪种方式,您都可以通过两种协议(protocol)获得有关芯片的类似信息。

    但是,我不确定这对您来说是否足够。如果您只想检测芯片(任何芯片)响应,这可能就足够了。如果您还需要详细识别芯片,通常需要进一步检查,因为您通过两种方法获得的 ID 代码可以识别芯片的设计者。因此,对于所有 Cortex 芯片,您基本上会得到“ARM”而不是芯片的实际制造商(例如“ST”)。尽管 ST(可能还有其他制造商)芯片有一个单独的边界扫描 TAP(即仅 JTAG),它提供可用于芯片识别的实际 ST IDCODE。

    但是,由于 SWD 仅与 ARM Cortex 类型(或更确切地说是 ADI v5)目标相关,如果您可以使用 SWD,您还可以阅读调试组件的 ROM 表,其中提供了芯片制造商的其他信息:

    # Your JTAG adapter config
    script interface.cfg

    transport select swd
    adapter_khz 100

    swd newdap chip cpu -enable
    dap create chip.dap -chain-position chip.cpu
    target create chip.cpu cortex_m -dap chip.dap

    init
    dap info
    shutdown

    STM32F103 的输出:
    Info : SWD DPIDR 0x1ba01477
    Info : chip.cpu: hardware has 6 breakpoints, 4 watchpoints
    Info : gdb port disabled
    AP ID register 0x14770011
    Type is MEM-AP AHB
    MEM-AP BASE 0xe00ff003
    Valid ROM table present
    Component base address 0xe00ff000
    Peripheral ID 0x00000a0410
    Designer is 0x0a0, STMicroelectronics
    Part is 0x410, Unrecognized
    Component class is 0x1, ROM table
    MEMTYPE system memory present on bus
    ROMTABLE[0x0] = 0xfff0f003
    Component base address 0xe000e000
    Peripheral ID 0x04001bb000
    Designer is 0x4bb, ARM Ltd.
    Part is 0x0, Cortex-M3 SCS (System Control Space)
    Component class is 0xe, Generic IP component
    ROMTABLE[0x4] = 0xfff02003
    Component base address 0xe0001000
    Peripheral ID 0x04001bb002
    Designer is 0x4bb, ARM Ltd.
    Part is 0x2, Cortex-M3 DWT (Data Watchpoint and Trace)
    Component class is 0xe, Generic IP component
    ROMTABLE[0x8] = 0xfff03003
    Component base address 0xe0002000
    Peripheral ID 0x04000bb003
    Designer is 0x4bb, ARM Ltd.
    Part is 0x3, Cortex-M3 FPB (Flash Patch and Breakpoint)
    Component class is 0xe, Generic IP component
    ROMTABLE[0xc] = 0xfff01003
    Component base address 0xe0000000
    Peripheral ID 0x04001bb001
    Designer is 0x4bb, ARM Ltd.
    Part is 0x1, Cortex-M3 ITM (Instrumentation Trace Module)
    Component class is 0xe, Generic IP component
    ROMTABLE[0x10] = 0xfff41003
    Component base address 0xe0040000
    Peripheral ID 0x04001bb923
    Designer is 0x4bb, ARM Ltd.
    Part is 0x923, Cortex-M3 TPIU (Trace Port Interface Unit)
    Component class is 0x9, CoreSight component
    Type is 0x11, Trace Sink, Port
    ROMTABLE[0x14] = 0xfff42002
    Component not present
    ROMTABLE[0x18] = 0x0
    End of ROM table

    对于非 Cortex 芯片,您将使用 JTAG TAP IDCODE 单独从自动探测中获得良好的识别,就像在这个使用旧 STR750 的示例中一样:
    # Your JTAG adapter config
    script interface.cfg

    transport select jtag
    adapter_khz 100

    init
    shutdown
    Info : JTAG tap: auto0.tap tap/device found: 0x4f1f0041 (mfg: 0x020 (STMicroelectronics), part: 0xf1f0, ver: 0x4)

    问题2:

    如上所述,“自动探测”仅与 JTAG 相关,但您也可以通过 SWD 获得相同的功能(读取 ID 代码)。不幸的是,这对您没有帮助,因为您无法访问任一协议(protocol)!

    问题在于您使用的是 ST-Link。不管人们怎么想,这不是真正的 JTAG/SWD 适配器。是的,它同时支持 JTAG 和 SWD,但它完全隐藏了适配器固件中的协议(protocol)。它只向主机 (OpenOCD) 提供高级命令集,类型为“重置目标”、“步进目标”、“读取此内存”等。因此,ST-Link 的 OpenOCD 支持是一个丑陋的黑客,它位于目标层而不是适配器层。因此,OpenOCD 的大多数适配器、传输或 DAP 级功能根本不存在,并且 OpenOCD 意义上的自动探测与您的设置完全无关。

    对于简单的闪烁和非常基本的 GDB 调试,ST-Link 可以工作。但是对于更底层的东西,请远离 ST-Link。对于 OpenOCD 来说,这根本不是一个好匹配。

    也就是说,如果您只需要知道是否有芯片,在某些配置中,ST-Link 可能会被说服为您提供该信息,例如使用以下配置文件:
    script interface/stlink.cfg

    transport select hla_swd
    adapter_khz 100

    hla newtap chip cpu -enable
    dap create chip.dap -chain-position chip.cpu
    target create chip.cpu cortex_m -dap chip.dap

    你会得到
    Warn : UNEXPECTED idcode: 0x2ba01477

    或者
    Error: init mode failed (unable to connect to the target)

    其余问题与 ST-Link 无关,因此我假设您切换到真正的 JTAG/SWD 适配器。

    问题三:

    JTAG 自动探测以及通过 SWD 读取 DPIDR 是完全非侵入性的。一般来说,对于 Cortex-M 目标,对目标的大多数调试访问都是非侵入性的,因此您可以在目标几乎不运行的情况下读/写内存等,而不会影响它。

    JTAG 根本不定义或要求系统复位信号可用。没有它,自动探测工作正常,你应该可以使用
    reset_config none

    问题 4:

    你想完全避免启动 gdb 服务器/telnet 服务器吗?然后您可以使用以下配置禁用它们:
    gdb_port disabled
    telnet_port disabled
    tcl_port disabled

    但是,如果您只是启动 OpenOCD 来检测芯片然后将其关闭,那么暂时启动这些服务可能无论如何都不是问题。

    此外,至少 GDB 服务器仅在创建目标后才启动,这不是执行 JTAG 自动探测所必需的。

    摘要

    是的,您应该能够做您想做的事,但使用 ST-Link 可能不行。使用真正的适配器,您可以进行 JTAG 自动探测以在扫描链上打印检测到的 TAP。对于 SWD,OpenOCD 始终打印检测到的 DPIDR 寄存器(如果未找到目标,通常会中断;至少输出会有所不同)。

    连接/检测可以是完全非侵入式的,如果目标本身支持它,就像大多数 Cortex-M 那样。如果目标固件已禁用调试引脚或关闭调试逻辑,您可能需要保持或脉冲复位,具体取决于目标。

    关于embedded - 如何使用 OpenOCD ping 芯片(检测芯片是否已连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56951820/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com