X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=fe240eb66383462227400df855590cde12efca4d;hp=e190858a9e47ac46fc5648125820c334c6cc5874;hb=01a5d87d5f5788542c5d26da1c19fa4e634adc10;hpb=4c7891ecebbf28659f24a21e0156284c802ab6e7 diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index e190858a9e..fe240eb663 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -22,6 +22,7 @@ #include "types.h" #include "binarybuffer.h" +#include "log.h" #include "command.h" @@ -269,6 +270,9 @@ 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 int interface_jtag_add_statemove(enum tap_state endstate); @@ -277,6 +281,9 @@ extern int interface_jtag_add_statemove(enum tap_state endstate); * 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 int interface_jtag_add_pathmove(int num_states, enum tap_state *path); @@ -289,6 +296,9 @@ extern int 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 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 @@ -340,4 +350,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 */