jtag.h 25.1 KB
Newer Older
oharboe's avatar
oharboe committed
1
/***************************************************************************
2
3
4
*   Copyright (C) 2005 by Dominic Rath                                    *
*   Dominic.Rath@gmx.de                                                   *
*                                                                         *
5
*   Copyright (C) 2007,2008 Øyvind Harboe                                 *
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*   oyvind.harboe@zylin.com                                               *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
*   This program is distributed in the hope that it will be useful,       *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
*   GNU General Public License for more details.                          *
*                                                                         *
*   You should have received a copy of the GNU General Public License     *
*   along with this program; if not, write to the                         *
*   Free Software Foundation, Inc.,                                       *
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
***************************************************************************/
oharboe's avatar
oharboe committed
23
24
25
26
#ifndef JTAG_H
#define JTAG_H

#include "binarybuffer.h"
27
#include "log.h"
oharboe's avatar
oharboe committed
28

29

30
#ifdef _DEBUG_JTAG_IO_
31
32
#define DEBUG_JTAG_IO(expr ...) \
	do { if (1) LOG_DEBUG(expr); } while (0)
33
#else
34
35
#define DEBUG_JTAG_IO(expr ...) \
	do { if (0) LOG_DEBUG(expr); } while (0)
oharboe's avatar
oharboe committed
36
37
#endif

38
#ifndef DEBUG_JTAG_IOZ
39
#define DEBUG_JTAG_IOZ 64
40
41
#endif

42
43
/*-----<Macros>--------------------------------------------------*/

44
45
46
47
/**
 * When given an array, compute its DIMension; in other words, the
 * number of elements in the array
 */
48
49
50
51
52
53
54
#define DIM(x)					(sizeof(x)/sizeof((x)[0]))

/** Calculate the number of bytes required to hold @a n TAP scan bits */
#define TAP_SCAN_BYTES(n)		CEIL(n, 8)

/*-----</Macros>-------------------------------------------------*/

55
56
57
58
59
/**
 * Defines JTAG Test Access Port states.
 *
 * These definitions were gleaned from the ARM7TDMI-S Technical
 * Reference Manual and validated against several other ARM core
60
61
62
63
64
65
 * technical manuals.
 *
 * FIXME some interfaces require specific numbers be used, as they
 * are handed-off directly to their hardware implementations.
 * Fix those drivers to map as appropriate ... then pick some
 * sane set of numbers here (where 0/uninitialized == INVALID).
oharboe's avatar
oharboe committed
66
 */
67
68
typedef enum tap_state
{
69
70
	TAP_INVALID = -1,

oharboe's avatar
oharboe committed
71
#if BUILD_ZY1000
72
	/* These are the old numbers. Leave as-is for now... */
oharboe's avatar
oharboe committed
73
74
75
76
77
78
79
80
	TAP_RESET    = 0, TAP_IDLE = 8,
	TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4,
	TAP_DRPAUSE  = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7,
	TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12,
	TAP_IRPAUSE  = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15,

#else
	/* Proper ARM recommended numbers */
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
	TAP_DREXIT2 = 0x0,
	TAP_DREXIT1 = 0x1,
	TAP_DRSHIFT = 0x2,
	TAP_DRPAUSE = 0x3,
	TAP_IRSELECT = 0x4,
	TAP_DRUPDATE = 0x5,
	TAP_DRCAPTURE = 0x6,
	TAP_DRSELECT = 0x7,
	TAP_IREXIT2 = 0x8,
	TAP_IREXIT1 = 0x9,
	TAP_IRSHIFT = 0xa,
	TAP_IRPAUSE = 0xb,
	TAP_IDLE = 0xc,
	TAP_IRUPDATE = 0xd,
	TAP_IRCAPTURE = 0xe,
	TAP_RESET = 0x0f,
97

oharboe's avatar
oharboe committed
98
#endif
99
} tap_state_t;
oharboe's avatar
oharboe committed
100

