跟我一起學OpenOCD(一)

跟我一起學OpenOCD(一)

  • 跟我一起學OpenOCD(一)
  • 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 系統

  1. 到OpenOCD下載官網最新軟體,本文撰寫時最新軟體版本為0.10.0。OpenOCD:sourceforge.net/project
  2. 解壓後,進入openocd-0.10.0目錄,右鍵在終端中打開,tomato@tomato-PC:~/Software/openocd-0.10.0$
  3. 英文好的同學可以直接點開INSTALL這個文件,根據指導一步步安裝,英文不好的童靴可以繼續往下看後面幾步
  4. 運行 $ ./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

  1. 運行 $ make 進行編譯
  • 此處注意,OpenOCD可以使用gcc和clang兩個編譯器進行編譯,但是筆者的系統默認編譯器為 gcc 7.2,在編譯過程中會由於報出warning而終止,到網上查了一下發現是OpenOCD的bug,後面有修改。為了保證當前順利安裝,筆者選擇忽略warning,繼續編譯。運行 $ ./configure --disable-werror命令進行不把warning變成error的配置,並會生成相應的makefile。然後運行$ make 進行編譯。

  1. 運行 $ sudo make install 進行軟體安裝
  2. 安裝完成後,運行 $ 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 v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Open On-Chip Debugger
Licensed 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

配置文件和腳本按照如下目錄進行順序搜索:

  1. 當前工作目錄
  2. 命令選項-s後面跟隨的目錄地址
  3. 使用 add_script_search_dir 命令定義的目錄地址
  4. $HOME/.openocd(非Windows)
  5. OPENOCD_SCRIPTS環境變數設置
  6. $pkgdatadir/site站點中的腳本
  7. $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一直運行,工作任務結束後會自動關閉。


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: elk.informatik.fh-augsburg.de

- jtagkey: amontec.com/jtagkey.sht

- jtagkey2: amontec.com/jtagkey2.sh

- oocdlink: oocdlink.com

- signalyzer: signalyzer.com

- Stellaris Eval Boards: ti.com

- TI/Luminary ICDI: ti.com

- olimex-jtag: olimex.com

- Flyswatter/Flyswatter2: tincantools.com

- turtelizer2: ethernut.de

- comstick: hitex.com/index.php?

- stm32stick: hitex.com/stm32-stick

- axm0432 jtag: axman.com

- cortino: hitex.com/index.php?

- dlp-usb1232h: dlpdesign.com/usb/usb12

- digilent-hs1: digilentinc.com/Product

- opendous: code.google.com/p/opend

- JTAG-lock-pick Tiny 2: distortec.com/jtag-lock

- GW16042: shop.gateworks.com/inde

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

這些設備也顯示為FTDI設備,但與FT2232設備不兼容,但是它們的協議是兼容的。USB-JTAG設備通常由遵循CPLD的FT245構成,CPLD可以理解特定協議,或者使用其他硬體模擬的協議。

它們可能出現在不同的USB VID/PID下,具體取決於特定產品。若使用OpenOCD進行配置連接,可以將驅動程序配置為搜索任何VID/PID。

如下為一些產品示例:

- USB-JTAG: ixo-jtag.sourceforge.net

- Altera USB-Blaster: altera.com/literature/u

4.5. 基於 USB J-Link

SEGGER J-Link適配器有很多不同的OEM版本。它是基於微控制器的JTAG調試器的一個示例,內部使用了AT91SAM764晶元。

如下為一些產品示例:

- SEGGER J-Link: segger.com/jlink.html

- Atmel SAM-ICE: atmel.com/tools/atmelsa

- IAR J-Link: item.taobao.com/item.ht

4.6. 基於 USB RLINK

Raisonance有一個名為RLink的適配器。它在STM32 Primer上,永久性地連接到JTAG線。它也在STM32 Primer2上,但是Primer2上的連接的是SWD,而不是JTAG。

  • STM32 Primer: stm32circle.com/resourc
  • STM32 Primer2: stm32circle.com/resourc

4.7. 基於 USB ST-LINK

ST(意法半導體)有一個名為ST-LINK的調試器。僅適用於ST 晶元,尤其是STM32和STM8。

  • ST-LINK: st.com/internet/evalboa
  • ST-LINK/V2: st.com/internet/evalboa

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: shop.embedded-projects.net
  • USB - Presto: tools.asix.net/prg_pres
  • Versaloon-Link: versaloon.com
  • ARM-JTAG-EW: olimex.com/dev/arm-jtag
  • Buspirate: dangerousprototypes.com
  • opendous: code.google.com/p/opend
  • estick: code.google.com/p/estic
  • Keil ULINK v1: keil.com/ulink1/
  • TI XDS110 Debug Probe: processors.wiki.ti.com/

4.11. 基於IBM PC並行列印口

有兩條著名的「並口JTAG」線束,分別是Xilinx DLC5和Macraigor Wiggler。市場上有許多克隆和變體。

並行埠變得越來越不常見,因此如果有選擇,應該避免使用這些調試器,而選擇基於USB的埠。

  • Wiggler: macraigor.com/wiggler.h
  • fla arm-jtag: olimex.com/Products/ARM

5. 附錄2: 關於 About Jim-Tcl

OpenOCD使用了一種名為 Jim-TCL 的小型 TCL解析器。這種編程語言提供了簡單和可擴展的命令解析器。

本本提供的所有命令都是Jim-Tcl的擴展。 您可以將它們用作簡單的命令,而無需了解有關Tcl的任何內容。 或者,您可以使用它們編寫Tcl程序。

以在網站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的快速入門,如有需要可以閱讀參考。

推薦閱讀:

嵌入式冰箱真的好嗎?看完之後恍然大悟
收藏 | 韋東山所有視頻詳細目錄介紹
【轉】嵌入式產品開發流程
嵌入式Linux學習規劃
嵌入式工程師發展前景

TAG:嵌入式開發 | 汽車電子 |