查看: 2856|回复: 6
收起左侧

跟我一起学OpenOCD(一)

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-1-15 13:53
  • 签到天数: 26 天

    [LV.4]

    发表于 2020-8-13 17:54:17 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    国内芯片技术交流-跟我一起学OpenOCD(一)risc-v单片机中文社区(1)

    本文目录
    • 1. 前言
      • 1.1. 什么是OpenOCD
    • 2. 安装
      • 2.1. Linux 系统
      • 2.2. Windows 系统
    • 3. 运行
      • 3.1. 简单的启动(非用户自定义)
      • 3.2. OpenOCD 在启动时做了些什么
    • 4. 附录1: OpenOCD当前支持的仿真器硬件
      • 4.1. 加密狗
      • 4.2. 独立的JTAG探测器
      • 4.3. 基于 USB FT2232
      • 4.4. USB-JTAG/Altera USB-Blaster 兼容机
      • 4.5. 基于 USB J-Link
      • 4.6. 基于 USB RLINK
      • 4.7. 基于 USB ST-LINK
      • 4.8. 基于 USB TI/Stellaris ICDI
      • 4.9. 基于 USB CMSIS-DAP
      • 4.10. 其它 USB 仿真器
      • 4.11. 基于IBM PC并行打印口
    • 5. 附录2: 关于 About Jim-Tcl

    1. 前言
    当今开发环境中,嵌入式工程师都会十分熟悉自己项目用到的调试器和调试软件,但是你真的清楚

    • 所谓的JTAG、SWD是什么?
    • 调试器又是怎样工作的?
    • 为什么每一个厂家甚至每一款芯片都需要用到不同的调试器,大家都使用JTAG协议,用一款调试器不好嘛?
    • CMSIS-DAP 又是什么鬼,和JTAG有什么不同么?

    如果你真的清楚如上几个问题,那我相信,OpenOCD你一定听说过,并且很可能已经使用过,如果你并不了解如上几个问题,想你你在读完本文后,会找到满意的答案。

    本文OpenOCD技术部分讲解大部分根据 OpenOCD User’s Guide 翻译所得,增加了自己的理解和一些演示的案例,如果英文能力好的同学可以直接阅读原文,笔者能力有限,如有问题欢迎各位侠士随时指正!

    1.1. 什么是OpenOCD
    OpenOCD(Open On-Chip Debugger)开源片上调试器,是一款开源软件,最初是由Dominic Rath同学还在大学期间发起的(2005年)项目。OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

    OpenOCD的功能是在仿真器的辅助下完成的,仿真器是能够提供调试目标的电信号的小型硬件单元。仿真器是必须的,因为调试主机(运行OpenOCD的主机)通常不具备这种电信号的直接解析功能。

    仿真器支持一个或多个传输协议,每个协议涉及不同的电信号,且使用不同的协议栈进行消息传递。市面上有很多种仿真器,并且这些仿真器的命名没有统一的规律。

    仿真器有时候会被封装成独立的加密狗,这种称为硬件接口加密狗。一些开发板上面直接集成了硬件接口加密狗,这样可以使开发板通过USB直接连到主机上进行调试。

    例如,JTAG仿真器支持JTAG协议的信号,可以用来进行TAPs和目标板子之间符合JTAG协议(IEEE 1149.1)的通讯。TAP(Test Access Port)是处理特殊指令和数据的单元。TAPs在芯片与板子之间和之内以菊花链的形式进行连接。JTAG支持调试和边界扫描。

    还有SWD仿真器,这种仿真器支持使用SWD(Serial Wire Debug)信号与一些比较新的ARM芯片进行通讯,而且还可以作为那些同时支持JTAG和SWD的芯片的仿真器。不过SWD仅支持调试,不支持边检扫描。

    对于一些芯片,还有专门的编程下载器,这些下载器仅支持擦写FLASH的功能,不支持调试和边界扫描。对于此类专用下载器,OpenOCD暂时并不支持。

    加密狗:OpenOCD目前支持多种类型的硬件加密狗:基于USB的,基于并行端口的,以及其他在内部运行OpenOCD的独立盒子。 请参见第2章[仿真器硬件],第5页。

    GDB调试:它允许ARM7(ARM7TDMI和ARM720t),ARM9(ARM920T,ARM922T,ARM926EJ-S,ARM966E-S),XScale(PXA25x,IXP42x),Cortex-M3(Stellaris LM3,ST STM32和Energy Micro EFM32)和基于Intel Quark(x10xx)的内核使用GDB协议进行调试。

    Flash编程:擦写FLASH支持外部CFI兼容NOR闪存(Intel和AMD / Spansion命令集)和几个内部闪存(LPC1700,LPC1800,LPC2000,LPC4300,AT91SAM7,AT91SAM3U,STR7x,STR9x,LM3,STM32x和EFM32)。包括各种NAND闪存控制器(LPC3180,Orion,S3C24xx等)的初步支持。

    2. 安装


    2.1. Linux 系统
    • 到OpenOCD下载官网最新软件,本文撰写时最新软件版本为0.10.0。OpenOCD:https://sourceforge.net/projects/openocd/
    • 解压后,进入openocd-0.10.0目录,右键在终端中打开,tomato@tomato-PC:~/Software/openocd-0.10.0$
    • 英文好的同学可以直接点开INSTALL这个文件,根据指导一步步安装,英文不好的童靴可以继续往下看后面几步
    • 运行 $ ./configure 命令,进行OpenOCD配置,可配置的项目可以通过 $ ./configure -h 命令查看帮助信息。 笔者的调试器是J-Link,所以还要运行如下命令进行使能 $ ./configure --enable-jlink
    • 此处注意,由于笔者使用的是deepin系统,基于Debian,使能jlink的时候系统提示configure: error: libusb-1.x or libjaylink-0.1 is required for the SEGGER J-Link Programmer,笔者选择安装libusb-1.x这个组件,使用如下命令进行安装 $ sudo apt-get install libusb-1.0.0-dev。

    • 运行 $ make 进行编译

    • 此处注意,OpenOCD可以使用gcc和clang两个编译器进行编译,但是笔者的系统默认编译器为 gcc 7.2,在编译过程中会由于报出warning而终止,到网上查了一下发现是OpenOCD的bug,后面有修改。为了保证当前顺利安装,笔者选择忽略warning,继续编译。运行 $ ./configure --disable-werror命令进行不把warning变成error的配置,并会生成相应的makefile。然后运行$ make 进行编译。

    • 运行 $ sudo make install 进行软件安装
    • 安装完成后,运行 $ openocd -V 命令,查看当前软件版本。我安装的环境当前会返回 Open On-Chip Debugger 0.10.0字样。
    如果后续想要卸载OpenOCD,可以到OpenOCD的目录下,使用 $ make uninstall 进行卸载。

    2.2. Windows 系统
    TBD

    3. 运行
    安装好OpenOCD后,需要根据你的操作系统,设置访问debug适配器的权限。

    在Linux系统上,通常涉及/etc/udev/rules.d文件夹的操作。

    OpenOCD会附带一个通用规则文件60-openocd.rules,在OpenOCD解压后文件夹的contrib 目录中。

    按照文件中d的说明提示进行操作,OpenOCD 0.10.0版本的文件提示为 # Copy this file to /etc/udev/rules.d/ 。

    Windows系统需要针对每一个不同的外设,适配复杂的驱动配置。本文没有对此进行详细说明。

    然后,可以通过不同选项来调用OpenOCD的服务。 --help选项会出现如下提示:

    bash$ openocd --help
    Open On-Chip Debugger 0.10.0
    Licensed under GNU GPL v2For bug reports, read
        http://openocd.org/doc/doxygen/bugs.htmlOpen
    On-Chip DebuggerLicensed under GNU GPL v2
    --help       | -h   display this help
    --version    | -v   display OpenOCD version
    --file       | -f   use configuration file <name>
    --search     | -s   dir to search for config files and scripts
    --debug      | -d   set debug level <0-3>
    --log_output | -l   redirect log output to file <name>
    --command    | -c   run <command>

    如果没有输入 -f 或 -c 的选项命令,OpenOCD会试图读取openocd.cfg这个配置文件。

    如果定义了不同的配置文件,需要使用-f命令。示例如下:
    openocd -f config1.cfg -f config2.cfg -f config3.cfg

    配置文件和脚本按照如下目录进行顺序搜索:

    • 当前工作目录
    • 命令选项-s后面跟随的目录地址
    • 使用 add_script_search_dir 命令定义的目录地址
    • $HOME/.openocd(非Windows)
    • OPENOCD_SCRIPTS环境变量设置
    • $pkgdatadir/site站点中的脚本
    • $pkgdatadir/scriptsOpenOCD支持的脚本库

    需注意: 配置脚本的名字和路径中,不能包含 # 这个特殊字符,该字符为Tcl命令的起始标志。

    3.1. 简单的启动(非用户自定义)
    好的情况下,仅用两个库里自带的脚本就可以启动服务并连接JTAG适配器,达到开箱即用的效果。
    不过服用这些脚本虽然能够帮助你启动功能,距离功能完善还是需要进行一些自定义配置。
    这些可以参考 [OpenOCD Project Setup] 这一章。

    如果找到了适用于 JTAG适配器或目标板子的脚本,可以通过如下几条命令连接上JTAG适配器,并启动调试功能。


    openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg

    openocd -f interface/ftdi/ADAPTER.cfg -f board/MYBOARD.cfg

    如果要进行复位信号的配置,可以使用 -c 'rreset_configtrst_and_srsteset_config'命令。

    如果一切正常,将会看到如下类似的反馈信息。

    Info : JTAG tap: lm3s.cpu tap/device found: 0x3ba00477
    (mfg: 0x23b, part: 0xba00, ver: 0x3)

    如果看到了 “ap/device found” 反馈字样,并且没有 warning信息,则证明JTAG通讯已经建立。
    这是一个里程碑步骤,为了达到这一步还可能进行更多的项目设置。

    3.2. OpenOCD 在启动时做了些什么
    OpenOCD首先处理命令行上提供的配置命令,如果没有 -c 或 -f 的命令,OpenOCD会处理名为 openocd.cfg 文件中的命令。
    可以查看[Configuration Stage]章节的介绍。在配置阶段最后,OpenOCD会使用配置好的命令参数验证JTAG扫描链,所以要确保配置正确。

    通常OpenOCD会作为server一直运行。OpenOCD的命令也可以作为提前终止配置阶段,执行其它工作(如烧写flash),此时不会作为server一直运行,工作任务结束后会自动关闭。





    上一篇:RISC-V的前世今生
    下一篇:重磅!华为成立半导体投资基金
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

      离线 

  • TA的每日心情
    奋斗
    2021-1-15 13:53
  • 签到天数: 26 天

    [LV.4]

     楼主| 发表于 2020-8-13 17:54:45 | 显示全部楼层
    4. 附录1: OpenOCD当前支持的仿真器硬件


    4.1. 加密狗
    如果选择使用加密狗,如下几点是需要考虑的:

    1. Transport: 是否支持所需要的通讯协议?OpenOCD主要关注的是JTAG协议。
    2. Voltage: 目标是哪种电压,1.8, 2.8, 3.3, 5V?加密狗是否支持这些?是否需要转换器?
    3. Pinout: 目标板的引脚定义?加密狗是否支持?是否需要转换器?
    4. Connection: 计算机是否有所需要的USB、并行端口、网口?
    5. RTCK: 是否期望将其使用到具有RTCK功能的芯片和板子上(自适应时钟)?

    4.2. 独立的JTAG探测器
    Ultimate Solutions的ZY1000在技术上不是加密狗,而是一个独立的JTAG探测器,与大多数加密狗不同,它不需要在开发人员的主机上运行任何驱动程序。 使用DHCP或静态IP分配安装在网络上后,用户可以从任何主机本地或远程访问ZY1000探针,并可访问分配给探针的IP地址。

    ZY1000提供直观的Web界面,可直接访问OpenOCD调试器。

    用户还可以直接在ZY1000上运行GDBSERVER,以充分利用GCC和GDB来调试目标上运行的嵌入式Linux或NetBSD的任何分发。
    ZY1000支持RTCK和RCLK或自适应时钟,并具有内置继电器,可远程为目标供电。 有关更多信息,请访问: ZY1000


    4.3. 基于 USB FT2232

    市场上有许多USB JTAG加密狗,其中许多基于来自“Future Technology Devices International”(FTDI)的芯片,称为FTDI FT2232, 这是一个USB全速(12 Mbps)芯片。可以访问FT2232查看更所信息。 2009年第二季度,FTDI芯片的USB高速(480 Mbps)版本开始在JTAG适配器中推出。

    2012年左右,出现了一种新的变种 - FT232H--这是FT2232H的单通道版本。
    (使用高速FT2232H或FT232H芯片的适配器可能支持自适应时钟RTCK。)

    FT2232芯片非常灵活,可以支持其他一些传输选项,例如SWD协议,或用于下载某些芯片的特殊SPI协议。
    FT2232有两个信道,一个可用于UART适配器,另一个用于仿真器适配器。

    此外,一些开发板集成了FT2232芯片,可用作内置低成本调试适配器和USB转串口解决方案。

    如下为一些产品列举:
    - usbjtag: http://elk.informatik.fh-augsburg.de/hhweb/doc/openocd/usbjtag/usbjtag.html
    - jtagkey: http://www.amontec.com/jtagkey.shtml
    - jtagkey2: http://www.amontec.com/jtagkey2.shtml
    - oocdlink: http://www.oocdlink.com
    - signalyzer: http://www.signalyzer.com
    - Stellaris Eval Boards: http://www.ti.com
    - TI/Luminary ICDI: http://www.ti.com
    - olimex-jtag: http://www.olimex.com
    - Flyswatter/Flyswatter2: http://www.tincantools.com
    - turtelizer2: http://www.ethernut.de
    - comstick: http://www.hitex.com/index.php?id=383
    - stm32stick: http://www.hitex.com/stm32-stick
    - axm0432 jtag: http://www.axman.com
    - cortino: http://www.hitex.com/index.php?id=cortino
    - dlp-usb1232h: http://www.dlpdesign.com/usb/usb1232h.shtml
    - digilent-hs1: http://www.digilentinc.com/Products/Detail.cfm?Prod=JTAG-HS1
    - opendous: http://code.google.com/p/opendous/wiki/JTAG
    - JTAG-lock-pick Tiny 2: http://www.distortec.com/jtag-lock-pick-tiny-2
    - GW16042: https://shop.gateworks.com/index.php?route=product/product&path=70_80&product_id=64


    4.4. USB-JTAG/Altera USB-Blaster 兼容机

    这些设备也显示为FTDI设备,但与FT2232设备不兼容,但是它们的协议是兼容的。USB-JTAG设备通常由遵循CPLD的FT245构成,CPLD可以理解特定协议,或者使用其他硬件模拟的协议。

    它们可能出现在不同的USB VID/PID下,具体取决于特定产品。若使用OpenOCD进行配置连接,可以将驱动程序配置为搜索任何VID/PID。
    如下为一些产品示例:

    4.5. 基于 USB J-Link
    SEGGER J-Link适配器有很多不同的OEM版本。
    它是基于微控制器的JTAG调试器的一个示例,内部使用了AT91SAM764芯片。

    如下为一些产品示例:


    4.6. 基于 USB RLINK
    Raisonance有一个名为RLink的适配器。它在STM32 Primer上,永久性地连接到JTAG线。
    它也在STM32 Primer2上,但是Primer2上的连接的是SWD,而不是JTAG。

    • STM32 Primer: http://www.stm32circle.com/resources/stm32primer.php
    • STM32 Primer2: http://www.stm32circle.com/resources/stm32primer2.php

    4.7. 基于 USB ST-LINK
    ST(意法半导体)有一个名为ST-LINK的调试器。仅适用于ST 芯片,尤其是STM32和STM8。

    • ST-LINK: http://www.st.com/internet/evalboard/product/219866.jsp
    • ST-LINK/V2: http://www.st.com/internet/evalboard/product/251168.jsp

    4.8. 基于 USB TI/Stellaris ICDI
    德州仪器有一个称为ICDI的适配器。这与安装在评估板上的基于FTDI的调试器不同。
    ICDI适用于Stellaris LaunchPad系列。

    4.9. 基于 USB CMSIS-DAP
    ARM发布了一个名为CMSIS-DAP的接口标准,
    简化了将调试器连接到基于ARM Cortex的目标板上,具体可以到官网查看CMSIS-DAP

    4.10. 其它 USB 仿真器
    • USBprog: http://shop.embedded-projects.net/
    • USB - Presto: http://tools.asix.net/prg_presto.htm
    • Versaloon-Link: http://www.versaloon.com
    • ARM-JTAG-EW: http://www.olimex.com/dev/arm-jtag-ew.html
    • Buspirate: http://dangerousprototypes.com/bus-pirate-manual/
    • opendous: http://code.google.com/p/opendous-jtag/
    • estick: http://code.google.com/p/estick-jtag/
    • Keil ULINK v1: http://www.keil.com/ulink1/
    • TI XDS110 Debug Probe: http://processors.wiki.ti.com/index.php/XDS110

    4.11. 基于IBM PC并行打印口
    有两条著名的“并口JTAG”线束,分别是Xilinx DLC5和Macraigor Wiggler。市场上有许多克隆和变体。
    并行端口变得越来越不常见,因此如果有选择,应该避免使用这些调试器,而选择基于USB的端口。

    • Wiggler: http://www.macraigor.com/wiggler.htm
    • fla arm-jtag: https://www.olimex.com/Products/ARM/JTAG/ARM-JTAG/


    5. 附录2: 关于 About Jim-Tcl

    OpenOCD使用了一种名为 Jim-TCL 的小型 TCL解析器。这种编程语言提供了简单和可扩展的命令解析器。
    本本提供的所有命令都是Jim-Tcl的扩展。 您可以将它们用作简单的命令,而无需了解有关Tcl的任何内容。

    或者,您可以使用它们编写Tcl程序。以在网站http://jim.tcl.tk 上了解更多相关信息。

    • Jim 与 Tcl
      • Jim-Tcl是着名的Tcl语言的精简版本。 Jim-Tcl的功能要少得多。 Jim-Tcl是几十个.C文件和.H文件,并实现了基本的Tcl命令集。 相反:Tcl 8.6是一个包含1540多个文件,总共4.2 MB 的zip文件。

    • 缺少的功能
      • OpenOCD的做法是仅添加必要的Tcl功能。所以在OpenOCD中还有大量的Jim-Tcl可选功能都没有添加。

    • 脚本
      • OpenOCD 的配置脚本是 Jim-Tcl 的脚本。如今,OpenOCD的命令解析器融合了较新的Jim-Tcl命令,和较旧的原始命令。

    • 命令
      • 在OpenOCD的telnet命令行中(或者通过GDB监视器中的命令行),每次可以键入一个Tcl for()循环,设置变量等操作。本文提到了一些从startup.tcl文件到启动服务的命令,这些命令可以通过Tcl脚本的形式进行实现。

    • 变更记录
      • Jim-Tcl在2008年春季被引入到OpenOCD中。到2010年秋季,在0.5版本发布前,OpenOCD使用了Jim-Tcl作为Git的子模块,这样极大的简化了Jim—Tcl的升级。

    • Tcl快速入门
      • 本文第TBD章会进行Tcl的快速入门,如有需要可以阅读参考。
    本篇完

    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    奋斗
    2022-2-18 00:56
  • 签到天数: 16 天

    [LV.4]

    发表于 2020-8-14 13:48:15 | 显示全部楼层
    这个我知道,论坛有个大牛---JLINKv10
    这位高人专门研究这个嵌入式调试器的。
    他发过类似的帖子

    点评

    老哥,是在呼唤我吗? 又有坛友在折腾嵌入式degugge工具了? 我现在都是跟进Segger的, OpenOCD一般在开源芯片用的多点,不过我也用过调试STM32,Kinetis K60这些芯片  详情 回复 发表于 2020-8-14 14:24
    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    飞起
    2022-10-5 00:04
  • 签到天数: 2 天

    [LV.1]

    发表于 2020-8-14 14:24:18 | 显示全部楼层
    孔明 发表于 2020-8-14 13:48
    这个我知道,论坛有个大牛---JLINKv10
    这位高人专门研究这个嵌入式调试器的。
    他发过类似的帖子

    老哥,是在呼唤我吗?
    又有坛友在折腾嵌入式Debugger工具了?

    我现在都是跟进Segger的,
    OpenOCD一般在开源芯片用的多点,不过我也用过调试STM32,Kinetis K60这些芯片
    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    飞起
    2022-10-5 00:04
  • 签到天数: 2 天

    [LV.1]

    发表于 2020-8-14 14:26:19 | 显示全部楼层
    好像RISC-V目前是采用的OpenOCD,我看那个芯来科技的 IDE就是这个

    点评

    你们都这么厉害,带带我啊  详情 回复 发表于 2020-8-14 14:57
    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    奋斗
    2021-1-15 13:53
  • 签到天数: 26 天

    [LV.4]

     楼主| 发表于 2020-8-14 14:57:45 | 显示全部楼层
    JLINKv10 发表于 2020-8-14 14:26
    好像RISC-V目前是采用的OpenOCD,我看那个芯来科技的 IDE就是这个

    你们都这么厉害,带带我啊国内芯片技术交流-跟我一起学OpenOCD(一)risc-v单片机中文社区(2)

    点评

    还不明白OpenOCD的话,顶我的帖子 https://www.risc-v1.com/forum.php?mod=viewthread&tid=1095&page=1&extra=#pid2052  详情 回复 发表于 2020-9-12 15:02
    全球首家只专注于RISC-V单片机行业应用的中文网站

      离线 

  • TA的每日心情
    飞起
    2022-10-5 00:04
  • 签到天数: 2 天

    [LV.1]

    发表于 2020-9-12 15:02:37 | 显示全部楼层
    新ちゃん 发表于 2020-8-14 14:57
    你们都这么厉害,带带我啊

    还不明白OpenOCD的话,顶我的帖子


    https://www.risc-v1.com/forum.ph ... &extra=#pid2052
    全球首家只专注于RISC-V单片机行业应用的中文网站
    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-3-29 22:25 , Processed in 0.652579 second(s), 63 queries .

    快速回复 返回顶部 返回列表