From ffb51c23fdd753ada2554b8b6283533089153b46 Mon Sep 17 00:00:00 2001 From: drath Date: Thu, 21 Jun 2007 13:15:22 +0000 Subject: - added support for Intel/Marvel PXA27x (XScale) targets - added support for scans coming from or ending in Shift-DR or Shift-IR to bitbang code (required for XScale debugging) - cleaned up errror handlers. only use when there's a catchable error - fix segfault when etm was configured without a valid driver git-svn-id: svn://svn.berlios.de/openocd/trunk@176 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/bitbang.c | 28 +++++++++++++++++++++------- src/jtag/jtag.c | 13 ++++++++----- src/jtag/jtag.h | 3 +++ 3 files changed, 32 insertions(+), 12 deletions(-) (limited to 'src/jtag') diff --git a/src/jtag/bitbang.c b/src/jtag/bitbang.c index 82e92a21..198a741f 100644 --- a/src/jtag/bitbang.c +++ b/src/jtag/bitbang.c @@ -132,21 +132,35 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size) enum tap_state saved_end_state = end_state; int bit_cnt; - if (ir_scan) - bitbang_end_state(TAP_SI); - else - bitbang_end_state(TAP_SD); + if (!((!ir_scan && (cur_state == TAP_SD)) || (ir_scan && (cur_state == TAP_SI)))) + { + if (ir_scan) + bitbang_end_state(TAP_SI); + else + bitbang_end_state(TAP_SD); - bitbang_state_move(); - bitbang_end_state(saved_end_state); + bitbang_state_move(); + bitbang_end_state(saved_end_state); + } for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++) { + /* set TMS high on the last bit unless we want to end in TAP_SD/SI */ + int tms; + if ((ir_scan && (end_state == TAP_SI)) || + (!ir_scan && (end_state == TAP_SD))) + { + tms = 0; + } else { + tms = (bit_cnt==scan_size-1) ? 1 : 0; + } + /* if we're just reading the scan, but don't care about the output * default to outputting 'low', this also makes valgrind traces more readable, * as it removes the dependency on an uninitialised value */ - if ((type != SCAN_IN) && ((buffer[bit_cnt/8] >> (bit_cnt % 8)) & 0x1)) { + if ((type != SCAN_IN) && ((buffer[bit_cnt/8] >> (bit_cnt % 8)) & 0x1)) + { bitbang_interface->write(0, (bit_cnt==scan_size-1) ? 1 : 0, 1); bitbang_interface->write(1, (bit_cnt==scan_size-1) ? 1 : 0, 1); } else { diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index 6dfde760..98919123 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -58,6 +58,8 @@ static cmd_queue_page_t *cmd_queue_pages = NULL; * 3: Pause-DR * 4: Shift-IR * 5: Pause-IR + * + * SD->SD and SI->SI have to be caught in interface specific code */ u8 tap_move[6][6] = { @@ -1086,9 +1088,6 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) if (compare_failed) { - char *captured_char = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16); - char *in_check_value_char = buf_to_str(cmd->fields[i].in_check_value, (num_bits > 64) ? 64 : num_bits, 16); - if (cmd->error_handler) { /* ask the error handler if once has been specified if this is a real problem */ @@ -1109,6 +1108,9 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) */ if (compare_failed) { + char *captured_char = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16); + char *in_check_value_char = buf_to_str(cmd->fields[i].in_check_value, (num_bits > 64) ? 64 : num_bits, 16); + if (cmd->fields[i].in_check_mask) { char *in_check_mask_char; @@ -1120,10 +1122,11 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) { WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s", captured_char, in_check_value_char); } + + free(captured_char); + free(in_check_value_char); } - free(captured_char); - free(in_check_value_char); } } free(captured); diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 1464a080..1b03d615 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -59,6 +59,9 @@ extern tap_transition_t tap_transitions[16]; /* describe the TAP state diagram * extern enum tap_state end_state; /* finish DR scans in dr_end_state */ extern enum tap_state cur_state; /* current TAP state */ +extern enum tap_state cmd_queue_end_state; /* finish DR scans in dr_end_state */ +extern enum tap_state cmd_queue_cur_state; /* current TAP state */ + #define TAP_MOVE(from, to) tap_move[tap_move_map[from]][tap_move_map[to]] typedef struct error_handler_s -- cgit v1.2.3