From 9b25f5eba2a8326e28146bbe315efe21e0cea91e Mon Sep 17 00:00:00 2001 From: oharboe Date: Wed, 5 Mar 2008 19:21:22 +0000 Subject: added jtag_add_dr_out(). Better for hw fifo, same for software fifo. Passes 94kBytes/s regression test. Works with str912, which relies on bypass git-svn-id: svn://svn.berlios.de/openocd/trunk@447 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/jtag.h | 53 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 15 deletions(-) (limited to 'src/jtag/jtag.h') diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 31ed51e4..ada3b49d 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -344,28 +344,51 @@ extern int jtag_verify_capture_ir; #define ERROR_JTAG_DEVICE_ERROR (-107) -/* Here a #define MINIDRIVER() and an inline version of hw fifo interface_jtag_add_shift can be defined */ -#ifndef MINIDRIVER -extern int interface_jtag_add_shift(const enum tap_state shift_state, const enum tap_state end_state, int bits, u32 value); -#endif - -/* Enter the shift_state and cycle "bits" times out of that state. +/* 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() * - * So if the end_state!=shift_state, then the transition from shift_state to - * end_state counts as a transition out of shift_state. + * Current or end_state can not be TAP_TLR. end_state can be -1 * - * Legal shift states TAP_SD and TAP_SI + * num_bits[i] is the number of bits to clock out from value[i] LSB first. * - * Legal end state does not include TAP_TLR + * 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. * - * Bits are clocked out from value LSB first. + * 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. */ -static __inline int jtag_add_shift(const enum tap_state shift_state, const enum tap_state end_state, int bits, u32 value) +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) { - int retval; - retval=interface_jtag_add_shift(shift_state, end_state, bits, value); - return retval; + 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); } -- cgit v1.2.3