On Saturday 05 September 2009, Øyvind Harboe wrote:
> Add "jtag_extra_clocks 100" to your config file

to icepick.cfg in fact ... see the appended patch, which
is yours plus (a) "quilt" removed spurious end-of-line
whitespace, and (b) the icepic.cfg update is there

Not tested.

- Dave

---
 src/flash/str9xpec.c   |    3 ++-
 src/jtag/core.c        |   36 ++++++++++++++++++++++++++++++++++--
 src/jtag/jtag.h        |    5 +++++
 src/jtag/tcl.c         |   39 +++++++++++++++++++++++++++++++++++++++
 tcl/target/icepick.cfg |    3 +++
 5 files changed, 83 insertions(+), 3 deletions(-)

--- a/src/flash/str9xpec.c
+++ b/src/flash/str9xpec.c
@@ -1254,7 +1254,8 @@ static int str9xpec_handle_flash_disable
 		return ERROR_FAIL;
 
 	/* exit turbo mode via RESET */
-	str9xpec_set_instr(tap, ISC_NOOP, TAP_RESET);
+	str9xpec_set_instr(tap, ISC_NOOP, TAP_IDLE);
+	jtag_add_tlr();
 	jtag_execute_queue();
 
 	/* restore previous scan chain */
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -43,6 +43,8 @@
 /// The number of JTAG queue flushes (for profiling and debugging purposes).
 static int jtag_flush_queue_count;
 
+static int jtag_extra_tlr_clocks = 0;
+
 static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state),
 		int in_num_fields, scan_field_t *in_fields, tap_state_t state);
 