101
102
103
104
/**
 * Function tap_state_name
 * Returns a string suitable for display representing the JTAG tap_state
 */
105
106
107
108
const char *tap_state_name(tap_state_t state);

/// Provides user-friendly name lookup of TAP states.
tap_state_t tap_state_by_name(const char *name);
109

110
111
/// The current TAP state of the pending JTAG command queue.
extern tap_state_t cmd_queue_cur_state;
112

113
114
115
116
117
118
119
120
121
122
/**
 * This structure defines a single scan field in the scan. It provides
 * fields for the field's width and pointers to scan input and output
 * values.
 *
 * In addition, this structure includes a value and mask that is used by
 * jtag_add_dr_scan_check() to validate the value that was scanned out.
 *
 * The allocated, modified, and intmp fields are internal work space.
 */
oharboe's avatar
oharboe committed
123
124
typedef struct scan_field_s
{
125
126
127
128
129
130
	/// A pointer to the tap structure to which this field refers.
	jtag_tap_t* tap;

	/// The number of bits this field specifies (up to 32)
	int num_bits;
	/// A pointer to value to be scanned into the device
zwelch's avatar
zwelch committed
131
	uint8_t* out_value;
132
	/// A pointer to a 32-bit memory location for data scanned out
zwelch's avatar
zwelch committed
133
	uint8_t* in_value;
134
135

	/// The value used to check the data scanned out.
zwelch's avatar
zwelch committed
136
	uint8_t* check_value;
137
	/// The mask to go with check_value
zwelch's avatar
zwelch committed
138
	uint8_t* check_mask;
139
140
141
142
143
144

	/// in_value has been allocated for the queue
	int allocated;
	/// Indicates we modified the in_value.
	int modified;
	/// temporary storage for performing value checks synchronously
zwelch's avatar
zwelch committed
145
	uint8_t intmp[4];
oharboe's avatar
oharboe committed
146
147
} scan_field_t;

148
149
typedef struct jtag_tap_event_action_s jtag_tap_event_action_t;

150
151
/* this is really: typedef jtag_tap_t */
/* But - the typedef is done in "types.h" */
oharboe's avatar
oharboe committed
152
/* due to "forward declaration reasons" */
153
struct jtag_tap_s
oharboe's avatar
oharboe committed
154
{
155
156
157
	const char* chip;
	const char* tapname;
	const char* dotted_name;
158
	int abs_chain_position;
zwelch's avatar
zwelch committed
159
160
161
162
	/// Is this TAP disabled after JTAG reset?
	bool disabled_after_reset;
	/// Is this TAP currently enabled?
	bool enabled;
163
	int ir_length; /**< size of instruction register */
164
	uint32_t ir_capture_value;
zwelch's avatar
zwelch committed
165
	uint8_t* expected; /**< Capture-IR expected value */
166
	uint32_t ir_capture_mask;
zwelch's avatar
zwelch committed
167
	uint8_t* expected_mask; /**< Capture-IR expected mask */
168
169
170
171
	uint32_t idcode; /**< device identification code */
	/** not all devices have idcode,
	 * we'll discover this during chain examination */
	bool hasidcode;
172
173

	/// Array of expected identification codes */
174
	uint32_t* expected_ids;
175
	/// Number of expected identification codes
zwelch's avatar
zwelch committed
176
	uint8_t expected_ids_cnt;
177
178

	/// current instruction
zwelch's avatar
zwelch committed
179
	uint8_t* cur_instr;
180
181
182
183
	/// Bypass register selected
	int bypass;

	jtag_tap_event_action_t *event_action;
184
185

	jtag_tap_t* next_tap;
186
};
zwelch's avatar
zwelch committed
187
188
189
190

void jtag_tap_init(jtag_tap_t *tap);
void jtag_tap_free(jtag_tap_t *tap);

