跟我一起學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 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 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
配置文件和腳本按照如下目錄進行順序搜索:
- 當前工作目錄
- 命令選項
-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一直運行,工作任務結束後會自動關閉。
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=644.4. USB-JTAG/Altera USB-Blaster 兼容機
這些設備也顯示為FTDI設備,但與FT2232設備不兼容,但是它們的協議是兼容的。USB-JTAG設備通常由遵循CPLD的FT245構成,CPLD可以理解特定協議,或者使用其他硬體模擬的協議。
它們可能出現在不同的USB VID/PID下,具體取決於特定產品。若使用OpenOCD進行配置連接,可以將驅動程序配置為搜索任何VID/PID。
如下為一些產品示例:
- USB-JTAG: http://ixo-jtag.sourceforge.net/- Altera USB-Blaster: http://www.altera.com/literature/ug/ug_usb_blstr.pdf4.5. 基於 USB J-Link
SEGGER J-Link適配器有很多不同的OEM版本。它是基於微控制器的JTAG調試器的一個示例,內部使用了AT91SAM764晶元。
如下為一些產品示例:
- SEGGER J-Link: http://www.segger.com/jlink.html- Atmel SAM-ICE: http://www.atmel.com/tools/atmelsam-ice.aspx- IAR J-Link: https://item.taobao.com/item.htm?spm=a230r.1.14.27.1eac49774LE8rV&id=560873858295&ns=1&abbucket=4#detail4.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的快速入門,如有需要可以閱讀參考。
推薦閱讀:
※嵌入式冰箱真的好嗎?看完之後恍然大悟
※收藏 | 韋東山所有視頻詳細目錄介紹
※【轉】嵌入式產品開發流程
※嵌入式Linux學習規劃
※嵌入式工程師發展前景
