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.
 
 
 
 
 
 

211 lines
6.4 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2007-2009 by √ėyvind Harboe *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This program is distributed in the hope that it will be useful, *
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  12. * GNU General Public License for more details. *
  13. * *
  14. * You should have received a copy of the GNU General Public License *
  15. * along with this program; if not, write to the *
  16. * Free Software Foundation, Inc., *
  17. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. ***************************************************************************/
  19. #include <cyg/hal/hal_io.h> // low level i/o
  20. #include <cyg/hal/hal_intr.h> // low level i/o
  21. //#define VERBOSE(a) a
  22. #define VERBOSE(a)
  23. /* used to test manual mode */
  24. #define TEST_MANUAL() 0
  25. #if 0
  26. int diag_printf(const char *fmt, ...);
  27. #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b); diag_printf("poke 0x%08x,0x%08x\n", a, b)
  28. #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b); diag_printf("peek 0x%08x = 0x%08x\n", a, b)
  29. #else
  30. #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b)
  31. #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b)
  32. #endif
  33. // FIFO empty?
  34. static __inline__ void waitIdle(void)
  35. {
  36. cyg_uint32 empty;
  37. do
  38. {
  39. ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty);
  40. } while ((empty & 0x100) == 0);
  41. }
  42. static __inline__ void waitQueue(void)
  43. {
  44. // waitIdle();
  45. }
  46. static __inline__ void sampleShiftRegister(void)
  47. {
  48. #if 0
  49. cyg_uint32 dummy;
  50. waitIdle();
  51. ZY1000_PEEK(ZY1000_JTAG_BASE + 0xc, dummy);
  52. #endif
  53. }
  54. static __inline__ void setCurrentState(enum tap_state state)
  55. {
  56. cyg_uint32 a;
  57. a = state;
  58. int repeat = 0;
  59. if (state == TAP_RESET)
  60. {
  61. // The FPGA nor we know the current state of the CPU TAP
  62. // controller. This will move it to TAP for sure.
  63. //
  64. // 5 should be enough here, 7 is what OpenOCD uses
  65. repeat = 7;
  66. }
  67. waitQueue();
  68. sampleShiftRegister();
  69. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | a);
  70. }
  71. /*
  72. * Enter state and cause repeat transitions *out* of that state. So if the endState != state, then
  73. * the transition from state to endState counts as a transition out of state.
  74. */
  75. static __inline__ void shiftValueInner(const enum tap_state state, const enum tap_state endState, int repeat, cyg_uint32 value)
  76. {
  77. cyg_uint32 a,b;
  78. a = state;
  79. b = endState;
  80. waitQueue();
  81. sampleShiftRegister();
  82. ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value);
  83. #if 1
  84. #if TEST_MANUAL()
  85. if ((state == TAP_DRSHIFT) && (endState != TAP_DRSHIFT))
  86. {
  87. int i;
  88. setCurrentState(state);
  89. for (i = 0; i < repeat; i++)
  90. {
  91. int tms;
  92. tms = 0;
  93. if ((i == repeat-1) && (state != endState))
  94. {
  95. tms = 1;
  96. }
  97. /* shift out value */
  98. waitIdle();
  99. ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, (((value >> i)&1) << 1) | tms);
  100. }
  101. waitIdle();
  102. ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
  103. waitIdle();
  104. //ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT); // set this state and things break => expected
  105. ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRPAUSE); // set this and things will work => expected. Not setting this is not sufficient to make things break.
  106. setCurrentState(endState);
  107. } else
  108. {
  109. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
  110. }
  111. #else
  112. /* fast version */
  113. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
  114. #endif
  115. #else
  116. /* maximum debug version */
  117. if ((repeat > 0) && ((state == TAP_DRSHIFT)||(state == TAP_SI)))
  118. {
  119. int i;
  120. /* sample shift register for every bit. */
  121. for (i = 0; i < repeat-1; i++)
  122. {
  123. sampleShiftRegister();
  124. ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> i);
  125. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | a);
  126. }
  127. sampleShiftRegister();
  128. ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> (repeat-1));
  129. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | b);
  130. } else
  131. {
  132. sampleShiftRegister();
  133. ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
  134. }
  135. sampleShiftRegister();
  136. #endif
  137. }
  138. static __inline__ void interface_jtag_add_dr_out_core(struct jtag_tap *target_tap,
  139. int num_fields,
  140. const int *num_bits,
  141. const uint32_t *value,
  142. enum tap_state end_state)
  143. {
  144. enum tap_state pause_state = TAP_DRSHIFT;
  145. struct jtag_tap *tap, *nextTap;
  146. for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
  147. {
  148. nextTap = jtag_tap_next_enabled(tap);
  149. if (nextTap == NULL)
  150. {
  151. pause_state = end_state;
  152. }
  153. if (tap == target_tap)
  154. {
  155. int j;
  156. for (j = 0; j < (num_fields-1); j++)
  157. {
  158. shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[j], value[j]);
  159. }
  160. shiftValueInner(TAP_DRSHIFT, pause_state, num_bits[j], value[j]);
  161. } else
  162. {
  163. /* program the scan field to 1 bit length, and ignore it's value */
  164. shiftValueInner(TAP_DRSHIFT, pause_state, 1, 0);
  165. }
  166. }
  167. }
  168. static __inline__ void interface_jtag_add_dr_out(struct jtag_tap *target_tap,
  169. int num_fields,
  170. const int *num_bits,
  171. const uint32_t *value,
  172. enum tap_state end_state)
  173. {
  174. int singletap = (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL)) == NULL);
  175. if ((singletap) && (num_fields == 3))
  176. {
  177. /* used by embeddedice_write_reg_inner() */
  178. shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);
  179. shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[1], value[1]);
  180. shiftValueInner(TAP_DRSHIFT, end_state, num_bits[2], value[2]);
  181. } else if ((singletap) && (num_fields == 2))
  182. {
  183. /* used by arm7 code */
  184. shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);
  185. shiftValueInner(TAP_DRSHIFT, end_state, num_bits[1], value[1]);
  186. } else
  187. {
  188. interface_jtag_add_dr_out_core(target_tap, num_fields, num_bits, value, end_state);
  189. }
  190. }
  191. #define interface_jtag_add_callback(callback, in) callback(in)
  192. #define interface_jtag_add_callback4(callback, in, data1, data2, data3) jtag_set_error(callback(in, data1, data2, data3))