191
192
193
194
195
196
197
jtag_tap_t* jtag_all_taps(void);
const char *jtag_tap_name(const jtag_tap_t *tap);
jtag_tap_t* jtag_tap_by_string(const char* dotted_name);
jtag_tap_t* jtag_tap_by_jim_obj(Jim_Interp* interp, Jim_Obj* obj);
jtag_tap_t* jtag_tap_next_enabled(jtag_tap_t* p);
unsigned jtag_tap_count_enabled(void);
unsigned jtag_tap_count(void);
198
199


zwelch's avatar
zwelch committed
200
/*
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
 * - TRST_ASSERTED triggers two sets of callbacks, after operations to
 *   reset the scan chain -- via TMS+TCK signaling, or deasserting the
 *   nTRST signal -- are queued:
 *
 *    + Callbacks in C code fire first, patching internal state
 *    + Then post-reset event scripts fire ... activating JTAG circuits
 *      via TCK cycles, exiting SWD mode via TMS sequences, etc
 *
 *   During those callbacks, scan chain contents have not been validated.
 *   JTAG operations that address a specific TAP (primarily DR/IR scans)
 *   must *not* be queued.
 *
 * - TAP_EVENT_SETUP is reported after TRST_ASSERTED, and after the scan
 *   chain has been validated.  JTAG operations including scans that
 *   target specific TAPs may be performed.
 *
 * - TAP_EVENT_ENABLE and TAP_EVENT_DISABLE implement TAP activation and
 *   deactivation outside the core using scripted code that understands
 *   the specific JTAG router type.  They might be triggered indirectly
 *   from EVENT_SETUP operations.
zwelch's avatar
zwelch committed
221
 */
222
enum jtag_event {
zwelch's avatar
zwelch committed
223
	JTAG_TRST_ASSERTED,
224
	JTAG_TAP_EVENT_SETUP,
225
	JTAG_TAP_EVENT_ENABLE,
zwelch's avatar
zwelch committed
226
	JTAG_TAP_EVENT_DISABLE,
227
228
};

229
230
struct jtag_tap_event_action_s
{
zwelch's avatar
zwelch committed
231
	enum jtag_event		event;
232
233
	Jim_Obj*                 body;
	jtag_tap_event_action_t* next;
234
};
oharboe's avatar
oharboe committed
235

zwelch's avatar
zwelch committed
236
237
238
239
240
241
242
243
244
245
246
247
248
/**
 * Defines the function signature requide for JTAG event callback
 * functions, which are added with jtag_register_event_callback()
 * and removed jtag_unregister_event_callback().
 * @param event The event to handle.
 * @param prive A pointer to data that was passed to
 *	jtag_register_event_callback().
 * @returns Must return ERROR_OK on success, or an error code on failure.
 *
 * @todo Change to return void or define a use for its return code.
 */
typedef int (*jtag_event_handler_t)(enum jtag_event event, void* priv);

249
250
int jtag_register_event_callback(jtag_event_handler_t f, void *x);
int jtag_unregister_event_callback(jtag_event_handler_t f, void *x);
251

252
int jtag_call_event_callbacks(enum jtag_event event);
253

oharboe's avatar
oharboe committed
254

255
256
/// @returns The current JTAG speed setting.
int jtag_get_speed(void);
257

258
259
/**
 * Given a @a speed setting, use the interface @c speed_div callback to
zwelch's avatar
zwelch committed
260
 * adjust the setting.
261
262
 * @param speed The speed setting to convert back to readable KHz.
 * @returns ERROR_OK if the interface has not been initialized or on success;
263
 *	otherwise, the error code produced by the @c speed_div callback.
264
265
 */
int jtag_get_speed_readable(int *speed);
266
267
268

/// Attempt to configure the interface for the specified KHz.
int jtag_config_khz(unsigned khz);
269

270
271
272
273
274
/**
 * Attempt to enable RTCK/RCLK. If that fails, fallback to the
 * specified frequency.
 */
int jtag_config_rclk(unsigned fallback_speed_khz);
275

