|
- \input texinfo @c -*-texinfo-*-
- @c %**start of header
- @setfilename openocd.info
- @settitle OpenOCD User's Guide
- @dircategory Development
- @direntry
- * OpenOCD: (openocd). OpenOCD User's Guide
- @end direntry
- @paragraphindent 0
- @c %**end of header
-
- @include version.texi
-
- @copying
-
- This User's Guide documents
- release @value{VERSION},
- dated @value{UPDATED},
- of the Open On-Chip Debugger (OpenOCD).
-
- @itemize @bullet
- @item Copyright @copyright{} 2008 The OpenOCD Project
- @item Copyright @copyright{} 2007-2008 Spencer Oliver @email{spen@@spen-soft.co.uk}
- @item Copyright @copyright{} 2008-2010 Oyvind Harboe @email{oyvind.harboe@@zylin.com}
- @item Copyright @copyright{} 2008 Duane Ellis @email{openocd@@duaneellis.com}
- @item Copyright @copyright{} 2009-2010 David Brownell
- @end itemize
-
- @quotation
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
- copy of the license is included in the section entitled ``GNU Free
- Documentation License''.
- @end quotation
- @end copying
-
- @titlepage
- @titlefont{@emph{Open On-Chip Debugger:}}
- @sp 1
- @title OpenOCD User's Guide
- @subtitle for release @value{VERSION}
- @subtitle @value{UPDATED}
-
- @page
- @vskip 0pt plus 1filll
- @insertcopying
- @end titlepage
-
- @summarycontents
- @contents
-
- @ifnottex
- @node Top
- @top OpenOCD User's Guide
-
- @insertcopying
- @end ifnottex
-
- @menu
- * About:: About OpenOCD
- * Developers:: OpenOCD Developer Resources
- * Debug Adapter Hardware:: Debug Adapter Hardware
- * About Jim-Tcl:: About Jim-Tcl
- * Running:: Running OpenOCD
- * OpenOCD Project Setup:: OpenOCD Project Setup
- * Config File Guidelines:: Config File Guidelines
- * Server Configuration:: Server Configuration
- * Debug Adapter Configuration:: Debug Adapter Configuration
- * Reset Configuration:: Reset Configuration
- * TAP Declaration:: TAP Declaration
- * CPU Configuration:: CPU Configuration
- * Flash Commands:: Flash Commands
- * Flash Programming:: Flash Programming
- * PLD/FPGA Commands:: PLD/FPGA Commands
- * General Commands:: General Commands
- * Architecture and Core Commands:: Architecture and Core Commands
- * JTAG Commands:: JTAG Commands
- * Boundary Scan Commands:: Boundary Scan Commands
- * Utility Commands:: Utility Commands
- * GDB and OpenOCD:: Using GDB and OpenOCD
- * Tcl Scripting API:: Tcl Scripting API
- * FAQ:: Frequently Asked Questions
- * Tcl Crash Course:: Tcl Crash Course
- * License:: GNU Free Documentation License
-
- @comment DO NOT use the plain word ``Index'', reason: CYGWIN filename
- @comment case issue with ``Index.html'' and ``index.html''
- @comment Occurs when creating ``--html --no-split'' output
- @comment This fix is based on: http://sourceware.org/ml/binutils/2006-05/msg00215.html
- * OpenOCD Concept Index:: Concept Index
- * Command and Driver Index:: Command and Driver Index
- @end menu
-
- @node About
- @unnumbered About
- @cindex about
-
- OpenOCD was created by Dominic Rath as part of a 2005 diploma thesis written
- at the University of Applied Sciences Augsburg (@uref{http://www.hs-augsburg.de}).
- Since that time, the project has grown into an active open-source project,
- supported by a diverse community of software and hardware developers from
- around the world.
-
- @section What is OpenOCD?
- @cindex TAP
- @cindex JTAG
-
- The Open On-Chip Debugger (OpenOCD) aims to provide debugging,
- in-system programming and boundary-scan testing for embedded target
- devices.
-
- It does so with the assistance of a @dfn{debug adapter}, which is
- a small hardware module which helps provide the right kind of
- electrical signaling to the target being debugged. These are
- required since the debug host (on which OpenOCD runs) won't
- usually have native support for such signaling, or the connector
- needed to hook up to the target.
-
- Such debug adapters support one or more @dfn{transport} protocols,
- each of which involves different electrical signaling (and uses
- different messaging protocols on top of that signaling). There
- are many types of debug adapter, and little uniformity in what
- they are called. (There are also product naming differences.)
-
- These adapters are sometimes packaged as discrete dongles, which
- may generically be called @dfn{hardware interface dongles}.
- Some development boards also integrate them directly, which may
- let the development board connect directly to the debug
- host over USB (and sometimes also to power it over USB).
-
- For example, a @dfn{JTAG Adapter} supports JTAG
- signaling, and is used to communicate
- with JTAG (IEEE 1149.1) compliant TAPs on your target board.
- A @dfn{TAP} is a ``Test Access Port'', a module which processes
- special instructions and data. TAPs are daisy-chained within and
- between chips and boards. JTAG supports debugging and boundary
- scan operations.
-
- There are also @dfn{SWD Adapters} that support Serial Wire Debug (SWD)
- signaling to communicate with some newer ARM cores, as well as debug
- adapters which support both JTAG and SWD transports. SWD supports only
- debugging, whereas JTAG also supports boundary scan operations.
-
- For some chips, there are also @dfn{Programming Adapters} supporting
- special transports used only to write code to flash memory, without
- support for on-chip debugging or boundary scan.
- (At this writing, OpenOCD does not support such non-debug adapters.)
-
-
- @b{Dongles:} OpenOCD currently supports many types of hardware dongles:
- USB-based, parallel port-based, and other standalone boxes that run
- OpenOCD internally. @xref{Debug Adapter Hardware}.
-
- @b{GDB Debug:} It allows ARM7 (ARM7TDMI and ARM720t), ARM9 (ARM920T,
- ARM922T, ARM926EJ--S, ARM966E--S), XScale (PXA25x, IXP42x), Cortex-M3
- (Stellaris LM3, STMicroelectronics STM32 and Energy Micro EFM32) and
- Intel Quark (x10xx) based cores to be debugged via the GDB protocol.
-
- @b{Flash Programming:} Flash writing is supported for external
- CFI-compatible NOR flashes (Intel and AMD/Spansion command set) and several
- internal flashes (LPC1700, LPC1800, LPC2000, LPC4300, AT91SAM7, AT91SAM3U,
- STR7x, STR9x, LM3, STM32x and EFM32). Preliminary support for various NAND flash
- controllers (LPC3180, Orion, S3C24xx, more) is included.
-
- @section OpenOCD Web Site
-
- The OpenOCD web site provides the latest public news from the community:
-
- @uref{http://openocd.org/}
-
- @section Latest User's Guide:
-
- The user's guide you are now reading may not be the latest one
- available. A version for more recent code may be available.
- Its HTML form is published regularly at:
-
- @uref{http://openocd.org/doc/html/index.html}
-
- PDF form is likewise published at:
-
- @uref{http://openocd.org/doc/pdf/openocd.pdf}
-
- @section OpenOCD User's Forum
-
- There is an OpenOCD forum (phpBB) hosted by SparkFun,
- which might be helpful to you. Note that if you want
- anything to come to the attention of developers, you
- should post it to the OpenOCD Developer Mailing List
- instead of this forum.
-
- @uref{http://forum.sparkfun.com/viewforum.php?f=18}
-
- @section OpenOCD User's Mailing List
-
- The OpenOCD User Mailing List provides the primary means of
- communication between users:
-
- @uref{https://lists.sourceforge.net/mailman/listinfo/openocd-user}
-
- @section OpenOCD IRC
-
- Support can also be found on irc:
- @uref{irc://irc.libera.chat/openocd}
-
- @node Developers
- @chapter OpenOCD Developer Resources
- @cindex developers
-
- If you are interested in improving the state of OpenOCD's debugging and
- testing support, new contributions will be welcome. Motivated developers
- can produce new target, flash or interface drivers, improve the
- documentation, as well as more conventional bug fixes and enhancements.
-
- The resources in this chapter are available for developers wishing to explore
- or expand the OpenOCD source code.
-
- @section OpenOCD Git Repository
-
- During the 0.3.x release cycle, OpenOCD switched from Subversion to
- a Git repository hosted at SourceForge. The repository URL is:
-
- @uref{git://git.code.sf.net/p/openocd/code}
-
- or via http
-
- @uref{http://git.code.sf.net/p/openocd/code}
-
- You may prefer to use a mirror and the HTTP protocol:
-
- @uref{http://repo.or.cz/r/openocd.git}
-
- With standard Git tools, use @command{git clone} to initialize
- a local repository, and @command{git pull} to update it.
- There are also gitweb pages letting you browse the repository
- with a web browser, or download arbitrary snapshots without
- needing a Git client:
-
- @uref{http://repo.or.cz/w/openocd.git}
-
- The @file{README} file contains the instructions for building the project
- from the repository or a snapshot.
-
- Developers that want to contribute patches to the OpenOCD system are
- @b{strongly} encouraged to work against mainline.
- Patches created against older versions may require additional
- work from their submitter in order to be updated for newer releases.
-
- @section Doxygen Developer Manual
-
- During the 0.2.x release cycle, the OpenOCD project began
- providing a Doxygen reference manual. This document contains more
- technical information about the software internals, development
- processes, and similar documentation:
-
- @uref{http://openocd.org/doc/doxygen/html/index.html}
-
- This document is a work-in-progress, but contributions would be welcome
- to fill in the gaps. All of the source files are provided in-tree,
- listed in the Doxyfile configuration at the top of the source tree.
-
- @section Gerrit Review System
-
- All changes in the OpenOCD Git repository go through the web-based Gerrit
- Code Review System:
-
- @uref{http://openocd.zylin.com/}
-
- After a one-time registration and repository setup, anyone can push commits
- from their local Git repository directly into Gerrit.
- All users and developers are encouraged to review, test, discuss and vote
- for changes in Gerrit. The feedback provides the basis for a maintainer to
- eventually submit the change to the main Git repository.
-
- The @file{HACKING} file, also available as the Patch Guide in the Doxygen
- Developer Manual, contains basic information about how to connect a
- repository to Gerrit, prepare and push patches. Patch authors are expected to
- maintain their changes while they're in Gerrit, respond to feedback and if
- necessary rework and push improved versions of the change.
-
- @section OpenOCD Developer Mailing List
-
- The OpenOCD Developer Mailing List provides the primary means of
- communication between developers:
-
- @uref{https://lists.sourceforge.net/mailman/listinfo/openocd-devel}
-
- @section OpenOCD Bug Tracker
-
- The OpenOCD Bug Tracker is hosted on SourceForge:
-
- @uref{http://bugs.openocd.org/}
-
-
- @node Debug Adapter Hardware
- @chapter Debug Adapter Hardware
- @cindex dongles
- @cindex FTDI
- @cindex wiggler
- @cindex printer port
- @cindex USB Adapter
- @cindex RTCK
-
- Defined: @b{dongle}: A small device that plugs into a computer and serves as
- an adapter .... [snip]
-
- In the OpenOCD case, this generally refers to @b{a small adapter} that
- attaches to your computer via USB or the parallel port.
-
-
- @section Choosing a Dongle
-
- There are several things you should keep in mind when choosing a dongle.
-
- @enumerate
- @item @b{Transport} Does it support the kind of communication that you need?
- OpenOCD focuses mostly on JTAG. Your version may also support
- other ways to communicate with target devices.
- @item @b{Voltage} What voltage is your target - 1.8, 2.8, 3.3, or 5V?
- Does your dongle support it? You might need a level converter.
- @item @b{Pinout} What pinout does your target board use?
- Does your dongle support it? You may be able to use jumper
- wires, or an "octopus" connector, to convert pinouts.
- @item @b{Connection} Does your computer have the USB, parallel, or
- Ethernet port needed?
- @item @b{RTCK} Do you expect to use it with ARM chips and boards with
- RTCK support (also known as ``adaptive clocking'')?
- @end enumerate
-
- @section USB FT2232 Based
-
- There are many USB JTAG dongles on the market, many of them based
- on a chip from ``Future Technology Devices International'' (FTDI)
- known as the FTDI FT2232; this is a USB full speed (12 Mbps) chip.
- See: @url{http://www.ftdichip.com} for more information.
- In summer 2009, USB high speed (480 Mbps) versions of these FTDI
- chips started to become available in JTAG adapters. Around 2012, a new
- variant appeared - FT232H - this is a single-channel version of FT2232H.
- (Adapters using those high speed FT2232H or FT232H chips may support adaptive
- clocking.)
-
- The FT2232 chips are flexible enough to support some other
- transport options, such as SWD or the SPI variants used to
- program some chips. They have two communications channels,
- and one can be used for a UART adapter at the same time the
- other one is used to provide a debug adapter.
-
- Also, some development boards integrate an FT2232 chip to serve as
- a built-in low-cost debug adapter and USB-to-serial solution.
-
- @itemize @bullet
- @item @b{usbjtag}
- @* Link @url{http://elk.informatik.fh-augsburg.de/hhweb/doc/openocd/usbjtag/usbjtag.html}
- @item @b{jtagkey}
- @* See: @url{http://www.amontec.com/jtagkey.shtml}
- @item @b{jtagkey2}
- @* See: @url{http://www.amontec.com/jtagkey2.shtml}
- @item @b{oocdlink}
- @* See: @url{http://www.oocdlink.com} By Joern Kaipf
- @item @b{signalyzer}
- @* See: @url{http://www.signalyzer.com}
- @item @b{Stellaris Eval Boards}
- @* See: @url{http://www.ti.com} - The Stellaris eval boards
- bundle FT2232-based JTAG and SWD support, which can be used to debug
- the Stellaris chips. Using separate JTAG adapters is optional.
- These boards can also be used in a "pass through" mode as JTAG adapters
- to other target boards, disabling the Stellaris chip.
- @item @b{TI/Luminary ICDI}
- @* See: @url{http://www.ti.com} - TI/Luminary In-Circuit Debug
- Interface (ICDI) Boards are included in Stellaris LM3S9B9x
- Evaluation Kits. Like the non-detachable FT2232 support on the other
- Stellaris eval boards, they can be used to debug other target boards.
- @item @b{olimex-jtag}
- @* See: @url{http://www.olimex.com}
- @item @b{Flyswatter/Flyswatter2}
- @* See: @url{http://www.tincantools.com}
- @item @b{turtelizer2}
- @* See:
- @uref{http://www.ethernut.de/en/hardware/turtelizer/index.html, Turtelizer 2}, or
- @url{http://www.ethernut.de}
- @item @b{comstick}
- @* Link: @url{http://www.hitex.com/index.php?id=383}
- @item @b{stm32stick}
- @* Link @url{http://www.hitex.com/stm32-stick}
- @item @b{axm0432_jtag}
- @* Axiom AXM-0432 Link @url{http://www.axman.com} - NOTE: This JTAG does not appear
- to be available anymore as of April 2012.
- @item @b{cortino}
- @* Link @url{http://www.hitex.com/index.php?id=cortino}
- @item @b{dlp-usb1232h}
- @* Link @url{http://www.dlpdesign.com/usb/usb1232h.shtml}
- @item @b{digilent-hs1}
- @* Link @url{http://www.digilentinc.com/Products/Detail.cfm?Prod=JTAG-HS1}
- @item @b{opendous}
- @* Link @url{http://code.google.com/p/opendous/wiki/JTAG} FT2232H-based
- (OpenHardware).
- @item @b{JTAG-lock-pick Tiny 2}
- @* Link @url{http://www.distortec.com/jtag-lock-pick-tiny-2} FT232H-based
-
- @item @b{GW16042}
- @* Link: @url{http://shop.gateworks.com/index.php?route=product/product&path=70_80&product_id=64}
- FT2232H-based
-
- @end itemize
- @section USB-JTAG / Altera USB-Blaster compatibles
-
- These devices also show up as FTDI devices, but are not
- protocol-compatible with the FT2232 devices. They are, however,
- protocol-compatible among themselves. USB-JTAG devices typically consist
- of a FT245 followed by a CPLD that understands a particular protocol,
- or emulates this protocol using some other hardware.
-
- They may appear under different USB VID/PID depending on the particular
- product. The driver can be configured to search for any VID/PID pair
- (see the section on driver commands).
-
- @itemize
- @item @b{USB-JTAG} Kolja Waschk's USB Blaster-compatible adapter
- @* Link: @url{http://ixo-jtag.sourceforge.net/}
- @item @b{Altera USB-Blaster}
- @* Link: @url{http://www.altera.com/literature/ug/ug_usb_blstr.pdf}
- @end itemize
-
- @section USB J-Link based
- There are several OEM versions of the SEGGER @b{J-Link} adapter. It is
- an example of a microcontroller based JTAG adapter, it uses an
- AT91SAM764 internally.
-
- @itemize @bullet
- @item @b{SEGGER J-Link}
- @* Link: @url{http://www.segger.com/jlink.html}
- @item @b{Atmel SAM-ICE} (Only works with Atmel chips!)
- @* Link: @url{http://www.atmel.com/tools/atmelsam-ice.aspx}
- @item @b{IAR J-Link}
- @end itemize
-
- @section USB RLINK based
- Raisonance has an adapter called @b{RLink}. It exists in a stripped-down form on the STM32 Primer,
- permanently attached to the JTAG lines. It also exists on the STM32 Primer2, but that is wired for
- SWD and not JTAG, thus not supported.
-
- @itemize @bullet
- @item @b{Raisonance RLink}
- @* Link: @url{http://www.mcu-raisonance.com/~rlink-debugger-programmer__@/microcontrollers__tool~tool__T018:4cn9ziz4bnx6.html}
- @item @b{STM32 Primer}
- @* Link: @url{http://www.stm32circle.com/resources/stm32primer.php}
- @item @b{STM32 Primer2}
- @* Link: @url{http://www.stm32circle.com/resources/stm32primer2.php}
- @end itemize
-
- @section USB ST-LINK based
- STMicroelectronics has an adapter called @b{ST-LINK}.
- They only work with STMicroelectronics chips, notably STM32 and STM8.
-
- @itemize @bullet
- @item @b{ST-LINK}
- @* This is available standalone and as part of some kits, eg. STM32VLDISCOVERY.
- @* Link: @url{http://www.st.com/internet/evalboard/product/219866.jsp}
- @item @b{ST-LINK/V2}
- @* This is available standalone and as part of some kits, eg. STM32F4DISCOVERY.
- @* Link: @url{http://www.st.com/internet/evalboard/product/251168.jsp}
- @item @b{STLINK-V3}
- @* This is available standalone and as part of some kits.
- @* Link: @url{http://www.st.com/stlink-v3}
- @end itemize
-
- For info the original ST-LINK enumerates using the mass storage usb class; however,
- its implementation is completely broken. The result is this causes issues under Linux.
- The simplest solution is to get Linux to ignore the ST-LINK using one of the following methods:
- @itemize @bullet
- @item modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i
- @item add "options usb-storage quirks=483:3744:i" to /etc/modprobe.conf
- @end itemize
-
- @section USB TI/Stellaris ICDI based
- Texas Instruments has an adapter called @b{ICDI}.
- It is not to be confused with the FTDI based adapters that were originally fitted to their
- evaluation boards. This is the adapter fitted to the Stellaris LaunchPad.
-
- @section USB Nuvoton Nu-Link
- Nuvoton has an adapter called @b{Nu-Link}.
- It is available either as stand-alone dongle and embedded on development boards.
- It supports SWD, serial port bridge and mass storage for firmware update.
- Both Nu-Link v1 and v2 are supported.
-
- @section USB CMSIS-DAP based
- ARM has released a interface standard called CMSIS-DAP that simplifies connecting
- debuggers to ARM Cortex based targets @url{http://www.keil.com/support/man/docs/dapdebug/dapdebug_introduction.htm}.
-
- @section USB Other
- @itemize @bullet
- @item @b{USBprog}
- @* Link: @url{http://shop.embedded-projects.net/} - which uses an Atmel MEGA32 and a UBN9604
-
- @item @b{USB - Presto}
- @* Link: @url{http://tools.asix.net/prg_presto.htm}
-
- @item @b{Versaloon-Link}
- @* Link: @url{http://www.versaloon.com}
-
- @item @b{ARM-JTAG-EW}
- @* Link: @url{http://www.olimex.com/dev/arm-jtag-ew.html}
-
- @item @b{Buspirate}
- @* Link: @url{http://dangerousprototypes.com/bus-pirate-manual/}
-
- @item @b{opendous}
- @* Link: @url{http://code.google.com/p/opendous-jtag/} - which uses an AT90USB162
-
- @item @b{estick}
- @* Link: @url{http://code.google.com/p/estick-jtag/}
-
- @item @b{Keil ULINK v1}
- @* Link: @url{http://www.keil.com/ulink1/}
-
- @item @b{TI XDS110 Debug Probe}
- @* Link: @url{https://software-dl.ti.com/ccs/esd/documents/xdsdebugprobes/emu_xds110.html}
- @* Link: @url{https://software-dl.ti.com/ccs/esd/documents/xdsdebugprobes/emu_xds_software_package_download.html#xds110-support-utilities}
- @end itemize
-
- @section IBM PC Parallel Printer Port Based
-
- The two well-known ``JTAG Parallel Ports'' cables are the Xilinx DLC5
- and the Macraigor Wiggler. There are many clones and variations of
- these on the market.
-
- Note that parallel ports are becoming much less common, so if you
- have the choice you should probably avoid these adapters in favor
- of USB-based ones.
-
- @itemize @bullet
-
- @item @b{Wiggler} - There are many clones of this.
- @* Link: @url{http://www.macraigor.com/wiggler.htm}
-
- @item @b{DLC5} - From XILINX - There are many clones of this
- @* Link: Search the web for: ``XILINX DLC5'' - it is no longer
- produced, PDF schematics are easily found and it is easy to make.
-
- @item @b{Amontec - JTAG Accelerator}
- @* Link: @url{http://www.amontec.com/jtag_accelerator.shtml}
-
- @item @b{Wiggler2}
- @* Link: @url{http://www.ccac.rwth-aachen.de/~michaels/index.php/hardware/armjtag}
-
- @item @b{Wiggler_ntrst_inverted}
- @* Yet another variation - See the source code, src/jtag/parport.c
-
- @item @b{old_amt_wiggler}
- @* Unknown - probably not on the market today
-
- @item @b{arm-jtag}
- @* Link: Most likely @url{http://www.olimex.com/dev/arm-jtag.html} [another wiggler clone]
-
- @item @b{chameleon}
- @* Link: @url{http://www.amontec.com/chameleon.shtml}
-
- @item @b{Triton}
- @* Unknown.
-
- @item @b{Lattice}
- @* ispDownload from Lattice Semiconductor
- @url{http://www.latticesemi.com/lit/docs/@/devtools/dlcable.pdf}
-
- @item @b{flashlink}
- @* From STMicroelectronics;
- @* Link: @url{http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/DM00039500.pdf}
-
- @end itemize
-
- @section Other...
- @itemize @bullet
-
- @item @b{ep93xx}
- @* An EP93xx based Linux machine using the GPIO pins directly.
-
- @item @b{at91rm9200}
- @* Like the EP93xx - but an ATMEL AT91RM9200 based solution using the GPIO pins on the chip.
-
- @item @b{bcm2835gpio}
- @* A BCM2835-based board (e.g. Raspberry Pi) using the GPIO pins of the expansion header.
-
- @item @b{imx_gpio}
- @* A NXP i.MX-based board (e.g. Wandboard) using the GPIO pins (should work on any i.MX processor).
-
- @item @b{jtag_vpi}
- @* A JTAG driver acting as a client for the JTAG VPI server interface.
- @* Link: @url{http://github.com/fjullien/jtag_vpi}
-
- @item @b{jtag_dpi}
- @* A JTAG driver acting as a client for the SystemVerilog Direct Programming
- Interface (DPI) for JTAG devices. DPI allows OpenOCD to connect to the JTAG
- interface of a hardware model written in SystemVerilog, for example, on an
- emulation model of target hardware.
-
- @item @b{xlnx_pcie_xvc}
- @* A JTAG driver exposing Xilinx Virtual Cable over PCI Express to OpenOCD as JTAG/SWD interface.
-
- @item @b{linuxgpiod}
- @* A bitbang JTAG driver using Linux GPIO through library libgpiod.
-
- @item @b{sysfsgpio}
- @* A bitbang JTAG driver using Linux legacy sysfs GPIO.
- This is deprecated from Linux v5.3; prefer using @b{linuxgpiod}.
-
- @end itemize
-
- @node About Jim-Tcl
- @chapter About Jim-Tcl
- @cindex Jim-Tcl
- @cindex tcl
-
- OpenOCD uses a small ``Tcl Interpreter'' known as Jim-Tcl.
- This programming language provides a simple and extensible
- command interpreter.
-
- All commands presented in this Guide are extensions to Jim-Tcl.
- You can use them as simple commands, without needing to learn
- much of anything about Tcl.
- Alternatively, you can write Tcl programs with them.
-
- You can learn more about Jim at its website, @url{http://jim.tcl.tk}.
- There is an active and responsive community, get on the mailing list
- if you have any questions. Jim-Tcl maintainers also lurk on the
- OpenOCD mailing list.
-
- @itemize @bullet
- @item @b{Jim vs. Tcl}
- @* Jim-Tcl is a stripped down version of the well known Tcl language,
- which can be found here: @url{http://www.tcl.tk}. Jim-Tcl has far
- fewer features. Jim-Tcl is several dozens of .C files and .H files and
- implements the basic Tcl command set. In contrast: Tcl 8.6 is a
- 4.2 MB .zip file containing 1540 files.
-
- @item @b{Missing Features}
- @* Our practice has been: Add/clone the real Tcl feature if/when
- needed. We welcome Jim-Tcl improvements, not bloat. Also there
- are a large number of optional Jim-Tcl features that are not
- enabled in OpenOCD.
-
- @item @b{Scripts}
- @* OpenOCD configuration scripts are Jim-Tcl Scripts. OpenOCD's
- command interpreter today is a mixture of (newer)
- Jim-Tcl commands, and the (older) original command interpreter.
-
- @item @b{Commands}
- @* At the OpenOCD telnet command line (or via the GDB monitor command) one
- can type a Tcl for() loop, set variables, etc.
- Some of the commands documented in this guide are implemented
- as Tcl scripts, from a @file{startup.tcl} file internal to the server.
-
- @item @b{Historical Note}
- @* Jim-Tcl was introduced to OpenOCD in spring 2008. Fall 2010,
- before OpenOCD 0.5 release, OpenOCD switched to using Jim-Tcl
- as a Git submodule, which greatly simplified upgrading Jim-Tcl
- to benefit from new features and bugfixes in Jim-Tcl.
-
- @item @b{Need a crash course in Tcl?}
- @*@xref{Tcl Crash Course}.
- @end itemize
-
- @node Running
- @chapter Running
- @cindex command line options
- @cindex logfile
- @cindex directory search
-
- Properly installing OpenOCD sets up your operating system to grant it access
- to the debug adapters. On Linux, this usually involves installing a file
- in @file{/etc/udev/rules.d,} so OpenOCD has permissions. An example rules file
- that works for many common adapters is shipped with OpenOCD in the
- @file{contrib} directory. MS-Windows needs
- complex and confusing driver configuration for every peripheral. Such issues
- are unique to each operating system, and are not detailed in this User's Guide.
-
- Then later you will invoke the OpenOCD server, with various options to
- tell it how each debug session should work.
- The @option{--help} option shows:
- @verbatim
- bash$ openocd --help
-
- --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 to 3
- | -d<n> set debug level to <level>
- --log_output | -l redirect log output to file <name>
- --command | -c run <command>
- @end verbatim
-
- If you don't give any @option{-f} or @option{-c} options,
- OpenOCD tries to read the configuration file @file{openocd.cfg}.
- To specify one or more different
- configuration files, use @option{-f} options. For example:
-
- @example
- openocd -f config1.cfg -f config2.cfg -f config3.cfg
- @end example
-
- Configuration files and scripts are searched for in
- @enumerate
- @item the current directory,
- @item any search dir specified on the command line using the @option{-s} option,
- @item any search dir specified using the @command{add_script_search_dir} command,
- @item a directory in the @env{OPENOCD_SCRIPTS} environment variable (if set),
- @item @file{%APPDATA%/OpenOCD} (only on Windows),
- @item @file{$HOME/Library/Preferences/org.openocd} (only on Darwin),
- @item @file{$XDG_CONFIG_HOME/openocd} (@env{$XDG_CONFIG_HOME} defaults to @file{$HOME/.config}),
- @item @file{$HOME/.openocd},
- @item the site wide script library @file{$pkgdatadir/site} and
- @item the OpenOCD-supplied script library @file{$pkgdatadir/scripts}.
- @end enumerate
- The first found file with a matching file name will be used.
-
- @quotation Note
- Don't try to use configuration script names or paths which
- include the "#" character. That character begins Tcl comments.
- @end quotation
-
- @section Simple setup, no customization
-
- In the best case, you can use two scripts from one of the script
- libraries, hook up your JTAG adapter, and start the server ... and
- your JTAG setup will just work "out of the box". Always try to
- start by reusing those scripts, but assume you'll need more
- customization even if this works. @xref{OpenOCD Project Setup}.
-
- If you find a script for your JTAG adapter, and for your board or
- target, you may be able to hook up your JTAG adapter then start
- the server with some variation of one of the following:
-
- @example
- openocd -f interface/ADAPTER.cfg -f board/MYBOARD.cfg
- openocd -f interface/ftdi/ADAPTER.cfg -f board/MYBOARD.cfg
- @end example
-
- You might also need to configure which reset signals are present,
- using @option{-c 'reset_config trst_and_srst'} or something similar.
- If all goes well you'll see output something like
-
- @example
- Open On-Chip Debugger 0.4.0 (2010-01-14-15:06)
- For bug reports, read
- http://openocd.org/doc/doxygen/bugs.html
- Info : JTAG tap: lm3s.cpu tap/device found: 0x3ba00477
- (mfg: 0x23b, part: 0xba00, ver: 0x3)
- @end example
-
- Seeing that "tap/device found" message, and no warnings, means
- the JTAG communication is working. That's a key milestone, but
- you'll probably need more project-specific setup.
-
- @section What OpenOCD does as it starts
-
- OpenOCD starts by processing the configuration commands provided
- on the command line or, if there were no @option{-c command} or
- @option{-f file.cfg} options given, in @file{openocd.cfg}.
- @xref{configurationstage,,Configuration Stage}.
- At the end of the configuration stage it verifies the JTAG scan
- chain defined using those commands; your configuration should
- ensure that this always succeeds.
- Normally, OpenOCD then starts running as a server.
- Alternatively, commands may be used to terminate the configuration
- stage early, perform work (such as updating some flash memory),
- and then shut down without acting as a server.
-
- Once OpenOCD starts running as a server, it waits for connections from
- clients (Telnet, GDB, RPC) and processes the commands issued through
- those channels.
-
- If you are having problems, you can enable internal debug messages via
- the @option{-d} option.
-
- Also it is possible to interleave Jim-Tcl commands w/config scripts using the
- @option{-c} command line switch.
-
- To enable debug output (when reporting problems or working on OpenOCD
- itself), use the @option{-d} command line switch. This sets the
- @option{debug_level} to "3", outputting the most information,
- including debug messages. The default setting is "2", outputting only
- informational messages, warnings and errors. You can also change this
- setting from within a telnet or gdb session using @command{debug_level<n>}
- (@pxref{debuglevel,,debug_level}).
-
- You can redirect all output from the server to a file using the
- @option{-l <logfile>} switch.
-
- Note! OpenOCD will launch the GDB & telnet server even if it can not
- establish a connection with the target. In general, it is possible for
- the JTAG controller to be unresponsive until the target is set up
- correctly via e.g. GDB monitor commands in a GDB init script.
-
- @node OpenOCD Project Setup
- @chapter OpenOCD Project Setup
-
- To use OpenOCD with your development projects, you need to do more than
- just connect the JTAG adapter hardware (dongle) to your development board
- and start the OpenOCD server.
- You also need to configure your OpenOCD server so that it knows
- about your adapter and board, and helps your work.
- You may also want to connect OpenOCD to GDB, possibly
- using Eclipse or some other GUI.
-
- @section Hooking up the JTAG Adapter
-
- Today's most common case is a dongle with a JTAG cable on one side
- (such as a ribbon cable with a 10-pin or 20-pin IDC connector)
- and a USB cable on the other.
- Instead of USB, some dongles use Ethernet;
- older ones may use a PC parallel port, or even a serial port.
-
- @enumerate
- @item @emph{Start with power to your target board turned off},
- and nothing connected to your JTAG adapter.
- If you're particularly paranoid, unplug power to the board.
- It's important to have the ground signal properly set up,
- unless you are using a JTAG adapter which provides
- galvanic isolation between the target board and the
- debugging host.
-
- @item @emph{Be sure it's the right kind of JTAG connector.}
- If your dongle has a 20-pin ARM connector, you need some kind
- of adapter (or octopus, see below) to hook it up to
- boards using 14-pin or 10-pin connectors ... or to 20-pin
- connectors which don't use ARM's pinout.
-
- In the same vein, make sure the voltage levels are compatible.
- Not all JTAG adapters have the level shifters needed to work
- with 1.2 Volt boards.
-
- @item @emph{Be certain the cable is properly oriented} or you might
- damage your board. In most cases there are only two possible
- ways to connect the cable.
- Connect the JTAG cable from your adapter to the board.
- Be sure it's firmly connected.
-
- In the best case, the connector is keyed to physically
- prevent you from inserting it wrong.
- This is most often done using a slot on the board's male connector
- housing, which must match a key on the JTAG cable's female connector.
- If there's no housing, then you must look carefully and
- make sure pin 1 on the cable hooks up to pin 1 on the board.
- Ribbon cables are frequently all grey except for a wire on one
- edge, which is red. The red wire is pin 1.
-
- Sometimes dongles provide cables where one end is an ``octopus'' of
- color coded single-wire connectors, instead of a connector block.
- These are great when converting from one JTAG pinout to another,
- but are tedious to set up.
- Use these with connector pinout diagrams to help you match up the
- adapter signals to the right board pins.
-
- @item @emph{Connect the adapter's other end} once the JTAG cable is connected.
- A USB, parallel, or serial port connector will go to the host which
- you are using to run OpenOCD.
- For Ethernet, consult the documentation and your network administrator.
-
- For USB-based JTAG adapters you have an easy sanity check at this point:
- does the host operating system see the JTAG adapter? If you're running
- Linux, try the @command{lsusb} command. If that host is an
- MS-Windows host, you'll need to install a driver before OpenOCD works.
-
- @item @emph{Connect the adapter's power supply, if needed.}
- This step is primarily for non-USB adapters,
- but sometimes USB adapters need extra power.
-
- @item @emph{Power up the target board.}
- Unless you just let the magic smoke escape,
- you're now ready to set up the OpenOCD server
- so you can use JTAG to work with that board.
-
- @end enumerate
-
- Talk with the OpenOCD server using
- telnet (@code{telnet localhost 4444} on many systems) or GDB.
- @xref{GDB and OpenOCD}.
-
- @section Project Directory
-
- There are many ways you can configure OpenOCD and start it up.
-
- A simple way to organize them all involves keeping a
- single directory for your work with a given board.
- When you start OpenOCD from that directory,
- it searches there first for configuration files, scripts,
- files accessed through semihosting,
- and for code you upload to the target board.
- It is also the natural place to write files,
- such as log files and data you download from the board.
-
- @section Configuration Basics
-
- There are two basic ways of configuring OpenOCD, and
- a variety of ways you can mix them.
- Think of the difference as just being how you start the server:
-
- @itemize
- @item Many @option{-f file} or @option{-c command} options on the command line
- @item No options, but a @dfn{user config file}
- in the current directory named @file{openocd.cfg}
- @end itemize
-
- Here is an example @file{openocd.cfg} file for a setup
- using a Signalyzer FT2232-based JTAG adapter to talk to
- a board with an Atmel AT91SAM7X256 microcontroller:
-
- @example
- source [find interface/ftdi/signalyzer.cfg]
-
- # GDB can also flash my flash!
- gdb_memory_map enable
- gdb_flash_program enable
-
- source [find target/sam7x256.cfg]
- @end example
-
- Here is the command line equivalent of that configuration:
-
- @example
- openocd -f interface/ftdi/signalyzer.cfg \
- -c "gdb_memory_map enable" \
- -c "gdb_flash_program enable" \
- -f target/sam7x256.cfg
- @end example
-
- You could wrap such long command lines in shell scripts,
- each supporting a different development task.
- One might re-flash the board with a specific firmware version.
- Another might set up a particular debugging or run-time environment.
-
- @quotation Important
- At this writing (October 2009) the command line method has
- problems with how it treats variables.
- For example, after @option{-c "set VAR value"}, or doing the
- same in a script, the variable @var{VAR} will have no value
- that can be tested in a later script.
- @end quotation
-
- Here we will focus on the simpler solution: one user config
- file, including basic configuration plus any TCL procedures
- to simplify your work.
-
- @section User Config Files
- @cindex config file, user
- @cindex user config file
- @cindex config file, overview
-
- A user configuration file ties together all the parts of a project
- in one place.
- One of the following will match your situation best:
-
- @itemize
- @item Ideally almost everything comes from configuration files
- provided by someone else.
- For example, OpenOCD distributes a @file{scripts} directory
- (probably in @file{/usr/share/openocd/scripts} on Linux).
- Board and tool vendors can provide these too, as can individual
- user sites; the @option{-s} command line option lets you say
- where to find these files. (@xref{Running}.)
- The AT91SAM7X256 example above works this way.
-
- Three main types of non-user configuration file each have their
- own subdirectory in the @file{scripts} directory:
-
- @enumerate
- @item @b{interface} -- one for each different debug adapter;
- @item @b{board} -- one for each different board
- @item @b{target} -- the chips which integrate CPUs and other JTAG TAPs
- @end enumerate
-
- Best case: include just two files, and they handle everything else.
- The first is an interface config file.
- The second is board-specific, and it sets up the JTAG TAPs and
- their GDB targets (by deferring to some @file{target.cfg} file),
- declares all flash memory, and leaves you nothing to do except
- meet your deadline:
-
- @example
- source [find interface/olimex-jtag-tiny.cfg]
- source [find board/csb337.cfg]
- @end example
-
- Boards with a single microcontroller often won't need more
- than the target config file, as in the AT91SAM7X256 example.
- That's because there is no external memory (flash, DDR RAM), and
- the board differences are encapsulated by application code.
-
- @item Maybe you don't know yet what your board looks like to JTAG.
- Once you know the @file{interface.cfg} file to use, you may
- need help from OpenOCD to discover what's on the board.
- Once you find the JTAG TAPs, you can just search for appropriate
- target and board
- configuration files ... or write your own, from the bottom up.
- @xref{autoprobing,,Autoprobing}.
-
- @item You can often reuse some standard config files but
- need to write a few new ones, probably a @file{board.cfg} file.
- You will be using commands described later in this User's Guide,
- and working with the guidelines in the next chapter.
-
- For example, there may be configuration files for your JTAG adapter
- and target chip, but you need a new board-specific config file
- giving access to your particular flash chips.
- Or you might need to write another target chip configuration file
- for a new chip built around the Cortex-M3 core.
-
- @quotation Note
- When you write new configuration files, please submit
- them for inclusion in the next OpenOCD release.
- For example, a @file{board/newboard.cfg} file will help the
- next users of that board, and a @file{target/newcpu.cfg}
- will help support users of any board using that chip.
- @end quotation
-
- @item
- You may need to write some C code.
- It may be as simple as supporting a new FT2232 or parport
- based adapter; a bit more involved, like a NAND or NOR flash
- controller driver; or a big piece of work like supporting
- a new chip architecture.
- @end itemize
-
- Reuse the existing config files when you can.
- Look first in the @file{scripts/boards} area, then @file{scripts/targets}.
- You may find a board configuration that's a good example to follow.
-
- When you write config files, separate the reusable parts
- (things every user of that interface, chip, or board needs)
- from ones specific to your environment and debugging approach.
- @itemize
-
- @item
- For example, a @code{gdb-attach} event handler that invokes
- the @command{reset init} command will interfere with debugging
- early boot code, which performs some of the same actions
- that the @code{reset-init} event handler does.
-
- @item
- Likewise, the @command{arm9 vector_catch} command (or
- @cindex vector_catch
- its siblings @command{xscale vector_catch}
- and @command{cortex_m vector_catch}) can be a time-saver
- during some debug sessions, but don't make everyone use that either.
- Keep those kinds of debugging aids in your user config file,
- along with messaging and tracing setup.
- (@xref{softwaredebugmessagesandtracing,,Software Debug Messages and Tracing}.)
-
- @item
- You might need to override some defaults.
- For example, you might need to move, shrink, or back up the target's
- work area if your application needs much SRAM.
-
- @item
- TCP/IP port configuration is another example of something which
- is environment-specific, and should only appear in
- a user config file. @xref{tcpipports,,TCP/IP Ports}.
- @end itemize
-
- @section Project-Specific Utilities
-
- A few project-specific utility
- routines may well speed up your work.
- Write them, and keep them in your project's user config file.
-
- For example, if you are making a boot loader work on a
- board, it's nice to be able to debug the ``after it's
- loaded to RAM'' parts separately from the finicky early
- code which sets up the DDR RAM controller and clocks.
- A script like this one, or a more GDB-aware sibling,
- may help:
-
- @example
- proc ramboot @{ @} @{
- # Reset, running the target's "reset-init" scripts
- # to initialize clocks and the DDR RAM controller.
- # Leave the CPU halted.
- reset init
-
- # Load CONFIG_SKIP_LOWLEVEL_INIT version into DDR RAM.
- load_image u-boot.bin 0x20000000
-
- # Start running.
- resume 0x20000000
- @}
- @end example
-
- Then once that code is working you will need to make it
- boot from NOR flash; a different utility would help.
- Alternatively, some developers write to flash using GDB.
- (You might use a similar script if you're working with a flash
- based microcontroller application instead of a boot loader.)
-
- @example
- proc newboot @{ @} @{
- # Reset, leaving the CPU halted. The "reset-init" event
- # proc gives faster access to the CPU and to NOR flash;
- # "reset halt" would be slower.
- reset init
-
- # Write standard version of U-Boot into the first two
- # sectors of NOR flash ... the standard version should
- # do the same lowlevel init as "reset-init".
- flash protect 0 0 1 off
- flash erase_sector 0 0 1
- flash write_bank 0 u-boot.bin 0x0
- flash protect 0 0 1 on
-
- # Reboot from scratch using that new boot loader.
- reset run
- @}
- @end example
-
- You may need more complicated utility procedures when booting
- from NAND.
- That often involves an extra bootloader stage,
- running from on-chip SRAM to perform DDR RAM setup so it can load
- the main bootloader code (which won't fit into that SRAM).
-
- Other helper scripts might be used to write production system images,
- involving considerably more than just a three stage bootloader.
-
- @section Target Software Changes
-
- Sometimes you may want to make some small changes to the software
- you're developing, to help make JTAG debugging work better.
- For example, in C or assembly language code you might
- use @code{#ifdef JTAG_DEBUG} (or its converse) around code
- handling issues like:
-
- @itemize @bullet
-
- @item @b{Watchdog Timers}...
- Watchdog timers are typically used to automatically reset systems if
- some application task doesn't periodically reset the timer. (The
- assumption is that the system has locked up if the task can't run.)
- When a JTAG debugger halts the system, that task won't be able to run
- and reset the timer ... potentially causing resets in the middle of
- your debug sessions.
-
- It's rarely a good idea to disable such watchdogs, since their usage
- needs to be debugged just like all other parts of your firmware.
- That might however be your only option.
-
- Look instead for chip-specific ways to stop the watchdog from counting
- while the system is in a debug halt state. It may be simplest to set
- that non-counting mode in your debugger startup scripts. You may however
- need a different approach when, for example, a motor could be physically
- damaged by firmware remaining inactive in a debug halt state. That might
- involve a type of firmware mode where that "non-counting" mode is disabled
- at the beginning then re-enabled at the end; a watchdog reset might fire
- and complicate the debug session, but hardware (or people) would be
- protected.@footnote{Note that many systems support a "monitor mode" debug
- that is a somewhat cleaner way to address such issues. You can think of
- it as only halting part of the system, maybe just one task,
- instead of the whole thing.
- At this writing, January 2010, OpenOCD based debugging does not support
- monitor mode debug, only "halt mode" debug.}
-
- @item @b{ARM Semihosting}...
- @cindex ARM semihosting
- When linked with a special runtime library provided with many
- toolchains@footnote{See chapter 8 "Semihosting" in
- @uref{http://infocenter.arm.com/help/topic/com.arm.doc.dui0203i/DUI0203I_rvct_developer_guide.pdf,
- ARM DUI 0203I}, the "RealView Compilation Tools Developer Guide".
- The CodeSourcery EABI toolchain also includes a semihosting library.},
- your target code can use I/O facilities on the debug host. That library
- provides a small set of system calls which are handled by OpenOCD.
- It can let the debugger provide your system console and a file system,
- helping with early debugging or providing a more capable environment
- for sometimes-complex tasks like installing system firmware onto
- NAND or SPI flash.
-
- @item @b{ARM Wait-For-Interrupt}...
- Many ARM chips synchronize the JTAG clock using the core clock.
- Low power states which stop that core clock thus prevent JTAG access.
- Idle loops in tasking environments often enter those low power states
- via the @code{WFI} instruction (or its coprocessor equivalent, before ARMv7).
-
- You may want to @emph{disable that instruction} in source code,
- or otherwise prevent using that state,
- to ensure you can get JTAG access at any time.@footnote{As a more
- polite alternative, some processors have special debug-oriented
- registers which can be used to change various features including
- how the low power states are clocked while debugging.
- The STM32 DBGMCU_CR register is an example; at the cost of extra
- power consumption, JTAG can be used during low power states.}
- For example, the OpenOCD @command{halt} command may not
- work for an idle processor otherwise.
-
- @item @b{Delay after reset}...
- Not all chips have good support for debugger access
- right after reset; many LPC2xxx chips have issues here.
- Similarly, applications that reconfigure pins used for
- JTAG access as they start will also block debugger access.
-
- To work with boards like this, @emph{enable a short delay loop}
- the first thing after reset, before "real" startup activities.
- For example, one second's delay is usually more than enough
- time for a JTAG debugger to attach, so that
- early code execution can be debugged
- or firmware can be replaced.
-
- @item @b{Debug Communications Channel (DCC)}...
- Some processors include mechanisms to send messages over JTAG.
- Many ARM cores support these, as do some cores from other vendors.
- (OpenOCD may be able to use this DCC internally, speeding up some
- operations like writing to memory.)
-
- Your application may want to deliver various debugging messages
- over JTAG, by @emph{linking with a small library of code}
- provided with OpenOCD and using the utilities there to send
- various kinds of message.
- @xref{softwaredebugmessagesandtracing,,Software Debug Messages and Tracing}.
-
- @end itemize
-
- @section Target Hardware Setup
-
- Chip vendors often provide software development boards which
- are highly configurable, so that they can support all options
- that product boards may require. @emph{Make sure that any
- jumpers or switches match the system configuration you are
- working with.}
-
- Common issues include:
-
- @itemize @bullet
-
- @item @b{JTAG setup} ...
- Boards may support more than one JTAG configuration.
- Examples include jumpers controlling pullups versus pulldowns
- on the nTRST and/or nSRST signals, and choice of connectors
- (e.g. which of two headers on the base board,
- or one from a daughtercard).
- For some Texas Instruments boards, you may need to jumper the
- EMU0 and EMU1 signals (which OpenOCD won't currently control).
-
- @item @b{Boot Modes} ...
- Complex chips often support multiple boot modes, controlled
- by external jumpers. Make sure this is set up correctly.
- For example many i.MX boards from NXP need to be jumpered
- to "ATX mode" to start booting using the on-chip ROM, when
- using second stage bootloader code stored in a NAND flash chip.
-
- Such explicit configuration is common, and not limited to
- booting from NAND. You might also need to set jumpers to
- start booting using code loaded from an MMC/SD card; external
- SPI flash; Ethernet, UART, or USB links; NOR flash; OneNAND
- flash; some external host; or various other sources.
-
-
- @item @b{Memory Addressing} ...
- Boards which support multiple boot modes may also have jumpers
- to configure memory addressing. One board, for example, jumpers
- external chipselect 0 (used for booting) to address either
- a large SRAM (which must be pre-loaded via JTAG), NOR flash,
- or NAND flash. When it's jumpered to address NAND flash, that
- board must also be told to start booting from on-chip ROM.
-
- Your @file{board.cfg} file may also need to be told this jumper
- configuration, so that it can know whether to declare NOR flash
- using @command{flash bank} or instead declare NAND flash with
- @command{nand device}; and likewise which probe to perform in
- its @code{reset-init} handler.
-
- A closely related issue is bus width. Jumpers might need to
- distinguish between 8 bit or 16 bit bus access for the flash
- used to start booting.
-
- @item @b{Peripheral Access} ...
- Development boards generally provide access to every peripheral
- on the chip, sometimes in multiple modes (such as by providing
- multiple audio codec chips).
- This interacts with software
- configuration of pin multiplexing, where for example a
- given pin may be routed either to the MMC/SD controller
- or the GPIO controller. It also often interacts with
- configuration jumpers. One jumper may be used to route
- signals to an MMC/SD card slot or an expansion bus (which
- might in turn affect booting); others might control which
- audio or video codecs are used.
-
- @end itemize
-
- Plus you should of course have @code{reset-init} event handlers
- which set up the hardware to match that jumper configuration.
- That includes in particular any oscillator or PLL used to clock
- the CPU, and any memory controllers needed to access external
- memory and peripherals. Without such handlers, you won't be
- able to access those resources without working target firmware
- which can do that setup ... this can be awkward when you're
- trying to debug that target firmware. Even if there's a ROM
- bootloader which handles a few issues, it rarely provides full
- access to all board-specific capabilities.
-
-
- @node Config File Guidelines
- @chapter Config File Guidelines
-
- This chapter is aimed at any user who needs to write a config file,
- including developers and integrators of OpenOCD and any user who
- needs to get a new board working smoothly.
- It provides guidelines for creating those files.
-
- You should find the following directories under
- @t{$(INSTALLDIR)/scripts}, with config files maintained upstream. Use
- them as-is where you can; or as models for new files.
- @itemize @bullet
- @item @file{interface} ...
- These are for debug adapters. Files that specify configuration to use
- specific JTAG, SWD and other adapters go here.
- @item @file{board} ...
- Think Circuit Board, PWA, PCB, they go by many names. Board files
- contain initialization items that are specific to a board.
-
- They reuse target configuration files, since the same
- microprocessor chips are used on many boards,
- but support for external parts varies widely. For
- example, the SDRAM initialization sequence for the board, or the type
- of external flash and what address it uses. Any initialization
- sequence to enable that external flash or SDRAM should be found in the
- board file. Boards may also contain multiple targets: two CPUs; or
- a CPU and an FPGA.
- @item @file{target} ...
- Think chip. The ``target'' directory represents the JTAG TAPs
- on a chip
- which OpenOCD should control, not a board. Two common types of targets
- are ARM chips and FPGA or CPLD chips.
- When a chip has multiple TAPs (maybe it has both ARM and DSP cores),
- the target config file defines all of them.
- @item @emph{more} ... browse for other library files which may be useful.
- For example, there are various generic and CPU-specific utilities.
- @end itemize
-
- The @file{openocd.cfg} user config
- file may override features in any of the above files by
- setting variables before sourcing the target file, or by adding
- commands specific to their situation.
-
- @section Interface Config Files
-
- The user config file
- should be able to source one of these files with a command like this:
-
- @example
- source [find interface/FOOBAR.cfg]
- @end example
-
- A preconfigured interface file should exist for every debug adapter
- in use today with OpenOCD.
- That said, perhaps some of these config files
- have only been used by the developer who created it.
-
- A separate chapter gives information about how to set these up.
- @xref{Debug Adapter Configuration}.
- Read the OpenOCD source code (and Developer's Guide)
- if you have a new kind of hardware interface
- and need to provide a driver for it.
-
- @section Board Config Files
- @cindex config file, board
- @cindex board config file
-
- The user config file
- should be able to source one of these files with a command like this:
-
- @example
- source [find board/FOOBAR.cfg]
- @end example
-
- The point of a board config file is to package everything
- about a given board that user config files need to know.
- In summary the board files should contain (if present)
-
- @enumerate
- @item One or more @command{source [find target/...cfg]} statements
- @item NOR flash configuration (@pxref{norconfiguration,,NOR Configuration})
- @item NAND flash configuration (@pxref{nandconfiguration,,NAND Configuration})
- @item Target @code{reset} handlers for SDRAM and I/O configuration
- @item JTAG adapter reset configuration (@pxref{Reset Configuration})
- @item All things that are not ``inside a chip''
- @end enumerate
-
- Generic things inside target chips belong in target config files,
- not board config files. So for example a @code{reset-init} event
- handler should know board-specific oscillator and PLL parameters,
- which it passes to target-specific utility code.
-
- The most complex task of a board config file is creating such a
- @code{reset-init} event handler.
- Define those handlers last, after you verify the rest of the board
- configuration works.
-
- @subsection Communication Between Config files
-
- In addition to target-specific utility code, another way that
- board and target config files communicate is by following a
- convention on how to use certain variables.
-
- The full Tcl/Tk language supports ``namespaces'', but Jim-Tcl does not.
- Thus the rule we follow in OpenOCD is this: Variables that begin with
- a leading underscore are temporary in nature, and can be modified and
- used at will within a target configuration file.
-
- Complex board config files can do the things like this,
- for a board with three chips:
-
- @example
- # Chip #1: PXA270 for network side, big endian
- set CHIPNAME network
- set ENDIAN big
- source [find target/pxa270.cfg]
- # on return: _TARGETNAME = network.cpu
- # other commands can refer to the "network.cpu" target.
- $_TARGETNAME configure .... events for this CPU..
-
- # Chip #2: PXA270 for video side, little endian
- set CHIPNAME video
- set ENDIAN little
- source [find target/pxa270.cfg]
- # on return: _TARGETNAME = video.cpu
- # other commands can refer to the "video.cpu" target.
- $_TARGETNAME configure .... events for this CPU..
-
- # Chip #3: Xilinx FPGA for glue logic
- set CHIPNAME xilinx
- unset ENDIAN
- source [find target/spartan3.cfg]
- @end example
-
- That example is oversimplified because it doesn't show any flash memory,
- or the @code{reset-init} event handlers to initialize external DRAM
- or (assuming it needs it) load a configuration into the FPGA.
- Such features are usually needed for low-level work with many boards,
- where ``low level'' implies that the board initialization software may
- not be working. (That's a common reason to need JTAG tools. Another
- is to enable working with microcontroller-based systems, which often
- have no debugging support except a JTAG connector.)
-
- Target config files may also export utility functions to board and user
- config files. Such functions should use name prefixes, to help avoid
- naming collisions.
-
- Board files could also accept input variables from user config files.
- For example, there might be a @code{J4_JUMPER} setting used to identify
- what kind of flash memory a development board is using, or how to set
- up other clocks and peripherals.
-
- @subsection Variable Naming Convention
- @cindex variable names
-
- Most boards have only one instance of a chip.
- However, it should be easy to create a board with more than
- one such chip (as shown above).
- Accordingly, we encourage these conventions for naming
- variables associated with different @file{target.cfg} files,
- to promote consistency and
- so that board files can override target defaults.
-
- Inputs to target config files include:
-
- @itemize @bullet
- @item @code{CHIPNAME} ...
- This gives a name to the overall chip, and is used as part of
- tap identifier dotted names.
- While the default is normally provided by the chip manufacturer,
- board files may need to distinguish between instances of a chip.
- @item @code{ENDIAN} ...
- By default @option{little} - although chips may hard-wire @option{big}.
- Chips that can't change endianness don't need to use this variable.
- @item @code{CPUTAPID} ...
- When OpenOCD examines the JTAG chain, it can be told verify the
- chips against the JTAG IDCODE register.
- The target file will hold one or more defaults, but sometimes the
- chip in a board will use a different ID (perhaps a newer revision).
- @end itemize
-
- Outputs from target config files include:
-
- @itemize @bullet
- @item @code{_TARGETNAME} ...
- By convention, this variable is created by the target configuration
- script. The board configuration file may make use of this variable to
- configure things like a ``reset init'' script, or other things
- specific to that board and that target.
- If the chip has 2 targets, the names are @code{_TARGETNAME0},
- @code{_TARGETNAME1}, ... etc.
- @end itemize
-
- @subsection The reset-init Event Handler
- @cindex event, reset-init
- @cindex reset-init handler
-
- Board config files run in the OpenOCD configuration stage;
- they can't use TAPs or targets, since they haven't been
- fully set up yet.
- This means you can't write memory or access chip registers;
- you can't even verify that a flash chip is present.
- That's done later in event handlers, of which the target @code{reset-init}
- handler is one of the most important.
-
- Except on microcontrollers, the basic job of @code{reset-init} event
- handlers is setting up flash and DRAM, as normally handled by boot loaders.
- Microcontrollers rarely use boot loaders; they run right out of their
- on-chip flash and SRAM memory. But they may want to use one of these
- handlers too, if just for developer convenience.
-
- @quotation Note
- Because this is so very board-specific, and chip-specific, no examples
- are included here.
- Instead, look at the board config files distributed with OpenOCD.
- If you have a boot loader, its source code will help; so will
- configuration files for other JTAG tools
- (@pxref{translatingconfigurationfiles,,Translating Configuration Files}).
- @end quotation
-
- Some of this code could probably be shared between different boards.
- For example, setting up a DRAM controller often doesn't differ by
- much except the bus width (16 bits or 32?) and memory timings, so a
- reusable TCL procedure loaded by the @file{target.cfg} file might take
- those as parameters.
- Similarly with oscillator, PLL, and clock setup;
- and disabling the watchdog.
- Structure the code cleanly, and provide comments to help
- the next developer doing such work.
- (@emph{You might be that next person} trying to reuse init code!)
-
- The last thing normally done in a @code{reset-init} handler is probing
- whatever flash memory was configured. For most chips that needs to be
- done while the associated target is halted, either because JTAG memory
- access uses the CPU or to prevent conflicting CPU access.
-
- @subsection JTAG Clock Rate
-
- Before your @code{reset-init} handler has set up
- the PLLs and clocking, you may need to run with
- a low JTAG clock rate.
- @xref{jtagspeed,,JTAG Speed}.
- Then you'd increase that rate after your handler has
- made it possible to use the faster JTAG clock.
- When the initial low speed is board-specific, for example
- because it depends on a board-specific oscillator speed, then
- you should probably set it up in the board config file;
- if it's target-specific, it belongs in the target config file.
-
- For most ARM-based processors the fastest JTAG clock@footnote{A FAQ
- @uref{http://www.arm.com/support/faqdev/4170.html} gives details.}
- is one sixth of the CPU clock; or one eighth for ARM11 cores.
- Consult chip documentation to determine the peak JTAG clock rate,
- which might be less than that.
-
- @quotation Warning
- On most ARMs, JTAG clock detection is coupled to the core clock, so
- software using a @option{wait for interrupt} operation blocks JTAG access.
- Adaptive clocking provides a partial workaround, but a more complete
- solution just avoids using that instruction with JTAG debuggers.
- @end quotation
-
- If both the chip and the board support adaptive clocking,
- use the @command{jtag_rclk}
- command, in case your board is used with JTAG adapter which
- also supports it. Otherwise use @command{adapter speed}.
- Set the slow rate at the beginning of the reset sequence,
- and the faster rate as soon as the clocks are at full speed.
-
- @anchor{theinitboardprocedure}
- @subsection The init_board procedure
- @cindex init_board procedure
-
- The concept of @code{init_board} procedure is very similar to @code{init_targets}
- (@xref{theinittargetsprocedure,,The init_targets procedure}.) - it's a replacement of ``linear''
- configuration scripts. This procedure is meant to be executed when OpenOCD enters run stage
- (@xref{enteringtherunstage,,Entering the Run Stage},) after @code{init_targets}. The idea to have
- separate @code{init_targets} and @code{init_board} procedures is to allow the first one to configure
- everything target specific (internal flash, internal RAM, etc.) and the second one to configure
- everything board specific (reset signals, chip frequency, reset-init event handler, external memory, etc.).
- Additionally ``linear'' board config file will most likely fail when target config file uses
- @code{init_targets} scheme (``linear'' script is executed before @code{init} and @code{init_targets} - after),
- so separating these two configuration stages is very convenient, as the easiest way to overcome this
- problem is to convert board config file to use @code{init_board} procedure. Board config scripts don't
- need to override @code{init_targets} defined in target config files when they only need to add some specifics.
-
- Just as @code{init_targets}, the @code{init_board} procedure can be overridden by ``next level'' script (which sources
- the original), allowing greater code reuse.
-
- @example
- ### board_file.cfg ###
-
- # source target file that does most of the config in init_targets
- source [find target/target.cfg]
-
- proc enable_fast_clock @{@} @{
- # enables fast on-board clock source
- # configures the chip to use it
- @}
-
- # initialize only board specifics - reset, clock, adapter frequency
- proc init_board @{@} @{
- reset_config trst_and_srst trst_pulls_srst
-
- $_TARGETNAME configure -event reset-start @{
- adapter speed 100
- @}
-
- $_TARGETNAME configure -event reset-init @{
- enable_fast_clock
- adapter speed 10000
- @}
- @}
- @end example
-
- @section Target Config Files
- @cindex config file, target
- @cindex target config file
-
- Board config files communicate with target config files using
- naming conventions as described above, and may source one or
- more target config files like this:
-
- @example
- source [find target/FOOBAR.cfg]
- @end example
-
- The point of a target config file is to package everything
- about a given chip that board config files need to know.
- In summary the target files should contain
-
- @enumerate
- @item Set defaults
- @item Add TAPs to the scan chain
- @item Add CPU targets (includes GDB support)
- @item CPU/Chip/CPU-Core specific features
- @item On-Chip flash
- @end enumerate
-
- As a rule of thumb, a target file sets up only one chip.
- For a microcontroller, that will often include a single TAP,
- which is a CPU needing a GDB target, and its on-chip flash.
-
- More complex chips may include multiple TAPs, and the target
- config file may need to define them all before OpenOCD
- can talk to the chip.
- For example, some phone chips have JTAG scan chains that include
- an ARM core for operating system use, a DSP,
- another ARM core embedded in an image processing engine,
- and other processing engines.
-
- @subsection Default Value Boiler Plate Code
-
- All target configuration files should start with code like this,
- letting board config files express environment-specific
- differences in how things should be set up.
-
- @example
- # Boards may override chip names, perhaps based on role,
- # but the default should match what the vendor uses
- if @{ [info exists CHIPNAME] @} @{
- set _CHIPNAME $CHIPNAME
- @} else @{
- set _CHIPNAME sam7x256
- @}
-
- # ONLY use ENDIAN with targets that can change it.
- if @{ [info exists ENDIAN] @} @{
- set _ENDIAN $ENDIAN
- @} else @{
- set _ENDIAN little
- @}
-
- # TAP identifiers may change as chips mature, for example with
- # new revision fields (the "3" here). Pick a good default; you
- # can pass several such identifiers to the "jtag newtap" command.
- if @{ [info exists CPUTAPID ] @} @{
- set _CPUTAPID $CPUTAPID
- @} else @{
- set _CPUTAPID 0x3f0f0f0f
- @}
- @end example
- @c but 0x3f0f0f0f is for an str73x part ...
-
- @emph{Remember:} Board config files may include multiple target
- config files, or the same target file multiple times
- (changing at least @code{CHIPNAME}).
-
- Likewise, the target configuration file should define
- @code{_TARGETNAME} (or @code{_TARGETNAME0} etc) and
- use it later on when defining debug targets:
-
- @example
- set _TARGETNAME $_CHIPNAME.cpu
- target create $_TARGETNAME arm7tdmi -chain-position $_TARGETNAME
- @end example
-
- @subsection Adding TAPs to the Scan Chain
- After the ``defaults'' are set up,
- add the TAPs on each chip to the JTAG scan chain.
- @xref{TAP Declaration}, and the naming convention
- for taps.
-
- In the simplest case the chip has only one TAP,
- probably for a CPU or FPGA.
- The config file for the Atmel AT91SAM7X256
- looks (in part) like this:
-
- @example
- jtag newtap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID
- @end example
-
- A board with two such at91sam7 chips would be able
- to source such a config file twice, with different
- values for @code{CHIPNAME}, so
- it adds a different TAP each time.
-
- If there are nonzero @option{-expected-id} values,
- OpenOCD attempts to verify the actual tap id against those values.
- It will issue error messages if there is mismatch, which
- can help to pinpoint problems in OpenOCD configurations.
-
- @example
- JTAG tap: sam7x256.cpu tap/device found: 0x3f0f0f0f
- (Manufacturer: 0x787, Part: 0xf0f0, Version: 0x3)
- ERROR: Tap: sam7x256.cpu - Expected id: 0x12345678, Got: 0x3f0f0f0f
- ERROR: expected: mfg: 0x33c, part: 0x2345, ver: 0x1
- ERROR: got: mfg: 0x787, part: 0xf0f0, ver: 0x3
- @end example
-
- There are more complex examples too, with chips that have
- multiple TAPs. Ones worth looking at include:
-
- @itemize
- @item @file{target/omap3530.cfg} -- with disabled ARM and DSP,
- plus a JRC to enable them
- @item @file{target/str912.cfg} -- with flash, CPU, and boundary scan
- @item @file{target/ti_dm355.cfg} -- with ETM, ARM, and JRC (this JRC
- is not currently used)
- @end itemize
-
- @subsection Add CPU targets
-
- After adding a TAP for a CPU, you should set it up so that
- GDB and other commands can use it.
- @xref{CPU Configuration}.
- For the at91sam7 example above, the command can look like this;
- note that @code{$_ENDIAN} is not needed, since OpenOCD defaults
- to little endian, and this chip doesn't support changing that.
-
- @example
- set _TARGETNAME $_CHIPNAME.cpu
- target create $_TARGETNAME arm7tdmi -chain-position $_TARGETNAME
- @end example
-
- Work areas are small RAM areas associated with CPU targets.
- They are used by OpenOCD to speed up downloads,
- and to download small snippets of code to program flash chips.
- If the chip includes a form of ``on-chip-ram'' - and many do - define
- a work area if you can.
- Again using the at91sam7 as an example, this can look like:
-
- @example
- $_TARGETNAME configure -work-area-phys 0x00200000 \
- -work-area-size 0x4000 -work-area-backup 0
- @end example
-
- @anchor{definecputargetsworkinginsmp}
- @subsection Define CPU targets working in SMP
- @cindex SMP
- After setting targets, you can define a list of targets working in SMP.
-
- @example
- set _TARGETNAME_1 $_CHIPNAME.cpu1
- set _TARGETNAME_2 $_CHIPNAME.cpu2
- target create $_TARGETNAME_1 cortex_a -chain-position $_CHIPNAME.dap \
- -coreid 0 -dbgbase $_DAP_DBG1
- target create $_TARGETNAME_2 cortex_a -chain-position $_CHIPNAME.dap \
- -coreid 1 -dbgbase $_DAP_DBG2
- #define 2 targets working in smp.
- target smp $_CHIPNAME.cpu2 $_CHIPNAME.cpu1
- @end example
- In the above example on cortex_a, 2 cpus are working in SMP.
- In SMP only one GDB instance is created and :
- @itemize @bullet
- @item a set of hardware breakpoint sets the same breakpoint on all targets in the list.
- @item halt command triggers the halt of all targets in the list.
- @item resume command triggers the write context and the restart of all targets in the list.
- @item following a breakpoint: the target stopped by the breakpoint is displayed to the GDB session.
- @item dedicated GDB serial protocol packets are implemented for switching/retrieving the target
- displayed by the GDB session @pxref{usingopenocdsmpwithgdb,,Using OpenOCD SMP with GDB}.
- @end itemize
-
- The SMP behaviour can be disabled/enabled dynamically. On cortex_a following
- command have been implemented.
- @itemize @bullet
- @item cortex_a smp on : enable SMP mode, behaviour is as described above.
- @item cortex_a smp off : disable SMP mode, the current target is the one
- displayed in the GDB session, only this target is now controlled by GDB
- session. This behaviour is useful during system boot up.
- @item cortex_a smp : display current SMP mode.
- @item cortex_a smp_gdb : display/fix the core id displayed in GDB session see
- following example.
- @end itemize
-
- @example
- >cortex_a smp_gdb
- gdb coreid 0 -> -1
- #0 : coreid 0 is displayed to GDB ,
- #-> -1 : next resume triggers a real resume
- > cortex_a smp_gdb 1
- gdb coreid 0 -> 1
- #0 :coreid 0 is displayed to GDB ,
- #->1 : next resume displays coreid 1 to GDB
- > resume
- > cortex_a smp_gdb
- gdb coreid 1 -> 1
- #1 :coreid 1 is displayed to GDB ,
- #->1 : next resume displays coreid 1 to GDB
- > cortex_a smp_gdb -1
- gdb coreid 1 -> -1
- #1 :coreid 1 is displayed to GDB,
- #->-1 : next resume triggers a real resume
- @end example
-
-
- @subsection Chip Reset Setup
-
- As a rule, you should put the @command{reset_config} command
- into the board file. Most things you think you know about a
- chip can be tweaked by the board.
-
- Some chips have specific ways the TRST and SRST signals are
- managed. In the unusual case that these are @emph{chip specific}
- and can never be changed by board wiring, they could go here.
- For example, some chips can't support JTAG debugging without
- both signals.
-
- Provide a @code{reset-assert} event handler if you can.
- Such a handler uses JTAG operations to reset the target,
- letting this target config be used in systems which don't
- provide the optional SRST signal, or on systems where you
- don't want to reset all targets at once.
- Such a handler might write to chip registers to force a reset,
- use a JRC to do that (preferable -- the target may be wedged!),
- or force a watchdog timer to trigger.
- (For Cortex-M targets, this is not necessary. The target
- driver knows how to use trigger an NVIC reset when SRST is
- not available.)
-
- Some chips need special attention during reset handling if
- they're going to be used with JTAG.
- An example might be needing to send some commands right
- after the target's TAP has been reset, providing a
- @code{reset-deassert-post} event handler that writes a chip
- register to report that JTAG debugging is being done.
- Another would be reconfiguring the watchdog so that it stops
- counting while the core is halted in the debugger.
-
- JTAG clocking constraints often change during reset, and in
- some cases target config files (rather than board config files)
- are the right places to handle some of those issues.
- For example, immediately after reset most chips run using a
- slower clock than they will use later.
- That means that after reset (and potentially, as OpenOCD
- first starts up) they must use a slower JTAG clock rate
- than they will use later.
- @xref{jtagspeed,,JTAG Speed}.
-
- @quotation Important
- When you are debugging code that runs right after chip
- reset, getting these issues right is critical.
- In particular, if you see intermittent failures when
- OpenOCD verifies the scan chain after reset,
- look at how you are setting up JTAG clocking.
- @end quotation
-
- @anchor{theinittargetsprocedure}
- @subsection The init_targets procedure
- @cindex init_targets procedure
-
- Target config files can either be ``linear'' (script executed line-by-line when parsed in
- configuration stage, @xref{configurationstage,,Configuration Stage},) or they can contain a special
- procedure called @code{init_targets}, which will be executed when entering run stage
- (after parsing all config files or after @code{init} command, @xref{enteringtherunstage,,Entering the Run Stage}.)
- Such procedure can be overridden by ``next level'' script (which sources the original).
- This concept facilitates code reuse when basic target config files provide generic configuration
- procedures and @code{init_targets} procedure, which can then be sourced and enhanced or changed in
- a ``more specific'' target config file. This is not possible with ``linear'' config scripts,
- because sourcing them executes every initialization commands they provide.
-
- @example
- ### generic_file.cfg ###
-
- proc setup_my_chip @{chip_name flash_size ram_size@} @{
- # basic initialization procedure ...
- @}
-
- proc init_targets @{@} @{
- # initializes generic chip with 4kB of flash and 1kB of RAM
- setup_my_chip MY_GENERIC_CHIP 4096 1024
- @}
-
- ### specific_file.cfg ###
-
- source [find target/generic_file.cfg]
-
- proc init_targets @{@} @{
- # initializes specific chip with 128kB of flash and 64kB of RAM
- setup_my_chip MY_CHIP_WITH_128K_FLASH_64KB_RAM 131072 65536
- @}
- @end example
-
- The easiest way to convert ``linear'' config files to @code{init_targets} version is to
- enclose every line of ``code'' (i.e. not @code{source} commands, procedures, etc.) in this procedure.
-
- For an example of this scheme see LPC2000 target config files.
-
- The @code{init_boards} procedure is a similar concept concerning board config files
- (@xref{theinitboardprocedure,,The init_board procedure}.)
-
- @anchor{theinittargeteventsprocedure}
- @subsection The init_target_events procedure
- @cindex init_target_events procedure
-
- A special procedure called @code{init_target_events} is run just after
- @code{init_targets} (@xref{theinittargetsprocedure,,The init_targets
- procedure}.) and before @code{init_board}
- (@xref{theinitboardprocedure,,The init_board procedure}.) It is used
- to set up default target events for the targets that do not have those
- events already assigned.
-
- @subsection ARM Core Specific Hacks
-
- If the chip has a DCC, enable it. If the chip is an ARM9 with some
- special high speed download features - enable it.
-
- If present, the MMU, the MPU and the CACHE should be disabled.
-
- Some ARM cores are equipped with trace support, which permits
- examination of the instruction and data bus activity. Trace
- activity is controlled through an ``Embedded Trace Module'' (ETM)
- on one of the core's scan chains. The ETM emits voluminous data
- through a ``trace port''. (@xref{armhardwaretracing,,ARM Hardware Tracing}.)
- If you are using an external trace port,
- configure it in your board config file.
- If you are using an on-chip ``Embedded Trace Buffer'' (ETB),
- configure it in your target config file.
-
- @example
- etm config $_TARGETNAME 16 normal full etb
- etb config $_TARGETNAME $_CHIPNAME.etb
- @end example
-
- @subsection Internal Flash Configuration
-
- This applies @b{ONLY TO MICROCONTROLLERS} that have flash built in.
-
- @b{Never ever} in the ``target configuration file'' define any type of
- flash that is external to the chip. (For example a BOOT flash on
- Chip Select 0.) Such flash information goes in a board file - not
- the TARGET (chip) file.
-
- Examples:
- @itemize @bullet
- @item at91sam7x256 - has 256K flash YES enable it.
- @item str912 - has flash internal YES enable it.
- @item imx27 - uses boot flash on CS0 - it goes in the board file.
- @item pxa270 - again - CS0 flash - it goes in the board file.
- @end itemize
-
- @anchor{translatingconfigurationfiles}
- @section Translating Configuration Files
- @cindex translation
- If you have a configuration file for another hardware debugger
- or toolset (Abatron, BDI2000, BDI3000, CCS,
- Lauterbach, SEGGER, Macraigor, etc.), translating
- it into OpenOCD syntax is often quite straightforward. The most tricky
- part of creating a configuration script is oftentimes the reset init
- sequence where e.g. PLLs, DRAM and the like is set up.
-
- One trick that you can use when translating is to write small
- Tcl procedures to translate the syntax into OpenOCD syntax. This
- can avoid manual translation errors and make it easier to
- convert other scripts later on.
-
- Example of transforming quirky arguments to a simple search and
- replace job:
-
- @example
- # Lauterbach syntax(?)
- #
- # Data.Set c15:0x042f %long 0x40000015
- #
- # OpenOCD syntax when using procedure below.
- #
- # setc15 0x01 0x00050078
-
- proc setc15 @{regs value@} @{
- global TARGETNAME
-
- echo [format "set p15 0x%04x, 0x%08x" $regs $value]
-
- arm mcr 15 [expr ($regs>>12)&0x7] \
- [expr ($regs>>0)&0xf] [expr ($regs>>4)&0xf] \
- [expr ($regs>>8)&0x7] $value
- @}
- @end example
-
-
-
- @node Server Configuration
- @chapter Server Configuration
- @cindex initialization
- The commands here are commonly found in the openocd.cfg file and are
- used to specify what TCP/IP ports are used, and how GDB should be
- supported.
-
- @anchor{configurationstage}
- @section Configuration Stage
- @cindex configuration stage
- @cindex config command
-
- When the OpenOCD server process starts up, it enters a
- @emph{configuration stage} which is the only time that
- certain commands, @emph{configuration commands}, may be issued.
- Normally, configuration commands are only available
- inside startup scripts.
-
- In this manual, the definition of a configuration command is
- presented as a @emph{Config Command}, not as a @emph{Command}
- which may be issued interactively.
- The runtime @command{help} command also highlights configuration
- commands, and those which may be issued at any time.
-
- Those configuration commands include declaration of TAPs,
- flash banks,
- the interface used for JTAG communication,
- and other basic setup.
- The server must leave the configuration stage before it
- may access or activate TAPs.
- After it leaves this stage, configuration commands may no
- longer be issued.
-
- @anchor{enteringtherunstage}
- @section Entering the Run Stage
-
- The first thing OpenOCD does after leaving the configuration
- stage is to verify that it can talk to the scan chain
- (list of TAPs) which has been configured.
- It will warn if it doesn't find TAPs it expects to find,
- or finds TAPs that aren't supposed to be there.
- You should see no errors at this point.
- If you see errors, resolve them by correcting the
- commands you used to configure the server.
- Common errors include using an initial JTAG speed that's too
- fast, and not providing the right IDCODE values for the TAPs
- on the scan chain.
-
- Once OpenOCD has entered the run stage, a number of commands
- become available.
- A number of these relate to the debug targets you may have declared.
- For example, the @command{mww} command will not be available until
- a target has been successfully instantiated.
- If you want to use those commands, you may need to force
- entry to the run stage.
-
- @deffn {Config Command} {init}
- This command terminates the configuration stage and
- enters the run stage. This helps when you need to have
- the startup scripts manage tasks such as resetting the target,
- programming flash, etc. To reset the CPU upon startup, add "init" and
- "reset" at the end of the config script or at the end of the OpenOCD
- command line using the @option{-c} command line switch.
-
- If this command does not appear in any startup/configuration file
- OpenOCD executes the command for you after processing all
- configuration files and/or command line options.
-
- @b{NOTE:} This command normally occurs at or near the end of your
- openocd.cfg file to force OpenOCD to ``initialize'' and make the
- targets ready. For example: If your openocd.cfg file needs to
- read/write memory on your target, @command{init} must occur before
- the memory read/write commands. This includes @command{nand probe}.
- @end deffn
-
- @deffn {Overridable Procedure} {jtag_init}
- This is invoked at server startup to verify that it can talk
- to the scan chain (list of TAPs) which has been configured.
-
- The default implementation first tries @command{jtag arp_init},
- which uses only a lightweight JTAG reset before examining the
- scan chain.
- If that fails, it tries again, using a harder reset
- from the overridable procedure @command{init_reset}.
-
- Implementations must have verified the JTAG scan chain before
- they return.
- This is done by calling @command{jtag arp_init}
- (or @command{jtag arp_init-reset}).
- @end deffn
-
- @anchor{tcpipports}
- @section TCP/IP Ports
- @cindex TCP port
- @cindex server
- @cindex port
- @cindex security
- The OpenOCD server accepts remote commands in several syntaxes.
- Each syntax uses a different TCP/IP port, which you may specify
- only during configuration (before those ports are opened).
-
- For reasons including security, you may wish to prevent remote
- access using one or more of these ports.
- In such cases, just specify the relevant port number as "disabled".
- If you disable all access through TCP/IP, you will need to
- use the command line @option{-pipe} option.
-
- @anchor{gdb_port}
- @deffn {Config Command} {gdb_port} [number]
- @cindex GDB server
- Normally gdb listens to a TCP/IP port, but GDB can also
- communicate via pipes(stdin/out or named pipes). The name
- "gdb_port" stuck because it covers probably more than 90% of
- the normal use cases.
-
- No arguments reports GDB port. "pipe" means listen to stdin
- output to stdout, an integer is base port number, "disabled"
- disables the gdb server.
-
- When using "pipe", also use log_output to redirect the log
- output to a file so as not to flood the stdin/out pipes.
-
- Any other string is interpreted as named pipe to listen to.
- Output pipe is the same name as input pipe, but with 'o' appended,
- e.g. /var/gdb, /var/gdbo.
-
- The GDB port for the first target will be the base port, the
- second target will listen on gdb_port + 1, and so on.
- When not specified during the configuration stage,
- the port @var{number} defaults to 3333.
- When @var{number} is not a numeric value, incrementing it to compute
- the next port number does not work. In this case, specify the proper
- @var{number} for each target by using the option @code{-gdb-port} of the
- commands @command{target create} or @command{$target_name configure}.
- @xref{gdbportoverride,,option -gdb-port}.
-
- Note: when using "gdb_port pipe", increasing the default remote timeout in
- gdb (with 'set remotetimeout') is recommended. An insufficient timeout may
- cause initialization to fail with "Unknown remote qXfer reply: OK".
- @end deffn
-
- @deffn {Config Command} {tcl_port} [number]
- Specify or query the port used for a simplified RPC
- connection that can be used by clients to issue TCL commands and get the
- output from the Tcl engine.
- Intended as a machine interface.
- When not specified during the configuration stage,
- the port @var{number} defaults to 6666.
- When specified as "disabled", this service is not activated.
- @end deffn
-
- @deffn {Config Command} {telnet_port} [number]
- Specify or query the
- port on which to listen for incoming telnet connections.
- This port is intended for interaction with one human through TCL commands.
- When not specified during the configuration stage,
- the port @var{number} defaults to 4444.
- When specified as "disabled", this service is not activated.
- @end deffn
-
- @anchor{gdbconfiguration}
- @section GDB Configuration
- @cindex GDB
- @cindex GDB configuration
- You can reconfigure some GDB behaviors if needed.
- The ones listed here are static and global.
- @xref{targetconfiguration,,Target Configuration}, about configuring individual targets.
- @xref{targetevents,,Target Events}, about configuring target-specific event handling.
-
- @anchor{gdbbreakpointoverride}
- @deffn {Command} {gdb_breakpoint_override} [@option{hard}|@option{soft}|@option{disable}]
- Force breakpoint type for gdb @command{break} commands.
- This option supports GDB GUIs which don't
- distinguish hard versus soft breakpoints, if the default OpenOCD and
- GDB behaviour is not sufficient. GDB normally uses hardware
- breakpoints if the memory map has been set up for flash regions.
- @end deffn
-
- @anchor{gdbflashprogram}
- @deffn {Config Command} {gdb_flash_program} (@option{enable}|@option{disable})
- Set to @option{enable} to cause OpenOCD to program the flash memory when a
- vFlash packet is received.
- The default behaviour is @option{enable}.
- @end deffn
-
- @deffn {Config Command} {gdb_memory_map} (@option{enable}|@option{disable})
- Set to @option{enable} to cause OpenOCD to send the memory configuration to GDB when
- requested. GDB will then know when to set hardware breakpoints, and program flash
- using the GDB load command. @command{gdb_flash_program enable} must also be enabled
- for flash programming to work.
- Default behaviour is @option{enable}.
- @xref{gdbflashprogram,,gdb_flash_program}.
- @end deffn
-
- @deffn {Config Command} {gdb_report_data_abort} (@option{enable}|@option{disable})
- Specifies whether data aborts cause an error to be reported
- by GDB memory read packets.
- The default behaviour is @option{disable};
- use @option{enable} see these errors reported.
- @end deffn
-
- @deffn {Config Command} {gdb_report_register_access_error} (@option{enable}|@option{disable})
- Specifies whether register accesses requested by GDB register read/write
- packets report errors or not.
- The default behaviour is @option{disable};
- use @option{enable} see these errors reported.
- @end deffn
-
- @deffn {Config Command} {gdb_target_description} (@option{enable}|@option{disable})
- Set to @option{enable} to cause OpenOCD to send the target descriptions to gdb via qXfer:features:read packet.
- The default behaviour is @option{enable}.
- @end deffn
-
- @deffn {Command} {gdb_save_tdesc}
- Saves the target description file to the local file system.
-
- The file name is @i{target_name}.xml.
- @end deffn
-
- @anchor{eventpolling}
- @section Event Polling
-
- Hardware debuggers are parts of asynchronous systems,
- where significant events can happen at any time.
- The OpenOCD server needs to detect some of these events,
- so it can report them to through TCL command line
- or to GDB.
-
- Examples of such events include:
-
- @itemize
- @item One of the targets can stop running ... maybe it triggers
- a code breakpoint or data watchpoint, or halts itself.
- @item Messages may be sent over ``debug message'' channels ... many
- targets support such messages sent over JTAG,
- for receipt by the person debugging or tools.
- @item Loss of power ... some adapters can detect these events.
- @item Resets not issued through JTAG ... such reset sources
- can include button presses or other system hardware, sometimes
- including the target itself (perhaps through a watchdog).
- @item Debug instrumentation sometimes supports event triggering
- such as ``trace buffer full'' (so it can quickly be emptied)
- or other signals (to correlate with code behavior).
- @end itemize
-
- None of those events are signaled through standard JTAG signals.
- However, most conventions for JTAG connectors include voltage
- level and system reset (SRST) signal detection.
- Some connectors also include instrumentation signals, which
- can imply events when those signals are inputs.
-
- In general, OpenOCD needs to periodically check for those events,
- either by looking at the status of signals on the JTAG connector
- or by sending synchronous ``tell me your status'' JTAG requests
- to the various active targets.
- There is a command to manage and monitor that polling,
- which is normally done in the background.
-
- @deffn {Command} {poll} [@option{on}|@option{off}]
- Poll the current target for its current state.
- (Also, @pxref{targetcurstate,,target curstate}.)
- If that target is in debug mode, architecture
- specific information about the current state is printed.
- An optional parameter
- allows background polling to be enabled and disabled.
-
- You could use this from the TCL command shell, or
- from GDB using @command{monitor poll} command.
- Leave background polling enabled while you're using GDB.
- @example
- > poll
- background polling: on
- target state: halted
- target halted in ARM state due to debug-request, \
- current mode: Supervisor
- cpsr: 0x800000d3 pc: 0x11081bfc
- MMU: disabled, D-Cache: disabled, I-Cache: enabled
- >
- @end example
- @end deffn
-
- @node Debug Adapter Configuration
- @chapter Debug Adapter Configuration
- @cindex config file, interface
- @cindex interface config file
-
- Correctly installing OpenOCD includes making your operating system give
- OpenOCD access to debug adapters. Once that has been done, Tcl commands
- are used to select which one is used, and to configure how it is used.
-
- @quotation Note
- Because OpenOCD started out with a focus purely on JTAG, you may find
- places where it wrongly presumes JTAG is the only transport protocol
- in use. Be aware that recent versions of OpenOCD are removing that
- limitation. JTAG remains more functional than most other transports.
- Other transports do not support boundary scan operations, or may be
- specific to a given chip vendor. Some might be usable only for
- programming flash memory, instead of also for debugging.
- @end quotation
-
- Debug Adapters/Interfaces/Dongles are normally configured
- through commands in an interface configuration
- file which is sourced by your @file{openocd.cfg} file, or
- through a command line @option{-f interface/....cfg} option.
-
- @example
- source [find interface/olimex-jtag-tiny.cfg]
- @end example
-
- These commands tell
- OpenOCD what type of JTAG adapter you have, and how to talk to it.
- A few cases are so simple that you only need to say what driver to use:
-
- @example
- # jlink interface
- adapter driver jlink
- @end example
-
- Most adapters need a bit more configuration than that.
-
-
- @section Adapter Configuration
-
- The @command{adapter driver} command tells OpenOCD what type of debug adapter you are
- using. Depending on the type of adapter, you may need to use one or
- more additional commands to further identify or configure the adapter.
-
- @deffn {Config Command} {adapter driver} name
- Use the adapter driver @var{name} to connect to the
- target.
- @end deffn
-
- @deffn {Command} {adapter list}
- List the debug adapter drivers that have been built into
- the running copy of OpenOCD.
- @end deffn
- @deffn {Config Command} {adapter transports} transport_name+
- Specifies the transports supported by this debug adapter.
- The adapter driver builds-in similar knowledge; use this only
- when external configuration (such as jumpering) changes what
- the hardware can support.
- @end deffn
-
-
-
- @deffn {Command} {adapter name}
- Returns the name of the debug adapter driver being used.
- @end deffn
-
- @anchor{adapter_usb_location}
- @deffn {Config Command} {adapter usb location} [<bus>-<port>[.<port>]...]
- Displays or specifies the physical USB port of the adapter to use. The path
- roots at @var{bus} and walks down the physical ports, with each
- @var{port} option specifying a deeper level in the bus topology, the last
- @var{port} denoting where the target adapter is actually plugged.
- The USB bus topology can be queried with the command @emph{lsusb -t} or @emph{dmesg}.
-
- This command is only available if your libusb1 is at least version 1.0.16.
- @end deffn
-
- @section Interface Drivers
-
- Each of the interface drivers listed here must be explicitly
- enabled when OpenOCD is configured, in order to be made
- available at run time.
-
- @deffn {Interface Driver} {amt_jtagaccel}
- Amontec Chameleon in its JTAG Accelerator configuration,
- connected to a PC's EPP mode parallel port.
- This defines some driver-specific commands:
-
- @deffn {Config Command} {parport port} number
- Specifies either the address of the I/O port (default: 0x378 for LPT1) or
- the number of the @file{/dev/parport} device.
- @end deffn
-
- @deffn {Config Command} {rtck} [@option{enable}|@option{disable}]
- Displays status of RTCK option.
- Optionally sets that option first.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {arm-jtag-ew}
- Olimex ARM-JTAG-EW USB adapter
- This has one driver-specific command:
-
- @deffn {Command} {armjtagew_info}
- Logs some status
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {at91rm9200}
- Supports bitbanged JTAG from the local system,
- presuming that system is an Atmel AT91rm9200
- and a specific set of GPIOs is used.
- @c command: at91rm9200_device NAME
- @c chooses among list of bit configs ... only one option
- @end deffn
-
- @deffn {Interface Driver} {cmsis-dap}
- ARM CMSIS-DAP compliant based adapter v1 (USB HID based)
- or v2 (USB bulk).
-
- @deffn {Config Command} {cmsis_dap_vid_pid} [vid pid]+
- The vendor ID and product ID of the CMSIS-DAP device. If not specified
- the driver will attempt to auto detect the CMSIS-DAP device.
- Currently, up to eight [@var{vid}, @var{pid}] pairs may be given, e.g.
- @example
- cmsis_dap_vid_pid 0xc251 0xf001 0x0d28 0x0204
- @end example
- @end deffn
-
- @deffn {Config Command} {cmsis_dap_serial} [serial]
- Specifies the @var{serial} of the CMSIS-DAP device to use.
- If not specified, serial numbers are not considered.
- @end deffn
-
- @deffn {Config Command} {cmsis_dap_backend} [@option{auto}|@option{usb_bulk}|@option{hid}]
- Specifies how to communicate with the adapter:
-
- @itemize @minus
- @item @option{hid} Use HID generic reports - CMSIS-DAP v1
- @item @option{usb_bulk} Use USB bulk - CMSIS-DAP v2
- @item @option{auto} First try USB bulk CMSIS-DAP v2, if not found try HID CMSIS-DAP v1.
- This is the default if @command{cmsis_dap_backend} is not specified.
- @end itemize
- @end deffn
-
- @deffn {Config Command} {cmsis_dap_usb interface} [number]
- Specifies the @var{number} of the USB interface to use in v2 mode (USB bulk).
- In most cases need not to be specified and interfaces are searched by
- interface string or for user class interface.
- @end deffn
-
- @deffn {Command} {cmsis-dap info}
- Display various device information, like hardware version, firmware version, current bus status.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {dummy}
- A dummy software-only driver for debugging.
- @end deffn
-
- @deffn {Interface Driver} {ep93xx}
- Cirrus Logic EP93xx based single-board computer bit-banging (in development)
- @end deffn
-
- @deffn {Interface Driver} {ftdi}
- This driver is for adapters using the MPSSE (Multi-Protocol Synchronous Serial
- Engine) mode built into many FTDI chips, such as the FT2232, FT4232 and FT232H.
-
- The driver is using libusb-1.0 in asynchronous mode to talk to the FTDI device,
- bypassing intermediate libraries like libftdi or D2XX.
-
- Support for new FTDI based adapters can be added completely through
- configuration files, without the need to patch and rebuild OpenOCD.
-
- The driver uses a signal abstraction to enable Tcl configuration files to
- define outputs for one or several FTDI GPIO. These outputs can then be
- controlled using the @command{ftdi set_signal} command. Special signal names
- are reserved for nTRST, nSRST and LED (for blink) so that they, if defined,
- will be used for their customary purpose. Inputs can be read using the
- @command{ftdi get_signal} command.
-
- To support SWD, a signal named SWD_EN must be defined. It is set to 1 when the
- SWD protocol is selected. When set, the adapter should route the SWDIO pin to
- the data input. An SWDIO_OE signal, if defined, will be set to 1 or 0 as
- required by the protocol, to tell the adapter to drive the data output onto
- the SWDIO pin or keep the SWDIO pin Hi-Z, respectively.
-
- Depending on the type of buffer attached to the FTDI GPIO, the outputs have to
- be controlled differently. In order to support tristateable signals such as
- nSRST, both a data GPIO and an output-enable GPIO can be specified for each
- signal. The following output buffer configurations are supported:
-
- @itemize @minus
- @item Push-pull with one FTDI output as (non-)inverted data line
- @item Open drain with one FTDI output as (non-)inverted output-enable
- @item Tristate with one FTDI output as (non-)inverted data line and another
- FTDI output as (non-)inverted output-enable
- @item Unbuffered, using the FTDI GPIO as a tristate output directly by
- switching data and direction as necessary
- @end itemize
-
- These interfaces have several commands, used to configure the driver
- before initializing the JTAG scan chain:
-
- @deffn {Config Command} {ftdi vid_pid} [vid pid]+
- The vendor ID and product ID of the adapter. Up to eight
- [@var{vid}, @var{pid}] pairs may be given, e.g.
- @example
- ftdi vid_pid 0x0403 0xcff8 0x15ba 0x0003
- @end example
- @end deffn
-
- @deffn {Config Command} {ftdi device_desc} description
- Provides the USB device description (the @emph{iProduct string})
- of the adapter. If not specified, the device description is ignored
- during device selection.
- @end deffn
-
- @deffn {Config Command} {ftdi serial} serial-number
- Specifies the @var{serial-number} of the adapter to use,
- in case the vendor provides unique IDs and more than one adapter
- is connected to the host.
- If not specified, serial numbers are not considered.
- (Note that USB serial numbers can be arbitrary Unicode strings,
- and are not restricted to containing only decimal digits.)
- @end deffn
-
- @deffn {Config Command} {ftdi channel} channel
- Selects the channel of the FTDI device to use for MPSSE operations. Most
- adapters use the default, channel 0, but there are exceptions.
- @end deffn
-
- @deffn {Config Command} {ftdi layout_init} data direction
- Specifies the initial values of the FTDI GPIO data and direction registers.
- Each value is a 16-bit number corresponding to the concatenation of the high
- and low FTDI GPIO registers. The values should be selected based on the
- schematics of the adapter, such that all signals are set to safe levels with
- minimal impact on the target system. Avoid floating inputs, conflicting outputs
- and initially asserted reset signals.
- @end deffn
-
- @deffn {Command} {ftdi layout_signal} name [@option{-data}|@option{-ndata} data_mask] [@option{-input}|@option{-ninput} input_mask] [@option{-oe}|@option{-noe} oe_mask] [@option{-alias}|@option{-nalias} name]
- Creates a signal with the specified @var{name}, controlled by one or more FTDI
- GPIO pins via a range of possible buffer connections. The masks are FTDI GPIO
- register bitmasks to tell the driver the connection and type of the output
- buffer driving the respective signal. @var{data_mask} is the bitmask for the
- pin(s) connected to the data input of the output buffer. @option{-ndata} is
- used with inverting data inputs and @option{-data} with non-inverting inputs.
- The @option{-oe} (or @option{-noe}) option tells where the output-enable (or
- not-output-enable) input to the output buffer is connected. The options
- @option{-input} and @option{-ninput} specify the bitmask for pins to be read
- with the method @command{ftdi get_signal}.
-
- Both @var{data_mask} and @var{oe_mask} need not be specified. For example, a
- simple open-collector transistor driver would be specified with @option{-oe}
- only. In that case the signal can only be set to drive low or to Hi-Z and the
- driver will complain if the signal is set to drive high. Which means that if
- it's a reset signal, @command{reset_config} must be specified as
- @option{srst_open_drain}, not @option{srst_push_pull}.
-
- A special case is provided when @option{-data} and @option{-oe} is set to the
- same bitmask. Then the FTDI pin is considered being connected straight to the
- target without any buffer. The FTDI pin is then switched between output and
- input as necessary to provide the full set of low, high and Hi-Z
- characteristics. In all other cases, the pins specified in a signal definition
- are always driven by the FTDI.
-
- If @option{-alias} or @option{-nalias} is used, the signal is created
- identical (or with data inverted) to an already specified signal
- @var{name}.
- @end deffn
-
- @deffn {Command} {ftdi set_signal} name @option{0}|@option{1}|@option{z}
- Set a previously defined signal to the specified level.
- @itemize @minus
- @item @option{0}, drive low
- @item @option{1}, drive high
- @item @option{z}, set to high-impedance
- @end itemize
- @end deffn
-
- @deffn {Command} {ftdi get_signal} name
- Get the value of a previously defined signal.
- @end deffn
-
- @deffn {Command} {ftdi tdo_sample_edge} @option{rising}|@option{falling}
- Configure TCK edge at which the adapter samples the value of the TDO signal
-
- Due to signal propagation delays, sampling TDO on rising TCK can become quite
- peculiar at high JTAG clock speeds. However, FTDI chips offer a possibility to sample
- TDO on falling edge of TCK. With some board/adapter configurations, this may increase
- stability at higher JTAG clocks.
- @itemize @minus
- @item @option{rising}, sample TDO on rising edge of TCK - this is the default
- @item @option{falling}, sample TDO on falling edge of TCK
- @end itemize
- @end deffn
-
- For example adapter definitions, see the configuration files shipped in the
- @file{interface/ftdi} directory.
-
- @end deffn
-
- @deffn {Interface Driver} {ft232r}
- This driver is implementing synchronous bitbang mode of an FTDI FT232R,
- FT230X, FT231X and similar USB UART bridge ICs by reusing RS232 signals as GPIO.
- It currently doesn't support using CBUS pins as GPIO.
-
- List of connections (default physical pin numbers for FT232R in 28-pin SSOP package):
- @itemize @minus
- @item RXD(5) - TDI
- @item TXD(1) - TCK
- @item RTS(3) - TDO
- @item CTS(11) - TMS
- @item DTR(2) - TRST
- @item DCD(10) - SRST
- @end itemize
-
- User can change default pinout by supplying configuration
- commands with GPIO numbers or RS232 signal names.
- GPIO numbers correspond to bit numbers in FTDI GPIO register.
- They differ from physical pin numbers.
- For details see actual FTDI chip datasheets.
- Every JTAG line must be configured to unique GPIO number
- different than any other JTAG line, even those lines
- that are sometimes not used like TRST or SRST.
-
- FT232R
- @itemize @minus
- @item bit 7 - RI
- @item bit 6 - DCD
- @item bit 5 - DSR
- @item bit 4 - DTR
- @item bit 3 - CTS
- @item bit 2 - RTS
- @item bit 1 - RXD
- @item bit 0 - TXD
- @end itemize
-
- These interfaces have several commands, used to configure the driver
- before initializing the JTAG scan chain:
-
- @deffn {Config Command} {ft232r_vid_pid} @var{vid} @var{pid}
- The vendor ID and product ID of the adapter. If not specified, default
- 0x0403:0x6001 is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_serial_desc} @var{serial}
- Specifies the @var{serial} of the adapter to use, in case the
- vendor provides unique IDs and more than one adapter is connected to
- the host. If not specified, serial numbers are not considered.
- @end deffn
-
- @deffn {Config Command} {ft232r_jtag_nums} @var{tck} @var{tms} @var{tdi} @var{tdo}
- Set four JTAG GPIO numbers at once.
- If not specified, default 0 3 1 2 or TXD CTS RXD RTS is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_tck_num} @var{tck}
- Set TCK GPIO number. If not specified, default 0 or TXD is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_tms_num} @var{tms}
- Set TMS GPIO number. If not specified, default 3 or CTS is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_tdi_num} @var{tdi}
- Set TDI GPIO number. If not specified, default 1 or RXD is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_tdo_num} @var{tdo}
- Set TDO GPIO number. If not specified, default 2 or RTS is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_trst_num} @var{trst}
- Set TRST GPIO number. If not specified, default 4 or DTR is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_srst_num} @var{srst}
- Set SRST GPIO number. If not specified, default 6 or DCD is used.
- @end deffn
-
- @deffn {Config Command} {ft232r_restore_serial} @var{word}
- Restore serial port after JTAG. This USB bitmode control word
- (16-bit) will be sent before quit. Lower byte should
- set GPIO direction register to a "sane" state:
- 0x15 for TXD RTS DTR as outputs (1), others as inputs (0). Higher
- byte is usually 0 to disable bitbang mode.
- When kernel driver reattaches, serial port should continue to work.
- Value 0xFFFF disables sending control word and serial port,
- then kernel driver will not reattach.
- If not specified, default 0xFFFF is used.
- @end deffn
-
- @end deffn
-
- @deffn {Interface Driver} {remote_bitbang}
- Drive JTAG from a remote process. This sets up a UNIX or TCP socket connection
- with a remote process and sends ASCII encoded bitbang requests to that process
- instead of directly driving JTAG.
-
- The remote_bitbang driver is useful for debugging software running on
- processors which are being simulated.
-
- @deffn {Config Command} {remote_bitbang port} number
- Specifies the TCP port of the remote process to connect to or 0 to use UNIX
- sockets instead of TCP.
- @end deffn
-
- @deffn {Config Command} {remote_bitbang host} hostname
- Specifies the hostname of the remote process to connect to using TCP, or the
- name of the UNIX socket to use if remote_bitbang port is 0.
- @end deffn
-
- For example, to connect remotely via TCP to the host foobar you might have
- something like:
-
- @example
- adapter driver remote_bitbang
- remote_bitbang port 3335
- remote_bitbang host foobar
- @end example
-
- To connect to another process running locally via UNIX sockets with socket
- named mysocket:
-
- @example
- adapter driver remote_bitbang
- remote_bitbang port 0
- remote_bitbang host mysocket
- @end example
- @end deffn
-
- @deffn {Interface Driver} {usb_blaster}
- USB JTAG/USB-Blaster compatibles over one of the userspace libraries
- for FTDI chips. These interfaces have several commands, used to
- configure the driver before initializing the JTAG scan chain:
-
- @deffn {Config Command} {usb_blaster_device_desc} description
- Provides the USB device description (the @emph{iProduct string})
- of the FTDI FT245 device. If not
- specified, the FTDI default value is used. This setting is only valid
- if compiled with FTD2XX support.
- @end deffn
-
- @deffn {Config Command} {usb_blaster_vid_pid} vid pid
- The vendor ID and product ID of the FTDI FT245 device. If not specified,
- default values are used.
- Currently, only one @var{vid}, @var{pid} pair may be given, e.g. for
- Altera USB-Blaster (default):
- @example
- usb_blaster_vid_pid 0x09FB 0x6001
- @end example
- The following VID/PID is for Kolja Waschk's USB JTAG:
- @example
- usb_blaster_vid_pid 0x16C0 0x06AD
- @end example
- @end deffn
-
- @deffn {Command} {usb_blaster_pin} (@option{pin6}|@option{pin8}) (@option{0}|@option{1}|@option{s}|@option{t})
- Sets the state or function of the unused GPIO pins on USB-Blasters
- (pins 6 and 8 on the female JTAG header). These pins can be used as
- SRST and/or TRST provided the appropriate connections are made on the
- target board.
-
- For example, to use pin 6 as SRST:
- @example
- usb_blaster_pin pin6 s
- reset_config srst_only
- @end example
- @end deffn
-
- @deffn {Config Command} {usb_blaster_lowlevel_driver} (@option{ftdi}|@option{ublast2})
- Chooses the low level access method for the adapter. If not specified,
- @option{ftdi} is selected unless it wasn't enabled during the
- configure stage. USB-Blaster II needs @option{ublast2}.
- @end deffn
-
- @deffn {Config Command} {usb_blaster_firmware} @var{path}
- This command specifies @var{path} to access USB-Blaster II firmware
- image. To be used with USB-Blaster II only.
- @end deffn
-
- @end deffn
-
- @deffn {Interface Driver} {gw16012}
- Gateworks GW16012 JTAG programmer.
- This has one driver-specific command:
-
- @deffn {Config Command} {parport port} [port_number]
- Display either the address of the I/O port
- (default: 0x378 for LPT1) or the number of the @file{/dev/parport} device.
- If a parameter is provided, first switch to use that port.
- This is a write-once setting.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {jlink}
- SEGGER J-Link family of USB adapters. It currently supports JTAG and SWD
- transports.
-
- @quotation Compatibility Note
- SEGGER released many firmware versions for the many hardware versions they
- produced. OpenOCD was extensively tested and intended to run on all of them,
- but some combinations were reported as incompatible. As a general
- recommendation, it is advisable to use the latest firmware version
- available for each hardware version. However the current V8 is a moving
- target, and SEGGER firmware versions released after the OpenOCD was
- released may not be compatible. In such cases it is recommended to
- revert to the last known functional version. For 0.5.0, this is from
- "Feb 8 2012 14:30:39", packed with 4.42c. For 0.6.0, the last known
- version is from "May 3 2012 18:36:22", packed with 4.46f.
- @end quotation
-
- @deffn {Command} {jlink hwstatus}
- Display various hardware related information, for example target voltage and pin
- states.
- @end deffn
- @deffn {Command} {jlink freemem}
- Display free device internal memory.
- @end deffn
- @deffn {Command} {jlink jtag} [@option{2}|@option{3}]
- Set the JTAG command version to be used. Without argument, show the actual JTAG
- command version.
- @end deffn
- @deffn {Command} {jlink config}
- Display the device configuration.
- @end deffn
- @deffn {Command} {jlink config targetpower} [@option{on}|@option{off}]
- Set the target power state on JTAG-pin 19. Without argument, show the target
- power state.
- @end deffn
- @deffn {Command} {jlink config mac} [@option{ff:ff:ff:ff:ff:ff}]
- Set the MAC address of the device. Without argument, show the MAC address.
- @end deffn
- @deffn {Command} {jlink config ip} [@option{A.B.C.D}(@option{/E}|@option{F.G.H.I})]
- Set the IP configuration of the device, where A.B.C.D is the IP address, E the
- bit of the subnet mask and F.G.H.I the subnet mask. Without arguments, show the
- IP configuration.
- @end deffn
- @deffn {Command} {jlink config usb} [@option{0} to @option{3}]
- Set the USB address of the device. This will also change the USB Product ID
- (PID) of the device. Without argument, show the USB address.
- @end deffn
- @deffn {Command} {jlink config reset}
- Reset the current configuration.
- @end deffn
- @deffn {Command} {jlink config write}
- Write the current configuration to the internal persistent storage.
- @end deffn
- @deffn {Command} {jlink emucom write <channel> <data>}
- Write data to an EMUCOM channel. The data needs to be encoded as hexadecimal
- pairs.
-
- The following example shows how to write the three bytes 0xaa, 0x0b and 0x23 to
- the EMUCOM channel 0x10:
- @example
- > jlink emucom write 0x10 aa0b23
- @end example
- @end deffn
- @deffn {Command} {jlink emucom read <channel> <length>}
- Read data from an EMUCOM channel. The read data is encoded as hexadecimal
- pairs.
-
- The following example shows how to read 4 bytes from the EMUCOM channel 0x0:
- @example
- > jlink emucom read 0x0 4
- 77a90000
- @end example
- @end deffn
- @deffn {Config Command} {jlink usb} <@option{0} to @option{3}>
- Set the USB address of the interface, in case more than one adapter is connected
- to the host. If not specified, USB addresses are not considered. Device
- selection via USB address is not always unambiguous. It is recommended to use
- the serial number instead, if possible.
-
- As a configuration command, it can be used only before 'init'.
- @end deffn
- @deffn {Config Command} {jlink serial} <serial number>
- Set the serial number of the interface, in case more than one adapter is
- connected to the host. If not specified, serial numbers are not considered.
-
- As a configuration command, it can be used only before 'init'.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {kitprog}
- This driver is for Cypress Semiconductor's KitProg adapters. The KitProg is an
- SWD-only adapter that is designed to be used with Cypress's PSoC and PRoC device
- families, but it is possible to use it with some other devices. If you are using
- this adapter with a PSoC or a PRoC, you may need to add
- @command{kitprog_init_acquire_psoc} or @command{kitprog acquire_psoc} to your
- configuration script.
-
- Note that this driver is for the proprietary KitProg protocol, not the CMSIS-DAP
- mode introduced in firmware 2.14. If the KitProg is in CMSIS-DAP mode, it cannot
- be used with this driver, and must either be used with the cmsis-dap driver or
- switched back to KitProg mode. See the Cypress KitProg User Guide for
- instructions on how to switch KitProg modes.
-
- Known limitations:
- @itemize @bullet
- @item The frequency of SWCLK cannot be configured, and varies between 1.6 MHz
- and 2.7 MHz.
- @item For firmware versions below 2.14, "JTAG to SWD" sequences are replaced by
- "SWD line reset" in the driver. This is for two reasons. First, the KitProg does
- not support sending arbitrary SWD sequences, and only firmware 2.14 and later
- implement both "JTAG to SWD" and "SWD line reset" in firmware. Earlier firmware
- versions only implement "SWD line reset". Second, due to a firmware quirk, an
- SWD sequence must be sent after every target reset in order to re-establish
- communications with the target.
- @item Due in part to the limitation above, KitProg devices with firmware below
- version 2.14 will need to use @command{kitprog_init_acquire_psoc} in order to
- communicate with PSoC 5LP devices. This is because, assuming debug is not
- disabled on the PSoC, the PSoC 5LP needs its JTAG interface switched to SWD
- mode before communication can begin, but prior to firmware 2.14, "JTAG to SWD"
- could only be sent with an acquisition sequence.
- @end itemize
-
- @deffn {Config Command} {kitprog_init_acquire_psoc}
- Indicate that a PSoC acquisition sequence needs to be run during adapter init.
- Please be aware that the acquisition sequence hard-resets the target.
- @end deffn
-
- @deffn {Config Command} {kitprog_serial} serial
- Select a KitProg device by its @var{serial}. If left unspecified, the first
- device detected by OpenOCD will be used.
- @end deffn
-
- @deffn {Command} {kitprog acquire_psoc}
- Run a PSoC acquisition sequence immediately. Typically, this should not be used
- outside of the target-specific configuration scripts since it hard-resets the
- target as a side-effect.
- This is necessary for "reset halt" on some PSoC 4 series devices.
- @end deffn
-
- @deffn {Command} {kitprog info}
- Display various adapter information, such as the hardware version, firmware
- version, and target voltage.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {parport}
- Supports PC parallel port bit-banging cables:
- Wigglers, PLD download cable, and more.
- These interfaces have several commands, used to configure the driver
- before initializing the JTAG scan chain:
-
- @deffn {Config Command} {parport cable} name
- Set the layout of the parallel port cable used to connect to the target.
- This is a write-once setting.
- Currently valid cable @var{name} values include:
-
- @itemize @minus
- @item @b{altium} Altium Universal JTAG cable.
- @item @b{arm-jtag} Same as original wiggler except SRST and
- TRST connections reversed and TRST is also inverted.
- @item @b{chameleon} The Amontec Chameleon's CPLD when operated
- in configuration mode. This is only used to
- program the Chameleon itself, not a connected target.
- @item @b{dlc5} The Xilinx Parallel cable III.
- @item @b{flashlink} The ST Parallel cable.
- @item @b{lattice} Lattice ispDOWNLOAD Cable
- @item @b{old_amt_wiggler} The Wiggler configuration that comes with
- some versions of
- Amontec's Chameleon Programmer. The new version available from
- the website uses the original Wiggler layout ('@var{wiggler}')
- @item @b{triton} The parallel port adapter found on the
- ``Karo Triton 1 Development Board''.
- This is also the layout used by the HollyGates design
- (see @uref{http://www.lartmaker.nl/projects/jtag/}).
- @item @b{wiggler} The original Wiggler layout, also supported by
- several clones, such as the Olimex ARM-JTAG
- @item @b{wiggler2} Same as original wiggler except an led is fitted on D5.
- @item @b{wiggler_ntrst_inverted} Same as original wiggler except TRST is inverted.
- @end itemize
- @end deffn
-
- @deffn {Config Command} {parport port} [port_number]
- Display either the address of the I/O port
- (default: 0x378 for LPT1) or the number of the @file{/dev/parport} device.
- If a parameter is provided, first switch to use that port.
- This is a write-once setting.
-
- When using PPDEV to access the parallel port, use the number of the parallel port:
- @option{parport port 0} (the default). If @option{parport port 0x378} is specified
- you may encounter a problem.
- @end deffn
-
- @deffn {Config Command} {parport toggling_time} [nanoseconds]
- Displays how many nanoseconds the hardware needs to toggle TCK;
- the parport driver uses this value to obey the
- @command{adapter speed} configuration.
- When the optional @var{nanoseconds} parameter is given,
- that setting is changed before displaying the current value.
-
- The default setting should work reasonably well on commodity PC hardware.
- However, you may want to calibrate for your specific hardware.
- @quotation Tip
- To measure the toggling time with a logic analyzer or a digital storage
- oscilloscope, follow the procedure below:
- @example
- > parport toggling_time 1000
- > adapter speed 500
- @end example
- This sets the maximum JTAG clock speed of the hardware, but
- the actual speed probably deviates from the requested 500 kHz.
- Now, measure the time between the two closest spaced TCK transitions.
- You can use @command{runtest 1000} or something similar to generate a
- large set of samples.
- Update the setting to match your measurement:
- @example
- > parport toggling_time <measured nanoseconds>
- @end example
- Now the clock speed will be a better match for @command{adapter speed}
- command given in OpenOCD scripts and event handlers.
-
- You can do something similar with many digital multimeters, but note
- that you'll probably need to run the clock continuously for several
- seconds before it decides what clock rate to show. Adjust the
- toggling time up or down until the measured clock rate is a good
- match with the rate you specified in the @command{adapter speed} command;
- be conservative.
- @end quotation
- @end deffn
-
- @deffn {Config Command} {parport write_on_exit} (@option{on}|@option{off})
- This will configure the parallel driver to write a known
- cable-specific value to the parallel interface on exiting OpenOCD.
- @end deffn
-
- For example, the interface configuration file for a
- classic ``Wiggler'' cable on LPT2 might look something like this:
-
- @example
- adapter driver parport
- parport port 0x278
- parport cable wiggler
- @end example
- @end deffn
-
- @deffn {Interface Driver} {presto}
- ASIX PRESTO USB JTAG programmer.
- @deffn {Config Command} {presto serial} serial_string
- Configures the USB serial number of the Presto device to use.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {rlink}
- Raisonance RLink USB adapter
- @end deffn
-
- @deffn {Interface Driver} {usbprog}
- usbprog is a freely programmable USB adapter.
- @end deffn
-
- @deffn {Interface Driver} {vsllink}
- vsllink is part of Versaloon which is a versatile USB programmer.
-
- @quotation Note
- This defines quite a few driver-specific commands,
- which are not currently documented here.
- @end quotation
- @end deffn
-
- @anchor{hla_interface}
- @deffn {Interface Driver} {hla}
- This is a driver that supports multiple High Level Adapters.
- This type of adapter does not expose some of the lower level api's
- that OpenOCD would normally use to access the target.
-
- Currently supported adapters include the STMicroelectronics ST-LINK, TI ICDI
- and Nuvoton Nu-Link.
- ST-LINK firmware version >= V2.J21.S4 recommended due to issues with earlier
- versions of firmware where serial number is reset after first use. Suggest
- using ST firmware update utility to upgrade ST-LINK firmware even if current
- version reported is V2.J21.S4.
-
- @deffn {Config Command} {hla_device_desc} description
- Currently Not Supported.
- @end deffn
-
- @deffn {Config Command} {hla_serial} serial
- Specifies the serial number of the adapter.
- @end deffn
-
- @deffn {Config Command} {hla_layout} (@option{stlink}|@option{icdi}|@option{nulink})
- Specifies the adapter layout to use.
- @end deffn
-
- @deffn {Config Command} {hla_vid_pid} [vid pid]+
- Pairs of vendor IDs and product IDs of the device.
- @end deffn
-
- @deffn {Config Command} {hla_stlink_backend} (usb | tcp [port])
- @emph{ST-Link only:} Choose between 'exclusive' USB communication (the default backend) or
- 'shared' mode using ST-Link TCP server (the default port is 7184).
-
- @emph{Note:} ST-Link TCP server is a binary application provided by ST
- available from @url{https://www.st.com/en/development-tools/st-link-server.html,
- ST-LINK server software module}.
- @end deffn
-
- @deffn {Command} {hla_command} command
- Execute a custom adapter-specific command. The @var{command} string is
- passed as is to the underlying adapter layout handler.
- @end deffn
- @end deffn
-
- @anchor{st_link_dap_interface}
- @deffn {Interface Driver} {st-link}
- This is a driver that supports STMicroelectronics adapters ST-LINK/V2
- (from firmware V2J24) and STLINK-V3, thanks to a new API that provides
- directly access the arm ADIv5 DAP.
-
- The new API provide access to multiple AP on the same DAP, but the
- maximum number of the AP port is limited by the specific firmware version
- (e.g. firmware V2J29 has 3 as maximum AP number, while V2J32 has 8).
- An error is returned for any AP number above the maximum allowed value.
-
- @emph{Note:} Either these same adapters and their older versions are
- also supported by @ref{hla_interface, the hla interface driver}.
-
- @deffn {Config Command} {st-link backend} (usb | tcp [port])
- Choose between 'exclusive' USB communication (the default backend) or
- 'shared' mode using ST-Link TCP server (the default port is 7184).
-
- @emph{Note:} ST-Link TCP server is a binary application provided by ST
- available from @url{https://www.st.com/en/development-tools/st-link-server.html,
- ST-LINK server software module}.
-
- @emph{Note:} ST-Link TCP server does not support the SWIM transport.
- @end deffn
-
- @deffn {Config Command} {st-link serial} serial
- Specifies the serial number of the adapter.
- @end deffn
-
- @deffn {Config Command} {st-link vid_pid} [vid pid]+
- Pairs of vendor IDs and product IDs of the device.
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {opendous}
- opendous-jtag is a freely programmable USB adapter.
- @end deffn
-
- @deffn {Interface Driver} {ulink}
- This is the Keil ULINK v1 JTAG debugger.
- @end deffn
-
- @deffn {Interface Driver} {xds110}
- The XDS110 is included as the embedded debug probe on many Texas Instruments
- LaunchPad evaluation boards. The XDS110 is also available as a stand-alone USB
- debug probe with the added capability to supply power to the target board. The
- following commands are supported by the XDS110 driver:
-
- @deffn {Config Command} {xds110 serial} serial_string
- Specifies the serial number of which XDS110 probe to use. Otherwise, the first
- XDS110 found will be used.
- @end deffn
-
- @deffn {Config Command} {xds110 supply} voltage_in_millivolts
- Available only on the XDS110 stand-alone probe. Sets the voltage level of the
- XDS110 power supply. A value of 0 leaves the supply off. Otherwise, the supply
- can be set to any value in the range 1800 to 3600 millivolts.
- @end deffn
-
- @deffn {Command} {xds110 info}
- Displays information about the connected XDS110 debug probe (e.g. firmware
- version).
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {xlnx_pcie_xvc}
- This driver supports the Xilinx Virtual Cable (XVC) over PCI Express.
- It is commonly found in Xilinx based PCI Express designs. It allows debugging
- fabric based JTAG/SWD devices such as Cortex-M1/M3 microcontrollers. Access to this is
- exposed via extended capability registers in the PCI Express configuration space.
-
- For more information see Xilinx PG245 (Section on From_PCIE_to_JTAG mode).
-
- @deffn {Config Command} {xlnx_pcie_xvc config} device
- Specifies the PCI Express device via parameter @var{device} to use.
-
- The correct value for @var{device} can be obtained by looking at the output
- of lscpi -D (first column) for the corresponding device.
-
- The string will be of the format "DDDD:BB:SS.F" such as "0000:65:00.1".
-
- @end deffn
- @end deffn
-
- @deffn {Interface Driver} {bcm2835gpio}
- This SoC is present in Raspberry Pi which is a cheap single-board computer
- exposing some GPIOs on its expansion header.
-
- The driver accesses memory-mapped GPIO peripheral registers directly
- for maximum performance, but the only possible race condition is for
- the pins' modes/muxing (which is highly unlikely), so it should be
- able to coexist nicely with both sysfs bitbanging and various
- peripherals' kernel drivers. The driver restores the previous
- configuration on exit.
-
- See @file{interface/raspberrypi-native.cfg} for a sample config and
- pinout.
-
- @deffn {Config Command} {bcm2835gpio jtag_nums} @var{tck} @var{tms} @var{tdi} @var{tdo}
- Set JTAG transport GPIO numbers for TCK, TMS, TDI, and TDO (in that order).
- Must be specified to enable JTAG transport. These pins can also be specified
- individually.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio tck_num} @var{tck}
- Set TCK GPIO number. Must be specified to enable JTAG transport. Can also be
- specified using the configuration command @command{bcm2835gpio jtag_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio tms_num} @var{tms}
- Set TMS GPIO number. Must be specified to enable JTAG transport. Can also be
- specified using the configuration command @command{bcm2835gpio jtag_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio tdo_num} @var{tdo}
- Set TDO GPIO number. Must be specified to enable JTAG transport. Can also be
- specified using the configuration command @command{bcm2835gpio jtag_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio tdi_num} @var{tdi}
- Set TDI GPIO number. Must be specified to enable JTAG transport. Can also be
- specified using the configuration command @command{bcm2835gpio jtag_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio swd_nums} @var{swclk} @var{swdio}
- Set SWD transport GPIO numbers for SWCLK and SWDIO (in that order). Must be
- specified to enable SWD transport. These pins can also be specified individually.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio swclk_num} @var{swclk}
- Set SWCLK GPIO number. Must be specified to enable SWD transport. Can also be
- specified using the configuration command @command{bcm2835gpio swd_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio swdio_num} @var{swdio}
- Set SWDIO GPIO number. Must be specified to enable SWD transport. Can also be
- specified using the configuration command @command{bcm2835gpio swd_nums}.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio swdio_dir_num} @var{swdio} @var{dir}
- Set SWDIO direction control pin GPIO number. If specified, this pin can be used
- to control the direction of an external buffer on the SWDIO pin (set=output
- mode, clear=input mode). If not specified, this feature is disabled.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio srst_num} @var{srst}
- Set SRST GPIO number. Must be specified to enable SRST.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio trst_num} @var{trst}
- Set TRST GPIO number. Must be specified to enable TRST.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio speed_coeffs} @var{speed_coeff} @var{speed_offset}
- Set SPEED_COEFF and SPEED_OFFSET for delay calculations. If unspecified,
- speed_coeff defaults to 113714, and speed_offset defaults to 28.
- @end deffn
-
- @deffn {Config Command} {bcm2835gpio peripheral_base} @var{base}
- Set the peripheral base register address to access GPIOs. For the RPi1, use
- 0x20000000. For RPi2 and RPi3, use 0x3F000000. For RPi4, use 0xFE000000. A full
- list can be found in the
- @uref{https://www.raspberrypi.org/documentation/hardware/raspberrypi/peripheral_addresses.md, official guide}.
- @end deffn
-
- @end deffn
-
- @deffn {Interface Driver} {imx_gpio}
- i.MX SoC is present in many community boards. Wandboard is an example
- of the one which is most popular.
-
- This driver is mostly the same as bcm2835gpio.
-
- See @file{interface/imx-native.cfg} for a sample config and
- pinout.
-
- @end deffn
-
-
- @deffn {Interface Driver} {linuxgpiod}
- Linux provides userspace access to GPIO through libgpiod since Linux kernel version v4.6.
- The driver emulates either JTAG and SWD transport through bitbanging.
-
- See @file{interface/dln-2-gpiod.cfg} for a sample config.
- @end deffn
-
-
- @deffn {Interface Driver} {sysfsgpio}
- Linux legacy userspace access to GPIO through sysfs is deprecated from Linux kernel version v5.3.
- Prefer using @b{linuxgpiod}, instead.
-
- See @file{interface/sysfsgpio-raspberrypi.cfg} for a sample config.
- @end deffn
-
-
- @deffn {Interface Driver} {openjtag}
- OpenJTAG compatible USB adapter.
- This defines some driver-specific commands:
-
- @deffn {Config Command} {openjtag variant} variant
- Specifies the variant of the OpenJTAG adapter (see @uref{http://www.openjtag.org/}).
- Currently valid @var{variant} values include:
-
- @itemize @minus
- @item @b{standard} Standard variant (default).
- @item @b{cy7c65215} Cypress CY7C65215 Dual Channel USB-Serial Bridge Controller
- (see @uref{http://www.cypress.com/?rID=82870}).
- @end itemize
- @end deffn
-
- @deffn {Config Command} {openjtag device_desc} string
- The USB device description string of the adapter.
- This value is only used with the standard variant.
- @end deffn
- @end deffn
-
-
- @deffn {Interface Driver} {jtag_dpi}
- SystemVerilog Direct Programming Interface (DPI) compatible driver for
- JTAG devices in emulation. The driver acts as a client for the SystemVerilog
- DPI server interface.
-
- @deffn {Config Command} {jtag_dpi set_port} port
- Specifies the TCP/IP port number of the SystemVerilog DPI server interface.
- @end deffn
-
- @deffn {Config Command} {jtag_dpi set_address} address
- Specifies the TCP/IP address of the SystemVerilog DPI server interface.
- @end deffn
- @end deffn
-
-
- @deffn {Interface Driver} {buspirate}
-
- This driver is for the Bus Pirate (see @url{http://dangerousprototypes.com/docs/Bus_Pirate}) and compatible devices.
- It uses a simple data protocol over a serial port connection.
-
- Most hardware development boards have a UART, a real serial port, or a virtual USB serial device, so this driver
- allows you to start building your own JTAG adapter without the complexity of a custom USB connection.
-
- @deffn {Config Command} {buspirate port} serial_port
- Specify the serial port's filename. For example:
- @example
- buspirate port /dev/ttyUSB0
- @end example
- @end deffn
-
- @deffn {Config Command} {buspirate speed} (normal|fast)
- Set the communication speed to 115k (normal) or 1M (fast). For example:
- @example
- buspirate mode normal
- @end example
- @end deffn
-
- @deffn {Config Command} {buspirate mode} (normal|open-drain)
- Set the Bus Pirate output mode.
- @itemize @minus
- @item In normal mode (push/pull), do not enable the pull-ups, and do not connect I/O header pin VPU to JTAG VREF.
- @item In open drain mode, you will then need to enable the pull-ups.
- @end itemize
- For example:
- @example
- buspirate mode normal
- @end example
- @end deffn
-
- @deffn {Config Command} {buspirate pullup} (0|1)
- Whether to connect (1) or not (0) the I/O header pin VPU (JTAG VREF)
- to the pull-up/pull-down resistors on MOSI (JTAG TDI), CLK (JTAG TCK), MISO (JTAG TDO) and CS (JTAG TMS).
- For example:
- @example
- buspirate pullup 0
- @end example
- @end deffn
-
- @deffn {Config Command} {buspirate vreg} (0|1)
- Whether to enable (1) or disable (0) the built-in voltage regulator,
- which can be used to supply power to a test circuit through
- I/O header pins +3V3 and +5V. For example:
- @example
- buspirate vreg 0
- @end example
- @end deffn
-
- @deffn {Command} {buspirate led} (0|1)
- Turns the Bus Pirate's LED on (1) or off (0). For example:
- @end deffn
- @example
- buspirate led 1
- @end example
-
- @end deffn
-
-
- @section Transport Configuration
- @cindex Transport
- As noted earlier, depending on the version of OpenOCD you use,
- and the debug adapter you are using,
- several transports may be available to
- communicate with debug targets (or perhaps to program flash memory).
- @deffn {Command} {transport list}
- displays the names of the transports supported by this
- version of OpenOCD.
- @end deffn
-
- @deffn {Command} {transport select} @option{transport_name}
- Select which of the supported transports to use in this OpenOCD session.
-
- When invoked with @option{transport_name}, attempts to select the named
- transport. The transport must be supported by the debug adapter
- hardware and by the version of OpenOCD you are using (including the
- adapter's driver).
-
- If no transport has been selected and no @option{transport_name} is
- provided, @command{transport select} auto-selects the first transport
- supported by the debug adapter.
-
- @command{transport select} always returns the name of the session's selected
- transport, if any.
- @end deffn
-
- @subsection JTAG Transport
- @cindex JTAG
- JTAG is the original transport supported by OpenOCD, and most
- of the OpenOCD commands support it.
- JTAG transports expose a chain of one or more Test Access Points (TAPs),
- each of which must be explicitly declared.
- JTAG supports both debugging and boundary scan testing.
- Flash programming support is built on top of debug support.
-
- JTAG transport is selected with the command @command{transport select
- jtag}. Unless your adapter uses either @ref{hla_interface,the hla interface
- driver} (in which case the command is @command{transport select hla_jtag})
- or @ref{st_link_dap_interface,the st-link interface driver} (in which case
- the command is @command{transport select dapdirect_jtag}).
-
- @subsection SWD Transport
- @cindex SWD
- @cindex Serial Wire Debug
- SWD (Serial Wire Debug) is an ARM-specific transport which exposes one
- Debug Access Point (DAP, which must be explicitly declared.
- (SWD uses fewer signal wires than JTAG.)
- SWD is debug-oriented, and does not support boundary scan testing.
- Flash programming support is built on top of debug support.
- (Some processors support both JTAG and SWD.)
-
- SWD transport is selected with the command @command{transport select
- swd}. Unless your adapter uses either @ref{hla_interface,the hla interface
- driver} (in which case the command is @command{transport select hla_swd})
- or @ref{st_link_dap_interface,the st-link interface driver} (in which case
- the command is @command{transport select dapdirect_swd}).
-
- @deffn {Config Command} {swd newdap} ...
- Declares a single DAP which uses SWD transport.
- Parameters are currently the same as "jtag newtap" but this is
- expected to change.
- @end deffn
- @deffn {Command} {swd wcr trn prescale}
- Updates TRN (turnaround delay) and prescaling.fields of the
- Wire Control Register (WCR).
- No parameters: displays current settings.
- @end deffn
-
- @subsection SPI Transport
- @cindex SPI
- @cindex Serial Peripheral Interface
- The Serial Peripheral Interface (SPI) is a general purpose transport
- which uses four wire signaling. Some processors use it as part of a
- solution for flash programming.
-
- @anchor{swimtransport}
- @subsection SWIM Transport
- @cindex SWIM
- @cindex Single Wire Interface Module
- The Single Wire Interface Module (SWIM) is a low-pin-count debug protocol used
- by the STMicroelectronics MCU family STM8 and documented in the
- @uref{https://www.st.com/resource/en/user_manual/cd00173911.pdf, User Manual UM470}.
-
- SWIM does not support boundary scan testing nor multiple cores.
-
- The SWIM transport is selected with the command @command{transport select swim}.
-
- The concept of TAPs does not fit in the protocol since SWIM does not implement
- a scan chain. Nevertheless, the current SW model of OpenOCD requires defining a
- virtual SWIM TAP through the command @command{swim newtap basename tap_type}.
- The TAP definition must precede the target definition command
- @command{target create target_name stm8 -chain-position basename.tap_type}.
-
- @anchor{jtagspeed}
- @section JTAG Speed
- JTAG clock setup is part of system setup.
- It @emph{does not belong with interface setup} since any interface
- only knows a few of the constraints for the JTAG clock speed.
- Sometimes the JTAG speed is
- changed during the target initialization process: (1) slow at
- reset, (2) program the CPU clocks, (3) run fast.
- Both the "slow" and "fast" clock rates are functions of the
- oscillators used, the chip, the board design, and sometimes
- power management software that may be active.
-
- The speed used during reset, and the scan chain verification which
- follows reset, can be adjusted using a @code{reset-start}
- target event handler.
- It can then be reconfigured to a faster speed by a
- @code{reset-init} target event handler after it reprograms those
- CPU clocks, or manually (if something else, such as a boot loader,
- sets up those clocks).
- @xref{targetevents,,Target Events}.
- When the initial low JTAG speed is a chip characteristic, perhaps
- because of a required oscillator speed, provide such a handler
- in the target config file.
- When that speed is a function of a board-specific characteristic
- such as which speed oscillator is used, it belongs in the board
- config file instead.
- In both cases it's safest to also set the initial JTAG clock rate
- to that same slow speed, so that OpenOCD never starts up using a
- clock speed that's faster than the scan chain can support.
-
- @example
- jtag_rclk 3000
- $_TARGET.cpu configure -event reset-start @{ jtag_rclk 3000 @}
- @end example
-
- If your system supports adaptive clocking (RTCK), configuring
- JTAG to use that is probably the most robust approach.
- However, it introduces delays to synchronize clocks; so it
- may not be the fastest solution.
-
- @b{NOTE:} Script writers should consider using @command{jtag_rclk}
- instead of @command{adapter speed}, but only for (ARM) cores and boards
- which support adaptive clocking.
-
- @deffn {Command} {adapter speed} max_speed_kHz
- A non-zero speed is in KHZ. Hence: 3000 is 3mhz.
- JTAG interfaces usually support a limited number of
- speeds. The speed actually used won't be faster
- than the speed specified.
-
- Chip data sheets generally include a top JTAG clock rate.
- The actual rate is often a function of a CPU core clock,
- and is normally less than that peak rate.
- For example, most ARM cores accept at most one sixth of the CPU clock.
-
- Speed 0 (khz) selects RTCK method.
- @xref{faqrtck,,FAQ RTCK}.
- If your system uses RTCK, you won't need to change the
- JTAG clocking after setup.
- Not all interfaces, boards, or targets support ``rtck''.
- If the interface device can not
- support it, an error is returned when you try to use RTCK.
- @end deffn
-
- @defun jtag_rclk fallback_speed_kHz
- @cindex adaptive clocking
- @cindex RTCK
- This Tcl proc (defined in @file{startup.tcl}) attempts to enable RTCK/RCLK.
- If that fails (maybe the interface, board, or target doesn't
- support it), falls back to the specified frequency.
- @example
- # Fall back to 3mhz if RTCK is not supported
- jtag_rclk 3000
- @end example
- @end defun
-
- @node Reset Configuration
- @chapter Reset Configuration
- @cindex Reset Configuration
-
- Every system configuration may require a different reset
- configuration. This can also be quite confusing.
- Resets also interact with @var{reset-init} event handlers,
- which do things like setting up clocks and DRAM, and
- JTAG clock rates. (@xref{jtagspeed,,JTAG Speed}.)
- They can also interact with JTAG routers.
- Please see the various board files for examples.
-
- @quotation Note
- To maintainers and integrators:
- Reset configuration touches several things at once.
- Normally the board configuration file
- should define it and assume that the JTAG adapter supports
- everything that's wired up to the board's JTAG connector.
-
- However, the target configuration file could also make note
- of something the silicon vendor has done inside the chip,
- which will be true for most (or all) boards using that chip.
- And when the JTAG adapter doesn't support everything, the
- user configuration file will need to override parts of
- the reset configuration provided by other files.
- @end quotation
-
- @section Types of Reset
-
- There are many kinds of reset possible through JTAG, but
- they may not all work with a given board and adapter.
- That's part of why reset configuration can be error prone.
-
- @itemize @bullet
- @item
- @emph{System Reset} ... the @emph{SRST} hardware signal
- resets all chips connected to the JTAG adapter, such as processors,
- power management chips, and I/O controllers. Normally resets triggered
- with this signal behave exactly like pressing a RESET button.
- @item
- @emph{JTAG TAP Reset} ... the @emph{TRST} hardware signal resets
- just the TAP controllers connected to the JTAG adapter.
- Such resets should not be visible to the rest of the system; resetting a
- device's TAP controller just puts that controller into a known state.
- @item
- @emph{Emulation Reset} ... many devices can be reset through JTAG
- commands. These resets are often distinguishable from system
- resets, either explicitly (a "reset reason" register says so)
- or implicitly (not all parts of the chip get reset).
- @item
- @emph{Other Resets} ... system-on-chip devices often support
- several other types of reset.
- You may need to arrange that a watchdog timer stops
- while debugging, preventing a watchdog reset.
- There may be individual module resets.
- @end itemize
-
- In the best case, OpenOCD can hold SRST, then reset
- the TAPs via TRST and send commands through JTAG to halt the
- CPU at the reset vector before the 1st instruction is executed.
- Then when it finally releases the SRST signal, the system is
- halted under debugger control before any code has executed.
- This is the behavior required to support the @command{reset halt}
- and @command{reset init} commands; after @command{reset init} a
- board-specific script might do things like setting up DRAM.
- (@xref{resetcommand,,Reset Command}.)
-
- @anchor{srstandtrstissues}
- @section SRST and TRST Issues
-
- Because SRST and TRST are hardware signals, they can have a
- variety of system-specific constraints. Some of the most
- common issues are:
-
- @itemize @bullet
-
- @item @emph{Signal not available} ... Some boards don't wire
- SRST or TRST to the JTAG connector. Some JTAG adapters don't
- support such signals even if they are wired up.
- Use the @command{reset_config} @var{signals} options to say
- when either of those signals is not connected.
- When SRST is not available, your code might not be able to rely
- on controllers having been fully reset during code startup.
- Missing TRST is not a problem, since JTAG-level resets can
- be triggered using with TMS signaling.
-
- @item @emph{Signals shorted} ... Sometimes a chip, board, or
- adapter will connect SRST to TRST, instead of keeping them separate.
- Use the @command{reset_config} @var{combination} options to say
- when those signals aren't properly independent.
-
- @item @emph{Timing} ... Reset circuitry like a resistor/capacitor
- delay circuit, reset supervisor, or on-chip features can extend
- the effect of a JTAG adapter's reset for some time after the adapter
- stops issuing the reset. For example, there may be chip or board
- requirements that all reset pulses last for at least a
- certain amount of time; and reset buttons commonly have
- hardware debouncing.
- Use the @command{adapter srst delay} and @command{jtag_ntrst_delay}
- commands to say when extra delays are needed.
-
- @item @emph{Drive type} ... Reset lines often have a pullup
- resistor, letting the JTAG interface treat them as open-drain
- signals. But that's not a requirement, so the adapter may need
- to use push/pull output drivers.
- Also, with weak pullups it may be advisable to drive
- signals to both levels (push/pull) to minimize rise times.
- Use the @command{reset_config} @var{trst_type} and
- @var{srst_type} parameters to say how to drive reset signals.
-
- @item @emph{Special initialization} ... Targets sometimes need
- special JTAG initialization sequences to handle chip-specific
- issues (not limited to errata).
- For example, certain JTAG commands might need to be issued while
- the system as a whole is in a reset state (SRST active)
- but the JTAG scan chain is usable (TRST inactive).
- Many systems treat combined assertion of SRST and TRST as a
- trigger for a harder reset than SRST alone.
- Such custom reset handling is discussed later in this chapter.
- @end itemize
-
- There can also be other issues.
- Some devices don't fully conform to the JTAG specifications.
- Trivial system-specific differences are common, such as
- SRST and TRST using slightly different names.
- There are also vendors who distribute key JTAG documentation for
- their chips only to developers who have signed a Non-Disclosure
- Agreement (NDA).
-
- Sometimes there are chip-specific extensions like a requirement to use
- the normally-optional TRST signal (precluding use of JTAG adapters which
- don't pass TRST through), or needing extra steps to complete a TAP reset.
-
- In short, SRST and especially TRST handling may be very finicky,
- needing to cope with both architecture and board specific constraints.
-
- @section Commands for Handling Resets
-
- @deffn {Command} {adapter srst pulse_width} milliseconds
- Minimum amount of time (in milliseconds) OpenOCD should wait
- after asserting nSRST (active-low system reset) before
- allowing it to be deasserted.
- @end deffn
-
- @deffn {Command} {adapter srst delay} milliseconds
- How long (in milliseconds) OpenOCD should wait after deasserting
- nSRST (active-low system reset) before starting new JTAG operations.
- When a board has a reset button connected to SRST line it will
- probably have hardware debouncing, implying you should use this.
- @end deffn
-
- @deffn {Command} {jtag_ntrst_assert_width} milliseconds
- Minimum amount of time (in milliseconds) OpenOCD should wait
- after asserting nTRST (active-low JTAG TAP reset) before
- allowing it to be deasserted.
- @end deffn
-
- @deffn {Command} {jtag_ntrst_delay} milliseconds
- How long (in milliseconds) OpenOCD should wait after deasserting
- nTRST (active-low JTAG TAP reset) before starting new JTAG operations.
- @end deffn
-
- @anchor{reset_config}
- @deffn {Command} {reset_config} mode_flag ...
- This command displays or modifies the reset configuration
- of your combination of JTAG board and target in target
- configuration scripts.
-
- Information earlier in this section describes the kind of problems
- the command is intended to address (@pxref{srstandtrstissues,,SRST and TRST Issues}).
- As a rule this command belongs only in board config files,
- describing issues like @emph{board doesn't connect TRST};
- or in user config files, addressing limitations derived
- from a particular combination of interface and board.
- (An unlikely example would be using a TRST-only adapter
- with a board that only wires up SRST.)
-
- The @var{mode_flag} options can be specified in any order, but only one
- of each type -- @var{signals}, @var{combination}, @var{gates},
- @var{trst_type}, @var{srst_type} and @var{connect_type}
- -- may be specified at a time.
- If you don't provide a new value for a given type, its previous
- value (perhaps the default) is unchanged.
- For example, this means that you don't need to say anything at all about
- TRST just to declare that if the JTAG adapter should want to drive SRST,
- it must explicitly be driven high (@option{srst_push_pull}).
-
- @itemize
- @item
- @var{signals} can specify which of the reset signals are connected.
- For example, If the JTAG interface provides SRST, but the board doesn't
- connect that signal properly, then OpenOCD can't use it.
- Possible values are @option{none} (the default), @option{trst_only},
- @option{srst_only} and @option{trst_and_srst}.
-
- @quotation Tip
- If your board provides SRST and/or TRST through the JTAG connector,
- you must declare that so those signals can be used.
- @end quotation
-
- @item
- The @var{combination} is an optional value specifying broken reset
- signal implementations.
- The default behaviour if no option given is @option{separate},
- indicating everything behaves normally.
- @option{srst_pulls_trst} states that the
- test logic is reset together with the reset of the system (e.g. NXP
- LPC2000, "broken" board layout), @option{trst_pulls_srst} says that
- the system is reset together with the test logic (only hypothetical, I
- haven't seen hardware with such a bug, and can be worked around).
- @option{combined} implies both @option{srst_pulls_trst} and
- @option{trst_pulls_srst}.
-
- @item
- The @var{gates} tokens control flags that describe some cases where
- JTAG may be unavailable during reset.
- @option{srst_gates_jtag} (default)
- indicates that asserting SRST gates the
- JTAG clock. This means that no communication can happen on JTAG
- while SRST is asserted.
- Its converse is @option{srst_nogate}, indicating that JTAG commands
- can safely be issued while SRST is active.
-
- @item
- The @var{connect_type} tokens control flags that describe some cases where
- SRST is asserted while connecting to the target. @option{srst_nogate}
- is required to use this option.
- @option{connect_deassert_srst} (default)
- indicates that SRST will not be asserted while connecting to the target.
- Its converse is @option{connect_assert_srst}, indicating that SRST will
- be asserted before any target connection.
- Only some targets support this feature, STM32 and STR9 are examples.
- This feature is useful if you are unable to connect to your target due
- to incorrect options byte config or illegal program execution.
- @end itemize
-
- The optional @var{trst_type} and @var{srst_type} parameters allow the
- driver mode of each reset line to be specified. These values only affect
- JTAG interfaces with support for different driver modes, like the Amontec
- JTAGkey and JTAG Accelerator. Also, they are necessarily ignored if the
- relevant signal (TRST or SRST) is not connected.
-
- @itemize
- @item
- Possible @var{trst_type} driver modes for the test reset signal (TRST)
- are the default @option{trst_push_pull}, and @option{trst_open_drain}.
- Most boards connect this signal to a pulldown, so the JTAG TAPs
- never leave reset unless they are hooked up to a JTAG adapter.
-
- @item
- Possible @var{srst_type} driver modes for the system reset signal (SRST)
- are the default @option{srst_open_drain}, and @option{srst_push_pull}.
- Most boards connect this signal to a pullup, and allow the
- signal to be pulled low by various events including system
- power-up and pressing a reset button.
- @end itemize
- @end deffn
-
- @section Custom Reset Handling
- @cindex events
-
- OpenOCD has several ways to help support the various reset
- mechanisms provided by chip and board vendors.
- The commands shown in the previous section give standard parameters.
- There are also @emph{event handlers} associated with TAPs or Targets.
- Those handlers are Tcl procedures you can provide, which are invoked
- at particular points in the reset sequence.
-
- @emph{When SRST is not an option} you must set
- up a @code{reset-assert} event handler for your target.
- For example, some JTAG adapters don't include the SRST signal;
- and some boards have multiple targets, and you won't always
- want to reset everything at once.
-
- After configuring those mechanisms, you might still
- find your board doesn't start up or reset correctly.
- For example, maybe it needs a slightly different sequence
- of SRST and/or TRST manipulations, because of quirks that
- the @command{reset_config} mechanism doesn't address;
- or asserting both might trigger a stronger reset, which
- needs special attention.
-
- Experiment with lower level operations, such as
- @command{adapter assert}, @command{adapter deassert}
- and the @command{jtag arp_*} operations shown here,
- to find a sequence of operations that works.
- @xref{JTAG Commands}.
- When you find a working sequence, it can be used to override
- @command{jtag_init}, which fires during OpenOCD startup
- (@pxref{configurationstage,,Configuration Stage});
- or @command{init_reset}, which fires during reset processing.
-
- You might also want to provide some project-specific reset
- schemes. For example, on a multi-target board the standard
- @command{reset} command would reset all targets, but you
- may need the ability to reset only one target at time and
- thus want to avoid using the board-wide SRST signal.
-
- @deffn {Overridable Procedure} {init_reset} mode
- This is invoked near the beginning of the @command{reset} command,
- usually to provide as much of a cold (power-up) reset as practical.
- By default it is also invoked from @command{jtag_init} if
- the scan chain does not respond to pure JTAG operations.
- The @var{mode} parameter is the parameter given to the
- low level reset command (@option{halt},
- @option{init}, or @option{run}), @option{setup},
- or potentially some other value.
-
- The default implementation just invokes @command{jtag arp_init-reset}.
- Replacements will normally build on low level JTAG
- operations such as @command{adapter assert} and @command{adapter deassert}.
- Operations here must not address individual TAPs
- (or their associated targets)
- until the JTAG scan chain has first been verified to work.
-
- Implementations must have verified the JTAG scan chain before
- they return.
- This is done by calling @command{jtag arp_init}
- (or @command{jtag arp_init-reset}).
- @end deffn
-
- @deffn {Command} {jtag arp_init}
- This validates the scan chain using just the four
- standard JTAG signals (TMS, TCK, TDI, TDO).
- It starts by issuing a JTAG-only reset.
- Then it performs checks to verify that the scan chain configuration
- matches the TAPs it can observe.
- Those checks include checking IDCODE values for each active TAP,
- and verifying the length of their instruction registers using
- TAP @code{-ircapture} and @code{-irmask} values.
- If these tests all pass, TAP @code{setup} events are
- issued to all TAPs with handlers for that event.
- @end deffn
-
- @deffn {Command} {jtag arp_init-reset}
- This uses TRST and SRST to try resetting
- everything on the JTAG scan chain
- (and anything else connected to SRST).
- It then invokes the logic of @command{jtag arp_init}.
- @end deffn
-
-
- @node TAP Declaration
- @chapter TAP Declaration
- @cindex TAP declaration
- @cindex TAP configuration
-
- @emph{Test Access Ports} (TAPs) are the core of JTAG.
- TAPs serve many roles, including:
-
- @itemize @bullet
- @item @b{Debug Target} A CPU TAP can be used as a GDB debug target.
- @item @b{Flash Programming} Some chips program the flash directly via JTAG.
- Others do it indirectly, making a CPU do it.
- @item @b{Program Download} Using the same CPU support GDB uses,
- you can initialize a DRAM controller, download code to DRAM, and then
- start running that code.
- @item @b{Boundary Scan} Most chips support boundary scan, which
- helps test for board assembly problems like solder bridges
- and missing connections.
- @end itemize
-
- OpenOCD must know about the active TAPs on your board(s).
- Setting up the TAPs is the core task of your configuration files.
- Once those TAPs are set up, you can pass their names to code
- which sets up CPUs and exports them as GDB targets,
- probes flash memory, performs low-level JTAG operations, and more.
-
- @section Scan Chains
- @cindex scan chain
-
- TAPs are part of a hardware @dfn{scan chain},
- which is a daisy chain of TAPs.
- They also need to be added to
- OpenOCD's software mirror of that hardware list,
- giving each member a name and associating other data with it.
- Simple scan chains, with a single TAP, are common in
- systems with a single microcontroller or microprocessor.
- More complex chips may have several TAPs internally.
- Very complex scan chains might have a dozen or more TAPs:
- several in one chip, more in the next, and connecting
- to other boards with their own chips and TAPs.
-
- You can display the list with the @command{scan_chain} command.
- (Don't confuse this with the list displayed by the @command{targets}
- command, presented in the next chapter.
- That only displays TAPs for CPUs which are configured as
- debugging targets.)
- Here's what the scan chain might look like for a chip more than one TAP:
-
- @verbatim
- TapName Enabled IdCode Expected IrLen IrCap IrMask
- -- ------------------ ------- ---------- ---------- ----- ----- ------
- 0 omap5912.dsp Y 0x03df1d81 0x03df1d81 38 0x01 0x03
- 1 omap5912.arm Y 0x0692602f 0x0692602f 4 0x01 0x0f
- 2 omap5912.unknown Y 0x00000000 0x00000000 8 0x01 0x03
- @end verbatim
-
- OpenOCD can detect some of that information, but not all
- of it. @xref{autoprobing,,Autoprobing}.
- Unfortunately, those TAPs can't always be autoconfigured,
- because not all devices provide good support for that.
- JTAG doesn't require supporting IDCODE instructions, and
- chips with JTAG routers may not link TAPs into the chain
- until they are told to do so.
-
- The configuration mechanism currently supported by OpenOCD
- requires explicit configuration of all TAP devices using
- @command{jtag newtap} commands, as detailed later in this chapter.
- A command like this would declare one tap and name it @code{chip1.cpu}:
-
- @example
- jtag newtap chip1 cpu -irlen 4 -expected-id 0x3ba00477
- @end example
-
- Each target configuration file lists the TAPs provided
- by a given chip.
- Board configuration files combine all the targets on a board,
- and so forth.
- Note that @emph{the order in which TAPs are declared is very important.}
- That declaration order must match the order in the JTAG scan chain,
- both inside a single chip and between them.
- @xref{faqtaporder,,FAQ TAP Order}.
-
- For example, the STMicroelectronics STR912 chip has
- three separate TAPs@footnote{See the ST
- document titled: @emph{STR91xFAxxx, Section 3.15 Jtag Interface, Page:
- 28/102, Figure 3: JTAG chaining inside the STR91xFA}.
- @url{http://eu.st.com/stonline/products/literature/ds/13495.pdf}}.
- To configure those taps, @file{target/str912.cfg}
- includes commands something like this:
-
- @example
- jtag newtap str912 flash ... params ...
- jtag newtap str912 cpu ... params ...
- jtag newtap str912 bs ... params ...
- @end example
-
- Actual config files typically use a variable such as @code{$_CHIPNAME}
- instead of literals like @option{str912}, to support more than one chip
- of each type. @xref{Config File Guidelines}.
-
- @deffn {Command} {jtag names}
- Returns the names of all current TAPs in the scan chain.
- Use @command{jtag cget} or @command{jtag tapisenabled}
- to examine attributes and state of each TAP.
- @example
- foreach t [jtag names] @{
- puts [format "TAP: %s\n" $t]
- @}
- @end example
- @end deffn
-
- @deffn {Command} {scan_chain}
- Displays the TAPs in the scan chain configuration,
- and their status.
- The set of TAPs listed by this command is fixed by
- exiting the OpenOCD configuration stage,
- but systems with a JTAG router can
- enable or disable TAPs dynamically.
- @end deffn
-
- @c FIXME! "jtag cget" should be able to return all TAP
- @c attributes, like "$target_name cget" does for targets.
-
- @c Probably want "jtag eventlist", and a "tap-reset" event
- @c (on entry to RESET state).
-
- @section TAP Names
- @cindex dotted name
-
- When TAP objects are declared with @command{jtag newtap},
- a @dfn{dotted.name} is created for the TAP, combining the
- name of a module (usually a chip) and a label for the TAP.
- For example: @code{xilinx.tap}, @code{str912.flash},
- @code{omap3530.jrc}, @code{dm6446.dsp}, or @code{stm32.cpu}.
- Many other commands use that dotted.name to manipulate or
- refer to the TAP. For example, CPU configuration uses the
- name, as does declaration of NAND or NOR flash banks.
-
- The components of a dotted name should follow ``C'' symbol
- name rules: start with an alphabetic character, then numbers
- and underscores are OK; while others (including dots!) are not.
-
- @section TAP Declaration Commands
-
- @deffn {Config Command} {jtag newtap} chipname tapname configparams...
- Declares a new TAP with the dotted name @var{chipname}.@var{tapname},
- and configured according to the various @var{configparams}.
-
- The @var{chipname} is a symbolic name for the chip.
- Conventionally target config files use @code{$_CHIPNAME},
- defaulting to the model name given by the chip vendor but
- overridable.
-
- @cindex TAP naming convention
- The @var{tapname} reflects the role of that TAP,
- and should follow this convention:
-
- @itemize @bullet
- @item @code{bs} -- For boundary scan if this is a separate TAP;
- @item @code{cpu} -- The main CPU of the chip, alternatively
- @code{arm} and @code{dsp} on chips with both ARM and DSP CPUs,
- @code{arm1} and @code{arm2} on chips with two ARMs, and so forth;
- @item @code{etb} -- For an embedded trace buffer (example: an ARM ETB11);
- @item @code{flash} -- If the chip has a flash TAP, like the str912;
- @item @code{jrc} -- For JTAG route controller (example: the ICEPick modules
- on many Texas Instruments chips, like the OMAP3530 on Beagleboards);
- @item @code{tap} -- Should be used only for FPGA- or CPLD-like devices
- with a single TAP;
- @item @code{unknownN} -- If you have no idea what the TAP is for (N is a number);
- @item @emph{when in doubt} -- Use the chip maker's name in their data sheet.
- For example, the Freescale i.MX31 has a SDMA (Smart DMA) with
- a JTAG TAP; that TAP should be named @code{sdma}.
- @end itemize
-
- Every TAP requires at least the following @var{configparams}:
-
- @itemize @bullet
- @item @code{-irlen} @var{NUMBER}
- @*The length in bits of the
- instruction register, such as 4 or 5 bits.
- @end itemize
-
- A TAP may also provide optional @var{configparams}:
-
- @itemize @bullet
- @item @code{-disable} (or @code{-enable})
- @*Use the @code{-disable} parameter to flag a TAP which is not
- linked into the scan chain after a reset using either TRST
- or the JTAG state machine's @sc{reset} state.
- You may use @code{-enable} to highlight the default state
- (the TAP is linked in).
- @xref{enablinganddisablingtaps,,Enabling and Disabling TAPs}.
- @item @code{-expected-id} @var{NUMBER}
- @*A non-zero @var{number} represents a 32-bit IDCODE
- which you expect to find when the scan chain is examined.
- These codes are not required by all JTAG devices.
- @emph{Repeat the option} as many times as required if more than one
- ID code could appear (for example, multiple versions).
- Specify @var{number} as zero to suppress warnings about IDCODE
- values that were found but not included in the list.
-
- Provide this value if at all possible, since it lets OpenOCD
- tell when the scan chain it sees isn't right. These values
- are provided in vendors' chip documentation, usually a technical
- reference manual. Sometimes you may need to probe the JTAG
- hardware to find these values.
- @xref{autoprobing,,Autoprobing}.
- @item @code{-ignore-version}
- @*Specify this to ignore the JTAG version field in the @code{-expected-id}
- option. When vendors put out multiple versions of a chip, or use the same
- JTAG-level ID for several largely-compatible chips, it may be more practical
- to ignore the version field than to update config files to handle all of
- the various chip IDs. The version field is defined as bit 28-31 of the IDCODE.
- @item @code{-ircapture} @var{NUMBER}
- @*The bit pattern loaded by the TAP into the JTAG shift register
- on entry to the @sc{ircapture} state, such as 0x01.
- JTAG requires the two LSBs of this value to be 01.
- By default, @code{-ircapture} and @code{-irmask} are set
- up to verify that two-bit value. You may provide
- additional bits if you know them, or indicate that
- a TAP doesn't conform to the JTAG specification.
- @item @code{-irmask} @var{NUMBER}
- @*A mask used with @code{-ircapture}
- to verify that instruction scans work correctly.
- Such scans are not used by OpenOCD except to verify that
- there seems to be no problems with JTAG scan chain operations.
- @item @code{-ignore-syspwrupack}
- @*Specify this to ignore the CSYSPWRUPACK bit in the ARM DAP DP CTRL/STAT
- register during initial examination and when checking the sticky error bit.
- This bit is normally checked after setting the CSYSPWRUPREQ bit, but some
- devices do not set the ack bit until sometime later.
- @end itemize
- @end deffn
-
- @section Other TAP commands
-
- @deffn {Command} {jtag cget} dotted.name @option{-idcode}
- Get the value of the IDCODE found in hardware.
- @end deffn
-
- @deffn {Command} {jtag cget} dotted.name @option{-event} event_name
- @deffnx {Command} {jtag configure} dotted.name @option{-event} event_name handler
- At this writing this TAP attribute
- mechanism is limited and used mostly for event handling.
- (It is not a direct analogue of the @code{cget}/@code{configure}
- mechanism for debugger targets.)
- See the next section for information about the available events.
-
- The @code{configure} subcommand assigns an event handler,
- a TCL string which is evaluated when the event is triggered.
- The @code{cget} subcommand returns that handler.
- @end deffn
-
- @section TAP Events
- @cindex events
- @cindex TAP events
-
- OpenOCD includes two event mechanisms.
- The one presented here applies to all JTAG TAPs.
- The other applies to debugger targets,
- which are associated with certain TAPs.
-
- The TAP events currently defined are:
-
- @itemize @bullet
- @item @b{post-reset}
- @* The TAP has just completed a JTAG reset.
- The tap may still be in the JTAG @sc{reset} state.
- Handlers for these events might perform initialization sequences
- such as issuing TCK cycles, TMS sequences to ensure
- exit from the ARM SWD mode, and more.
-
- Because the scan chain has not yet been verified, handlers for these events
- @emph{should not issue commands which scan the JTAG IR or DR registers}
- of any particular target.
- @b{NOTE:} As this is written (September 2009), nothing prevents such access.
- @item @b{setup}
- @* The scan chain has been reset and verified.
- This handler may enable TAPs as needed.
- @item @b{tap-disable}
- @* The TAP needs to be disabled. This handler should
- implement @command{jtag tapdisable}
- by issuing the relevant JTAG commands.
- @item @b{tap-enable}
- @* The TAP needs to be enabled. This handler should
- implement @command{jtag tapenable}
- by issuing the relevant JTAG commands.
- @end itemize
-
- If you need some action after each JTAG reset which isn't actually
- specific to any TAP (since you can't yet trust the scan chain's
- contents to be accurate), you might:
-
- @example
- jtag configure CHIP.jrc -event post-reset @{
- echo "JTAG Reset done"
- ... non-scan jtag operations to be done after reset
- @}
- @end example
-
-
- @anchor{enablinganddisablingtaps}
- @section Enabling and Disabling TAPs
- @cindex JTAG Route Controller
- @cindex jrc
-
- In some systems, a @dfn{JTAG Route Controller} (JRC)
- is used to enable and/or disable specific JTAG TAPs.
- Many ARM-based chips from Texas Instruments include
- an ``ICEPick'' module, which is a JRC.
- Such chips include DaVinci and OMAP3 processors.
-
- A given TAP may not be visible until the JRC has been
- told to link it into the scan chain; and if the JRC
- has been told to unlink that TAP, it will no longer
- be visible.
- Such routers address problems that JTAG ``bypass mode''
- ignores, such as:
-
- @itemize
- @item The scan chain can only go as fast as its slowest TAP.
- @item Having many TAPs slows instruction scans, since all
- TAPs receive new instructions.
- @item TAPs in the scan chain must be powered up, which wastes
- power and prevents debugging some power management mechanisms.
- @end itemize
-
- The IEEE 1149.1 JTAG standard has no concept of a ``disabled'' tap,
- as implied by the existence of JTAG routers.
- However, the upcoming IEEE 1149.7 framework (layered on top of JTAG)
- does include a kind of JTAG router functionality.
-
- @c (a) currently the event handlers don't seem to be able to
- @c fail in a way that could lead to no-change-of-state.
-
- In OpenOCD, tap enabling/disabling is invoked by the Tcl commands
- shown below, and is implemented using TAP event handlers.
- So for example, when defining a TAP for a CPU connected to
- a JTAG router, your @file{target.cfg} file
- should define TAP event handlers using
- code that looks something like this:
-
- @example
- jtag configure CHIP.cpu -event tap-enable @{
- ... jtag operations using CHIP.jrc
- @}
- jtag configure CHIP.cpu -event tap-disable @{
- ... jtag operations using CHIP.jrc
- @}
- @end example
-
- Then you might want that CPU's TAP enabled almost all the time:
-
- @example
- jtag configure $CHIP.jrc -event setup "jtag tapenable $CHIP.cpu"
- @end example
-
- Note how that particular setup event handler declaration
- uses quotes to evaluate @code{$CHIP} when the event is configured.
- Using brackets @{ @} would cause it to be evaluated later,
- at runtime, when it might have a different value.
-
- @deffn {Command} {jtag tapdisable} dotted.name
- If necessary, disables the tap
- by sending it a @option{tap-disable} event.
- Returns the string "1" if the tap
- specified by @var{dotted.name} is enabled,
- and "0" if it is disabled.
- @end deffn
-
- @deffn {Command} {jtag tapenable} dotted.name
- If necessary, enables the tap
- by sending it a @option{tap-enable} event.
- Returns the string "1" if the tap
- specified by @var{dotted.name} is enabled,
- and "0" if it is disabled.
- @end deffn
-
- @deffn {Command} {jtag tapisenabled} dotted.name
- Returns the string "1" if the tap
- specified by @var{dotted.name} is enabled,
- and "0" if it is disabled.
-
- @quotation Note
- Humans will find the @command{scan_chain} command more helpful
- for querying the state of the JTAG taps.
- @end quotation
- @end deffn
-
- @anchor{autoprobing}
- @section Autoprobing
- @cindex autoprobe
- @cindex JTAG autoprobe
-
- TAP configuration is the first thing that needs to be done
- after interface and reset configuration. Sometimes it's
- hard finding out what TAPs exist, or how they are identified.
- Vendor documentation is not always easy to find and use.
-
- To help you get past such problems, OpenOCD has a limited
- @emph{autoprobing} ability to look at the scan chain, doing
- a @dfn{blind interrogation} and then reporting the TAPs it finds.
- To use this mechanism, start the OpenOCD server with only data
- that configures your JTAG interface, and arranges to come up
- with a slow clock (many devices don't support fast JTAG clocks
- right when they come out of reset).
-
- For example, your @file{openocd.cfg} file might have:
-
- @example
- source [find interface/olimex-arm-usb-tiny-h.cfg]
- reset_config trst_and_srst
- jtag_rclk 8
- @end example
-
- When you start the server without any TAPs configured, it will
- attempt to autoconfigure the TAPs. There are two parts to this:
-
- @enumerate
- @item @emph{TAP discovery} ...
- After a JTAG reset (sometimes a system reset may be needed too),
- each TAP's data registers will hold the contents of either the
- IDCODE or BYPASS register.
- If JTAG communication is working, OpenOCD will see each TAP,
- and report what @option{-expected-id} to use with it.
- @item @emph{IR Length discovery} ...
- Unfortunately JTAG does not provide a reliable way to find out
- the value of the @option{-irlen} parameter to use with a TAP
- that is discovered.
- If OpenOCD can discover the length of a TAP's instruction
- register, it will report it.
- Otherwise you may need to consult vendor documentation, such
- as chip data sheets or BSDL files.
- @end enumerate
-
- In many cases your board will have a simple scan chain with just
- a single device. Here's what OpenOCD reported with one board
- that's a bit more complex:
-
- @example
- clock speed 8 kHz
- There are no enabled taps. AUTO PROBING MIGHT NOT WORK!!
- AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x2b900f0f ..."
- AUTO auto1.tap - use "jtag newtap auto1 tap -expected-id 0x07926001 ..."
- AUTO auto2.tap - use "jtag newtap auto2 tap -expected-id 0x0b73b02f ..."
- AUTO auto0.tap - use "... -irlen 4"
- AUTO auto1.tap - use "... -irlen 4"
- AUTO auto2.tap - use "... -irlen 6"
- no gdb ports allocated as no target has been specified
- @end example
-
- Given that information, you should be able to either find some existing
- config files to use, or create your own. If you create your own, you
- would configure from the bottom up: first a @file{target.cfg} file
- with these TAPs, any targets associated with them, and any on-chip
- resources; then a @file{board.cfg} with off-chip resources, clocking,
- and so forth.
-
- @anchor{dapdeclaration}
- @section DAP declaration (ARMv6-M, ARMv7 and ARMv8 targets)
- @cindex DAP declaration
-
- Since OpenOCD version 0.11.0, the Debug Access Port (DAP) is
- no longer implicitly created together with the target. It must be
- explicitly declared using the @command{dap create} command. For all ARMv6-M, ARMv7
- and ARMv8 targets, the option "@option{-dap} @var{dap_name}" has to be used
- instead of "@option{-chain-position} @var{dotted.name}" when the target is created.
-
- The @command{dap} command group supports the following sub-commands:
-
- @deffn {Command} {dap create} dap_name @option{-chain-position} dotted.name configparams...
- Declare a DAP instance named @var{dap_name} linked to the JTAG tap
- @var{dotted.name}. This also creates a new command (@command{dap_name})
- which is used for various purposes including additional configuration.
- There can only be one DAP for each JTAG tap in the system.
-
- A DAP may also provide optional @var{configparams}:
-
- @itemize @bullet
- @item @code{-ignore-syspwrupack}
- @*Specify this to ignore the CSYSPWRUPACK bit in the ARM DAP DP CTRL/STAT
- register during initial examination and when checking the sticky error bit.
- This bit is normally checked after setting the CSYSPWRUPREQ bit, but some
- devices do not set the ack bit until sometime later.
- @end itemize
- @end deffn
-
- @deffn {Command} {dap names}
- This command returns a list of all registered DAP objects. It it useful mainly
- for TCL scripting.
- @end deffn
-
- @deffn {Command} {dap info} [num]
- Displays the ROM table for MEM-AP @var{num},
- defaulting to the currently selected AP of the currently selected target.
- @end deffn
-
- @deffn {Command} {dap init}
- Initialize all registered DAPs. This command is used internally
- during initialization. It can be issued at any time after the
- initialization, too.
- @end deffn
-
- The following commands exist as subcommands of DAP instances:
-
- @deffn {Command} {$dap_name info} [num]
- Displays the ROM table for MEM-AP @var{num},
- defaulting to the currently selected AP.
- @end deffn
-
- @deffn {Command} {$dap_name apid} [num]
- Displays ID register from AP @var{num}, defaulting to the currently selected AP.
- @end deffn
-
- @anchor{DAP subcommand apreg}
- @deffn {Command} {$dap_name apreg} ap_num reg [value]
- Displays content of a register @var{reg} from AP @var{ap_num}
- or set a new value @var{value}.
- @var{reg} is byte address of a word register, 0, 4, 8 ... 0xfc.
- @end deffn
-
- @deffn {Command} {$dap_name apsel} [num]
- Select AP @var{num}, defaulting to 0.
- @end deffn
-
- @deffn {Command} {$dap_name dpreg} reg [value]
- Displays the content of DP register at address @var{reg}, or set it to a new
- value @var{value}.
-
- In case of SWD, @var{reg} is a value in packed format
- @math{dpbanksel << 4 | addr} and assumes values 0, 4, 8 ... 0xfc.
- In case of JTAG it only assumes values 0, 4, 8 and 0xc.
-
- @emph{Note:} Consider using @command{poll off} to avoid any disturbing
- background activity by OpenOCD while you are operating at such low-level.
- @end deffn
-
- @deffn {Command} {$dap_name baseaddr} [num]
- Displays debug base address from MEM-AP @var{num},
- defaulting to the currently selected AP.
- @end deffn
-
- @deffn {Command} {$dap_name memaccess} [value]
- Displays the number of extra tck cycles in the JTAG idle to use for MEM-AP
- memory bus access [0-255], giving additional time to respond to reads.
- If @var{value} is defined, first assigns that.
- @end deffn
-
- @deffn {Command} {$dap_name apcsw} [value [mask]]
- Displays or changes CSW bit pattern for MEM-AP transfers.
-
- At the begin of each memory access the CSW pattern is extended (bitwise or-ed)
- by @dfn{Size} and @dfn{AddrInc} bit-fields according to transfer requirements
- and the result is written to the real CSW register. All bits except dynamically
- updated fields @dfn{Size} and @dfn{AddrInc} can be changed by changing
- the CSW pattern. Refer to ARM ADI v5 manual chapter 7.6.4 and appendix A
- for details.
-
- Use @var{value} only syntax if you want to set the new CSW pattern as a whole.
- The example sets HPROT1 bit (required by Cortex-M) and clears the rest of
- the pattern:
- @example
- kx.dap apcsw 0x2000000
- @end example
-
- If @var{mask} is also used, the CSW pattern is changed only on bit positions
- where the mask bit is 1. The following example sets HPROT3 (cacheable)
- and leaves the rest of the pattern intact. It configures memory access through
- DCache on Cortex-M7.
- @example
- set CSW_HPROT3_CACHEABLE [expr 1 << 27]
- samv.dap apcsw $CSW_HPROT3_CACHEABLE $CSW_HPROT3_CACHEABLE
- @end example
-
- Another example clears SPROT bit and leaves the rest of pattern intact:
- @example
- set CSW_SPROT [expr 1 << 30]
- samv.dap apcsw 0 $CSW_SPROT
- @end example
-
- @emph{Note:} If you want to check the real value of CSW, not CSW pattern, use
- @code{xxx.dap apreg 0}. @xref{DAP subcommand apreg,,}.
-
- @emph{Warning:} Some of the CSW bits are vital for working memory transfer.
- If you set a wrong CSW pattern and MEM-AP stopped working, use the following
- example with a proper dap name:
- @example
- xxx.dap apcsw default
- @end example
- @end deffn
-
- @deffn {Config Command} {$dap_name ti_be_32_quirks} [@option{enable}]
- Set/get quirks mode for TI TMS450/TMS570 processors
- Disabled by default
- @end deffn
-
-
- @node CPU Configuration
- @chapter CPU Configuration
- @cindex GDB target
-
- This chapter discusses how to set up GDB debug targets for CPUs.
- You can also access these targets without GDB
- (@pxref{Architecture and Core Commands},
- and @ref{targetstatehandling,,Target State handling}) and
- through various kinds of NAND and NOR flash commands.
- If you have multiple CPUs you can have multiple such targets.
-
- We'll start by looking at how to examine the targets you have,
- then look at how to add one more target and how to configure it.
-
- @section Target List
- @cindex target, current
- @cindex target, list
-
- All targets that have been set up are part of a list,
- where each member has a name.
- That name should normally be the same as the TAP name.
- You can display the list with the @command{targets}
- (plural!) command.
- This display often has only one CPU; here's what it might
- look like with more than one:
- @verbatim
- TargetName Type Endian TapName State
- -- ------------------ ---------- ------ ------------------ ------------
- 0* at91rm9200.cpu arm920t little at91rm9200.cpu running
- 1 MyTarget cortex_m little mychip.foo tap-disabled
- @end verbatim
-
- One member of that list is the @dfn{current target}, which
- is implicitly referenced by many commands.
- It's the one marked with a @code{*} near the target name.
- In particular, memory addresses often refer to the address
- space seen by that current target.
- Commands like @command{mdw} (memory display words)
- and @command{flash erase_address} (erase NOR flash blocks)
- are examples; and there are many more.
-
- Several commands let you examine the list of targets:
-
- @deffn {Command} {target current}
- Returns the name of the current target.
- @end deffn
-
- @deffn {Command} {target names}
- Lists the names of all current targets in the list.
- @example
- foreach t [target names] @{
- puts [format "Target: %s\n" $t]
- @}
- @end example
- @end deffn
-
- @c yep, "target list" would have been better.
- @c plus maybe "target setdefault".
-
- @deffn {Command} {targets} [name]
- @emph{Note: the name of this command is plural. Other target
- command names are singular.}
-
- With no parameter, this command displays a table of all known
- targets in a user friendly form.
-
- With a parameter, this command sets the current target to
- the given target with the given @var{name}; this is
- only relevant on boards which have more than one target.
- @end deffn
-
- @section Target CPU Types
- @cindex target type
- @cindex CPU type
-
- Each target has a @dfn{CPU type}, as shown in the output of
- the @command{targets} command. You need to specify that type
- when calling @command{target create}.
- The CPU type indicates more than just the instruction set.
- It also indicates how that instruction set is implemented,
- what kind of debug support it integrates,
- whether it has an MMU (and if so, what kind),
- what core-specific commands may be available
- (@pxref{Architecture and Core Commands}),
- and more.
-
- It's easy to see what target types are supported,
- since there's a command to list them.
-
- @anchor{targettypes}
- @deffn {Command} {target types}
- Lists all supported target types.
- At this writing, the supported CPU types are:
-
- @itemize @bullet
- @item @code{aarch64} -- this is an ARMv8-A core with an MMU.
- @item @code{arm11} -- this is a generation of ARMv6 cores.
- @item @code{arm720t} -- this is an ARMv4 core with an MMU.
- @item @code{arm7tdmi} -- this is an ARMv4 core.
- @item @code{arm920t} -- this is an ARMv4 core with an MMU.
- @item @code{arm926ejs} -- this is an ARMv5 core with an MMU.
- @item @code{arm946e} -- this is an ARMv5 core with an MMU.
- @item @code{arm966e} -- this is an ARMv5 core.
- @item @code{arm9tdmi} -- this is an ARMv4 core.
- @item @code{avr} -- implements Atmel's 8-bit AVR instruction set.
- (Support for this is preliminary and incomplete.)
- @item @code{avr32_ap7k} -- this an AVR32 core.
- @item @code{cortex_a} -- this is an ARMv7-A core with an MMU.
- @item @code{cortex_m} -- this is an ARMv7-M core, supporting only the
- compact Thumb2 instruction set. Supports also ARMv6-M and ARMv8-M cores
- @item @code{cortex_r4} -- this is an ARMv7-R core.
- @item @code{dragonite} -- resembles arm966e.
- @item @code{dsp563xx} -- implements Freescale's 24-bit DSP.
- (Support for this is still incomplete.)
- @item @code{dsp5680xx} -- implements Freescale's 5680x DSP.
- @item @code{esirisc} -- this is an EnSilica eSi-RISC core.
- The current implementation supports eSi-32xx cores.
- @item @code{fa526} -- resembles arm920 (w/o Thumb).
- @item @code{feroceon} -- resembles arm926.
- @item @code{hla_target} -- a Cortex-M alternative to work with HL adapters like ST-Link.
- @item @code{ls1_sap} -- this is the SAP on NXP LS102x CPUs,
- allowing access to physical memory addresses independently of CPU cores.
- @item @code{mem_ap} -- this is an ARM debug infrastructure Access Port without
- a CPU, through which bus read and write cycles can be generated; it may be
- useful for working with non-CPU hardware behind an AP or during development of
- support for new CPUs.
- It's possible to connect a GDB client to this target (the GDB port has to be
- specified, @xref{gdbportoverride,,option -gdb-port}.), and a fake ARM core will
- be emulated to comply to GDB remote protocol.
- @item @code{mips_m4k} -- a MIPS core.
- @item @code{mips_mips64} -- a MIPS64 core.
- @item @code{nds32_v2} -- this is an Andes NDS32 v2 core.
- @item @code{nds32_v3} -- this is an Andes NDS32 v3 core.
- @item @code{nds32_v3m} -- this is an Andes NDS32 v3m core.
- @item @code{or1k} -- this is an OpenRISC 1000 core.
- The current implementation supports three JTAG TAP cores:
- @itemize @minus
- @item @code{OpenCores TAP} (See: @url{http://opencores.org/project@comma{}jtag})
- @item @code{Altera Virtual JTAG TAP} (See: @url{http://www.altera.com/literature/ug/ug_virtualjtag.pdf})
- @item @code{Xilinx BSCAN_* virtual JTAG interface} (See: @url{http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_2/spartan6_hdl.pdf})
- @end itemize
- And two debug interfaces cores:
- @itemize @minus
- @item @code{Advanced debug interface}
- @*(See: @url{http://opencores.org/project@comma{}adv_debug_sys})
- @item @code{SoC Debug Interface}
- @*(See: @url{http://opencores.org/project@comma{}dbg_interface})
- @end itemize
- @item @code{quark_d20xx} -- an Intel Quark D20xx core.
- @item @code{quark_x10xx} -- an Intel Quark X10xx core.
- @item @code{riscv} -- a RISC-V core.
- @item @code{stm8} -- implements an STM8 core.
- @item @code{testee} -- a dummy target for cases without a real CPU, e.g. CPLD.
- @item @code{xscale} -- this is actually an architecture,
- not a CPU type. It is based on the ARMv5 architecture.
- @end itemize
- @end deffn
-
- To avoid being confused by the variety of ARM based cores, remember
- this key point: @emph{ARM is a technology licencing company}.
- (See: @url{http://www.arm.com}.)
- The CPU name used by OpenOCD will reflect the CPU design that was
- licensed, not a vendor brand which incorporates that design.
- Name prefixes like arm7, arm9, arm11, and cortex
- reflect design generations;
- while names like ARMv4, ARMv5, ARMv6, ARMv7 and ARMv8
- reflect an architecture version implemented by a CPU design.
-
- @anchor{targetconfiguration}
- @section Target Configuration
-
- Before creating a ``target'', you must have added its TAP to the scan chain.
- When you've added that TAP, you will have a @code{dotted.name}
- which is used to set up the CPU support.
- The chip-specific configuration file will normally configure its CPU(s)
- right after it adds all of the chip's TAPs to the scan chain.
-
- Although you can set up a target in one step, it's often clearer if you
- use shorter commands and do it in two steps: create it, then configure
- optional parts.
- All operations on the target after it's created will use a new
- command, created as part of target creation.
-
- The two main things to configure after target creation are
- a work area, which usually has target-specific defaults even
- if the board setup code overrides them later;
- and event handlers (@pxref{targetevents,,Target Events}), which tend
- to be much more board-specific.
- The key steps you use might look something like this
-
- @example
- dap create mychip.dap -chain-position mychip.cpu
- target create MyTarget cortex_m -dap mychip.dap
- MyTarget configure -work-area-phys 0x08000 -work-area-size 8096
- MyTarget configure -event reset-deassert-pre @{ jtag_rclk 5 @}
- MyTarget configure -event reset-init @{ myboard_reinit @}
- @end example
-
- You should specify a working area if you can; typically it uses some
- on-chip SRAM.
- Such a working area can speed up many things, including bulk
- writes to target memory;
- flash operations like checking to see if memory needs to be erased;
- GDB memory checksumming;
- and more.
-
- @quotation Warning
- On more complex chips, the work area can become
- inaccessible when application code
- (such as an operating system)
- enables or disables the MMU.
- For example, the particular MMU context used to access the virtual
- address will probably matter ... and that context might not have
- easy access to other addresses needed.
- At this writing, OpenOCD doesn't have much MMU intelligence.
- @end quotation
-
- It's often very useful to define a @code{reset-init} event handler.
- For systems that are normally used with a boot loader,
- common tasks include updating clocks and initializing memory
- controllers.
- That may be needed to let you write the boot loader into flash,
- in order to ``de-brick'' your board; or to load programs into
- external DDR memory without having run the boot loader.
-
- @deffn {Config Command} {target create} target_name type configparams...
- This command creates a GDB debug target that refers to a specific JTAG tap.
- It enters that target into a list, and creates a new
- command (@command{@var{target_name}}) which is used for various
- purposes including additional configuration.
-
- @itemize @bullet
- @item @var{target_name} ... is the name of the debug target.
- By convention this should be the same as the @emph{dotted.name}
- of the TAP associated with this target, which must be specified here
- using the @code{-chain-position @var{dotted.name}} configparam.
-
- This name is also used to create the target object command,
- referred to here as @command{$target_name},
- and in other places the target needs to be identified.
- @item @var{type} ... specifies the target type. @xref{targettypes,,target types}.
- @item @var{configparams} ... all parameters accepted by
- @command{$target_name configure} are permitted.
- If the target is big-endian, set it here with @code{-endian big}.
-
- You @emph{must} set the @code{-chain-position @var{dotted.name}} or
- @code{-dap @var{dap_name}} here.
- @end itemize
- @end deffn
-
- @deffn {Command} {$target_name configure} configparams...
- The options accepted by this command may also be
- specified as parameters to @command{target create}.
- Their values can later be queried one at a time by
- using the @command{$target_name cget} command.
-
- @emph{Warning:} changing some of these after setup is dangerous.
- For example, moving a target from one TAP to another;
- and changing its endianness.
-
- @itemize @bullet
-
- @item @code{-chain-position} @var{dotted.name} -- names the TAP
- used to access this target.
-
- @item @code{-dap} @var{dap_name} -- names the DAP used to access
- this target. @xref{dapdeclaration,,DAP declaration}, on how to
- create and manage DAP instances.
-
- @item @code{-endian} (@option{big}|@option{little}) -- specifies
- whether the CPU uses big or little endian conventions
-
- @item @code{-event} @var{event_name} @var{event_body} --
- @xref{targetevents,,Target Events}.
- Note that this updates a list of named event handlers.
- Calling this twice with two different event names assigns
- two different handlers, but calling it twice with the
- same event name assigns only one handler.
-
- Current target is temporarily overridden to the event issuing target
- before handler code starts and switched back after handler is done.
-
- @item @code{-work-area-backup} (@option{0}|@option{1}) -- says
- whether the work area gets backed up; by default,
- @emph{it is not backed up.}
- When possible, use a working_area that doesn't need to be backed up,
- since performing a backup slows down operations.
- For example, the beginning of an SRAM block is likely to
- be used by most build systems, but the end is often unused.
-
- @item @code{-work-area-size} @var{size} -- specify work are size,
- in bytes. The same size applies regardless of whether its physical
- or virtual address is being used.
-
- @item @code{-work-area-phys} @var{address} -- set the work area
- base @var{address} to be used when no MMU is active.
-
- @item @code{-work-area-virt} @var{address} -- set the work area
- base @var{address} to be used when an MMU is active.
- @emph{Do not specify a value for this except on targets with an MMU.}
- The value should normally correspond to a static mapping for the
- @code{-work-area-phys} address, set up by the current operating system.
-
- @anchor{rtostype}
- @item @code{-rtos} @var{rtos_type} -- enable rtos support for target,
- @var{rtos_type} can be one of @option{auto}, @option{eCos},
- @option{ThreadX}, @option{FreeRTOS}, @option{linux}, @option{ChibiOS},
- @option{embKernel}, @option{mqx}, @option{uCOS-III}, @option{nuttx},
- @option{RIOT}, @option{Zephyr}
- @xref{gdbrtossupport,,RTOS Support}.
-
- @item @code{-defer-examine} -- skip target examination at initial JTAG chain
- scan and after a reset. A manual call to arp_examine is required to
- access the target for debugging.
-
- @item @code{-ap-num} @var{ap_number} -- set DAP access port for target,
- @var{ap_number} is the numeric index of the DAP AP the target is connected to.
- Use this option with systems where multiple, independent cores are connected
- to separate access ports of the same DAP.
-
- @item @code{-cti} @var{cti_name} -- set Cross-Trigger Interface (CTI) connected
- to the target. Currently, only the @code{aarch64} target makes use of this option,
- where it is a mandatory configuration for the target run control.
- @xref{armcrosstrigger,,ARM Cross-Trigger Interface},
- for instruction on how to declare and control a CTI instance.
-
- @anchor{gdbportoverride}
- @item @code{-gdb-port} @var{number} -- see command @command{gdb_port} for the
- possible values of the parameter @var{number}, which are not only numeric values.
- Use this option to override, for this target only, the global parameter set with
- command @command{gdb_port}.
- @xref{gdb_port,,command gdb_port}.
-
- @item @code{-gdb-max-connections} @var{number} -- EXPERIMENTAL: set the maximum
- number of GDB connections that are allowed for the target. Default is 1.
- A negative value for @var{number} means unlimited connections.
- See @xref{gdbmeminspect,,Using GDB as a non-intrusive memory inspector}.
- @end itemize
- @end deffn
-
- @section Other $target_name Commands
- @cindex object command
-
- The Tcl/Tk language has the concept of object commands,
- and OpenOCD adopts that same model for targets.
-
- A good Tk example is a on screen button.
- Once a button is created a button
- has a name (a path in Tk terms) and that name is useable as a first
- class command. For example in Tk, one can create a button and later
- configure it like this:
-
- @example
- # Create
- button .foobar -background red -command @{ foo @}
- # Modify
- .foobar configure -foreground blue
- # Query
- set x [.foobar cget -background]
- # Report
- puts [format "The button is %s" $x]
- @end example
-
- In OpenOCD's terms, the ``target'' is an object just like a Tcl/Tk
- button, and its object commands are invoked the same way.
-
- @example
- str912.cpu mww 0x1234 0x42
- omap3530.cpu mww 0x5555 123
- @end example
-
- The commands supported by OpenOCD target objects are:
-
- @deffn {Command} {$target_name arp_examine} @option{allow-defer}
- @deffnx {Command} {$target_name arp_halt}
- @deffnx {Command} {$target_name arp_poll}
- @deffnx {Command} {$target_name arp_reset}
- @deffnx {Command} {$target_name arp_waitstate}
- Internal OpenOCD scripts (most notably @file{startup.tcl})
- use these to deal with specific reset cases.
- They are not otherwise documented here.
- @end deffn
-
- @deffn {Command} {$target_name array2mem} arrayname width address count
- @deffnx {Command} {$target_name mem2array} arrayname width address count
- These provide an efficient script-oriented interface to memory.
- The @code{array2mem} primitive writes bytes, halfwords, words
- or double-words; while @code{mem2array} reads them.
- In both cases, the TCL side uses an array, and
- the target side uses raw memory.
-
- The efficiency comes from enabling the use of
- bulk JTAG data transfer operations.
- The script orientation comes from working with data
- values that are packaged for use by TCL scripts;
- @command{mdw} type primitives only print data they retrieve,
- and neither store nor return those values.
-
- @itemize
- @item @var{arrayname} ... is the name of an array variable
- @item @var{width} ... is 8/16/32/64 - indicating the memory access size
- @item @var{address} ... is the target memory address
- @item @var{count} ... is the number of elements to process
- @end itemize
- @end deffn
-
- @deffn {Command} {$target_name cget} queryparm
- Each configuration parameter accepted by
- @command{$target_name configure}
- can be individually queried, to return its current value.
- The @var{queryparm} is a parameter name
- accepted by that command, such as @code{-work-area-phys}.
- There are a few special cases:
-
- @itemize @bullet
- @item @code{-event} @var{event_name} -- returns the handler for the
- event named @var{event_name}.
- This is a special case because setting a handler requires
- two parameters.
- @item @code{-type} -- returns the target type.
- This is a special case because this is set using
- @command{target create} and can't be changed
- using @command{$target_name configure}.
- @end itemize
-
- For example, if you wanted to summarize information about
- all the targets you might use something like this:
-
- @example
- foreach name [target names] @{
- set y [$name cget -endian]
- set z [$name cget -type]
- puts [format "Chip %d is %s, Endian: %s, type: %s" \
- $x $name $y $z]
- @}
- @end example
- @end deffn
-
- @anchor{targetcurstate}
- @deffn {Command} {$target_name curstate}
- Displays the current target state:
- @code{debug-running},
- @code{halted},
- @code{reset},
- @code{running}, or @code{unknown}.
- (Also, @pxref{eventpolling,,Event Polling}.)
- @end deffn
-
- @deffn {Command} {$target_name eventlist}
- Displays a table listing all event handlers
- currently associated with this target.
- @xref{targetevents,,Target Events}.
- @end deffn
-
- @deffn {Command} {$target_name invoke-event} event_name
- Invokes the handler for the event named @var{event_name}.
- (This is primarily intended for use by OpenOCD framework
- code, for example by the reset code in @file{startup.tcl}.)
- @end deffn
-
- @deffn {Command} {$target_name mdd} [phys] addr [count]
- @deffnx {Command} {$target_name mdw} [phys] addr [count]
- @deffnx {Command} {$target_name mdh} [phys] addr [count]
- @deffnx {Command} {$target_name mdb} [phys] addr [count]
- Display contents of address @var{addr}, as
- 64-bit doublewords (@command{mdd}),
- 32-bit words (@command{mdw}), 16-bit halfwords (@command{mdh}),
- or 8-bit bytes (@command{mdb}).
- When the current target has an MMU which is present and active,
- @var{addr} is interpreted as a virtual address.
- Otherwise, or if the optional @var{phys} flag is specified,
- @var{addr} is interpreted as a physical address.
- If @var{count} is specified, displays that many units.
- (If you want to manipulate the data instead of displaying it,
- see the @code{mem2array} primitives.)
- @end deffn
-
- @deffn {Command} {$target_name mwd} [phys] addr doubleword [count]
- @deffnx {Command} {$target_name mww} [phys] addr word [count]
- @deffnx {Command} {$target_name mwh} [phys] addr halfword [count]
- @deffnx {Command} {$target_name mwb} [phys] addr byte [count]
- Writes the specified @var{doubleword} (64 bits), @var{word} (32 bits),
- @var{halfword} (16 bits), or @var{byte} (8-bit) value,
- at the specified address @var{addr}.
- When the current target has an MMU which is present and active,
- @var{addr} is interpreted as a virtual address.
- Otherwise, or if the optional @var{phys} flag is specified,
- @var{addr} is interpreted as a physical address.
- If @var{count} is specified, fills that many units of consecutive address.
- @end deffn
-
- @anchor{targetevents}
- @section Target Events
- @cindex target events
- @cindex events
- At various times, certain things can happen, or you want them to happen.
- For example:
- @itemize @bullet
- @item What should happen when GDB connects? Should your target reset?
- @item When GDB tries to flash the target, do you need to enable the flash via a special command?
- @item Is using SRST appropriate (and possible) on your system?
- Or instead of that, do you need to issue JTAG commands to trigger reset?
- SRST usually resets everything on the scan chain, which can be inappropriate.
- @item During reset, do you need to write to certain memory locations
- to set up system clocks or
- to reconfigure the SDRAM?
- How about configuring the watchdog timer, or other peripherals,
- to stop running while you hold the core stopped for debugging?
- @end itemize
-
- All of the above items can be addressed by target event handlers.
- These are set up by @command{$target_name configure -event} or
- @command{target create ... -event}.
-
- The programmer's model matches the @code{-command} option used in Tcl/Tk
- buttons and events. The two examples below act the same, but one creates
- and invokes a small procedure while the other inlines it.
-
- @example
- proc my_init_proc @{ @} @{
- echo "Disabling watchdog..."
- mww 0xfffffd44 0x00008000
- @}
- mychip.cpu configure -event reset-init my_init_proc
- mychip.cpu configure -event reset-init @{
- echo "Disabling watchdog..."
- mww 0xfffffd44 0x00008000
- @}
- @end example
-
- The following target events are defined:
-
- @itemize @bullet
- @item @b{debug-halted}
- @* The target has halted for debug reasons (i.e.: breakpoint)
- @item @b{debug-resumed}
- @* The target has resumed (i.e.: GDB said run)
- @item @b{early-halted}
- @* Occurs early in the halt process
- @item @b{examine-start}
- @* Before target examine is called.
- @item @b{examine-end}
- @* After target examine is called with no errors.
- @item @b{examine-fail}
- @* After target examine fails.
- @item @b{gdb-attach}
- @* When GDB connects. Issued before any GDB communication with the target
- starts. GDB expects the target is halted during attachment.
- @xref{gdbmeminspect,,GDB as a non-intrusive memory inspector}, how to
- connect GDB to running target.
- The event can be also used to set up the target so it is possible to probe flash.
- Probing flash is necessary during GDB connect if you want to use
- @pxref{programmingusinggdb,,programming using GDB}.
- Another use of the flash memory map is for GDB to automatically choose
- hardware or software breakpoints depending on whether the breakpoint
- is in RAM or read only memory.
- Default is @code{halt}
- @item @b{gdb-detach}
- @* When GDB disconnects
- @item @b{gdb-end}
- @* When the target has halted and GDB is not doing anything (see early halt)
- @item @b{gdb-flash-erase-start}
- @* Before the GDB flash process tries to erase the flash (default is
- @code{reset init})
- @item @b{gdb-flash-erase-end}
- @* After the GDB flash process has finished erasing the flash
- @item @b{gdb-flash-write-start}
- @* Before GDB writes to the flash
- @item @b{gdb-flash-write-end}
- @* After GDB writes to the flash (default is @code{reset halt})
- @item @b{gdb-start}
- @* Before the target steps, GDB is trying to start/resume the target
- @item @b{halted}
- @* The target has halted
- @item @b{reset-assert-pre}
- @* Issued as part of @command{reset} processing
- after @command{reset-start} was triggered
- but before either SRST alone is asserted on the scan chain,
- or @code{reset-assert} is triggered.
- @item @b{reset-assert}
- @* Issued as part of @command{reset} processing
- after @command{reset-assert-pre} was triggered.
- When such a handler is present, cores which support this event will use
- it instead of asserting SRST.
- This support is essential for debugging with JTAG interfaces which
- don't include an SRST line (JTAG doesn't require SRST), and for
- selective reset on scan chains that have multiple targets.
- @item @b{reset-assert-post}
- @* Issued as part of @command{reset} processing
- after @code{reset-assert} has been triggered.
- or the target asserted SRST on the entire scan chain.
- @item @b{reset-deassert-pre}
- @* Issued as part of @command{reset} processing
- after @code{reset-assert-post} has been triggered.
- @item @b{reset-deassert-post}
- @* Issued as part of @command{reset} processing
- after @code{reset-deassert-pre} has been triggered
- and (if the target is using it) after SRST has been
- released on the scan chain.
- @item @b{reset-end}
- @* Issued as the final step in @command{reset} processing.
- @item @b{reset-init}
- @* Used by @b{reset init} command for board-specific initialization.
- This event fires after @emph{reset-deassert-post}.
-
- This is where you would configure PLLs and clocking, set up DRAM so
- you can download programs that don't fit in on-chip SRAM, set up pin
- multiplexing, and so on.
- (You may be able to switch to a fast JTAG clock rate here, after
- the target clocks are fully set up.)
- @item @b{reset-start}
- @* Issued as the first step in @command{reset} processing
- before @command{reset-assert-pre} is called.
-
- This is the most robust place to use @command{jtag_rclk}
- or @command{adapter speed} to switch to a low JTAG clock rate,
- when reset disables PLLs needed to use a fast clock.
- @item @b{resume-start}
- @* Before any target is resumed
- @item @b{resume-end}
- @* After all targets have resumed
- @item @b{resumed}
- @* Target has resumed
- @item @b{step-start}
- @* Before a target is single-stepped
- @item @b{step-end}
- @* After single-step has completed
- @item @b{trace-config}
- @* After target hardware trace configuration was changed
- @end itemize
-
- @quotation Note
- OpenOCD events are not supposed to be preempt by another event, but this
- is not enforced in current code. Only the target event @b{resumed} is
- executed with polling disabled; this avoids polling to trigger the event
- @b{halted}, reversing the logical order of execution of their handlers.
- Future versions of OpenOCD will prevent the event preemption and will
- disable the schedule of polling during the event execution. Do not rely
- on polling in any event handler; this means, don't expect the status of
- a core to change during the execution of the handler. The event handler
- will have to enable polling or use @command{$target_name arp_poll} to
- check if the core has changed status.
- @end quotation
-
- @node Flash Commands
- @chapter Flash Commands
-
- OpenOCD has different commands for NOR and NAND flash;
- the ``flash'' command works with NOR flash, while
- the ``nand'' command works with NAND flash.
- This partially reflects different hardware technologies:
- NOR flash usually supports direct CPU instruction and data bus access,
- while data from a NAND flash must be copied to memory before it can be
- used. (SPI flash must also be copied to memory before use.)
- However, the documentation also uses ``flash'' as a generic term;
- for example, ``Put flash configuration in board-specific files''.
-
- Flash Steps:
- @enumerate
- @item Configure via the command @command{flash bank}
- @* Do this in a board-specific configuration file,
- passing parameters as needed by the driver.
- @item Operate on the flash via @command{flash subcommand}
- @* Often commands to manipulate the flash are typed by a human, or run
- via a script in some automated way. Common tasks include writing a
- boot loader, operating system, or other data.
- @item GDB Flashing
- @* Flashing via GDB requires the flash be configured via ``flash
- bank'', and the GDB flash features be enabled.
- @xref{gdbconfiguration,,GDB Configuration}.
- @end enumerate
-
- Many CPUs have the ability to ``boot'' from the first flash bank.
- This means that misprogramming that bank can ``brick'' a system,
- so that it can't boot.
- JTAG tools, like OpenOCD, are often then used to ``de-brick'' the
- board by (re)installing working boot firmware.
-
- @anchor{norconfiguration}
- @section Flash Configuration Commands
- @cindex flash configuration
-
- @deffn {Config Command} {flash bank} name driver base size chip_width bus_width target [driver_options]
- Configures a flash bank which provides persistent storage
- for addresses from @math{base} to @math{base + size - 1}.
- These banks will often be visible to GDB through the target's memory map.
- In some cases, configuring a flash bank will activate extra commands;
- see the driver-specific documentation.
-
- @itemize @bullet
- @item @var{name} ... may be used to reference the flash bank
- in other flash commands. A number is also available.
- @item @var{driver} ... identifies the controller driver
- associated with the flash bank being declared.
- This is usually @code{cfi} for external flash, or else
- the name of a microcontroller with embedded flash memory.
- @xref{flashdriverlist,,Flash Driver List}.
- @item @var{base} ... Base address of the flash chip.
- @item @var{size} ... Size of the chip, in bytes.
- For some drivers, this value is detected from the hardware.
- @item @var{chip_width} ... Width of the flash chip, in bytes;
- ignored for most microcontroller drivers.
- @item @var{bus_width} ... Width of the data bus used to access the
- chip, in bytes; ignored for most microcontroller drivers.
- @item @var{target} ... Names the target used to issue
- commands to the flash controller.
- @comment Actually, it's currently a controller-specific parameter...
- @item @var{driver_options} ... drivers may support, or require,
- additional parameters. See the driver-specific documentation
- for more information.
- @end itemize
- @quotation Note
- This command is not available after OpenOCD initialization has completed.
- Use it in board specific configuration files, not interactively.
- @end quotation
- @end deffn
-
- @comment less confusing would be: "flash list" (like "nand list")
- @deffn {Command} {flash banks}
- Prints a one-line summary of each device that was
- declared using @command{flash bank}, numbered from zero.
- Note that this is the @emph{plural} form;
- the @emph{singular} form is a very different command.
- @end deffn
-
- @deffn {Command} {flash list}
- Retrieves a list of associative arrays for each device that was
- declared using @command{flash bank}, numbered from zero.
- This returned list can be manipulated easily from within scripts.
- @end deffn
-
- @deffn {Command} {flash probe} num
- Identify the flash, or validate the parameters of the configured flash. Operation
- depends on the flash type.
- The @var{num} parameter is a value shown by @command{flash banks}.
- Most flash commands will implicitly @emph{autoprobe} the bank;
- flash drivers can distinguish between probing and autoprobing,
- but most don't bother.
- @end deffn
-
- @section Preparing a Target before Flash Programming
-
- The target device should be in well defined state before the flash programming
- begins.
-
- @emph{Always issue} @command{reset init} before @ref{flashprogrammingcommands,,Flash Programming Commands}.
- Do not issue another @command{reset} or @command{reset halt} or @command{resume}
- until the programming session is finished.
-
- If you use @ref{programmingusinggdb,,Programming using GDB},
- the target is prepared automatically in the event gdb-flash-erase-start
-
- The jimtcl script @command{program} calls @command{reset init} explicitly.
-
- @section Erasing, Reading, Writing to Flash
- @cindex flash erasing
- @cindex flash reading
- @cindex flash writing
- @cindex flash programming
- @anchor{flashprogrammingcommands}
-
- One feature distinguishing NOR flash from NAND or serial flash technologies
- is that for read access, it acts exactly like any other addressable memory.
- This means you can use normal memory read commands like @command{mdw} or
- @command{dump_image} with it, with no special @command{flash} subcommands.
- @xref{memoryaccess,,Memory access}, and @ref{imageaccess,,Image access}.
-
- Write access works differently. Flash memory normally needs to be erased
- before it's written. Erasing a sector turns all of its bits to ones, and
- writing can turn ones into zeroes. This is why there are special commands
- for interactive erasing and writing, and why GDB needs to know which parts
- of the address space hold NOR flash memory.
-
- @quotation Note
- Most of these erase and write commands leverage the fact that NOR flash
- chips consume target address space. They implicitly refer to the current
- JTAG target, and map from an address in that target's address space
- back to a flash bank.
- @comment In May 2009, those mappings may fail if any bank associated
- @comment with that target doesn't successfully autoprobe ... bug worth fixing?
- A few commands use abstract addressing based on bank and sector numbers,
- and don't depend on searching the current target and its address space.
- Avoid confusing the two command models.
- @end quotation
-
- Some flash chips implement software protection against accidental writes,
- since such buggy writes could in some cases ``brick'' a system.
- For such systems, erasing and writing may require sector protection to be
- disabled first.
- Examples include CFI flash such as ``Intel Advanced Bootblock flash'',
- and AT91SAM7 on-chip flash.
- @xref{flashprotect,,flash protect}.
-
- @deffn {Command} {flash erase_sector} num first last
- Erase sectors in bank @var{num}, starting at sector @var{first}
- up to and including @var{last}.
- Sector numbering starts at 0.
- Providing a @var{last} sector of @option{last}
- specifies "to the end of the flash bank".
- The @var{num} parameter is a value shown by @command{flash banks}.
- @end deffn
-
- @deffn {Command} {flash erase_address} [@option{pad}] [@option{unlock}] address length
- Erase sectors starting at @var{address} for @var{length} bytes.
- Unless @option{pad} is specified, @math{address} must begin a
- flash sector, and @math{address + length - 1} must end a sector.
- Specifying @option{pad} erases extra data at the beginning and/or
- end of the specified region, as needed to erase only full sectors.
- The flash bank to use is inferred from the @var{address}, and
- the specified length must stay within that bank.
- As a special case, when @var{length} is zero and @var{address} is
- the start of the bank, the whole flash is erased.
- If @option{unlock} is specified, then the flash is unprotected
- before erase starts.
- @end deffn
-
- @deffn {Command} {flash filld} address double-word length
- @deffnx {Command} {flash fillw} address word length
- @deffnx {Command} {flash fillh} address halfword length
- @deffnx {Command} {flash fillb} address byte length
- Fills flash memory with the specified @var{double-word} (64 bits), @var{word} (32 bits),
- @var{halfword} (16 bits), or @var{byte} (8-bit) pattern,
- starting at @var{address} and continuing
- for @var{length} units (word/halfword/byte).
- No erasure is done before writing; when needed, that must be done
- before issuing this command.
- Writes are done in blocks of up to 1024 bytes, and each write is
- verified by reading back the data and comparing it to what was written.
- The flash bank to use is inferred from the @var{address} of
- each block, and the specified length must stay within that bank.
- @end deffn
- @comment no current checks for errors if fill blocks touch multiple banks!
-
- @deffn {Command} {flash mdw} addr [count]
- @deffnx {Command} {flash mdh} addr [count]
- @deffnx {Command} {flash mdb} addr [count]
- Display contents of address @var{addr}, as
- 32-bit words (@command{mdw}), 16-bit halfwords (@command{mdh}),
- or 8-bit bytes (@command{mdb}).
- If @var{count} is specified, displays that many units.
- Reads from flash using the flash driver, therefore it enables reading
- from a bank not mapped in target address space.
- The flash bank to use is inferred from the @var{address} of
- each block, and the specified length must stay within that bank.
- @end deffn
-
- @deffn {Command} {flash write_bank} num filename [offset]
- Write the binary @file{filename} to flash bank @var{num},
- starting at @var{offset} bytes from the beginning of the bank. If @var{offset}
- is omitted, start at the beginning of the flash bank.
- The @var{num} parameter is a value shown by @command{flash banks}.
- @end deffn
-
- @deffn {Command} {flash read_bank} num filename [offset [length]]
- Read @var{length} bytes from the flash bank @var{num} starting at @var{offset}
- and write the contents to the binary @file{filename}. If @var{offset} is
- omitted, start at the beginning of the flash bank. If @var{length} is omitted,
- read the remaining bytes from the flash bank.
- The @var{num} parameter is a value shown by @command{flash banks}.
- @end deffn
-
- @deffn {Command} {flash verify_bank} num filename [offset]
- Compare the contents of the binary file @var{filename} with the contents of the
- flash bank @var{num} starting at @var{offset}. If @var{offset} is omitted,
- start at the beginning of the flash bank. Fail if the contents do not match.
- The @var{num} parameter is a value shown by @command{flash banks}.
- @end deffn
-
- @deffn {Command} {flash write_image} [erase] [unlock] filename [offset] [type]
- Write the image @file{filename} to the current target's flash bank(s).
- Only loadable sections from the image are written.
- A relocation @var{offset} may be specified, in which case it is added
- to the base address for each section in the image.
- The file [@var{type}] can be specified
- explicitly as @option{bin} (binary), @option{ihex} (Intel hex),
- @option{elf} (ELF file), @option{s19} (Motorola s19).
- @option{mem}, or @option{builder}.
- The relevant flash sectors will be erased prior to programming
- if the @option{erase} parameter is given. If @option{unlock} is
- provided, then the flash banks are unlocked before erase and
- program. The flash bank to use is inferred from the address of
- each image section.
-
- @quotation Warning
- Be careful using the @option{erase} flag when the flash is holding
- data you want to preserve.
- Portions of the flash outside those described in the image's
- sections might be erased with no notice.
- @itemize
- @item
- When a section of the image being written does not fill out all the
- sectors it uses, the unwritten parts of those sectors are necessarily
- also erased, because sectors can't be partially erased.
- @item
- Data stored in sector "holes" between image sections are also affected.
- For example, "@command{flash write_image erase ...}" of an image with
- one byte at the beginning of a flash bank and one byte at the end
- erases the entire bank -- not just the two sectors being written.
- @end itemize
- Also, when flash protection is important, you must re-apply it after
- it has been removed by the @option{unlock} flag.
- @end quotation
-
- @end deffn
-
- @deffn {Command} {flash verify_image} filename [offset] [type]
- Verify the image @file{filename} to the current target's flash bank(s).
- Parameters follow the description of 'flash write_image'.
- In contrast to the 'verify_image' command, for banks with specific
- verify method, that one is used instead of the usual target's read
- memory methods. This is necessary for flash banks not readable by
- ordinary memory reads.
- This command gives only an overall good/bad result for each bank, not
- addresses of individual failed bytes as it's intended only as quick
- check for successful programming.
- @end deffn
-
- @section Other Flash commands
- @cindex flash protection
-
- @deffn {Command} {flash erase_check} num
- Check erase state of sectors in flash bank @var{num},
- and display that status.
- The @var{num} parameter is a value shown by @command{flash banks}.
- @end deffn
-
- @deffn {Command} {flash info} num [sectors]
- Print info about flash bank @var{num}, a list of protection blocks
- and their status. Use @option{sectors} to show a list of sectors instead.
-
- The @var{num} parameter is a value shown by @command{flash banks}.
- This command will first query the hardware, it does not print cached
- and possibly stale information.
- @end deffn
-
- @anchor{flashprotect}
- @deffn {Command} {flash protect} num first last (@option{on}|@option{off})
- Enable (@option{on}) or disable (@option{off}) protection of flash blocks
- in flash bank @var{num}, starting at protection block @var{first}
- and continuing up to and including @var{last}.
- Providing a @var{last} block of @option{last}
- specifies "to the end of the flash bank".
- The @var{num} parameter is a value shown by @command{flash banks}.
- The protection block is usually identical to a flash sector.
- Some devices may utilize a protection block distinct from flash sector.
- See @command{flash info} for a list of protection blocks.
- @end deffn
-
- @deffn {Command} {flash padded_value} num value
- Sets the default value used for padding any image sections, This should
- normally match the flash bank erased value. If not specified by this
- command or the flash driver then it defaults to 0xff.
- @end deffn
-
- @anchor{program}
- @deffn {Command} {program} filename [preverify] [verify] [reset] [exit] [offset]
- This is a helper script that simplifies using OpenOCD as a standalone
- programmer. The only required parameter is @option{filename}, the others are optional.
- @xref{Flash Programming}.
- @end deffn
-
- @anchor{flashdriverlist}
- @section Flash Driver List
- As noted above, the @command{flash bank} command requires a driver name,
- and allows driver-specific options and behaviors.
- Some drivers also activate driver-specific commands.
-
- @deffn {Flash Driver} {virtual}
- This is a special driver that maps a previously defined bank to another
- address. All bank settings will be copied from the master physical bank.
-
- The @var{virtual} driver defines one mandatory parameters,
-
- @itemize
- @item @var{master_bank} The bank that this virtual address refers to.
- @end itemize
-
- So in the following example addresses 0xbfc00000 and 0x9fc00000 refer to
- the flash bank defined at address 0x1fc00000. Any command executed on
- the virtual banks is actually performed on the physical banks.
- @example
- flash bank $_FLASHNAME pic32mx 0x1fc00000 0 0 0 $_TARGETNAME
- flash bank vbank0 virtual 0xbfc00000 0 0 0 \
- $_TARGETNAME $_FLASHNAME
- flash bank vbank1 virtual 0x9fc00000 0 0 0 \
- $_TARGETNAME $_FLASHNAME
- @end example
- @end deffn
-
- @subsection External Flash
-
- @deffn {Flash Driver} {cfi}
- @cindex Common Flash Interface
- @cindex CFI
- The ``Common Flash Interface'' (CFI) is the main standard for
- external NOR flash chips, each of which connects to a
- specific external chip select on the CPU.
- Frequently the first such chip is used to boot the system.
- Your board's @code{reset-init} handler might need to
- configure additional chip selects using other commands (like: @command{mww} to
- configure a bus and its timings), or
- perhaps configure a GPIO pin that controls the ``write protect'' pin
- on the flash chip.
- The CFI driver can use a target-specific working area to significantly
- speed up operation.
-
- The CFI driver can accept the following optional parameters, in any order:
-
- @itemize
- @item @var{jedec_probe} ... is used to detect certain non-CFI flash ROMs,
- like AM29LV010 and similar types.
- @item @var{x16_as_x8} ... when a 16-bit flash is hooked up to an 8-bit bus.
- @item @var{bus_swap} ... when data bytes in a 16-bit flash needs to be swapped.
- @item @var{data_swap} ... when data bytes in a 16-bit flash needs to be
- swapped when writing data values (i.e. not CFI commands).
- @end itemize
-
- To configure two adjacent banks of 16 MBytes each, both sixteen bits (two bytes)
- wide on a sixteen bit bus:
-
- @example
- flash bank $_FLASHNAME cfi 0x00000000 0x01000000 2 2 $_TARGETNAME
- flash bank $_FLASHNAME cfi 0x01000000 0x01000000 2 2 $_TARGETNAME
- @end example
-
- To configure one bank of 32 MBytes
- built from two sixteen bit (two byte) wide parts wired in parallel
- to create a thirty-two bit (four byte) bus with doubled throughput:
-
- @example
- flash bank $_FLASHNAME cfi 0x00000000 0x02000000 2 4 $_TARGETNAME
- @end example
-
- @c "cfi part_id" disabled
- @end deffn
-
- @deffn {Flash Driver} {jtagspi}
- @cindex Generic JTAG2SPI driver
- @cindex SPI
- @cindex jtagspi
- @cindex bscan_spi
- Several FPGAs and CPLDs can retrieve their configuration (bitstream) from a
- SPI flash connected to them. To access this flash from the host, the device
- is first programmed with a special proxy bitstream that
- exposes the SPI flash on the device's JTAG interface. The flash can then be
- accessed through JTAG.
-
- Since signaling between JTAG and SPI is compatible, all that is required for
- a proxy bitstream is to connect TDI-MOSI, TDO-MISO, TCK-CLK and activate
- the flash chip select when the JTAG state machine is in SHIFT-DR. Such
- a bitstream for several Xilinx FPGAs can be found in
- @file{contrib/loaders/flash/fpga/xilinx_bscan_spi.py}. It requires
- @uref{https://github.com/m-labs/migen, migen} and a Xilinx toolchain to build.
-
- This flash bank driver requires a target on a JTAG tap and will access that
- tap directly. Since no support from the target is needed, the target can be a
- "testee" dummy. Since the target does not expose the flash memory
- mapping, target commands that would otherwise be expected to access the flash
- will not work. These include all @command{*_image} and
- @command{$target_name m*} commands as well as @command{program}. Equivalent
- functionality is available through the @command{flash write_bank},
- @command{flash read_bank}, and @command{flash verify_bank} commands.
-
- @itemize
- @item @var{ir} ... is loaded into the JTAG IR to map the flash as the JTAG DR.
- For the bitstreams generated from @file{xilinx_bscan_spi.py} this is the
- @var{USER1} instruction.
- @end itemize
-
- @example
- target create $_TARGETNAME testee -chain-position $_CHIPNAME.fpga
- set _XILINX_USER1 0x02
- flash bank $_FLASHNAME spi 0x0 0 0 0 \
- $_TARGETNAME $_XILINX_USER1
- @end example
- @end deffn
-
- @deffn {Flash Driver} {xcf}
- @cindex Xilinx Platform flash driver
- @cindex xcf
- Xilinx FPGAs can be configured from specialized flash ICs named Platform Flash.
- It is (almost) regular NOR flash with erase sectors, program pages, etc. The
- only difference is special registers controlling its FPGA specific behavior.
- They must be properly configured for successful FPGA loading using
- additional @var{xcf} driver command:
-
- @deffn {Command} {xcf ccb} <bank_id>
- command accepts additional parameters:
- @itemize
- @item @var{external|internal} ... selects clock source.
- @item @var{serial|parallel} ... selects serial or parallel data bus mode.
- @item @var{slave|master} ... selects slave of master mode for flash device.
- @item @var{40|20} ... selects clock frequency in MHz for internal clock
- in master mode.
- @end itemize
- @example
- xcf ccb 0 external parallel slave 40
- @end example
- All of them must be specified even if clock frequency is pointless
- in slave mode. If only bank id specified than command prints current
- CCB register value. Note: there is no need to write this register
- every time you erase/program data sectors because it stores in
- dedicated sector.
- @end deffn
-
- @deffn {Command} {xcf configure} <bank_id>
- Initiates FPGA loading procedure. Useful if your board has no "configure"
- button.
- @example
- xcf configure 0
- @end example
- @end deffn
-
- Additional driver notes:
- @itemize
- @item Only single revision supported.
- @item Driver automatically detects need of bit reverse, but
- only "bin" (raw binary, do not confuse it with "bit") and "mcs"
- (Intel hex) file types supported.
- @item For additional info check xapp972.pdf and ug380.pdf.
- @end itemize
- @end deffn
-
- @deffn {Flash Driver} {lpcspifi}
- @cindex NXP SPI Flash Interface
- @cindex SPIFI
- @cindex lpcspifi
- NXP's LPC43xx and LPC18xx families include a proprietary SPI
- Flash Interface (SPIFI) peripheral that can drive and provide
- memory mapped access to external SPI flash devices.
-
- The lpcspifi driver initializes this interface and provides
- program and erase functionality for these serial flash devices.
- Use of this driver @b{requires} a working area of at least 1kB
- to be configured on the target device; more than this will
- significantly reduce flash programming times.
-
- The setup command only requires the @var{base} parameter. All
- other parameters are ignored, and the flash size and layout
- are configured by the driver.
-
- @example
- flash bank $_FLASHNAME lpcspifi 0x14000000 0 0 0 $_TARGETNAME
- @end example
-
- @end deffn
-
- @deffn {Flash Driver} {stmsmi}
- @cindex STMicroelectronics Serial Memory Interface
- @cindex SMI
- @cindex stmsmi
- Some devices from STMicroelectronics (e.g. STR75x MCU family,
- SPEAr MPU family) include a proprietary
- ``Serial Memory Interface'' (SMI) controller able to drive external
- SPI flash devices.
- Depending on specific device and board configuration, up to 4 external
- flash devices can be connected.
-
- SMI makes the flash content directly accessible in the CPU address
- space; each external device is mapped in a memory bank.
- CPU can directly read data, execute code and boot from SMI banks.
- Normal OpenOCD commands like @command{mdw} can be used to display
- the flash content.
-
- The setup command only requires the @var{base} parameter in order
- to identify the memory bank.
- All other parameters are ignored. Additional information, like
- flash size, are detected automatically.
-
- @example
- flash bank $_FLASHNAME stmsmi 0xf8000000 0 0 0 $_TARGETNAME
- @end example
-
- @end deffn
-
- @deffn {Flash Driver} {stmqspi}
- @cindex STMicroelectronics QuadSPI/OctoSPI Interface
- @cindex QuadSPI
- @cindex OctoSPI
- @cindex stmqspi
- Some devices from STMicroelectronics include a proprietary ``QuadSPI Interface''
- (e.g. STM32F4, STM32F7, STM32L4) or ``OctoSPI Interface'' (e.g. STM32L4+)
- controller able to drive one or even two (dual mode) external SPI flash devices.
- The OctoSPI is a superset of QuadSPI, its presence is detected automatically.
- Currently only the regular command mode is supported, whereas the HyperFlash
- mode is not.
-
- QuadSPI/OctoSPI makes the flash contents directly accessible in the CPU address
- space; in case of dual mode both devices must be of the same type and are
- mapped in the same memory bank (even and odd addresses interleaved).
- CPU can directly read data, execute code (but not boot) from QuadSPI bank.
-
- The 'flash bank' command only requires the @var{base} parameter and the extra
- parameter @var{io_base} in order to identify the memory bank. Both are fixed
- by hardware, see datasheet or RM. All other parameters are ignored.
-
- The controller must be initialized after each reset and properly configured
- for memory-mapped read operation for the particular flash chip(s), for the full
- list of available register settings cf. the controller's RM. This setup is quite
- board specific (that's why booting from this memory is not possible). The
- flash driver infers all parameters from current controller register values when
- 'flash probe @var{bank_id}' is executed.
-
- Normal OpenOCD commands like @command{mdw} can be used to display the flash content,
- but only after proper controller initialization as described above. However,
- due to a silicon bug in some devices, attempting to access the very last word
- should be avoided.
-
- It is possible to use two (even different) flash chips alternatingly, if individual
- bank chip selects are available. For some package variants, this is not the case
- due to limited pin count. To switch from one to another, adjust FSEL bit accordingly
- and re-issue 'flash probe bank_id'. Note that the bank base address will @emph{not}
- change, so the address spaces of both devices will overlap. In dual flash mode
- both chips must be identical regarding size and most other properties.
-
- Block or sector protection internal to the flash chip is not handled by this
- driver at all, but can be dealt with manually by the 'cmd' command, see below.
- The sector protection via 'flash protect' command etc. is completely internal to
- openocd, intended only to prevent accidental erase or overwrite and it does not
- persist across openocd invocations.
-
- OpenOCD contains a hardcoded list of flash devices with their properties,
- these are auto-detected. If a device is not included in this list, SFDP discovery
- is attempted. If this fails or gives inappropriate results, manual setting is
- required (see 'set' command).
-
- @example
- flash bank $_FLASHNAME stmqspi 0x90000000 0 0 0 \
- $_TARGETNAME 0xA0001000
- flash bank $_FLASHNAME stmqspi 0x70000000 0 0 0 \
- $_TARGETNAME 0xA0001400
- @end example
-
- There are three specific commands
- @deffn {Command} {stmqspi mass_erase} bank_id
- Clears sector protections and performs a mass erase. Works only if there is no
- chip specific write protection engaged.
- @end deffn
-
- @deffn {Command} {stmqspi set} bank_id name total_size page_size read_cmd fread_cmd pprg_cmd mass_erase_cmd sector_size sector_erase_cmd
- Set flash parameters: @var{name} human readable string, @var{total_size} size
- in bytes, @var{page_size} is write page size. @var{read_cmd}, @var{fread_cmd} and @var{pprg_cmd}
- are commands for reading and page programming. @var{fread_cmd} is used in DPI and QPI modes,
- @var{read_cmd} in normal SPI (single line) mode. @var{mass_erase_cmd}, @var{sector_size}
- and @var{sector_erase_cmd} are optional.
-
- This command is required if chip id is not hardcoded yet and e.g. for EEPROMs or FRAMs
- which don't support an id command.
-
- In dual mode parameters of both chips are set identically. The parameters refer to
- a single chip, so the whole bank gets twice the specified capacity etc.
- @end deffn
-
- @deffn {Command} {stmqspi cmd} bank_id resp_num cmd_byte ...
- If @var{resp_num} is zero, sends command @var{cmd_byte} and following data
- bytes. In dual mode command byte is sent to @emph{both} chips but data bytes are
- sent @emph{alternatingly} to chip 1 and 2, first to flash 1, second to flash 2, etc.,
- i.e. the total number of bytes (including cmd_byte) must be odd.
-
- If @var{resp_num} is not zero, cmd and at most four following data bytes are
- sent, in dual mode @emph{simultaneously} to both chips. Then @var{resp_num} bytes
- are read interleaved from both chips starting with chip 1. In this case
- @var{resp_num} must be even.
-
- Note the hardware dictated subtle difference of those two cases in dual-flash mode.
-
- To check basic communication settings, issue
- @example
- stmqspi cmd bank_id 0 0x04; stmqspi cmd bank_id 1 0x05
- stmqspi cmd bank_id 0 0x06; stmqspi cmd bank_id 1 0x05
- @end example
- for single flash mode or
- @example
- stmqspi cmd bank_id 0 0x04; stmqspi cmd bank_id 2 0x05
- stmqspi cmd bank_id 0 0x06; stmqspi cmd bank_id 2 0x05
- @end example
- for dual flash mode. This should return the status register contents.
-
- In 8-line mode, @var{cmd_byte} is sent twice - first time as given, second time
- complemented. Additionally, in 8-line mode only, some commands (e.g. Read Status)
- need a dummy address, e.g.
- @example
- stmqspi cmd bank_id 1 0x05 0x00 0x00 0x00 0x00
- @end example
- should return the status register contents.
-
- @end deffn
-
- @end deffn
-
- @deffn {Flash Driver} {mrvlqspi}
- This driver supports QSPI flash controller of Marvell's Wireless
- Microcontroller platform.
-
- The flash size is autodetected based on the table of known JEDEC IDs
- hardcoded in the OpenOCD sources.
-
- @example
- flash bank $_FLASHNAME mrvlqspi 0x0 0 0 0 $_TARGETNAME 0x46010000
- @end example
-
- @end deffn
-
- @deffn {Flash Driver} {ath79}
- @cindex Atheros ath79 SPI driver
- @cindex ath79
- Members of ATH79 SoC family from Atheros include a SPI interface with 3
- chip selects.
- On reset a SPI flash connected to the first chip select (CS0) is made
- directly read-accessible in the CPU address space (up to 16MBytes)
- and is usually used to store the bootloader and operating system.
- Normal OpenOCD commands like @command{mdw} can be used to display
- the flash content while it is in memory-mapped mode (only the first
- 4MBytes are accessible without additional configuration on reset).
-
- The setup command only requires the @var{base} parameter in order
- to identify the memory bank. The actual value for the base address
- is not otherwise used by the driver. However the mapping is passed
- to gdb. Thus for the memory mapped flash (chipselect CS0) the base
- address should be the actual memory mapped base address. For unmapped
- chipselects (CS1 and CS2) care should be taken to use a base address
- that does not overlap with real memory regions.
- Additional information, like flash size, are detected automatically.
- An optional additional parameter sets the chipselect for the bank,
- with the default CS0.
- CS1 and CS2 require additional GPIO setup before they can be used
- since the alternate function must be enabled on the GPIO pin
- CS1/CS2 is routed to on the given SoC.
-
- @example
- flash bank $_FLASHNAME ath79 0xbf000000 0 0 0 $_TARGETNAME
-
- # When using multiple chipselects the base should be different
- # for each, otherwise the write_image command is not able to
- # distinguish the banks.
- flash bank flash0 ath79 0xbf000000 0 0 0 $_TARGETNAME cs0
- flash bank flash1 ath79 0x10000000 0 0 0 $_TARGETNAME cs1
- flash bank flash2 ath79 0x20000000 0 0 0 $_TARGETNAME cs2
- @end example
-
- @end deffn
-
- @deffn {Flash Driver} {fespi}
- @cindex Freedom E SPI
- @cindex fespi
-
- SiFive's Freedom E SPI controller, used in HiFive and other boards.
-
- @example
- flash bank $_FLASHNAME fespi 0x20000000 0 0 0 $_TARGETNAME
- @end example
- @end deffn
-
- @subsection Internal Flash (Microcontrollers)
-
- @deffn {Flash Driver} {aduc702x}
- The ADUC702x analog microcontrollers from Analog Devices
- include internal flash and use ARM7TDMI cores.
- The aduc702x flash driver works with models ADUC7019 through ADUC7028.
- The setup command only requires the @var{target} argument
- since all devices in this family have the same memory layout.
-
- @example
- flash bank $_FLASHNAME aduc702x 0 0 0 0 $_TARGETNAME
- @end example
- @end deffn
-
- @deffn {Flash Driver} {ambiqmicro}
- @cindex ambiqmicro
- @cindex apollo
- All members of the Apollo microcontroller family from
- Ambiq Micro include internal flash and use ARM's Cortex-M4 core.
- The host connects over USB to an FTDI interface that communicates
- with the target using SWD.
-
- The @var{ambiqmicro} driver reads the Chip Information Register detect
- the device class of the MCU.
- The Flash and SRAM sizes directly follow device class, and are used
- to set up the flash banks.
- If this fails, the driver will use default values set to the minimum
- sizes of an Apollo chip.
-
- All Apollo chips have two flash banks of the same size.
- In all cases the first flash bank starts at location 0,
- and the second bank starts after the first.
-
- @example
- # Flash bank 0
- flash bank $_FLASHNAME ambiqmicro 0 0x00040000 0 0 $_TARGETNAME
- # Flash bank 1 - same size as bank0, starts after bank 0.
- flash bank $_FLASHNAME ambiqmicro 0x00040000 0x00040000 0 0 \
- $_TARGETNAME
- @end example
-
- Flash is programmed using custom entry points into the bootloader.
- This is the only way to program the flash as no flash control registers
- are available to the user.
-
- The @var{ambiqmicro} driver adds some additional commands:
-
- @deffn {Command} {ambiqmicro mass_erase} <bank>
- Erase entire bank.
- @end deffn
- @deffn {Command} {ambiqmicro page_erase} <bank> <first> <last>
- Erase device pages.
- @end deffn
- @deffn {Command} {ambiqmicro program_otp} <bank> <offset> <count>
- Program OTP is a one time operation to create write protected flash.
- The user writes sectors to SRAM starting at 0x10000010.
- Program OTP will write these sectors from SRAM to flash, and write protect
- the flash.
- @end deffn
- @end deffn
-
- @anchor{at91samd}
- @deffn {Flash Driver} {at91samd}
- @cindex at91samd
- All members of the ATSAM D2x, D1x, D0x, ATSAMR, ATSAML and ATSAMC microcontroller
- families from Atmel include internal flash and use ARM's Cortex-M0+ core.
-
- Do not use for ATSAM D51 and E5x: use @xref{atsame5}.
-
- The devices have one flash bank:
-
- @example
- flash bank $_FLASHNAME at91samd 0x00000000 0 1 1 $_TARGETNAME
- @end example
-
- @deffn {Command} {at91samd chip-erase}
- Issues a complete Flash erase via the Device Service Unit (DSU). This can be
- used to erase a chip back to its factory state and does not require the
- processor to be halted.
- @end deffn
-
- @deffn {Command} {at91samd set-security}
- Secures the Flash via the Set Security Bit (SSB) command. This prevents access
- to the Flash and can only be undone by using the chip-erase command which
- erases the Flash contents and turns off the security bit. Warning: at this
- time, openocd will not be able to communicate with a secured chip and it is
- therefore not possible to chip-erase it without using another tool.
-
- @example
- at91samd set-security enable
- @end example
- @end deffn
-
- @deffn {Command} {at91samd eeprom}
- Shows or sets the EEPROM emulation size configuration, stored in the User Row
- of the Flash. When setting, the EEPROM size must be specified in bytes and it
- must be one of the permitted sizes according to the datasheet. Settings are
- written immediately but only take effect on MCU reset. EEPROM emulation
- requires additional firmware support and the minimum EEPROM size may not be
- the same as the minimum that the hardware supports. Set the EEPROM size to 0
- in order to disable this feature.
-
- @example
- at91samd eeprom
- at91samd eeprom 1024
- @end example
- @end deffn
-
- @deffn {Command} {at91samd bootloader}
- Shows or sets the bootloader size configuration, stored in the User Row of the
- Flash. This is called the BOOTPROT region. When setting, the bootloader size
- must be specified in bytes and it must be one of the permitted sizes according
- to the datasheet. Settings are written immediately but only take effect on
- MCU reset. Setting the bootloader size to 0 disables bootloader protection.
-
- @example
- at91samd bootloader
- at91samd bootloader 16384
- @end example
- @end deffn
-
- @deffn {Command} {at91samd dsu_reset_deassert}
- This command releases internal reset held by DSU
- and prepares reset vector catch in case of reset halt.
- Command is used internally in event reset-deassert-post.
- @end deffn
-
- @deffn {Command} {at91samd nvmuserrow}
- Writes or reads the entire 64 bit wide NVM user row register which is located at
- 0x804000. This register includes various fuses lock-bits and factory calibration
- data. Reading the register is done by invoking this command without any
- arguments. Writing is possible by giving 1 or 2 hex values. The first argument
- is the register value to be written and the second one is an optional changemask.
- Every bit which value in changemask is 0 will stay unchanged. The lock- and
- reserved-bits are masked out and cannot be changed.
-
- @example
- # Read user row
- >at91samd nvmuserrow
- NVMUSERROW: 0xFFFFFC5DD8E0C788
- # Write 0xFFFFFC5DD8E0C788 to user row
- >at91samd nvmuserrow 0xFFFFFC5DD8E0C788
- # Write 0x12300 to user row but leave other bits and low
- # byte unchanged
- >at91samd nvmuserrow 0x12345 0xFFF00
- @end example
- @end deffn
-
- @end deffn
-
- @anchor{at91sam3}
- @deffn {Flash Driver} {at91sam3}
- @cindex at91sam3
- All members of the AT91SAM3 microcontroller family from
- Atmel include internal flash and use ARM's Cortex-M3 core. The driver
- currently (6/22/09) recognizes the AT91SAM3U[1/2/4][C/E] chips. Note
- that the driver was orginaly developed and tested using the
- AT91SAM3U4E, using a SAM3U-EK eval board. Support for other chips in
- the family was cribbed from the data sheet. @emph{Note to future
- readers/updaters: Please remove this worrisome comment after other
- chips are confirmed.}
-
- The AT91SAM3U4[E/C] (256K) chips have two flash banks; most other chips
- have one flash bank. In all cases the flash banks are at
- the following fixed locations:
-
- @example
- # Flash bank 0 - all chips
- flash bank $_FLASHNAME at91sam3 0x00080000 0 1 1 $_TARGETNAME
|