X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=84290ca7e189c0fc7288b4fb60618b209116d4db;hb=71d76b0a74bee78bd9aade2957e92c6b420372b9;hp=d5ed4f5807493b5a597d51bf1292c7bac85dd6f5;hpb=26526a80ea45894aa9041e19f52dcc3ad6dedebc;p=openocd.git diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index d5ed4f5807..84290ca7e1 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -23,12 +23,9 @@ #ifndef JTAG_H #define JTAG_H -#include "types.h" #include "binarybuffer.h" #include "log.h" -#include "command.h" - #ifdef _DEBUG_JTAG_IO_ #define DEBUG_JTAG_IO(expr ...) LOG_DEBUG(expr) @@ -272,6 +269,15 @@ typedef struct scan_field_s int num_bits; /* number of bits this field specifies (up to 32) */ u8* out_value; /* value to be scanned into the device */ u8* in_value; /* pointer to a 32-bit memory location to take data scanned out */ + + u8* check_value; /* Used together with jtag_add_dr_scan_check() to check data clocked + in */ + u8* check_mask; /* mask to go with check_value */ + + /* internal work space */ + int allocated; /* in_value has been allocated for the queue */ + int modified; /* did we modify the in_value? */ + u8 intmp[4]; /* temporary storage for checking synchronously */ } scan_field_t; enum scan_type { @@ -558,10 +564,29 @@ extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t e extern void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_state_t state); 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. + +/* 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. */ -extern void jtag_add_dr_scan_now(int num_fields, scan_field_t* fields, tap_state_t endstate); + +#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); 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); @@ -576,7 +601,7 @@ extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t* field typedef void (*jtag_callback1_t)(u8 *in); #ifndef HAVE_JTAG_MINIDRIVER_H -/* A simpler version of jtag_add_callback3 */ +/* A simpler version of jtag_add_callback4 */ extern void jtag_add_callback(jtag_callback1_t, u8 *in); #else /* implemented by minidriver */ @@ -584,14 +609,14 @@ extern void jtag_add_callback(jtag_callback1_t, u8 *in); /* 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. * * The callback is invoked with three arguments. The first argument is * the pointer to the data clocked in. */ -typedef int (*jtag_callback_t)(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2); +typedef int (*jtag_callback_t)(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3); /* This callback can be executed immediately the queue has been flushed. Note that @@ -626,7 +651,7 @@ typedef int (*jtag_callback_t)(u8 *in, jtag_callback_data_t data1, jtag_callback * callbacks may or may not be invoked depending on driver implementation. */ #ifndef HAVE_JTAG_MINIDRIVER_H -extern void jtag_add_callback3(jtag_callback_t, u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2); +extern void jtag_add_callback4(jtag_callback_t, u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3); #else /* implemented by minidriver */ #endif