Update OpenOCD notes and scripts

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3088 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2010-11-07 16:21:12 +00:00
parent a4e888b714
commit d2e2668275
3 changed files with 212 additions and 30 deletions

View File

@ -12,6 +12,7 @@ Contents
IDEs IDEs
NuttX buildroot Toolchain NuttX buildroot Toolchain
LEDs LEDs
Using OpenOCD and GDB with an FT2232 JTAG emulator
Olimex LPC1766-STK Configuration Options Olimex LPC1766-STK Configuration Options
Configurations Configurations
@ -287,6 +288,155 @@ LEDs
of a signal or interrupt handler. of a signal or interrupt handler.
ON Flashing Ooops! We crashed sometime after initialization. ON Flashing Ooops! We crashed sometime after initialization.
Using OpenOCD and GDB with an FT2232 JTAG emulator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Downloading OpenOCD
You can get information about OpenOCD here: http://openocd.berlios.de/web/
and you can download it from here. http://sourceforge.net/projects/openocd/files/.
To get the latest OpenOCD with more mature lpc17xx, you have to download
from the GIT archive.
git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
At present, there is only the older, frozen 0.4.0 version. These, of course,
may have changed since I wrote this.
Building OpenOCD under Cygwin:
You can build OpenOCD for Windows using the Cygwin tools. Below are a
few notes that worked as of November 7, 2010. Things may have changed
by the time you read this, but perhaps the following will be helpful to
you:
1. Install Cygwin (http://www.cygwin.com/). My recommendation is to install
everything. There are many tools you will need and it is best just to
waste a little disk space and have everthing you need. Everything will
require a couple of gigbytes of disk space.
2. Create a directory /home/OpenOCD.
3. Get the FT2232 drivr from http://www.ftdichip.com/Drivers/D2XX.htm and
extract it into /home/OpenOCD/ftd2xx
$ pwd
/home/OpenOCD
$ ls
CDM20802 WHQL Certified.zip
$ mkdir ftd2xx
$ cd ftd2xx
$ unzip ..CDM20802\ WHQL\ Certified.zip
Archive: CDM20802 WHQL Certified.zip
...
3. Get the latest OpenOCD source
$ pwd
/home/OpenOCD
$ git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd
You will then have the source code in /home/OpenOCD/openocd
4. Build OpenOCD for the FT22322 interface
$ pwd
/home/OpenOCD/openocd
$ ./bootstrap
Jim is a tiny version of the Tcl scripting language. It is needed
by more recent versions of OpenOCD. Build libjim.a using the following
instructions:
$ git submodule init
$ git submodule update
$ cd jimtcl
$./configure --with-jim-ext=nvp
$ make
$ make install
Configure OpenOCD:
.$ /configure --enable-maintainer-mode --disable-werror --disable-shared \
--enable-ft2232_ftd2xx --with-ftd2xx-win32-zipdir=/home/OpenOCD/ftd2xx \
LDFLAGS="-L/home/OpenOCD/openocd/jimtcl"
Then build OpenOCD and its HTML documentation:
$ make
$ make html
The result of the first make will be the "openocd.exe" will be
created in the folder /home/openocd/src. The following command
will install OpenOCD to a standard location (/usr/local/bin)
using using this command:
$ make install
Helper Scripts.
I have been using the Olimex ARM-USB-OCD JTAG debugger with the
LPC1766-STK (http://www.olimex.com). OpenOCD requires a configuration
file. I keep the one I used last here:
configs/olimex-lpc1766stk/tools/olimex.cfg
However, the "correct" configuration script to use with OpenOCD may
change as the features of OpenOCD evolve. So you should at least
compare that olimex.cfg file with configuration files in
/usr/local/share/openocd/scripts/target (or /home/OpenOCD/openocd/tcl/target).
As of this writing, there is no script for the lpc1766, but the
lpc1768 configurtion can be used after changing the flash size to
256Kb. That is, change:
flash bank $_FLASHNAME lpc2000 0x0 0x80000 0 0 $_TARGETNAME ...
To:
flash bank $_FLASHNAME lpc2000 0x0 0x40000 0 0 $_TARGETNAME ...
There is also a script on the tools/ directory that I use to start
the OpenOCD daemon on my system called oocd.sh. That script will
probably require some modifications to work in another environment:
- Possibly the value of OPENOCD_PATH and TARGET_PATH
- It assumes that the correct script to use is the one at
configs/olimex-lpc1766stk/tools/olimex.cfg
Starting OpenOCD
Then you should be able to start the OpenOCD daemon like:
configs/olimex-lpc1766stk/tools/oocd.sh $PWD
If you use the setenv.sh file, that the path to oocd.sh will be added
to your PATH environment variabl. So, in that case, the command simplifies
to just:
oocd.sh $PWD
Where it is assumed that you are executing oocd.sh from the top-level
directory where NuttX is installed. $PWD will be the path to the
top-level NuttX directory.
Connecting GDB
Once the OpenOCD daemon has been started, you can connect to it via
GDB using the following GDB command:
arm-elf-gdb
(gdb) target remote localhost:3333
And you can load the NuttX ELF file:
(gdb) symbol-file nuttx
(gdb) load nuttx
OpenOCD will support several special 'monitor' commands:
(gdb) monitor reset
(gdb) monitor halt
Olimex LPC1766-STK Configuration Options Olimex LPC1766-STK Configuration Options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -1,3 +1,5 @@
# NXP LPC1766 Cortex-M3 with 256kB Flash and 32kB+32kB Local On-Chip SRAM,
#daemon configuration #daemon configuration
telnet_port 4444 telnet_port 4444
gdb_port 3333 gdb_port 3333
@ -8,7 +10,9 @@ ft2232_device_desc "Olimex OpenOCD JTAG A"
ft2232_layout "olimex-jtag" ft2232_layout "olimex-jtag"
ft2232_vid_pid 0x15BA 0x0003 ft2232_vid_pid 0x15BA 0x0003
# NXP LPC1766 Cortex-M3 with 256kB Flash and 32kB+32kB Local On-Chip SRAM, clocked with 4MHz internal RC oscillator # LPC17xx chips support both JTAG and SWD transports.
# Adapt based on what transport is active.
source [find target/swj-dp.tcl]
if { [info exists CHIPNAME] } { if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME set _CHIPNAME $CHIPNAME
@ -16,12 +20,18 @@ if { [info exists CHIPNAME] } {
set _CHIPNAME lpc1766 set _CHIPNAME lpc1766
} }
if { [info exists ENDIAN] } { # After reset the chip is clocked by the ~4MHz internal RC oscillator.
set _ENDIAN $ENDIAN # When board-specific code (reset-init handler or device firmware)
# configures another oscillator and/or PLL0, set CCLK to match; if
# you don't, then flash erase and write operations may misbehave.
# (The ROM code doing those updates cares about core clock speed...)
#
# CCLK is the core clock frequency in KHz
if { [info exists CCLK ] } {
set _CCLK $CCLK
} else { } else {
set _ENDIAN little set _CCLK 4000
} }
if { [info exists CPUTAPID ] } { if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID set _CPUTAPID $CPUTAPID
} else { } else {
@ -29,33 +39,45 @@ if { [info exists CPUTAPID ] } {
} }
#delays on reset lines #delays on reset lines
jtag_nsrst_delay 200 adapter_nsrst_delay 200
jtag_ntrst_delay 200 jtag_ntrst_delay 200
# LPC2000 & LPC1700 -> SRST causes TRST #jtag newtap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID
reset_config trst_and_srst srst_pulls_trst swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
set _TARGETNAME $_CHIPNAME.cpu set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME target create $_TARGETNAME cortex_m3 -chain-position $_TARGETNAME
# LPC1766 has 32kB of SRAM on its main system bus (so-called Local On-Chip SRAM) # LPC1766 has 32kB of SRAM In the ARMv7-M "Code" area (at 0x10000000)
$_TARGETNAME configure -work-area-phys 0x10000000 -work-area-size 0x8000 -work-area-backup 0 # and 32K more on AHB, in the ARMv7-M "SRAM" area, (at 0x2007c000).
$_TARGETNAME configure -work-area-phys 0x10000000 -work-area-size 0x8000
# REVISIT is there any good reason to have this reset-init event handler??
# Normally they should set up (board-specific) clocking then probe the flash...
$_TARGETNAME configure -event reset-init {
# Force NVIC.VTOR to point to flash at 0 ...
# WHY? This is it's reset value; we run right after reset!!
mwb 0xE000ED08 0x00
}
# LPC1766 has 256kB of user-available FLASH (bootloader is located in separate dedicated region).
# flash bank lpc1700 <base> <size> 0 0 <target#> <variant> <cclk> [calc_checksum]
# LPC1766 has 256kB of flash memory, managed by ROM code (including a
# boot loader which verifies the flash exception table's checksum).
# flash bank <name> lpc2000 <base> <size> 0 0 <target#> <variant> <clock> [calc checksum]
set _FLASHNAME $_CHIPNAME.flash set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME lpc2000 0x0 0x40000 0 0 $_TARGETNAME lpc1700 80000 calc_checksum flash bank $_FLASHNAME lpc2000 0x0 0x40000 0 0 $_TARGETNAME \
lpc1700 $_CCLK calc_checksum
# 4MHz / 6 = 666kHz, so use 500 # Run with *real slow* clock by default since the
jtag_khz 100 # boot rom could have been playing with the PLL, so
# we have no idea what clock the target is running at.
jtag_khz 10
$_TARGETNAME configure -event reset-init {
# Do not remap 0x0000-0x0020 to anything but the flash (i.e. select
# "User Flash Mode" where interrupt vectors are _not_ remapped,
# and reside in flash instead).
#
# See Table 612. Memory Mapping Control register (MEMMAP - 0x400F C040) bit description
# Bit Symbol Value Description Reset
# value
# 0 MAP Memory map control. 0
# 0 Boot mode. A portion of the Boot ROM is mapped to address 0.
# 1 User mode. The on-chip Flash memory is mapped to address 0.
# 31:1 - Reserved. The value read from a reserved bit is not defined. NA
#
# http://ics.nxp.com/support/documents/microcontrollers/?scope=LPC1766&type=user
mww 0x400FC040 0x01
}

View File

@ -1,4 +1,7 @@
#!/bin/sh #!/bin/sh
#
# See configs/olimex-lpc1766stk/README.txt for information about
# this file.
TOPDIR=$1 TOPDIR=$1
USAGE="$0 <TOPDIR> [-d]" USAGE="$0 <TOPDIR> [-d]"
@ -8,10 +11,16 @@ if [ -z "${TOPDIR}" ]; then
exit 1 exit 1
fi fi
OPENOCD_PATH="/cygdrive/c/OpenOCD/openocd-0.4.0/src" # Assume that OpenOCD was installed and at /usr/local/bin. Uncomment
# the following to run directly from the build directory
#OPENOCD_PATH="/home/OpenOCD/openocd/src"
#TARGET_PATH="/home/OpenOCD/openocd/tcl"
OPENOCD_PATH="/usr/local/bin"
TARGET_PATH="/usr/local/share/openocd/scripts"
OPENOCD_EXE=openocd.exe OPENOCD_EXE=openocd.exe
OPENOCD_CFG="${TOPDIR}/configs/olimex-lpc1766stk/tools/olimex.cfg" OPENOCD_CFG="${TOPDIR}/configs/olimex-lpc1766stk/tools/olimex.cfg"
OPENOCD_ARGS="-f `cygpath -w ${OPENOCD_CFG}`" OPENOCD_ARGS="-f ${OPENOCD_CFG} -s ${TARGET_PATH}"
if [ "X$2" = "X-d" ]; then if [ "X$2" = "X-d" ]; then
OPENOCD_ARGS=$OPENOCD_ARGS" -d3" OPENOCD_ARGS=$OPENOCD_ARGS" -d3"
@ -32,7 +41,8 @@ if [ ! -f ${OPENOCD_CFG} ]; then
fi fi
echo "Starting OpenOCD" echo "Starting OpenOCD"
${OPENOCD_PATH}/${OPENOCD_EXE} ${OPENOCD_ARGS} & cd ${OPENOCD_PATH} || { echo "Failed to CD to ${OPENOCD_PATH}"; exit 1; }
${OPENOCD_EXE} ${OPENOCD_ARGS} &
echo "OpenOCD daemon started" echo "OpenOCD daemon started"
ps -ef | grep openocd ps -ef | grep openocd
echo "In GDB: target remote localhost:3333" echo "In GDB: target remote localhost:3333"