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.2 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2007-2008 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. //#define VERBOSE(a) a
  21. #define VERBOSE(a)
  22. /* used to test manual mode */
  23. #define TEST_MANUAL() 0
  24. #if 0
  25. int diag_printf( const char *fmt, ... );
  26. #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b); diag_printf("poke 0x%08x,0x%08x\n", a, b)
  27. #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b); diag_printf("peek 0x%08x=0x%08x\n", a, b)
  28. #else
  29. #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b)
  30. #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b)
  31. #endif
  32. // FIFO empty?
  33. static __inline__ void waitIdle(void)
  34. {
  35. cyg_uint32 empty;
  36. do
  37. {
  38. ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);
  39. } while ((empty & 0x100)==0);
  40. }
  41. static __inline__ void waitQueue(void)
  42. {
  43. // waitIdle();
  44. }
  45. static void sampleShiftRegister(void)
  46. {
  47. #if 0
  48. cyg_uint32 dummy;
  49. waitIdle();
  50. ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, dummy);
  51. #endif
  52. }
  53. /* -O3 will inline this for us */
  54. static 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(jtag_tap_t *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. jtag_tap_t *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(jtag_tap_t *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))