Author: Michael Bruck <mbruck@digenius.de>
[openocd.git] / src / jtag / jtag.h
index 6fa31c6b1a1407a987d973542dcf319908f96c1b..5e25fea6cbd1861824086cb4e2ecf9821cad3340 100644 (file)
@@ -277,7 +277,7 @@ typedef struct scan_field_s
        /* internal work space */
        int                     allocated;                      /* in_value has been allocated for the queue */
        int                     modified;                       /* did we modify the in_value? */
-       u32                     intmp;                          /* temporary storage for checking synchronously */
+       u8                      intmp[4];                       /* temporary storage for checking synchronously */
 } scan_field_t;
 
 enum scan_type {
@@ -287,7 +287,7 @@ enum scan_type {
 
 typedef struct scan_command_s
 {
-       int           ir_scan;      /* instruction/not data scan */
+       bool          ir_scan;      /* instruction/not data scan */
        int           num_fields;   /* number of fields in *fields array */
        scan_field_t* fields;       /* pointer to an array of data scan fields */
        tap_state_t   end_state;    /* TAP state in which JTAG commands should finish */
@@ -565,6 +565,26 @@ extern void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_
 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);
 
+/* set in_value to point to 32 bits of memory to scan into. This function
+ * is a way to handle the case of synchronous and asynchronous
+ * JTAG queues.
+ *
+ * In the event of an asynchronous queue execution the queue buffer
+ * allocation method is used, for the synchronous case the temporary 32 bits come
+ * from the input field itself.
+ */
+
+#ifndef HAVE_JTAG_MINIDRIVER_H
+extern void jtag_alloc_in_value32(scan_field_t *field);
+#else
+static __inline__ void jtag_alloc_in_value32(scan_field_t *field)
+{
+       field->in_value=field->intmp;
+}
+#endif
+
+
+
 /* This version of jtag_add_dr_scan() uses the check_value/mask fields */
 extern void jtag_add_dr_scan_check(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);
@@ -587,9 +607,10 @@ extern void jtag_add_callback(jtag_callback1_t, u8 *in);
 /* implemented by minidriver */
 #endif
 
+
 /* This type can store an integer safely by a normal cast on 64 and
  * 32 bit systems. */
-typedef void *jtag_callback_data_t;
+typedef intptr_t jtag_callback_data_t;
 
 /* The generic callback mechanism.
  *
@@ -835,8 +856,15 @@ void jtag_tap_handle_event(jtag_tap_t* tap, enum jtag_tap_event e);
 #define MINIDRIVER(a) notused ## a
 #else
 #define MINIDRIVER(a) a
+extern void interface_jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
+               tap_state_t end_state);
 
-/* jtag_add_dr_out() is a faster version of jtag_add_dr_scan()
+#endif
+
+/* jtag_add_dr_out() is a version of jtag_add_dr_scan() which
+ * only scans data out. It operates on 32 bit integers instead
+ * of 8 bit, which makes it a better impedance match with
+ * the calling code which often operate on 32 bit integers.
  *
  * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID
  *
@@ -851,13 +879,13 @@ void jtag_tap_handle_event(jtag_tap_t* tap, enum jtag_tap_event e);
  * 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.
+ * This is an inline fn to speed up embedded hosts. Also note that
+ * interface_jtag_add_dr_out() can be a *small* inline function for
+ * embedded hosts.
+ *
+ * There is no jtag_add_dr_outin() version of this fn that also allows
+ * clocking data back in. Patches gladly accepted!
  */
-extern void interface_jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
-               tap_state_t end_state);
-
-#endif
-
 static __inline__ void jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
                tap_state_t end_state)
 {

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)