276
277
278
279
/// Retreives the clock speed of the JTAG interface in KHz.
unsigned jtag_get_speed_khz(void);


280
281
282
283
284
enum reset_types {
	RESET_NONE            = 0x0,
	RESET_HAS_TRST        = 0x1,
	RESET_HAS_SRST        = 0x2,
	RESET_TRST_AND_SRST   = 0x3,
oharboe's avatar
oharboe committed
285
286
287
	RESET_SRST_PULLS_TRST = 0x4,
	RESET_TRST_PULLS_SRST = 0x8,
	RESET_TRST_OPEN_DRAIN = 0x10,
288
	RESET_SRST_PUSH_PULL  = 0x20,
dbrownell's avatar
dbrownell committed
289
	RESET_SRST_NO_GATING  = 0x40,
oharboe's avatar
oharboe committed
290
291
};

292
293
enum reset_types jtag_get_reset_config(void);
void jtag_set_reset_config(enum reset_types type);
oharboe's avatar
oharboe committed
294

295
296
297
298
299
300
void jtag_set_nsrst_delay(unsigned delay);
unsigned jtag_get_nsrst_delay(void);

void jtag_set_ntrst_delay(unsigned delay);
unsigned jtag_get_ntrst_delay(void);

oharboe's avatar
oharboe committed
301
302
303
304
305
306
void jtag_set_nsrst_assert_width(unsigned delay);
unsigned jtag_get_nsrst_assert_width(void);

void jtag_set_ntrst_assert_width(unsigned delay);
unsigned jtag_get_ntrst_assert_width(void);

307
308
309
310
311
/// @returns The current state of TRST.
int jtag_get_trst(void);
/// @returns The current state of SRST.
int jtag_get_srst(void);

312
313
314
315
/// Enable or disable data scan verification checking.
void jtag_set_verify(bool enable);
/// @returns True if data scan verification will be performed.
bool jtag_will_verify(void);
316

317
318
319
320
/// Enable or disable verification of IR scan checking.
void jtag_set_verify_capture_ir(bool enable);
/// @returns True if IR scan verification will be performed.
bool jtag_will_verify_capture_ir(void);
321

322
323
324
/**
 * Initialize interface upon startup.  Return a successful no-op upon
 * subsequent invocations.
325
 */
326
int  jtag_interface_init(struct command_context_s* cmd_ctx);
327

328
/// Shutdown the JTAG interface upon program exit.
329
int  jtag_interface_quit(void);
330

331
332
/**
 * Initialize JTAG chain using only a RESET reset. If init fails,
333
334
 * try reset + init.
 */
335
int  jtag_init(struct command_context_s* cmd_ctx);
336

337
/// reset, then initialize JTAG chain
338
339
340
int jtag_init_reset(struct command_context_s* cmd_ctx);
int jtag_register_commands(struct command_context_s* cmd_ctx);
int jtag_init_inner(struct command_context_s *cmd_ctx);
oharboe's avatar
oharboe committed
341

342
343
344
/**
 * @file
 * The JTAG interface can be implemented with a software or hardware fifo.
345
 *
346
347
348
 * TAP_DRSHIFT and TAP_IRSHIFT are illegal end states; however,
 * TAP_DRSHIFT/IRSHIFT can be emulated as end states, by using longer
 * scans.
349
 *
350
351
352
353
 * Code that is relatively insensitive to the path taken through state
 * machine (as long as it is JTAG compliant) can use @a endstate for
 * jtag_add_xxx_scan(). Otherwise, the pause state must be specified as
 * end state and a subsequent jtag_add_pathmove() must be issued.
354
 */
355

356
357
358
359
360
361
362
363
364
365
366
/**
 * Generate an IR SCAN with a list of scan fields with one entry for
 * each enabled TAP.
 *
 * If the input field list contains an instruction value for a TAP then
 * that is used otherwise the TAP is set to bypass.
 *
 * TAPs for which no fields are passed are marked as bypassed for
 * subsequent DR SCANs.
 *
 */
