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.
 
 
 
 
 
 

265 lines
7.6 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2006 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "virtex2.h"
  24. #include "pld.h"
  25. #include "xilinx_bit.h"
  26. #include "command.h"
  27. #include "log.h"
  28. #include "jtag.h"
  29. #include <stdlib.h>
  30. int virtex2_register_commands(struct command_context_s *cmd_ctx);
  31. int virtex2_pld_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct pld_device_s *pld_device);
  32. int virtex2_load(struct pld_device_s *pld_device, char *filename);
  33. pld_driver_t virtex2_pld =
  34. {
  35. .name = "virtex2",
  36. .register_commands = virtex2_register_commands,
  37. .pld_device_command = virtex2_pld_device_command,
  38. .load = virtex2_load,
  39. };
  40. int virtex2_set_instr(int chain_pos, u32 new_instr)
  41. {
  42. jtag_device_t *device = jtag_get_device(chain_pos);
  43. if (buf_get_u32(device->cur_instr, 0, device->ir_length) != new_instr)
  44. {
  45. scan_field_t field;
  46. field.device = chain_pos;
  47. field.num_bits = device->ir_length;
  48. field.out_value = calloc(CEIL(field.num_bits, 8), 1);
  49. buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
  50. field.out_mask = NULL;
  51. field.in_value = NULL;
  52. field.in_check_value = NULL;
  53. field.in_check_mask = NULL;
  54. field.in_handler = NULL;
  55. field.in_handler_priv = NULL;
  56. jtag_add_ir_scan(1, &field, TAP_RTI);
  57. free(field.out_value);
  58. }
  59. return ERROR_OK;
  60. }
  61. int virtex2_send_32(struct pld_device_s *pld_device, int num_words, u32 *words)
  62. {
  63. virtex2_pld_device_t *virtex2_info = pld_device->driver_priv;
  64. scan_field_t scan_field;
  65. u8 *values;
  66. int i;
  67. values = malloc(num_words * 4);
  68. scan_field.device = virtex2_info->chain_pos;
  69. scan_field.num_bits = num_words * 32;
  70. scan_field.out_value = values;
  71. scan_field.out_mask = NULL;
  72. scan_field.in_value = NULL;
  73. scan_field.in_check_value = NULL;
  74. scan_field.in_check_mask = NULL;
  75. scan_field.in_handler = NULL;
  76. scan_field.in_handler_priv = NULL;
  77. for (i = 0; i < num_words; i++)
  78. buf_set_u32(values + 4 * i, 0, 32, flip_u32(*words++, 32));
  79. virtex2_set_instr(virtex2_info->chain_pos, 0x5); /* CFG_IN */
  80. jtag_add_dr_scan(1, &scan_field, TAP_PD);
  81. free(values);
  82. return ERROR_OK;
  83. }
  84. int virtex2_jtag_buf_to_u32(u8 *in_buf, void *priv)
  85. {
  86. u32 *dest = priv;
  87. *dest = flip_u32(le_to_h_u32(in_buf), 32);
  88. return ERROR_OK;
  89. }
  90. int virtex2_receive_32(struct pld_device_s *pld_device, int num_words, u32 *words)
  91. {
  92. virtex2_pld_device_t *virtex2_info = pld_device->driver_priv;
  93. scan_field_t scan_field;
  94. scan_field.device = virtex2_info->chain_pos;
  95. scan_field.num_bits = 32;
  96. scan_field.out_value = NULL;
  97. scan_field.out_mask = NULL;
  98. scan_field.in_value = NULL;
  99. scan_field.in_check_value = NULL;
  100. scan_field.in_check_mask = NULL;
  101. scan_field.in_handler = virtex2_jtag_buf_to_u32;
  102. virtex2_set_instr(virtex2_info->chain_pos, 0x4); /* CFG_OUT */
  103. while (num_words--)
  104. {
  105. scan_field.in_handler_priv = words++;
  106. jtag_add_dr_scan(1, &scan_field, TAP_PD);
  107. }
  108. return ERROR_OK;
  109. }
  110. int virtex2_read_stat(struct pld_device_s *pld_device, u32 *status)
  111. {
  112. u32 data[5];
  113. jtag_add_statemove(TAP_TLR);
  114. data[0] = 0xaa995566; /* synch word */
  115. data[1] = 0x2800E001; /* Type 1, read, address 7, 1 word */
  116. data[2] = 0x20000000; /* NOOP (Type 1, read, address 0, 0 words */
  117. data[3] = 0x20000000; /* NOOP */
  118. data[4] = 0x20000000; /* NOOP */
  119. virtex2_send_32(pld_device, 5, data);
  120. virtex2_receive_32(pld_device, 1, status);
  121. jtag_execute_queue();
  122. DEBUG("status: 0x%8.8x", *status);
  123. return ERROR_OK;
  124. }
  125. int virtex2_load(struct pld_device_s *pld_device, char *filename)
  126. {
  127. virtex2_pld_device_t *virtex2_info = pld_device->driver_priv;
  128. xilinx_bit_file_t bit_file;
  129. int retval;
  130. int i;
  131. scan_field_t field;
  132. field.device = virtex2_info->chain_pos;
  133. field.out_mask = NULL;
  134. field.in_value = NULL;
  135. field.in_check_value = NULL;
  136. field.in_check_mask = NULL;
  137. field.in_handler = NULL;
  138. field.in_handler_priv = NULL;
  139. if ((retval = xilinx_read_bit_file(&bit_file, filename)) != ERROR_OK)
  140. return retval;
  141. jtag_add_end_state(TAP_RTI);
  142. virtex2_set_instr(virtex2_info->chain_pos, 0xb); /* JPROG_B */
  143. jtag_execute_queue();
  144. jtag_add_sleep(1000);
  145. virtex2_set_instr(virtex2_info->chain_pos, 0x5); /* CFG_IN */
  146. jtag_execute_queue();
  147. for (i = 0; i < bit_file.length; i++)
  148. bit_file.data[i] = flip_u32(bit_file.data[i], 8);
  149. field.num_bits = bit_file.length * 8;
  150. field.out_value = bit_file.data;
  151. jtag_add_dr_scan(1, &field, TAP_PD);
  152. jtag_execute_queue();
  153. jtag_add_statemove(TAP_TLR);
  154. jtag_add_end_state(TAP_RTI);
  155. virtex2_set_instr(virtex2_info->chain_pos, 0xc); /* JSTART */
  156. jtag_add_runtest(13, TAP_RTI);
  157. virtex2_set_instr(virtex2_info->chain_pos, 0x3f); /* BYPASS */
  158. virtex2_set_instr(virtex2_info->chain_pos, 0x3f); /* BYPASS */
  159. virtex2_set_instr(virtex2_info->chain_pos, 0xc); /* JSTART */
  160. jtag_add_runtest(13, TAP_RTI);
  161. virtex2_set_instr(virtex2_info->chain_pos, 0x3f); /* BYPASS */
  162. jtag_execute_queue();
  163. return ERROR_OK;
  164. }
  165. int virtex2_handle_read_stat_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  166. {
  167. pld_device_t *device;
  168. virtex2_pld_device_t *virtex2_info;
  169. u32 status;
  170. if (argc < 1)
  171. {
  172. command_print(cmd_ctx, "usage: virtex2 read_stat <num>");
  173. return ERROR_OK;
  174. }
  175. device = get_pld_device_by_num(strtoul(args[0], NULL, 0));
  176. if (!device)
  177. {
  178. command_print(cmd_ctx, "pld device '#%s' is out of bounds", args[0]);
  179. return ERROR_OK;
  180. }
  181. virtex2_info = device->driver_priv;
  182. virtex2_read_stat(device, &status);
  183. command_print(cmd_ctx, "virtex2 status register: 0x%8.8x", status);
  184. return ERROR_OK;
  185. }
  186. int virtex2_register_commands(struct command_context_s *cmd_ctx)
  187. {
  188. command_t *virtex2_cmd = register_command(cmd_ctx, NULL, "virtex2", NULL, COMMAND_ANY, "virtex2 specific commands");
  189. register_command(cmd_ctx, virtex2_cmd, "read_stat", virtex2_handle_read_stat_command, COMMAND_EXEC,
  190. "read Virtex-II status register");
  191. return ERROR_OK;
  192. }
  193. int virtex2_pld_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct pld_device_s *pld_device)
  194. {
  195. virtex2_pld_device_t *virtex2_info;
  196. if (argc < 2)
  197. {
  198. WARNING("incomplete pld device 'virtex2' configuration");
  199. return ERROR_PLD_DEVICE_INVALID;
  200. }
  201. virtex2_info = malloc(sizeof(virtex2_pld_device_t));
  202. pld_device->driver_priv = virtex2_info;
  203. virtex2_info->chain_pos = strtoul(args[1], NULL, 0);
  204. return ERROR_OK;
  205. }