This page is about how to use open source OpenOCD JTAG software with BeagleBoard. With this, it will be possible to have OMAP3 JTAG debug using cheap JTAG hardware, e.g. Flyswatter.
As of December 2008, OpenOCD doesn't work with Beagle Board (ARM Cortex A8, OMAP3). OpenOCD support is work in progress. This section tries to cover the recent status to
- give everybody the steps to recent status in case they want to help
- be ready if support is ready
OpenOCD JTAG bring up
On IRC it was discussed what will be necessary to get OpenOCD working with OMAP3 on BeagleBoard:
- OpenOCD compatible JTAG hardware interface with FTDI's FT2232 chip, e.g. Flyswatter.
- Create an adapter to convert the Flyswatter 14-pins JTAG into 14-pins TI JTAG
- Get latest OpenOCD source
- Add Cortex-A8 CPU ID. Currently only Cortex-M3 is supported. Take this as example. Once you connect to target you should get error message expect cpuid of xxxxxx but got yyyyyy which should contain Cortex-A8 CPU ID.
- Take CPU scan lengths from OMAP3530 CCS config.
- Regarding EMU0/EMU1 pins on BeagleBoard, pulling both pins down does currently not make Cortex-A8 CPU accessible. Only one TAP is visible (ICEPick). Therefore OpenOCD will not be able to validate the scan chain. The documentation for the control of EMU0/EMU1 is very misleading:
0 0 ICEPick + default TAP(s) 0 1 ICEPick Reserved 1 0 ICEPick Wait-in-reset 1 1 ICEPick Default condition NOTES: ICEPick is always in the scan chain Default TAPs are the ARM and the ETB
This table is identical to the Davinci documentation, with one BIG difference:
- The OMAP3xx has NO default TAP (ARM or ETB taps) which means that the configuration of EMU0-L/EMU1-L doesn't add ARM to scan chain (above table is wrong, though).
The OMAP3xx uses a TAP router, it needs to be programmed with the information about available TAPS first, before ARM is accessible. Once the DAP has been added to the TAP router, via a programming sequence, the ARM core can be accessed.
TI has a good presentation describing the functionality of the ICEPick TAP Router (or generically refered to as JTAG Route Controller or JRC). The ICEPick jtag device ID is 0x0b73b02f (Manufacturer: 0x017, Part: 0xb73b, Version: 0x0) and is the same as the Davinci series.
It may still be possible to use the EMU0-L/EMU1-L configuration, but with consideration that the TAP router will already configured for with the arm core interface. Yet to be tested.
If above basics work, additionally MMU, cache support and some include files for A8 might be added to OpenOCD.
Note: If you made some progress regarding BeagleBoard OpenOCD support, please send a short note to BeagleBoard ML and OpenOCD ML.
Status end of October 2008:
- Kees and Nishanth have some status info
- There is some discussion how to extend OpenOCD to support JRC configuration (see thread JTAG emulator with openocd for beagleboard).
OpenOCD build instructions describe how to build OpenOCD. For questions you can use OpenOCD Mailing list.
Get OpenOCD code via svn:
> svn checkout svn://svn.berlios.de/openocd/trunk openocd
For Flyswatter you additionally need libftd2xx or libFTDI. While libFTDI is available in source, libftd2xx is supposed to be 50% faster than libFTDI, but only available as (binary) shared library.
If you have both, unpack libftd2xx and build OpenOCD:
> tar xvfz libftd2xx0.4.15.tar.gz > cd openocd > ./bootstrap > ./configure --enable-ft2232_ftd2xx --with-ftd2xx=<path_to>/libftd2xx0.4.15 --prefix=/home/user/bin/openOCD or (depending which FTDI library you use, see above) > ./configure --enable-ft2232_libftdi -with-ftd2xx=<path_to>/include --prefix=/home/user/bin/openOCD > make > make install
Note: There is a bug in OpenOCD build tooling using --enable-ft2232_libftdi regarding -with-ftd2xx path if you didn't install libftdi library in standard path: While you give the path to include directory, the header file is found. But if you have libftdi.so in <path_to>/lib linking might stop with
... gcc -g -O2 -o openocd openocd-main.o openocd-openocd.o ../src/xsvf/libxsvf.a \ ../src/target/libtarget.a ../src/jtag/libjtag.a ../src/helper/libhelper.a \ ../src/server/libserver.a ../src/helper/libhelper.a ../src/flash/libflash.a \ ../src/target/libtarget.a ../src/pld/libpld.a -lftdi -lusb -ldl /bin/ld: cannot find -lftdi collect2: ld returned 1 exit status make: *** [openocd] Error 1 make: Leaving directory `./openocd/src' ...
You can fix this linking manually adding the path to libftdi.so (gcc command on one line):
> cd src > gcc -g -O2 -o openocd openocd-main.o openocd-openocd.o ../src/xsvf/libxsvf.a \ ../src/target/libtarget.a ../src/jtag/libjtag.a ../src/helper/libhelper.a \ ../src/server/libserver.a ../src/helper/libhelper.a ../src/flash/libflash.a \ ../src/target/libtarget.a ../src/pld/libpld.a -lftdi -lusb -ldl \ -L<path_to>/lib > cd .. > make
Note: By default (make & make install) only .info documentation is installed. You can get PDF or HTML documentation by
Resulting documentation can be found in openocd/doc, then.
Note: If you like to save some disk space and don't plan to debug OpenOCD binary itself, you can strip this (remove unneeded debug symbols):
> cd <openocd_install_dir>/bin > strip openocd
(e.g. with OpenOCD 1.0 this reduced binary size from ~3MB to ~700kB)
Note: If you don't have libftdi in standard path, you might like to extend library search path:
if you e.g. get
> ./openocd ./openocd: error while loading shared libraries: libftdi.so.1: cannot open shared object file: No such file or directory
Beagle configuration file
OpenOCD runtime is controlled by several configuration files. I.e. main configuration file (openocd.cfg) calling ("source") various sub configurations. For Beagle, in directory where you start openocd create a file openocd.cfg (assuming you use Flyswatter):
#File: openocd.cfg #Basic configuration telnet_port 4444 gdb_port 3333 #Interface source [find interface/flyswatter.cfg] #jtag scan chain set CHIPNAME beagleboard source [find board/beagleboard.cfg] #disable the dap before we enable it #this code needs to more somewhere else jtag tapdisable beagleboard.dap #also needs moving to the board? reset_config trst_and_srst
Interface configuration file flyswatter.cfg is part of OpenOCD source, while beagleboard.cfg isn't yet. Get an example beagleboard.cfg as patch (beagleboard_cfg.patch).
- have a beagleboard.cfg in board directory
- have Flyswatter switched on (attached to USB)
- have openocd.cfg in the directory you start openocd from
you can now start openocd with
openocd -s <path_to_config_files> // e.g. <patch_of_openocd_install_dir>/lib/openocd
This should result in
> openocd -s lib/openocd/ Open On-Chip Debugger 1.0 (2008-12-16-07:54) svn:1245 BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS $URL: svn://svn.berlios.de/openocd/trunk/src/openocd.c $ jtag_speed: 1 Error: JTAG communication failure, check connection, JTAG interface, target power etc. Error: trying to validate configured JTAG chain anyway... Error: Error validating JTAG scan chain, IR mismatch, scan returned 0xff Error: Could not validate JTAG chain, continuing anyway... Warning:no gdb ports allocated as no target has been specified Warning:no tcl port specified, using default port 6666