367
368
void jtag_add_ir_scan(int num_fields,
		scan_field_t* fields, tap_state_t endstate);
369
370
371
372
/**
 * The same as jtag_add_ir_scan except no verification is performed out
 * the output values.
 */
373
374
void jtag_add_ir_scan_noverify(int num_fields,
		const scan_field_t *fields, tap_state_t state);
375
376
377
378
379
/**
 * Duplicate the scan fields passed into the function into an IR SCAN
 * command.  This function assumes that the caller handles extra fields
 * for bypassed TAPs.
 */
380
381
void jtag_add_plain_ir_scan(int num_fields,
		const scan_field_t* fields, tap_state_t endstate);
382

383
384
385
386

/**
 * 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
387
388
389
 * JTAG queues.
 *
 * In the event of an asynchronous queue execution the queue buffer
390
391
 * allocation method is used, for the synchronous case the temporary 32
 * bits come from the input field itself.
392
 */
393
void jtag_alloc_in_value32(scan_field_t *field);
394

395
396
397
398
399
400
/**
 * Generate a DR SCAN using the fields passed to the function.
 * For connected TAPs, the function checks in_fields and uses fields
 * specified there.  For bypassed TAPs, the function generates a dummy
 * 1-bit field.  The bypass status of TAPs is set by jtag_add_ir_scan().
 */
401
402
void jtag_add_dr_scan(int num_fields,
		const scan_field_t* fields, tap_state_t endstate);
403
/// A version of jtag_add_dr_scan() that uses the check_value/mask fields
404
405
void jtag_add_dr_scan_check(int num_fields,
		scan_field_t* fields, tap_state_t endstate);
406
407
408
409
410
/**
 * Duplicate the scan fields passed into the function into a DR SCAN
 * command.  Unlike jtag_add_dr_scan(), this function assumes that the
 * caller handles extra fields for bypassed TAPs.
 */
411
412
void jtag_add_plain_dr_scan(int num_fields,
		const scan_field_t* fields, tap_state_t endstate);
413

414
415
416
417
418
/**
 * Defines the type of data passed to the jtag_callback_t interface.
 * The underlying type must allow storing an @c int or pointer type.
 */
typedef intptr_t jtag_callback_data_t;
419

420
421
422
423
424
425
426
427
/**
 * Defines a simple JTAG callback that can allow conversions on data
 * scanned in from an interface.
 *
 * This callback should only be used for conversion that cannot fail.
 * For conversion types or checks that can fail, use the more complete
 * variant: jtag_callback_t.
 */
428
typedef void (*jtag_callback1_t)(jtag_callback_data_t data0);
429

430
/// A simpler version of jtag_add_callback4().
431
void jtag_add_callback(jtag_callback1_t, jtag_callback_data_t data0);
432

oharboe's avatar
oharboe committed
433

434

435
436
/**
 * Defines the interface of the JTAG callback mechanism.
437
 *
438
439
440
441
442
 * @param in the pointer to the data clocked in
 * @param data1 An integer big enough to use as an @c int or a pointer.
 * @param data2 An integer big enough to use as an @c int or a pointer.
 * @param data3 An integer big enough to use as an @c int or a pointer.
 * @returns an error code
443
 */
444
445
446
447
typedef int (*jtag_callback_t)(jtag_callback_data_t data0,
				jtag_callback_data_t data1,
				jtag_callback_data_t data2,
				jtag_callback_data_t data3);
448
449


