This patch adds in support to assert warm reset through the ICEPick controller. The added functionality has been primarily tested on the AM/DM37x, but it has also been used some on the OMAP4.

-Karl
>From 0347f5ad23786080331ee4d09788c947c7126c28 Mon Sep 17 00:00:00 2001
From: Karl Kurbjun <kkurb...@gmail.com>
Date: Sun, 2 Oct 2011 10:52:20 -0600
Subject: [PATCH] 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.
---
 tcl/target/icepick.cfg |  109 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 102 insertions(+), 7 deletions(-)

diff --git a/tcl/target/icepick.cfg b/tcl/target/icepick.cfg
index da92c9e..40d462c 100644
--- a/tcl/target/icepick.cfg
+++ b/tcl/target/icepick.cfg
@@ -1,21 +1,116 @@
+#
+# 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
 
-	# set ip control
-	irscan $jrc 2 -endstate IRPAUSE
-	drscan $jrc 32 [expr 0xa0002108 + ($port << 24)] -endstate DRPAUSE
+	# TRM states that the register should be read back here, skipped for now
 
-	irscan $jrc 0x3F -endstate RUN/IDLE
+	# 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
+
+	# Finally select the tap
+	icepick_c_router $jrc 1 0x2 $port 0x102148
+
+	# 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
+}
+
+
-- 
1.7.4.1

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to