From: Karl Kurbjun Date: Sun, 2 Oct 2011 16:52:20 +0000 (-0600) Subject: ICEPick-C: Add support for warm reset through JTAG controller and provide finer detai... X-Git-Tag: v0.6.0-rc1~533 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=70143a96c5cfcf13e1bfcabcbd39bc321f2da151;p=openocd ICEPick-C: Add support for warm reset through JTAG controller and provide finer detail functions. This sets up simple functions that can later be used to provide additional ICEPick Operations. Change-Id: I313b8679267696fad87d23f3692963e513f2fe21 Signed-off-by: Spencer Oliver Reviewed-on: http://openocd.zylin.com/22 Tested-by: Øyvind Harboe Reviewed-by: Øyvind Harboe --- diff --git a/tcl/target/icepick.cfg b/tcl/target/icepick.cfg index da92c9ee..ff73138c 100644 --- a/tcl/target/icepick.cfg +++ b/tcl/target/icepick.cfg @@ -1,21 +1,115 @@ +# +# Copyright (C) 2011 by Karl Kurbjun +# Copyright (C) 2009 by David Brownell +# + # Utilities for TI ICEpick-C ... used in DaVinci, OMAP3, and more. +# Details about the ICEPickC are available in the AM/DM37x document SPRUGN4M + +# create "constants" +proc CONST { key } { + + array set constant { + # define ICEPick instructions + IR_BYPASS 0x00 + IR_ROUTER 0x02 + IR_CONNECT 0x07 + IF_BYPASS 0x3F + } + return $constant($key) +} + +# Instruction to connect to the icepick module +proc icepick_c_connect {jrc} { + + # Send CONNECT instruction in IR state + irscan $jrc [CONST IR_CONNECT] -endstate IRPAUSE + + # Send write and connect key + drscan $jrc 8 0x89 -endstate DRPAUSE +} + +# Instruction to disconnect to the icepick module +proc icepick_c_disconnect {jrc} { + + # Send CONNECT instruction in IR state + irscan $jrc [CONST IR_CONNECT] -endstate IRPAUSE + + # Send write and connect key + drscan $jrc 8 0x86 -endstate DRPAUSE +} + +# +# icepick_c_router: +# this function is for sending router commands +# arguments are: +# jrc: TAP name for the ICEpick +# rw: read/write (0 for read, 1 for write) +# block: icepick or DAP +# register: which register to read/write +# payload: value to read/write +# this function is for sending router commands +# +proc icepick_c_router {jrc rw block register payload} { + + set new_dr_value \ + [expr ( ($rw & 0x1) << 31) | ( ($block & 0x7) << 28) | \ + ( ($register & 0xF) << 24) | ( $payload & 0xFFFFFF ) ] + +# echo "\tNew router value:\t0x[format %x $new_dr_value]" + + # select router + irscan $jrc [CONST IR_ROUTER] -endstate IRPAUSE + + # ROUTER instructions are 32 bits wide + set old_dr_value [drscan $jrc 32 $new_dr_value -endstate DRPAUSE] +} + +# Configure the icepick control register +proc icepick_c_setup {jrc} { + + # send a router write, block is 0, register is 1, value is 0x2100 + icepick_c_router $jrc 1 0x0 0x1 0x001000 +} # jrc == TAP name for the ICEpick # port == a port number, 0..15 proc icepick_c_tapenable {jrc port} { + # First CONNECT to the ICEPick +# echo "Connecting to ICEPick" + icepick_c_connect $jrc + +# echo "Configuring the ICEpick" + icepick_c_setup $jrc + # NOTE: it's important not to enter RUN/IDLE state until # done sending these instructions and data to the ICEpick. # And never to enter RESET, which will disable the TAPs. - # select router - irscan $jrc 7 -endstate IRPAUSE - drscan $jrc 8 0x89 -endstate DRPAUSE + # first enable power and clock for TAP + icepick_c_router $jrc 1 0x2 $port 0x100048 + + # TRM states that the register should be read back here, skipped for now + + # enable debug "default" mode + icepick_c_router $jrc 1 0x2 $port 0x102048 + + # TRM states that debug enable and debug mode should be read back and + # confirmed - skipped for now - # set ip control - irscan $jrc 2 -endstate IRPAUSE - drscan $jrc 32 [expr 0xa0002108 + ($port << 24)] -endstate DRPAUSE + # Finally select the tap + icepick_c_router $jrc 1 0x2 $port 0x102148 - irscan $jrc 0x3F -endstate RUN/IDLE + # Enter the bypass state + irscan $jrc [CONST IR_BYPASS] -endstate RUN/IDLE runtest 10 } + +# This function uses the ICEPick to send a warm system reset +proc icepick_c_wreset {jrc} { + + # send a router write, block is 0, register is 1, value is 0x2100 + icepick_c_router $jrc 1 0x0 0x1 0x002101 +} +