450
451
/**
 * This callback can be executed immediately the queue has been flushed.
452
 *
453
454
455
 * The JTAG queue can be executed synchronously or asynchronously.
 * Typically for USB, the queue is executed asynchronously.  For
 * low-latency interfaces, the queue may be executed synchronously.
456
 *
457
458
459
460
461
 * The callback mechanism is very general and does not make many
 * assumptions about what the callback does or what its arguments are.
 * These callbacks are typically executed *after* the *entire* JTAG
 * queue has been executed for e.g. USB interfaces, and they are
 * guaranteeed to be invoked in the order that they were queued.
462
 *
463
464
465
 * If the execution of the queue fails before the callbacks, then --
 * depending on driver implementation -- the callbacks may or may not be
 * invoked.  @todo Can we make this behavior consistent?
466
 *
467
468
 * The strange name is due to C's lack of overloading using function
 * arguments.
469
 *
470
 * @param f The callback function to add.
471
 * @param data0 Typically used to point to the data to operate on.
472
473
474
475
 * Frequently this will be the data clocked in during a shift operation.
 * @param data1 An integer big enough to use as an @c int or a pointer.
 * @param data2 An integer big enough to use as an @c int or a pointer.
 * @param data3 An integer big enough to use as an @c int or a pointer.
476
477
 *
 */
478
void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
479
480
		jtag_callback_data_t data1, jtag_callback_data_t data2,
		jtag_callback_data_t data3);
481
482


483
484
485
/**
 * Run a TAP_RESET reset where the end state is TAP_RESET,
 * regardless of the start state.
486
 */
487
void jtag_add_tlr(void);
488

489
490
/**
 * Application code *must* assume that interfaces will
oharboe's avatar
oharboe committed
491
492
493
494
495
496
 * implement transitions between states with different
 * paths and path lengths through the state diagram. The
 * path will vary across interface and also across versions
 * of the same interface over time. Even if the OpenOCD code
 * is unchanged, the actual path taken may vary over time
 * and versions of interface firmware or PCB revisions.
497
 *
oharboe's avatar
oharboe committed
498
499
 * Use jtag_add_pathmove() when specific transition sequences
 * are required.
500
 *
oharboe's avatar
oharboe committed
501
 * Do not use jtag_add_pathmove() unless you need to, but do use it
502
 * if you have to.
oharboe's avatar
oharboe committed
503
 *
504
 * DANGER! If the target is dependent upon a particular sequence
505
506
507
508
509
 * of transitions for things to work correctly(e.g. as a workaround
 * for an errata that contradicts the JTAG standard), then pathmove
 * must be used, even if some jtag interfaces happen to use the
 * desired path. Worse, the jtag interface used for testing a
 * particular implementation, could happen to use the "desired"
510
511
 * path when transitioning to/from end
 * state.
oharboe's avatar
oharboe committed
512
 *
513
 * A list of unambigious single clock state transitions, not
oharboe's avatar
oharboe committed
514
515
 * all drivers can support this, but it is required for e.g.
 * XScale and Xilinx support
516
 *
517
 * Note! TAP_RESET must not be used in the path!
518
519
520
 *
 * Note that the first on the list must be reachable
 * via a single transition from the current state.
521
522
523
524
525
526
527
528
529
 *
 * All drivers are required to implement jtag_add_pathmove().
 * However, if the pathmove sequence can not be precisely
 * executed, an interface_jtag_add_pathmove() or jtag_execute_queue()
 * must return an error. It is legal, but not recommended, that
 * a driver returns an error in all cases for a pathmove if it
 * can only implement a few transitions and therefore
 * a partial implementation of pathmove would have little practical
 * application.
530
531
532
533
534
535
 *
 * If an error occurs, jtag_error will contain one of these error codes:
 *   - ERROR_JTAG_NOT_STABLE_STATE -- The final state was not stable.
 *   - ERROR_JTAG_STATE_INVALID -- The path passed through TAP_RESET.
 *   - ERROR_JTAG_TRANSITION_INVALID -- The path includes invalid
 *     state transitions.
oharboe's avatar
oharboe committed
536
 */
537
void jtag_add_pathmove(int num_states, const tap_state_t* path);
538

539
540
541
542
543
544
/**
 * jtag_add_statemove() moves from the current state to @a goal_state.
 *
 * @param goal_state The final TAP state.
 * @return ERROR_OK on success, or an error code on failure.
 *
zwelch's avatar
zwelch committed
545
 * Moves from the current state to the goal \a state.
David Brownell's avatar
David Brownell committed
546
 * Both states must be stable.
547
 */
