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.
 
 
 
 
 
 

326 lines
9.5 KiB

  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. #ifdef HAVE_CONFIG_H
  24. #include "config.h"
  25. #endif
  26. #include "bitbang.h"
  27. #include "interface.h"
  28. #include "commands.h"
  29. /**
  30. * Function bitbang_stableclocks
  31. * issues a number of clock cycles while staying in a stable state.
  32. * Because the TMS value required to stay in the RESET state is a 1, whereas
  33. * the TMS value required to stay in any of the other stable states is a 0,
  34. * this function checks the current stable state to decide on the value of TMS
  35. * to use.
  36. */
  37. static void bitbang_stableclocks(int num_cycles);
  38. bitbang_interface_t *bitbang_interface;
  39. /* DANGER!!!! clock absolutely *MUST* be 0 in idle or reset won't work!
  40. *
  41. * Set this to 1 and str912 reset halt will fail.
  42. *
  43. * If someone can submit a patch with an explanation it will be greatly
  44. * appreciated, but as far as I can tell (ØH) DCLK is generated upon
  45. * clk=0 in TAP_IDLE. Good luck deducing that from the ARM documentation!
  46. * The ARM documentation uses the term "DCLK is asserted while in the TAP_IDLE
  47. * state". With hardware there is no such thing as *while* in a state. There
  48. * are only edges. So clk => 0 is in fact a very subtle state transition that
  49. * happens *while* in the TAP_IDLE state. "#&¤"#¤&"#&"#&
  50. *
  51. * For "reset halt" the last thing that happens before srst is asserted
  52. * is that the breakpoint is set up. If DCLK is not wiggled one last
  53. * time before the reset, then the breakpoint is not set up and
  54. * "reset halt" will fail to halt.
  55. *
  56. */
  57. #define CLOCK_IDLE() 0
  58. /* The bitbang driver leaves the TCK 0 when in idle */
  59. static void bitbang_end_state(tap_state_t state)
  60. {
  61. if (tap_is_state_stable(state))
  62. tap_set_end_state(state);
  63. else
  64. {
  65. LOG_ERROR("BUG: %i is not a valid end state", state);
  66. exit(-1);
  67. }
  68. }
  69. static void bitbang_state_move(int skip)
  70. {
  71. int i=0, tms=0;
  72. uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
  73. int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
  74. for (i = skip; i < tms_count; i++)
  75. {
  76. tms = (tms_scan >> i) & 1;
  77. bitbang_interface->write(0, tms, 0);
  78. bitbang_interface->write(1, tms, 0);
  79. }
  80. bitbang_interface->write(CLOCK_IDLE(), tms, 0);
  81. tap_set_state(tap_get_end_state());
  82. }
  83. static void bitbang_path_move(pathmove_command_t *cmd)
  84. {
  85. int num_states = cmd->num_states;
  86. int state_count;
  87. int tms = 0;
  88. state_count = 0;
  89. while (num_states)
  90. {
  91. if (tap_state_transition(tap_get_state(), false) == cmd->path[state_count])
  92. {
  93. tms = 0;
  94. }
  95. else if (tap_state_transition(tap_get_state(), true) == cmd->path[state_count])
  96. {
  97. tms = 1;
  98. }
  99. else
  100. {
  101. LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
  102. exit(-1);
  103. }
  104. bitbang_interface->write(0, tms, 0);
  105. bitbang_interface->write(1, tms, 0);
  106. tap_set_state(cmd->path[state_count]);
  107. state_count++;
  108. num_states--;
  109. }
  110. bitbang_interface->write(CLOCK_IDLE(), tms, 0);
  111. tap_set_end_state(tap_get_state());
  112. }
  113. static void bitbang_runtest(int num_cycles)
  114. {
  115. int i;
  116. tap_state_t saved_end_state = tap_get_end_state();
  117. /* only do a state_move when we're not already in IDLE */
  118. if (tap_get_state() != TAP_IDLE)
  119. {
  120. bitbang_end_state(TAP_IDLE);
  121. bitbang_state_move(0);
  122. }
  123. /* execute num_cycles */
  124. for (i = 0; i < num_cycles; i++)
  125. {
  126. bitbang_interface->write(0, 0, 0);
  127. bitbang_interface->write(1, 0, 0);
  128. }
  129. bitbang_interface->write(CLOCK_IDLE(), 0, 0);
  130. /* finish in end_state */
  131. bitbang_end_state(saved_end_state);
  132. if (tap_get_state() != tap_get_end_state())
  133. bitbang_state_move(0);
  134. }
  135. static void bitbang_stableclocks(int num_cycles)
  136. {
  137. int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
  138. int i;
  139. /* send num_cycles clocks onto the cable */
  140. for (i = 0; i < num_cycles; i++)
  141. {
  142. bitbang_interface->write(1, tms, 0);
  143. bitbang_interface->write(0, tms, 0);
  144. }
  145. }
  146. static void bitbang_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size)
  147. {
  148. tap_state_t saved_end_state = tap_get_end_state();
  149. int bit_cnt;
  150. if (!((!ir_scan && (tap_get_state() == TAP_DRSHIFT)) || (ir_scan && (tap_get_state() == TAP_IRSHIFT))))
  151. {
  152. if (ir_scan)
  153. bitbang_end_state(TAP_IRSHIFT);
  154. else
  155. bitbang_end_state(TAP_DRSHIFT);
  156. bitbang_state_move(0);
  157. bitbang_end_state(saved_end_state);
  158. }
  159. for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)
  160. {
  161. int val=0;
  162. int tms=(bit_cnt==scan_size-1) ? 1 : 0;
  163. int tdi;
  164. int bytec=bit_cnt/8;
  165. int bcval=1 << (bit_cnt % 8);
  166. /* if we're just reading the scan, but don't care about the output
  167. * default to outputting 'low', this also makes valgrind traces more readable,
  168. * as it removes the dependency on an uninitialised value
  169. */
  170. tdi=0;
  171. if ((type != SCAN_IN) && (buffer[bytec] & bcval))
  172. tdi=1;
  173. bitbang_interface->write(0, tms, tdi);
  174. if (type != SCAN_OUT)
  175. val=bitbang_interface->read();
  176. bitbang_interface->write(1, tms, tdi);
  177. if (type != SCAN_OUT)
  178. {
  179. if (val)
  180. buffer[bytec] |= bcval;
  181. else
  182. buffer[bytec] &= ~bcval;
  183. }
  184. }
  185. if (tap_get_state() != tap_get_end_state())
  186. {
  187. /* we *KNOW* the above loop transitioned out of
  188. * the shift state, so we skip the first state
  189. * and move directly to the end state.
  190. */
  191. bitbang_state_move(1);
  192. }
  193. }
  194. int bitbang_execute_queue(void)
  195. {
  196. jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
  197. int scan_size;
  198. enum scan_type type;
  199. uint8_t *buffer;
  200. int retval;
  201. if (!bitbang_interface)
  202. {
  203. LOG_ERROR("BUG: Bitbang interface called, but not yet initialized");
  204. exit(-1);
  205. }
  206. /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
  207. * that wasn't handled by a caller-provided error handler
  208. */
  209. retval = ERROR_OK;
  210. if (bitbang_interface->blink)
  211. bitbang_interface->blink(1);
  212. while (cmd)
  213. {
  214. switch (cmd->type)
  215. {
  216. case JTAG_RESET:
  217. #ifdef _DEBUG_JTAG_IO_
  218. LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
  219. #endif
  220. if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
  221. {
  222. tap_set_state(TAP_RESET);
  223. }
  224. bitbang_interface->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
  225. break;
  226. case JTAG_RUNTEST:
  227. #ifdef _DEBUG_JTAG_IO_
  228. LOG_DEBUG("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(cmd->cmd.runtest->end_state) );
  229. #endif
  230. bitbang_end_state(cmd->cmd.runtest->end_state);
  231. bitbang_runtest(cmd->cmd.runtest->num_cycles);
  232. break;
  233. case JTAG_STABLECLOCKS:
  234. /* this is only allowed while in a stable state. A check for a stable
  235. * state was done in jtag_add_clocks()
  236. */
  237. bitbang_stableclocks(cmd->cmd.stableclocks->num_cycles);
  238. break;
  239. case JTAG_STATEMOVE:
  240. #ifdef _DEBUG_JTAG_IO_
  241. LOG_DEBUG("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
  242. #endif
  243. bitbang_end_state(cmd->cmd.statemove->end_state);
  244. bitbang_state_move(0);
  245. break;
  246. case JTAG_PATHMOVE:
  247. #ifdef _DEBUG_JTAG_IO_
  248. LOG_DEBUG("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
  249. tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
  250. #endif
  251. bitbang_path_move(cmd->cmd.pathmove);
  252. break;
  253. case JTAG_SCAN:
  254. #ifdef _DEBUG_JTAG_IO_
  255. LOG_DEBUG("%s scan end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", tap_state_name(cmd->cmd.scan->end_state) );
  256. #endif
  257. bitbang_end_state(cmd->cmd.scan->end_state);
  258. scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
  259. type = jtag_scan_type(cmd->cmd.scan);
  260. bitbang_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
  261. if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
  262. retval = ERROR_JTAG_QUEUE_FAILED;
  263. if (buffer)
  264. free(buffer);
  265. break;
  266. case JTAG_SLEEP:
  267. #ifdef _DEBUG_JTAG_IO_
  268. LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
  269. #endif
  270. jtag_sleep(cmd->cmd.sleep->us);
  271. break;
  272. default:
  273. LOG_ERROR("BUG: unknown JTAG command type encountered");
  274. exit(-1);
  275. }
  276. cmd = cmd->next;
  277. }
  278. if (bitbang_interface->blink)
  279. bitbang_interface->blink(0);
  280. return retval;
  281. }