@@ -339,6 +341,8 @@ void jtag_add_ir_scan_noverify(int in_co
 
 void jtag_add_ir_scan(int in_num_fields, scan_field_t *in_fields, tap_state_t state)
 {
+	assert(state != TAP_RESET);
+
 	if (jtag_verify && jtag_verify_capture_ir)
 	{
 		/* 8 x 32 bit id's is enough for all invocations */
@@ -361,6 +365,8 @@ void jtag_add_ir_scan(int in_num_fields,
 void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields,
 		tap_state_t state)
 {
+	assert(state != TAP_RESET);
+
 	jtag_prelude(state);
 
 	int retval = interface_jtag_add_plain_ir_scan(
@@ -439,6 +445,8 @@ void jtag_add_dr_scan_check(int in_num_f
 void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields,
 		tap_state_t state)
 {
+	assert(state != TAP_RESET);
+
 	jtag_prelude(state);
 
 	int retval;
@@ -449,6 +457,8 @@ void jtag_add_dr_scan(int in_num_fields,
 void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields,
 		tap_state_t state)
 {
+	assert(state != TAP_RESET);
+
 	jtag_prelude(state);
 
 	int retval;
@@ -460,6 +470,8 @@ void jtag_add_dr_out(jtag_tap_t* tap,
 		int num_fields, const int* num_bits, const uint32_t* value,
 		tap_state_t end_state)
 {
+	assert(end_state != TAP_RESET);
+
 	assert(end_state != TAP_INVALID);
 
 	cmd_queue_cur_state = end_state;
@@ -473,6 +485,9 @@ void jtag_add_tlr(void)
 {
 	jtag_prelude(TAP_RESET);
 	jtag_set_error(interface_jtag_add_tlr());
+
+	jtag_add_clocks(jtag_extra_tlr_clocks);
+
 	jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
 }
 
@@ -677,10 +692,14 @@ void jtag_add_reset(int req_tlr_or_trst,
 			 * should trigger a callback.
 			 */
 			LOG_DEBUG("TRST line asserted");
+
 			tap_set_state(TAP_RESET);
+
 			jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
 		} else {
 			LOG_DEBUG("TRST line released");
+			jtag_add_clocks(jtag_extra_tlr_clocks);
+
 			if (jtag_ntrst_delay)
 				jtag_add_sleep(jtag_ntrst_delay * 1000);
 		}
@@ -802,6 +821,16 @@ int jtag_get_flush_queue_count(void)
 	return jtag_flush_queue_count;
 }
 
+int jtag_get_extra_tlr_clocks(void)
+{
+	return jtag_extra_tlr_clocks;
+}
+
+void jtag_set_extra_tlr_clocks(int extra)
+{
+	jtag_extra_tlr_clocks = extra;
+}
+
 int jtag_execute_queue(void)
 {
 	jtag_execute_queue_noclear();
@@ -851,7 +880,8 @@ static int jtag_examine_chain_execute(ui
 	for (unsigned i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
 		buf_set_u32(idcode_buffer, i * 32, 32, 0x000000FF);
 
-	jtag_add_plain_dr_scan(1, &field, TAP_RESET);
+	jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE);
+	jtag_add_tlr();
 	return jtag_execute_queue();
 }
 
@@ -1065,7 +1095,9 @@ int jtag_validate_chain(void)
 	field.in_value = ir_test;
 
 
-	jtag_add_plain_ir_scan(1, &field, TAP_RESET);
+	jtag_add_plain_ir_scan(1, &field, TAP_IRPAUSE);
+	jtag_add_tlr();
+
 	int retval;
 	retval = jtag_execute_queue();
 	if (retval != ERROR_OK)
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -635,6 +635,11 @@ extern void jtag_execute_queue_noclear(v
 /// @returns the number of times the scan queue has been flushed
 int jtag_get_flush_queue_count(void);
 
+/// @returns the number of clocks to add while in TAP_RESET
+int jtag_get_extra_tlr_clocks(void);
+/// @returns set the number of clocks to add while in TAP_RESET
+void jtag_set_extra_tlr_clocks(int extra);
+
 
 /* can be implemented by hw + sw */
 extern int jtag_power_dropout(int* dropout);
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -65,6 +65,7 @@ static int handle_scan_chain_command(str
 
 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static int handle_jtag_extra_clocks_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
 static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
@@ -622,6 +623,12 @@ int jtag_register_commands(struct comman
 		COMMAND_ANY, "verify value capture <enable | disable>");
 	register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command,
 		COMMAND_ANY, "choose short(default) or long tms_sequence <short | long>");
+
+	register_command(cmd_ctx, NULL, "jtag_extra_clocks", handle_jtag_extra_clocks_command,
+		COMMAND_EXEC, "extra clocks in reset <clocks> - default 0");
+
+
+
 	return ERROR_OK;
 }
 
@@ -1504,3 +1511,35 @@ static int handle_tms_sequence_command(s
 
 	return ERROR_OK;
 }
+
+
+
+static int handle_jtag_extra_clocks_command(struct command_context_s *cmd_ctx,
+		char *cmd, char **args, int argc)
+{
+	if (argc > 1)
+	{
+		return ERROR_COMMAND_SYNTAX_ERROR;
+	}
+
+	if (argc == 1)
+	{
+		unsigned num_clocks;
+		int retval = parse_uint(args[0], &num_clocks);
+		if (ERROR_OK != retval)
+			return retval;
+
+		if (num_clocks > 10000)
+		{
+			command_print(cmd_ctx, "maximum 10000 extra clocks in reset");
+			return ERROR_COMMAND_SYNTAX_ERROR;
+		}
+
+		jtag_set_extra_tlr_clocks(num_clocks);
+	}
+
+	command_print(cmd_ctx, "extra clocks in reset %d", jtag_get_extra_tlr_clocks());
+
+	return ERROR_OK;
+}
+
--- a/tcl/target/icepick.cfg
+++ b/tcl/target/icepick.cfg
@@ -19,3 +19,6 @@ proc icepick_c_tapenable {jrc port} {
 	irscan $jrc 0x3F -endstate RUN/IDLE
 	runtest 10
 }
+
+# Be sure the ICEpick is fully powered up after JTAG reset
+jtag_extra_clocks 100
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to