548
int jtag_add_statemove(tap_state_t goal_state);
549

550
551
552
553
554
555
556
557
558
/**
 * Goes to TAP_IDLE (if we're not already there), cycle
 * precisely num_cycles in the TAP_IDLE state, after which move
 * to @a endstate (unless it is also TAP_IDLE).
 *
 * @param num_cycles Number of cycles in TAP_IDLE state.  This argument
 * 	may be 0, in which case this routine will navigate to @a endstate
 * 	via TAP_IDLE.
 * @param endstate The final state.
oharboe's avatar
oharboe committed
559
 */
560
void jtag_add_runtest(int num_cycles, tap_state_t endstate);
561

562
563
/**
 * A reset of the TAP state machine can be requested.
564
565
 *
 * Whether tms or trst reset is used depends on the capabilities of
566
 * the target and jtag interface(reset_config  command configures this).
567
 *
568
569
 * srst can driver a reset of the TAP state machine and vice
 * versa
570
 *
571
572
 * Application code may need to examine value of jtag_reset_config
 * to determine the proper codepath
573
 *
574
575
 * DANGER! Even though srst drives trst, trst might not be connected to
 * the interface, and it might actually be *harmful* to assert trst in this case.
576
 *
577
 * This is why combinations such as "reset_config srst_only srst_pulls_trst"
578
 * are supported.
579
 *
580
 * only req_tlr_or_trst and srst can have a transition for a
581
 * call as the effects of transitioning both at the "same time"
582
583
 * are undefined, but when srst_pulls_trst or vice versa,
 * then trst & srst *must* be asserted together.
584
 */
585
void jtag_add_reset(int req_tlr_or_trst, int srst);
586

587
588

/**
589
 * Function jtag_set_end_state
590
591
592
593
594
595
 *
 * Set a global variable to \a state if \a state != TAP_INVALID.
 *
 * Return the value of the global variable.
 *
 **/
596
tap_state_t jtag_set_end_state(tap_state_t state);
597
598
599
600
601
602
/**
 * Function jtag_get_end_state
 *
 * Return the value of the global variable for end state
 *
 **/
603
604
tap_state_t jtag_get_end_state(void);
void jtag_add_sleep(uint32_t us);
605

606
607
608
609
610
611

/**
 * Function jtag_add_stable_clocks
 * first checks that the state in which the clocks are to be issued is
 * stable, then queues up clock_count clocks for transmission.
 */
612
void jtag_add_clocks(int num_cycles);
613
614


615
/**
616
 * For software FIFO implementations, the queued commands can be executed
oharboe's avatar
oharboe committed
617
618
 * during this call or earlier. A sw queue might decide to push out
 * some of the jtag_add_xxx() operations once the queue is "big enough".
619
620
 *
 * This fn will return an error code if any of the prior jtag_add_xxx()
oharboe's avatar
oharboe committed
621
622
 * calls caused a failure, e.g. check failure. Note that it does not
 * matter if the operation was executed *before* jtag_execute_queue(),
623
624
 * jtag_execute_queue() will still return an error code.
 *
zwelch's avatar
zwelch committed
625
 * All jtag_add_xxx() calls that have in_handler != NULL will have been
626
627
628
629
630
631
632
633
 * executed when this fn returns, but if what has been queued only
 * clocks data out, without reading anything back, then JTAG could
 * be running *after* jtag_execute_queue() returns. The API does
 * not define a way to flush a hw FIFO that runs *after*
 * jtag_execute_queue() returns.
 *
 * jtag_add_xxx() commands can either be executed immediately or
 * at some time between the jtag_add_xxx() fn call and jtag_execute_queue().
oharboe's avatar
oharboe committed
634
 */
635
int jtag_execute_queue(void);
636

