Difference between revisions of "Hardware/EIR/OpenOCD/JTAG"

From Nutwiki
Jump to: navigation, search
(Created page with "<div id="content"> = OpenOCD for AT91SAM7SE - Part 2 = For the second part of our Tutorial it's assumed, that you have successfully openocd_hardware.html|...")
 
(No difference)

Latest revision as of 10:06, 13 July 2017

OpenOCD for AT91SAM7SE - Part 2

For the second part of our Tutorial it's assumed, that you have successfully setup your hardware.

Configuring the JTAG Adapter

In order to get OpenOCD up and running, we must configure the JTAG interface. Without this, OpenOCD will start, print a few error messages and stop.

Open On-Chip Debugger 0.6.0-rc1 (2012-08-08-20:04)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Runtime Error: embedded:startup.tcl:47: Can't find openocd.cfg
in procedure 'script'
at file "embedded:startup.tcl", line 47
Error: Debug Adapter has to be specified, see "interface" command
in procedure 'init'

When started without any command line options, OpenOCD expects its configuration in a file named openocd.cfg, located in the current directory. Let's create this file, using a text editor.

Selecting the Interface

The first thing we need to tell OpenOCD in this file is the name of the interface. This depends on the JTAG adapter you are using. For most USB JTAG adapters based on FTDI chips, this will be:

interface ft2232

For the Turtelizer support package, this is slightly different:

interface turtle

You may run into a problem here. Some time ago the OpenOCD development team decided not to provide any official binaries anymore. They offer the source code only, expecting the vendor of the JTAG hardware to build the binaries. All supported interfaces are optionally selected during this build stage and therefore the binary you received from somewhere may not support your specific JTAG hardware.

Luckily, if the specified interface is not supported, OpenOCD will list all known interfaces

The following debug interfaces are available:
1: parport
2: ft2232
3: ftdi
4: usb_blaster
5: amt_jtagaccel
6: gw16012
7: presto
8: usbprog
9: jlink
10: vsllink
11: rlink
12: ulink
13: arm-jtag-ew
14: stlink

If your's is not included, ask your JTAG hardware vendor for the right binary. Btw., the list above has been retrieved from the binary offered at www.freddiechopin.info. Freddie's binary distributions for Windows PCs are most complete and highly recommended.

Selecting the Layout

Next, we must specify the interface layout. The reason is, that only the main JTAG signals are at fixed pins of the FTDI chip. Selecting pins for additional I/Os like reset lines or LEDs is left to the manufacturer. Layouts are currently hard coded in the OpenOCD binary and selected with the ft2232_layout configuration. For the Turtelizer 2, add the following line to openocd.cfg.

ft2232_layout turtelizer2

Since OpenOCD version 0.6.0 it is possible to specify the pin layout in the configuration file. But this hadn't been documented yet. Freddie Chopin was so kind to add two new configuration files for Turtelizer 2, which make use of this new feature. One is for Rev-B and the other for Rev-C adapters. By the time we will try to test this new feature.

Selecting the USB Device

Saving our two lines in openocd.cfg (interface and layout) and trying to run OpenOCD will still fail with

Error: neither device description nor serial number specified
Error: please add "ft2232_device_desc " or "ft2232_serial " to your .cfg file
in procedure 'init'

OpenOCD needs to know, which USB device it should connect to. You may either specify the interface description or the devices serial number here. When using Turtelizer 2, add the following line to openocd.cfg:

ft2232_device_desc "Turtelizer JTAG/RS232 Adapter"

Saving this and trying to run OpenOCD again should give you an output similar to:

Info : only one transport option; autoselect 'jtag'
Info : device: 4 "2232C"
Info : deviceID: 67354056
Info : SerialNumber: TLVE8EUJA
Info : Description: Turtelizer JTAG/RS232 Adapter A
Error: An adapter speed is not selected in the init script.
Insert a call to adapter_khz or jtag_rclk to proceed.
in procedure 'init'

OpenOCD still terminates, but we will not test your patience any further. The next step will solve this final issue.

Just one more hint. If you look to the output above, you will probably notice the serial number. This is a unique ID, which may be used instead of the device descriptor. You will need this if you are attaching more than one Turtelizer to the same PC:

ft2232_serial TLVE8EUJA

Selecting the Initial Adapter Speed

Unlike other interfaces like RS-232 or Ethernet, JTAG does not define any standardized speeds. Uploading large binaries to your target board can become quite annoying, so you always want to run at the highest possible speed. This, however, is limited by two factors:

  • Maximum speed of the JTAG adapter
  • Maximum speed of the target board

The latter is the critical part, which requires further evaluation. Most ARM CPUs start running at a special slow clock. This is also true for the EIR, which initially uses the 32kHz oscillator. Usually the bootloader will reconfigure the clocks to let the CPU run at full speed. But when the CPU is controlled via JTAG, the bootloader may not have a chance to execute or may be completely absent. On the other hand, many ARM CPUs cannot handle JTAG clock frequencies much higher than the CPU clock.

The good news first: There is a mechanism called adaptive clocking, where the CPU returns the JTAG clock on a separate pin. This signal is used by the JTAG adapter to synchronize its output clock. OpenOCD supports this mode, when the following is given in the configuration file:

jtag_rclk 3000

It will set the JTAG clock speed to 3MHz and automatically adjust it to lower speeds, if required.

Now some bad news. First of all, Turtelizer doesn't support this feature. Simply because the FT2232D used in this adapter doesn't support it. There are other adapters based on the later FT2232H, which do support adaptive clocking. But still, they are not able to synchronize down to the full range. It is still required to "manually" adjust the clock. Well, and the final show stopper is the AT91SAM7SE CPU, which neither supports adaptive clocking.

We will solve this by starting at a low frequency of 8kHz. Later we will use OpenOCD to bring up the PLL, run the CPU at full speed and increase the Turtelizer's JTAG speed to its maximum. Add the following line to openocd.cfg:

adapter_khz 8

For completeness, here is the contents of openocd.cfg we got so far:

interface ft2232
ft2232_layout turtelizer2
ft2232_device_desc "Turtelizer JTAG/RS232 Adapter"
adapter_khz 8

If using the Turtelizer 2 support package, replace the first line with

interface turtle

Starting OpenOCD should now result in the following output and this time OpenOCD will no longer terminated with an error.

Open On-Chip Debugger 0.6.0-rc1 (2012-08-08-20:04)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
8 kHz
Info : device: 4 "2232C"
Info : deviceID: 67354056
Info : SerialNumber: TLVE8EUJA
Info : Description: Turtelizer JTAG/RS232 Adapter A
Info : clock speed 8 kHz
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x3f0f0f0f ..."
Warn : AUTO auto0.tap - use "... -irlen 4"
Warn : gdb services need one or more targets defined

Of course, your output will slightly vary. But in general you can see, that OpenOCD automatically switches to auto probing and even suggest to add jtag newtap to our configuration file. You will here more about this in the third part.