summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-06-21 13:15:22 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2007-06-21 13:15:22 +0000
commitffb51c23fdd753ada2554b8b6283533089153b46 (patch)
treef456f6ad7034d245251ec9e50bc223c1a693bc8b /src/jtag
parentee01d049089d5be099b84f8974f00f389eaea49b (diff)
downloadopenocd_libswd-ffb51c23fdd753ada2554b8b6283533089153b46.tar.gz
openocd_libswd-ffb51c23fdd753ada2554b8b6283533089153b46.tar.bz2
openocd_libswd-ffb51c23fdd753ada2554b8b6283533089153b46.tar.xz
openocd_libswd-ffb51c23fdd753ada2554b8b6283533089153b46.zip
- 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
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/bitbang.c28
-rw-r--r--src/jtag/jtag.c13
-rw-r--r--src/jtag/jtag.h3
3 files changed, 32 insertions, 12 deletions
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