637
/// same as jtag_execute_queue() but does not clear the error flag
638
void jtag_execute_queue_noclear(void);
oharboe's avatar
oharboe committed
639

640
641
642
/// @returns the number of times the scan queue has been flushed
int jtag_get_flush_queue_count(void);

643
644
/// Report Tcl event to all TAPs
void jtag_notify_event(enum jtag_event);
645

646

zwelch's avatar
zwelch committed
647
/* can be implemented by hw + sw */
648
649
int jtag_power_dropout(int* dropout);
int jtag_srst_asserted(int* srst_asserted);
650

oharboe's avatar
oharboe committed
651
/* JTAG support functions */
oharboe's avatar
oharboe committed
652

653
654
655
656
657
658
659
/**
 * Execute jtag queue and check value with an optional mask.
 * @param field Pointer to scan field.
 * @param value Pointer to scan value.
 * @param mask Pointer to scan mask; may be NULL.
 * @returns Nothing, but calls jtag_set_error() on any error.
 */
660
void jtag_check_value_mask(scan_field_t *field, uint8_t *value, uint8_t *mask);
661

662
void jtag_sleep(uint32_t us);
oharboe's avatar
oharboe committed
663

664
665
666
667
/*
 * The JTAG subsystem defines a number of error codes,
 * using codes between -100 and -199.
 */
668
669
670
671
672
673
674
#define ERROR_JTAG_INIT_FAILED       (-100)
#define ERROR_JTAG_INVALID_INTERFACE (-101)
#define ERROR_JTAG_NOT_IMPLEMENTED   (-102)
#define ERROR_JTAG_TRST_ASSERTED     (-103)
#define ERROR_JTAG_QUEUE_FAILED      (-104)
#define ERROR_JTAG_NOT_STABLE_STATE  (-105)
#define ERROR_JTAG_DEVICE_ERROR      (-107)
675
676
#define ERROR_JTAG_STATE_INVALID     (-108)
#define ERROR_JTAG_TRANSITION_INVALID (-109)
677
#define ERROR_JTAG_INIT_SOFT_FAIL    (-110)
oharboe's avatar
oharboe committed
678

679
680
/**
 * jtag_add_dr_out() is a version of jtag_add_dr_scan() which
681
682
683
 * 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.
684
 *
mifi's avatar
mifi committed
685
 * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID
686
 *
687
 * num_bits[i] is the number of bits to clock out from value[i] LSB first.
688
 *
689
 * If the device is in bypass, then that is an error condition in
690
691
692
 * 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.
693
 *
694
695
696
 * 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.
697
 *
698
699
700
701
702
703
 * 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!
704
 */
705
void jtag_add_dr_out(jtag_tap_t* tap,
706
		int num_fields, const int* num_bits, const uint32_t* value,
zwelch's avatar
zwelch committed
707
		tap_state_t end_state);
708
709


710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
/**
 * Set the current JTAG core execution error, unless one was set
 * by a previous call previously.  Driver or application code must
 * use jtag_error_clear to reset jtag_error once this routine has been
 * called with a non-zero error code.
 */
void jtag_set_error(int error);
/// @returns The current value of jtag_error
int jtag_get_error(void);
/**
 * Resets jtag_error to ERROR_OK, returning its previous value.
 * @returns The previous value of @c jtag_error.
 */
int jtag_error_clear(void);

725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
/**
 * Return true if it's safe for a background polling task to access the
 * JTAG scan chain.  Polling may be explicitly disallowed, and is also
 * unsafe while nTRST is active or the JTAG clock is gated off.,
 */
bool is_jtag_poll_safe(void);

/**
 * Return flag reporting whether JTAG polling is disallowed.
 */
bool jtag_poll_get_enabled(void);

/**
 * Assign flag reporting whether JTAG polling is disallowed.
 */
void jtag_poll_set_enabled(bool value);

oharboe's avatar
oharboe committed
742
#endif /* JTAG_H */