You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jtag.h 24 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * Copyright (C) 2007,2008 Øyvind Harboe *
  6. * oyvind.harboe@zylin.com *
  7. * *
  8. * This program is free software; you can redistribute it and/or modify *
  9. * it under the terms of the GNU General Public License as published by *
  10. * the Free Software Foundation; either version 2 of the License, or *
  11. * (at your option) any later version. *
  12. * *
  13. * This program is distributed in the hope that it will be useful, *
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  16. * GNU General Public License for more details. *
  17. * *
  18. * You should have received a copy of the GNU General Public License *
  19. * along with this program; if not, write to the *
  20. * Free Software Foundation, Inc., *
  21. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  22. ***************************************************************************/
  23. #ifndef JTAG_H
  24. #define JTAG_H
  25. #include "types.h"
  26. #include "binarybuffer.h"
  27. #include "log.h"
  28. #include "command.h"
  29. #if 0
  30. #define _DEBUG_JTAG_IO_
  31. #endif
  32. #ifndef DEBUG_JTAG_IOZ
  33. #define DEBUG_JTAG_IOZ 64
  34. #endif
  35. /* 16 Tap States, from page 21 of ASSET InterTech, Inc.'s svf.pdf
  36. */
  37. enum tap_state {
  38. TAP_RESET = 0, TAP_IDLE = 8,
  39. TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4,
  40. TAP_DRPAUSE = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7,
  41. TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12,
  42. TAP_IRPAUSE = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15
  43. };
  44. typedef enum tap_state tap_state_t;
  45. typedef unsigned BOOL;
  46. #define TRUE 1
  47. #define FALSE 0
  48. typedef struct tap_transition_s
  49. {
  50. tap_state_t high;
  51. tap_state_t low;
  52. } tap_transition_t;
  53. //extern tap_transition_t tap_transitions[16]; /* describe the TAP state diagram */
  54. /*-----<Cable Helper API>-------------------------------------------*/
  55. /* The "Cable Helper API" is what the cable drivers can use to help implement
  56. * their "Cable API". So a Cable Helper API is a set of helper functions used by
  57. * cable drivers, and this is different from a Cable API. A "Cable API" is what
  58. * higher level code used to talk to a cable.
  59. */
  60. /** implementation of wrapper function tap_set_state() */
  61. void tap_set_state_impl(tap_state_t new_state);
  62. /**
  63. * Function tap_set_state
  64. * sets the state of a "state follower" which tracks the state of the TAPs connected to the
  65. * cable. The state follower is hopefully always in the same state as the actual
  66. * TAPs in the jtag chain, and will be so if there are no bugs in the tracking logic within that
  67. * cable driver. All the cable drivers call this function to indicate the state they think
  68. * the TAPs attached to their cables are in. Because this function can also log transitions,
  69. * it will be helpful to call this function with every transition that the TAPs being manipulated
  70. * are expected to traverse, not just end points of a multi-step state path.
  71. * @param new_state is the state we think the TAPs are currently in or are about to enter.
  72. */
  73. #if defined(_DEBUG_JTAG_IO_)
  74. #define tap_set_state(new_state) \
  75. do { \
  76. LOG_DEBUG( "tap_set_state(%s)", tap_state_name(new_state) ); \
  77. tap_set_state_impl(new_state); \
  78. } while (0)
  79. #else
  80. static inline void tap_set_state(tap_state_t new_state)
  81. {
  82. tap_set_state_impl(new_state);
  83. }
  84. #endif
  85. /**
  86. * Function tap_get_state
  87. * gets the state of the "state follower" which tracks the state of the TAPs connected to
  88. * the cable.
  89. * @see tap_set_state
  90. * @return tap_state_t - The state the TAPs are in now.
  91. */
  92. tap_state_t tap_get_state(void);
  93. /**
  94. * Function tap_set_end_state
  95. * sets the state of an "end state follower" which tracks the state that any cable driver
  96. * thinks will be the end (resultant) state of the current TAP SIR or SDR operation. At completion
  97. * of that TAP operation this value is copied into the state follower via tap_set_state().
  98. * @param new_end_state is that state the TAPs should enter at completion of a pending TAP operation.
  99. */
  100. void tap_set_end_state(tap_state_t new_end_state);
  101. /**
  102. * Function tap_get_end_state
  103. * @see tap_set_end_state
  104. * @return tap_state_t - The state the TAPs should be in at completion of the current TAP operation.
  105. */
  106. tap_state_t tap_get_end_state(void);
  107. /**
  108. * Function tap_get_tms_path
  109. * returns a 7 bit long "bit sequence" indicating what has to be done with TMS
  110. * during a sequence of seven TAP clock cycles in order to get from
  111. * state \a "from" to state \a "to".
  112. * @param from is the starting state
  113. * @param to is the resultant or final state
  114. * @return int - a 7 bit sequence, with the first bit in the sequence at bit 0.
  115. */
  116. int tap_get_tms_path(tap_state_t from, tap_state_t to);
  117. /**
  118. * Function tap_move_ndx
  119. * when given a stable state, returns an index from 0-5. The index corresponds to a
  120. * sequence of stable states which are given in this order: <p>
  121. * { TAP_RESET, TAP_IDLE, TAP_DRSHIFT, TAP_DRPAUSE, TAP_IRSHIFT, TAP_IRPAUSE }
  122. * <p>
  123. * This sequence corresponds to look up tables which are used in some of the
  124. * cable drivers.
  125. * @param astate is the stable state to find in the sequence. If a non stable
  126. * state is passed, this may cause the program to output an error message
  127. * and terminate.
  128. * @return int - the array (or sequence) index as described above
  129. */
  130. int tap_move_ndx(tap_state_t astate);
  131. /**
  132. * Function tap_is_state_stable
  133. * returns TRUE if the \a astate is stable.
  134. */
  135. BOOL tap_is_state_stable(tap_state_t astate);
  136. /**
  137. * Function tap_state_transition
  138. * takes a current TAP state and returns the next state according to the tms value.
  139. * @param current_state is the state of a TAP currently.
  140. * @param tms is either zero or non-zero, just like a real TMS line in a jtag interface.
  141. * @return tap_state_t - the next state a TAP would enter.
  142. */
  143. tap_state_t tap_state_transition(tap_state_t current_state, BOOL tms);
  144. /**
  145. * Function tap_state_name
  146. * Returns a string suitable for display representing the JTAG tap_state
  147. */
  148. const char* tap_state_name(tap_state_t state);
  149. /*-----</Cable Helper API>------------------------------------------*/
  150. extern tap_state_t cmd_queue_end_state; /* finish DR scans in dr_end_state */
  151. extern tap_state_t cmd_queue_cur_state; /* current TAP state */
  152. typedef void* error_handler_t; /* Later on we can delete error_handler_t, but keep it for now to make patches more readable */
  153. struct scan_field_s;
  154. typedef int (*in_handler_t)(u8* in_value, void* priv, struct scan_field_s* field);
  155. typedef struct scan_field_s
  156. {
  157. jtag_tap_t* tap; /* tap pointer this instruction refers to */
  158. int num_bits; /* number of bits this field specifies (up to 32) */
  159. u8* out_value; /* value to be scanned into the device */
  160. u8* out_mask; /* only masked bits care */
  161. u8* in_value; /* pointer to a 32-bit memory location to take data scanned out */
  162. /* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage */
  163. u8* in_check_value; /* used to validate scan results */
  164. u8* in_check_mask; /* check specified bits against check_value */
  165. in_handler_t in_handler; /* process received buffer using this handler */
  166. void* in_handler_priv; /* additional information for the in_handler */
  167. } scan_field_t;
  168. enum scan_type {
  169. /* IN: from device to host, OUT: from host to device */
  170. SCAN_IN = 1, SCAN_OUT = 2, SCAN_IO = 3
  171. };
  172. typedef struct scan_command_s
  173. {
  174. int ir_scan; /* instruction/not data scan */
  175. int num_fields; /* number of fields in *fields array */
  176. scan_field_t* fields; /* pointer to an array of data scan fields */
  177. tap_state_t end_state; /* TAP state in which JTAG commands should finish */
  178. } scan_command_t;
  179. typedef struct statemove_command_s
  180. {
  181. tap_state_t end_state; /* TAP state in which JTAG commands should finish */
  182. } statemove_command_t;
  183. typedef struct pathmove_command_s
  184. {
  185. int num_states; /* number of states in *path */
  186. tap_state_t* path; /* states that have to be passed */
  187. } pathmove_command_t;
  188. typedef struct runtest_command_s
  189. {
  190. int num_cycles; /* number of cycles that should be spent in Run-Test/Idle */
  191. tap_state_t end_state; /* TAP state in which JTAG commands should finish */
  192. } runtest_command_t;
  193. typedef struct stableclocks_command_s
  194. {
  195. int num_cycles; /* number of clock cycles that should be sent */
  196. } stableclocks_command_t;
  197. typedef struct reset_command_s
  198. {
  199. int trst; /* trst/srst 0: deassert, 1: assert, -1: don't change */
  200. int srst;
  201. } reset_command_t;
  202. typedef struct end_state_command_s
  203. {
  204. tap_state_t end_state; /* TAP state in which JTAG commands should finish */
  205. } end_state_command_t;
  206. typedef struct sleep_command_s
  207. {
  208. u32 us; /* number of microseconds to sleep */
  209. } sleep_command_t;
  210. typedef union jtag_command_container_u
  211. {
  212. scan_command_t* scan;
  213. statemove_command_t* statemove;
  214. pathmove_command_t* pathmove;
  215. runtest_command_t* runtest;
  216. stableclocks_command_t* stableclocks;
  217. reset_command_t* reset;
  218. end_state_command_t* end_state;
  219. sleep_command_t* sleep;
  220. } jtag_command_container_t;
  221. enum jtag_command_type {
  222. JTAG_SCAN = 1,
  223. JTAG_STATEMOVE = 2,
  224. JTAG_RUNTEST = 3,
  225. JTAG_RESET = 4,
  226. JTAG_END_STATE = 5,
  227. JTAG_PATHMOVE = 6,
  228. JTAG_SLEEP = 7,
  229. JTAG_STABLECLOCKS = 8
  230. };
  231. typedef struct jtag_command_s
  232. {
  233. jtag_command_container_t cmd;
  234. enum jtag_command_type type;
  235. struct jtag_command_s* next;
  236. } jtag_command_t;
  237. extern jtag_command_t* jtag_command_queue;
  238. /* forward declaration */
  239. typedef struct jtag_tap_event_action_s jtag_tap_event_action_t;
  240. /* this is really: typedef jtag_tap_t */
  241. /* But - the typedef is done in "types.h" */
  242. /* due to "forward decloration reasons" */
  243. struct jtag_tap_s
  244. {
  245. const char* chip;
  246. const char* tapname;
  247. const char* dotted_name;
  248. int abs_chain_position;
  249. int enabled;
  250. int ir_length; /* size of instruction register */
  251. u32 ir_capture_value;
  252. u8* expected; /* Capture-IR expected value */
  253. u32 ir_capture_mask;
  254. u8* expected_mask; /* Capture-IR expected mask */
  255. u32 idcode; /* device identification code */
  256. u32* expected_ids; /* Array of expected identification codes */
  257. u8 expected_ids_cnt; /* Number of expected identification codes */
  258. u8* cur_instr; /* current instruction */
  259. int bypass; /* bypass register selected */
  260. jtag_tap_event_action_t* event_action;
  261. jtag_tap_t* next_tap;
  262. };
  263. extern jtag_tap_t* jtag_AllTaps(void);
  264. extern jtag_tap_t* jtag_TapByPosition(int n);
  265. extern jtag_tap_t* jtag_TapByPosition(int n);
  266. extern jtag_tap_t* jtag_TapByString(const char* dotted_name);
  267. extern jtag_tap_t* jtag_TapByJimObj(Jim_Interp* interp, Jim_Obj* obj);
  268. extern jtag_tap_t* jtag_TapByAbsPosition(int abs_position);
  269. extern int jtag_NumEnabledTaps(void);
  270. extern int jtag_NumTotalTaps(void);
  271. static __inline__ jtag_tap_t* jtag_NextEnabledTap(jtag_tap_t* p)
  272. {
  273. if (p == NULL)
  274. {
  275. /* start at the head of list */
  276. p = jtag_AllTaps();
  277. }
  278. else
  279. {
  280. /* start *after* this one */
  281. p = p->next_tap;
  282. }
  283. while (p)
  284. {
  285. if (p->enabled)
  286. {
  287. break;
  288. }
  289. else
  290. {
  291. p = p->next_tap;
  292. }
  293. }
  294. return p;
  295. }
  296. enum reset_line_mode {
  297. LINE_OPEN_DRAIN = 0x0,
  298. LINE_PUSH_PULL = 0x1,
  299. };
  300. typedef struct jtag_interface_s
  301. {
  302. char* name;
  303. /* queued command execution
  304. */
  305. int (*execute_queue)(void);
  306. /* interface initalization
  307. */
  308. int (*speed)(int speed);
  309. int (*register_commands)(struct command_context_s* cmd_ctx);
  310. int (*init)(void);
  311. int (*quit)(void);
  312. /* returns JTAG maxium speed for KHz. 0=RTCK. The function returns
  313. * a failure if it can't support the KHz/RTCK.
  314. *
  315. * WARNING!!!! if RTCK is *slow* then think carefully about
  316. * whether you actually want to support this in the driver.
  317. * Many target scripts are written to handle the absence of RTCK
  318. * and use a fallback kHz TCK.
  319. */
  320. int (*khz)(int khz, int* jtag_speed);
  321. /* returns the KHz for the provided JTAG speed. 0=RTCK. The function returns
  322. * a failure if it can't support the KHz/RTCK. */
  323. int (*speed_div)(int speed, int* khz);
  324. /* Read and clear the power dropout flag. Note that a power dropout
  325. * can be transitionary, easily much less than a ms.
  326. *
  327. * So to find out if the power is *currently* on, you must invoke
  328. * this method twice. Once to clear the power dropout flag and a
  329. * second time to read the current state.
  330. *
  331. * Currently the default implementation is never to detect power dropout.
  332. */
  333. int (*power_dropout)(int* power_dropout);
  334. /* Read and clear the srst asserted detection flag.
  335. *
  336. * NB!!!! like power_dropout this does *not* read the current
  337. * state. srst assertion is transitionary and *can* be much
  338. * less than 1ms.
  339. */
  340. int (*srst_asserted)(int* srst_asserted);
  341. } jtag_interface_t;
  342. enum jtag_event {
  343. JTAG_TRST_ASSERTED
  344. };
  345. extern char* jtag_event_strings[];
  346. enum jtag_tap_event {
  347. JTAG_TAP_EVENT_ENABLE,
  348. JTAG_TAP_EVENT_DISABLE
  349. };
  350. extern const Jim_Nvp nvp_jtag_tap_event[];
  351. struct jtag_tap_event_action_s
  352. {
  353. enum jtag_tap_event event;
  354. Jim_Obj* body;
  355. jtag_tap_event_action_t* next;
  356. };
  357. extern int jtag_trst;
  358. extern int jtag_srst;
  359. typedef struct jtag_event_callback_s
  360. {
  361. int (*callback)(enum jtag_event event, void* priv);
  362. void* priv;
  363. struct jtag_event_callback_s* next;
  364. } jtag_event_callback_t;
  365. extern jtag_event_callback_t* jtag_event_callbacks;
  366. extern jtag_interface_t* jtag; /* global pointer to configured JTAG interface */
  367. extern int jtag_speed;
  368. extern int jtag_speed_post_reset;
  369. enum reset_types {
  370. RESET_NONE = 0x0,
  371. RESET_HAS_TRST = 0x1,
  372. RESET_HAS_SRST = 0x2,
  373. RESET_TRST_AND_SRST = 0x3,
  374. RESET_SRST_PULLS_TRST = 0x4,
  375. RESET_TRST_PULLS_SRST = 0x8,
  376. RESET_TRST_OPEN_DRAIN = 0x10,
  377. RESET_SRST_PUSH_PULL = 0x20,
  378. };
  379. extern enum reset_types jtag_reset_config;
  380. /* initialize interface upon startup. A successful no-op
  381. * upon subsequent invocations
  382. */
  383. extern int jtag_interface_init(struct command_context_s* cmd_ctx);
  384. /* initialize JTAG chain using only a RESET reset. If init fails,
  385. * try reset + init.
  386. */
  387. extern int jtag_init(struct command_context_s* cmd_ctx);
  388. /* reset, then initialize JTAG chain */
  389. extern int jtag_init_reset(struct command_context_s* cmd_ctx);
  390. extern int jtag_register_commands(struct command_context_s* cmd_ctx);
  391. /* JTAG interface, can be implemented with a software or hardware fifo
  392. *
  393. * TAP_DRSHIFT and TAP_IRSHIFT are illegal end states. TAP_DRSHIFT/IRSHIFT as end states
  394. * can be emulated by using a larger scan.
  395. *
  396. * Code that is relatively insensitive to the path(as long
  397. * as it is JTAG compliant) taken through state machine can use
  398. * endstate for jtag_add_xxx_scan(). Otherwise the pause state must be
  399. * specified as end state and a subsequent jtag_add_pathmove() must
  400. * be issued.
  401. *
  402. */
  403. extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  404. extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  405. extern void jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  406. extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  407. extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  408. extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  409. extern void jtag_add_plain_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  410. extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
  411. /* run a TAP_RESET reset. End state is TAP_RESET, regardless
  412. * of start state.
  413. */
  414. extern void jtag_add_tlr(void);
  415. extern int interface_jtag_add_tlr(void);
  416. /* Do not use jtag_add_pathmove() unless you need to, but do use it
  417. * if you have to.
  418. *
  419. * DANGER! If the target is dependent upon a particular sequence
  420. * of transitions for things to work correctly(e.g. as a workaround
  421. * for an errata that contradicts the JTAG standard), then pathmove
  422. * must be used, even if some jtag interfaces happen to use the
  423. * desired path. Worse, the jtag interface used for testing a
  424. * particular implementation, could happen to use the "desired"
  425. * path when transitioning to/from end
  426. * state.
  427. *
  428. * A list of unambigious single clock state transitions, not
  429. * all drivers can support this, but it is required for e.g.
  430. * XScale and Xilinx support
  431. *
  432. * Note! TAP_RESET must not be used in the path!
  433. *
  434. * Note that the first on the list must be reachable
  435. * via a single transition from the current state.
  436. *
  437. * All drivers are required to implement jtag_add_pathmove().
  438. * However, if the pathmove sequence can not be precisely
  439. * executed, an interface_jtag_add_pathmove() or jtag_execute_queue()
  440. * must return an error. It is legal, but not recommended, that
  441. * a driver returns an error in all cases for a pathmove if it
  442. * can only implement a few transitions and therefore
  443. * a partial implementation of pathmove would have little practical
  444. * application.
  445. */
  446. extern void jtag_add_pathmove(int num_states, tap_state_t* path);
  447. extern int interface_jtag_add_pathmove(int num_states, tap_state_t* path);
  448. /* go to TAP_IDLE, if we're not already there and cycle
  449. * precisely num_cycles in the TAP_IDLE after which move
  450. * to the end state, if it is != TAP_IDLE
  451. *
  452. * nb! num_cycles can be 0, in which case the fn will navigate
  453. * to endstate via TAP_IDLE
  454. */
  455. extern void jtag_add_runtest(int num_cycles, tap_state_t endstate);
  456. extern int interface_jtag_add_runtest(int num_cycles, tap_state_t endstate);
  457. /* A reset of the TAP state machine can be requested.
  458. *
  459. * Whether tms or trst reset is used depends on the capabilities of
  460. * the target and jtag interface(reset_config command configures this).
  461. *
  462. * srst can driver a reset of the TAP state machine and vice
  463. * versa
  464. *
  465. * Application code may need to examine value of jtag_reset_config
  466. * to determine the proper codepath
  467. *
  468. * DANGER! Even though srst drives trst, trst might not be connected to
  469. * the interface, and it might actually be *harmful* to assert trst in this case.
  470. *
  471. * This is why combinations such as "reset_config srst_only srst_pulls_trst"
  472. * are supported.
  473. *
  474. * only req_tlr_or_trst and srst can have a transition for a
  475. * call as the effects of transitioning both at the "same time"
  476. * are undefined, but when srst_pulls_trst or vice versa,
  477. * then trst & srst *must* be asserted together.
  478. */
  479. extern void jtag_add_reset(int req_tlr_or_trst, int srst);
  480. /* this drives the actual srst and trst pins. srst will always be 0
  481. * if jtag_reset_config & RESET_SRST_PULLS_TRST != 0 and ditto for
  482. * trst.
  483. *
  484. * the higher level jtag_add_reset will invoke jtag_add_tlr() if
  485. * approperiate
  486. */
  487. extern int interface_jtag_add_reset(int trst, int srst);
  488. extern void jtag_add_end_state(tap_state_t endstate);
  489. extern int interface_jtag_add_end_state(tap_state_t endstate);
  490. extern void jtag_add_sleep(u32 us);
  491. extern int interface_jtag_add_sleep(u32 us);
  492. /**
  493. * Function jtag_add_stable_clocks
  494. * first checks that the state in which the clocks are to be issued is
  495. * stable, then queues up clock_count clocks for transmission.
  496. */
  497. void jtag_add_clocks(int num_cycles);
  498. int interface_jtag_add_clocks(int num_cycles);
  499. /*
  500. * For software FIFO implementations, the queued commands can be executed
  501. * during this call or earlier. A sw queue might decide to push out
  502. * some of the jtag_add_xxx() operations once the queue is "big enough".
  503. *
  504. * This fn will return an error code if any of the prior jtag_add_xxx()
  505. * calls caused a failure, e.g. check failure. Note that it does not
  506. * matter if the operation was executed *before* jtag_execute_queue(),
  507. * jtag_execute_queue() will still return an error code.
  508. *
  509. * All jtag_add_xxx() calls that have in_handler!=NULL will have been
  510. * executed when this fn returns, but if what has been queued only
  511. * clocks data out, without reading anything back, then JTAG could
  512. * be running *after* jtag_execute_queue() returns. The API does
  513. * not define a way to flush a hw FIFO that runs *after*
  514. * jtag_execute_queue() returns.
  515. *
  516. * jtag_add_xxx() commands can either be executed immediately or
  517. * at some time between the jtag_add_xxx() fn call and jtag_execute_queue().
  518. */
  519. extern int jtag_execute_queue(void);
  520. /* can be implemented by hw+sw */
  521. extern int interface_jtag_execute_queue(void);
  522. extern int jtag_power_dropout(int* dropout);
  523. extern int jtag_srst_asserted(int* srst_asserted);
  524. /* JTAG support functions */
  525. extern void jtag_set_check_value(scan_field_t* field, u8* value, u8* mask, error_handler_t* in_error_handler);
  526. extern enum scan_type jtag_scan_type(scan_command_t* cmd);
  527. extern int jtag_scan_size(scan_command_t* cmd);
  528. extern int jtag_read_buffer(u8* buffer, scan_command_t* cmd);
  529. extern int jtag_build_buffer(scan_command_t* cmd, u8** buffer);
  530. extern void jtag_sleep(u32 us);
  531. extern int jtag_call_event_callbacks(enum jtag_event event);
  532. extern int jtag_register_event_callback(int (* callback)(enum jtag_event event, void* priv), void* priv);
  533. extern int jtag_verify_capture_ir;
  534. void jtag_tap_handle_event(jtag_tap_t* tap, enum jtag_tap_event e);
  535. /* error codes
  536. * JTAG subsystem uses codes between -100 and -199 */
  537. #define ERROR_JTAG_INIT_FAILED (-100)
  538. #define ERROR_JTAG_INVALID_INTERFACE (-101)
  539. #define ERROR_JTAG_NOT_IMPLEMENTED (-102)
  540. #define ERROR_JTAG_TRST_ASSERTED (-103)
  541. #define ERROR_JTAG_QUEUE_FAILED (-104)
  542. #define ERROR_JTAG_NOT_STABLE_STATE (-105)
  543. #define ERROR_JTAG_DEVICE_ERROR (-107)
  544. /* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
  545. #ifdef HAVE_JTAG_MINIDRIVER_H
  546. /* Here a #define MINIDRIVER() and an inline version of hw fifo interface_jtag_add_dr_out can be defined */
  547. #include "jtag_minidriver.h"
  548. #define MINIDRIVER(a) notused ## a
  549. #else
  550. #define MINIDRIVER(a) a
  551. /* jtag_add_dr_out() is a faster version of jtag_add_dr_scan()
  552. *
  553. * Current or end_state can not be TAP_RESET. end_state can be -1
  554. *
  555. * num_bits[i] is the number of bits to clock out from value[i] LSB first.
  556. *
  557. * If the device is in bypass, then that is an error condition in
  558. * the caller code that is not detected by this fn, whereas jtag_add_dr_scan()
  559. * does detect it. Similarly if the device is not in bypass, data must
  560. * be passed to it.
  561. *
  562. * If anything fails, then jtag_error will be set and jtag_execute() will
  563. * return an error. There is no way to determine if there was a failure
  564. * during this function call.
  565. *
  566. * Note that this jtag_add_dr_out can be defined as an inline function.
  567. */
  568. extern void interface_jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
  569. tap_state_t end_state);
  570. #endif
  571. static __inline__ void jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
  572. tap_state_t end_state)
  573. {
  574. if (end_state != -1)
  575. cmd_queue_end_state = end_state;
  576. cmd_queue_cur_state = cmd_queue_end_state;
  577. interface_jtag_add_dr_out(tap, num_fields, num_bits, value, cmd_queue_end_state);
  578. }
  579. #endif /* JTAG_H */