- adds two speeds to jtag_speed. reset and post reset speed. Default
[fw/openocd] / src / jtag / jtag.h
index e190858a9e47ac46fc5648125820c334c6cc5874..0e9a9302eef70236f0a67b5bf382921b3b08dd88 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "types.h"
 #include "binarybuffer.h"
+#include "log.h"
 
 #include "command.h"
 
@@ -199,10 +200,7 @@ typedef struct jtag_interface_s
 
 enum jtag_event
 {
-       JTAG_SRST_ASSERTED,
-       JTAG_TRST_ASSERTED,
-       JTAG_SRST_RELEASED,
-       JTAG_TRST_RELEASED,
+       JTAG_TRST_ASSERTED
 };
 
 extern char* jtag_event_strings[];
@@ -224,6 +222,7 @@ extern enum tap_state end_state;
 extern enum tap_state cur_state;
 
 extern int jtag_speed;
+extern int jtag_speed_post_reset;
 
 enum reset_types
 {
@@ -244,13 +243,13 @@ extern int jtag_init(struct command_context_s *cmd_ctx);
 extern int jtag_register_commands(struct command_context_s *cmd_ctx);
 
 /* JTAG interface, can be implemented with a software or hardware fifo */
-extern int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 /* execute a state transition within the JTAG standard, but the exact path
  * path that is taken is undefined. Many implementations use precisely
@@ -269,26 +268,47 @@ extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields
  *
  *   - Run-Test/Idle must not be entered unless requested, because R-T/I may have 
  *   side effects.
+ * 
+ * NB! a jtag_add_statemove() to the current state is not
+ * a no-operation.
  */
-extern int jtag_add_statemove(enum tap_state endstate);
+extern void jtag_add_statemove(enum tap_state endstate);
 extern int interface_jtag_add_statemove(enum tap_state endstate);
 /* A list of unambigious single clock state transitions, not
  * all drivers can support this, but it is required for e.g.
  * XScale and Xilinx support
  * 
  * Note! TAP_TLR must not be used in the path!
+ * 
+ * Note that the first on the list must be reachable 
+ * via a single transition from the current state. 
  */
-extern int jtag_add_pathmove(int num_states, enum tap_state *path);
+extern void jtag_add_pathmove(int num_states, enum tap_state *path);
 extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
-/* cycle precisely num_cycles in the TAP_RTI state */
-extern int jtag_add_runtest(int num_cycles, enum tap_state endstate);
+/* go to TAP_RTI, if we're not already there and cycle
+ * precisely num_cycles in the TAP_RTI after which move
+ * to the end state, if it is != TAP_RTI
+ */
+extern void jtag_add_runtest(int num_cycles, enum tap_state endstate);
 extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
+/* If it fails and one of the error messages below are returned, nothing is 
+ * added to the queue and jtag_execute() won't return an error code.
+ * 
+ * ERROR_JTAG_RESET_WOULD_ASSERT_TRST
+ * ERROR_JTAG_RESET_CANT_SRST
+ * 
+ * All other error codes will result in jtag_execute_queue() returning
+ * an error.
+ */
 extern int jtag_add_reset(int trst, int srst);
 extern int interface_jtag_add_reset(int trst, int srst);
-extern int jtag_add_end_state(enum tap_state endstate);
+extern void jtag_add_end_state(enum tap_state endstate);
 extern int interface_jtag_add_end_state(enum tap_state endstate);
-extern int jtag_add_sleep(u32 us);
+extern void jtag_add_sleep(u32 us);
 extern int interface_jtag_add_sleep(u32 us);
+
+
+
 /*
  * For software FIFO implementations, the queued commands can be executed 
  * during this call or earlier. A sw queue might decide to push out
@@ -326,7 +346,6 @@ extern int jtag_register_event_callback(int (*callback)(enum jtag_event event, v
 
 extern int jtag_verify_capture_ir;
 
-
 /* error codes
  * JTAG subsystem uses codes between -100 and -199 */
 
@@ -340,4 +359,52 @@ extern int jtag_verify_capture_ir;
 #define ERROR_JTAG_DEVICE_ERROR                        (-107)
 
 
+
+/* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
+#ifdef HAVE_JTAG_MINIDRIVER_H
+/* Here a #define MINIDRIVER() and an inline version of hw fifo interface_jtag_add_dr_out can be defined */
+#include "jtag_minidriver.h"
+#define MINIDRIVER(a) notused ## a 
+#else
+#define MINIDRIVER(a) a
+/* jtag_add_dr_out() is a faster version of jtag_add_dr_scan() 
+ * 
+ * Current or end_state can not be TAP_TLR. end_state can be -1
+ * 
+ * num_bits[i] is the number of bits to clock out from value[i] LSB first.
+ * 
+ * If the device is in bypass, then that is an error condition in
+ * the caller code that is not detected by this fn, whereas jtag_add_dr_scan()
+ * does detect it. Similarly if the device is not in bypass, data must
+ * be passed to it. 
+ * 
+ * If anything fails, then jtag_error will be set and jtag_execute() will
+ * return an error. There is no way to determine if there was a failure
+ * during this function call.
+ * 
+ * Note that this jtag_add_dr_out can be defined as an inline function.
+ */
+extern void interface_jtag_add_dr_out(int device, 
+               int num_fields,
+               int *num_bits,
+               u32 *value,
+               enum tap_state end_state);
+#endif
+
+
+
+
+static __inline__ void jtag_add_dr_out(int device, 
+               int num_fields,
+               int *num_bits,
+               u32 *value,
+               enum tap_state end_state)
+{
+       if (end_state != -1)
+               cmd_queue_end_state=end_state;
+       cmd_queue_cur_state=cmd_queue_end_state;
+       interface_jtag_add_dr_out(device, num_fields, num_bits, value, cmd_queue_end_state);
+}
+
+
 #endif /* JTAG_H */