summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-05-07 06:29:08 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-05-07 06:29:08 +0000
commit9c9681116885d3b139ed3646892bad42be01876f (patch)
tree6f2b9437e2cf3060523d0ab7154ffd63b2911f54 /src/jtag
parent0cc7e5b0b7c1b1d579790135d5314e0ba1478b65 (diff)
downloadopenocd_libswd-9c9681116885d3b139ed3646892bad42be01876f.tar.gz
openocd_libswd-9c9681116885d3b139ed3646892bad42be01876f.tar.bz2
openocd_libswd-9c9681116885d3b139ed3646892bad42be01876f.tar.xz
openocd_libswd-9c9681116885d3b139ed3646892bad42be01876f.zip
added template for removing in_handler
git-svn-id: svn://svn.berlios.de/openocd/trunk@1629 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/jtag.c31
-rw-r--r--src/jtag/jtag.h14
-rw-r--r--src/jtag/zy1000.c2
3 files changed, 36 insertions, 11 deletions
diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c
index 91f14b15..242eb56b 100644
--- a/src/jtag/jtag.c
+++ b/src/jtag/jtag.c
@@ -42,6 +42,8 @@
#include <strings.h>
#endif
+static void jtag_execute_queue_noclear(void);
+
/* note that this is not marked as static as it must be available from outside jtag.c for those
that implement the jtag_xxx() minidriver layer
*/
@@ -670,6 +672,12 @@ void jtag_add_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
jtag_error=retval;
}
+void jtag_add_dr_scan_now(int num_fields, scan_field_t *fields, tap_state_t state)
+{
+ jtag_add_dr_scan(num_fields, fields, state);
+ jtag_execute_queue_noclear();
+}
+
int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
{
int j;
@@ -1438,13 +1446,21 @@ int MINIDRIVER(interface_jtag_execute_queue)(void)
return retval;
}
-int jtag_execute_queue(void)
+static void jtag_execute_queue_noclear(void)
{
int retval=interface_jtag_execute_queue();
- if (retval==ERROR_OK)
+ /* we keep the first error */
+ if ((jtag_error==ERROR_OK)&&(retval!=ERROR_OK))
{
- retval=jtag_error;
+ jtag_error=retval;
}
+}
+
+int jtag_execute_queue(void)
+{
+ int retval;
+ jtag_execute_queue_noclear();
+ retval=jtag_error;
jtag_error=ERROR_OK;
return retval;
}
@@ -1485,10 +1501,10 @@ int jtag_examine_chain(void)
field.tap = NULL;
field.num_bits = sizeof(idcode_buffer) * 8;
field.out_value = idcode_buffer;
-
+
field.in_value = idcode_buffer;
-
-
+
+
field.in_handler = NULL;
for (i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
@@ -1662,10 +1678,7 @@ int jtag_validate_chain(void)
field.tap = NULL;
field.num_bits = total_ir_length;
field.out_value = ir_test;
-
field.in_value = ir_test;
-
-
field.in_handler = NULL;
jtag_add_plain_ir_scan(1, &field, TAP_RESET);
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 604692cd..c0f94856 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -561,6 +561,10 @@ extern int jtag_register_commands(struct command_context_s* cmd_ctx);
extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern void jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+/* same as jtag_add_dr_scan but the scan is executed immediately. sets jtag_error if there
+ * was a failure.
+ */
+extern void jtag_add_dr_scan_now(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
@@ -696,6 +700,16 @@ int interface_jtag_add_clocks(int num_cycles);
*/
extern int jtag_execute_queue(void);
+/* this flag is set when an error occurs while executing the queue. cleared
+ * by jtag_execute_queue()
+ *
+ * this flag can also be set from application code if some error happens
+ * during processing that should be reported during jtag_execute_queue().
+ */
+extern int jtag_error;
+
+
+
/* can be implemented by hw+sw */
extern int interface_jtag_execute_queue(void);
extern int jtag_power_dropout(int* dropout);
diff --git a/src/jtag/zy1000.c b/src/jtag/zy1000.c
index f2765c0b..b1778068 100644
--- a/src/jtag/zy1000.c
+++ b/src/jtag/zy1000.c
@@ -39,8 +39,6 @@
#define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
const char *zylin_config_dir="/config/settings";
-extern int jtag_error;
-
/* low level command set
*/
int zy1000_read(void);