X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fpld%2Fvirtex2.c;h=821699ac95b34d1e8e9b3c42e438f19d6fe5aa4d;hp=cec4fe9d12342a931a17a50b648fa4faeb2c24b0;hb=00228aa8398fd7dde1271af424fab1cb470c5f43;hpb=4d88c124b1262a738b4a9f107ef62404a45bf323 diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c index cec4fe9d12..821699ac95 100644 --- a/src/pld/virtex2.c +++ b/src/pld/virtex2.c @@ -22,14 +22,9 @@ #endif #include "virtex2.h" - -#include "pld.h" #include "xilinx_bit.h" -#include "command.h" -#include "log.h" -#include "jtag.h" +#include "pld.h" -#include int virtex2_register_commands(struct command_context_s *cmd_ctx); int virtex2_pld_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct pld_device_s *pld_device); @@ -56,14 +51,14 @@ int virtex2_set_instr(jtag_tap_t *tap, u32 new_instr) field.num_bits = tap->ir_length; field.out_value = calloc(CEIL(field.num_bits, 8), 1); buf_set_u32(field.out_value, 0, field.num_bits, new_instr); - + field.in_value = NULL; - field.in_check_value = NULL; - field.in_check_mask = NULL; - field.in_handler = NULL; - field.in_handler_priv = NULL; - jtag_add_ir_scan(1, &field, TAP_IDLE); + + + + + jtag_add_ir_scan(1, &field, jtag_set_end_state(TAP_IDLE)); free(field.out_value); } @@ -84,28 +79,22 @@ int virtex2_send_32(struct pld_device_s *pld_device, int num_words, u32 *words) scan_field.num_bits = num_words * 32; scan_field.out_value = values; scan_field.in_value = NULL; - scan_field.in_check_value = NULL; - scan_field.in_check_mask = NULL; - scan_field.in_handler = NULL; - scan_field.in_handler_priv = NULL; for (i = 0; i < num_words; i++) buf_set_u32(values + 4 * i, 0, 32, flip_u32(*words++, 32)); virtex2_set_instr(virtex2_info->tap, 0x5); /* CFG_IN */ - jtag_add_dr_scan(1, &scan_field, TAP_DRPAUSE); + jtag_add_dr_scan(1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); free(values); return ERROR_OK; } -int virtex2_jtag_buf_to_u32(u8 *in_buf, void *priv, struct scan_field_s *field) +static __inline__ void virtexflip32(u8 *in) { - u32 *dest = priv; - *dest = flip_u32(le_to_h_u32(in_buf), 32); - return ERROR_OK; + *((u32 *)in)=flip_u32(le_to_h_u32(in), 32); } int virtex2_receive_32(struct pld_device_s *pld_device, int num_words, u32 *words) @@ -117,16 +106,18 @@ int virtex2_receive_32(struct pld_device_s *pld_device, int num_words, u32 *word scan_field.num_bits = 32; scan_field.out_value = NULL; scan_field.in_value = NULL; - scan_field.in_check_value = NULL; - scan_field.in_check_mask = NULL; - scan_field.in_handler = virtex2_jtag_buf_to_u32; /* deprecated! invoke this from user code! */ virtex2_set_instr(virtex2_info->tap, 0x4); /* CFG_OUT */ while (num_words--) { - scan_field.in_handler_priv = words++; - jtag_add_dr_scan(1, &scan_field, TAP_DRPAUSE); + scan_field.in_value = (u8 *)words; + + jtag_add_dr_scan(1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); + + jtag_add_callback(virtexflip32, (u8 *)words); + + words++;; } return ERROR_OK; @@ -164,17 +155,17 @@ int virtex2_load(struct pld_device_s *pld_device, char *filename) scan_field_t field; field.tap = virtex2_info->tap; - + field.in_value = NULL; - field.in_check_value = NULL; - field.in_check_mask = NULL; - field.in_handler = NULL; - field.in_handler_priv = NULL; + + + + if ((retval = xilinx_read_bit_file(&bit_file, filename)) != ERROR_OK) return retval; - jtag_add_end_state(TAP_IDLE); + jtag_set_end_state(TAP_IDLE); virtex2_set_instr(virtex2_info->tap, 0xb); /* JPROG_B */ jtag_execute_queue(); jtag_add_sleep(1000); @@ -188,18 +179,18 @@ int virtex2_load(struct pld_device_s *pld_device, char *filename) field.num_bits = bit_file.length * 8; field.out_value = bit_file.data; - jtag_add_dr_scan(1, &field, TAP_DRPAUSE); + jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE)); jtag_execute_queue(); jtag_add_tlr(); - jtag_add_end_state(TAP_IDLE); + jtag_set_end_state(TAP_IDLE); virtex2_set_instr(virtex2_info->tap, 0xc); /* JSTART */ - jtag_add_runtest(13, TAP_IDLE); + jtag_add_runtest(13, jtag_set_end_state(TAP_IDLE)); virtex2_set_instr(virtex2_info->tap, 0x3f); /* BYPASS */ virtex2_set_instr(virtex2_info->tap, 0x3f); /* BYPASS */ virtex2_set_instr(virtex2_info->tap, 0xc); /* JSTART */ - jtag_add_runtest(13, TAP_IDLE); + jtag_add_runtest(13, jtag_set_end_state(TAP_IDLE)); virtex2_set_instr(virtex2_info->tap, 0x3f); /* BYPASS */ jtag_execute_queue(); @@ -256,7 +247,7 @@ int virtex2_pld_device_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_PLD_DEVICE_INVALID; } - tap = jtag_TapByString( args[1] ); + tap = jtag_tap_by_string( args[1] ); if( tap == NULL ){ command_print( cmd_ctx, "Tap: %s does not exist", args[1] ); return ERROR_OK;