From: David B. <dbr...@us...> - 2010-03-11 23:23:03
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 03a26d31e991976ff978c8c9b245210f116f6ece (commit) via db464f3cd4ed83b9f3411a98362dd67aad7bc3fd (commit) from 24e1e3dd2699b817fa72a7843d36197abcd9e3a3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 03a26d31e991976ff978c8c9b245210f116f6ece Author: David Brownell <dbr...@us...> Date: Thu Mar 11 14:21:36 2010 -0800 versaloon cleanup patch Remove undesirable - backslashes at end-of-line; - initializations of BSS data to zero/NULL; - overlong lines (80+ characters) - whitespace issues - brackets around single-line statements And other minor issues reported by the Linux "checkpatch" utility Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c index 451d5f8..a985677 100644 --- a/src/jtag/drivers/vsllink.c +++ b/src/jtag/drivers/vsllink.c @@ -39,11 +39,11 @@ static uint8_t vsllink_usb_bulkin; static uint8_t vsllink_usb_interface; static int VSLLINK_USB_TIMEOUT = 1000; -static int vsllink_tms_offset = 0; +static int vsllink_tms_offset; /* Global USB buffers */ -static uint8_t* vsllink_usb_in_buffer = NULL; -static uint8_t* vsllink_usb_out_buffer = NULL; +static uint8_t *vsllink_usb_in_buffer; +static uint8_t *vsllink_usb_out_buffer; static int vsllink_buffer_size = 128; /* Constants for Versaloon command */ @@ -90,8 +90,8 @@ struct pending_scan_result { #define MAX_PENDING_SCAN_RESULTS 256 static int pending_scan_results_length; -static struct pending_scan_result \ - pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS]; +static struct pending_scan_result + pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS]; /* Queue command functions */ static void vsllink_end_state(tap_state_t state); @@ -99,8 +99,8 @@ static void vsllink_state_move(void); static void vsllink_path_move(int num_states, tap_state_t *path); static void vsllink_runtest(int num_cycles); static void vsllink_stableclocks(int num_cycles, int tms); -static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, \ - int scan_size, struct scan_command *command); +static void vsllink_scan(bool ir_scan, enum scan_type type, + uint8_t *buffer, int scan_size, struct scan_command *command); static void vsllink_reset(int trst, int srst); static void vsllink_simple_command(uint8_t command); @@ -109,17 +109,17 @@ static void vsllink_tap_append_step(int tms, int tdi); static void vsllink_tap_init(void); static int vsllink_tap_execute(void); static void vsllink_tap_ensure_pending(int scans); -static void vsllink_tap_append_scan(int length, uint8_t *buffer, \ - struct scan_command *command); +static void vsllink_tap_append_scan(int length, uint8_t *buffer, + struct scan_command *command); /* VSLLink lowlevel functions */ struct vsllink { - struct usb_dev_handle* usb_handle; + struct usb_dev_handle *usb_handle; }; static struct vsllink *vsllink_usb_open(void); static void vsllink_usb_close(struct vsllink *vsllink); -static int vsllink_usb_message(struct vsllink *vsllink, int out_length, \ +static int vsllink_usb_message(struct vsllink *vsllink, int out_length, int in_length); static int vsllink_usb_write(struct vsllink *vsllink, int out_length); static int vsllink_usb_read(struct vsllink *vsllink); @@ -128,13 +128,13 @@ static int vsllink_usb_read(struct vsllink *vsllink); static void vsllink_debug_buffer(uint8_t *buffer, int length); #endif -static int tap_length = 0; -static int tap_buffer_size = 0; -static uint8_t *tms_buffer = NULL; -static uint8_t *tdi_buffer = NULL; -static uint8_t *tdo_buffer = NULL; +static int tap_length; +static int tap_buffer_size; +static uint8_t *tms_buffer; +static uint8_t *tdi_buffer; +static uint8_t *tdo_buffer; -static struct vsllink* vsllink_handle = NULL; +static struct vsllink *vsllink_handle; static void reset_command_pointer(void) { @@ -148,80 +148,91 @@ static int vsllink_execute_queue(void) enum scan_type type; uint8_t *buffer; - DEBUG_JTAG_IO( "-------------------------------------" - " vsllink " - "-------------------------------------"); + DEBUG_JTAG_IO("-------------------------------------" + " vsllink " + "-------------------------------------"); reset_command_pointer(); - while (cmd != NULL) - { - switch (cmd->type) - { + while (cmd != NULL) { + switch (cmd->type) { case JTAG_RUNTEST: - DEBUG_JTAG_IO("runtest %i cycles, end in %s", \ - cmd->cmd.runtest->num_cycles, \ - tap_state_name(cmd->cmd.runtest->end_state)); + DEBUG_JTAG_IO("runtest %i cycles, end in %s", + cmd->cmd.runtest->num_cycles, + tap_state_name(cmd->cmd.runtest + ->end_state)); vsllink_end_state(cmd->cmd.runtest->end_state); vsllink_runtest(cmd->cmd.runtest->num_cycles); break; case JTAG_STATEMOVE: - DEBUG_JTAG_IO("statemove end in %s", \ - tap_state_name(cmd->cmd.statemove->end_state)); + DEBUG_JTAG_IO("statemove end in %s", + tap_state_name(cmd->cmd.statemove + ->end_state)); - vsllink_end_state(cmd->cmd.statemove->end_state); + vsllink_end_state(cmd->cmd.statemove + ->end_state); vsllink_state_move(); break; case JTAG_PATHMOVE: - DEBUG_JTAG_IO("pathmove: %i states, end in %s", \ - cmd->cmd.pathmove->num_states, \ - tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); - - vsllink_path_move(cmd->cmd.pathmove->num_states, \ - cmd->cmd.pathmove->path); + DEBUG_JTAG_IO("pathmove: %i states, end in %s", + cmd->cmd.pathmove->num_states, + tap_state_name(cmd->cmd.pathmove + ->path[cmd->cmd.pathmove + ->num_states - 1])); + + vsllink_path_move( + cmd->cmd.pathmove->num_states, + cmd->cmd.pathmove->path); break; case JTAG_SCAN: vsllink_end_state(cmd->cmd.scan->end_state); - scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer); + scan_size = jtag_build_buffer( + cmd->cmd.scan, &buffer); + if (cmd->cmd.scan->ir_scan) - { - DEBUG_JTAG_IO("JTAG Scan write IR(%d bits), end in %s:", \ - scan_size, \ - tap_state_name(cmd->cmd.scan->end_state)); - } + DEBUG_JTAG_IO( + "JTAG Scan write IR(%d bits), " + "end in %s:", + scan_size, + tap_state_name(cmd->cmd.scan + ->end_state)); + else - { - DEBUG_JTAG_IO("JTAG Scan write DR(%d bits), end in %s:", \ - scan_size, \ - tap_state_name(cmd->cmd.scan->end_state)); - } + DEBUG_JTAG_IO( + "JTAG Scan write DR(%d bits), " + "end in %s:", + scan_size, + tap_state_name(cmd->cmd.scan + ->end_state)); #ifdef _DEBUG_JTAG_IO_ - vsllink_debug_buffer(buffer, DIV_ROUND_UP(scan_size, 8)); + vsllink_debug_buffer(buffer, + DIV_ROUND_UP(scan_size, 8)); #endif type = jtag_scan_type(cmd->cmd.scan); - vsllink_scan(cmd->cmd.scan->ir_scan, type, buffer, \ - scan_size, cmd->cmd.scan); + vsllink_scan(cmd->cmd.scan->ir_scan, + type, buffer, scan_size, + cmd->cmd.scan); break; case JTAG_RESET: - DEBUG_JTAG_IO("reset trst: %i srst %i", \ - cmd->cmd.reset->trst, \ - cmd->cmd.reset->srst); + DEBUG_JTAG_IO("reset trst: %i srst %i", + cmd->cmd.reset->trst, + cmd->cmd.reset->srst); vsllink_tap_execute(); if (cmd->cmd.reset->trst == 1) - { tap_set_state(TAP_RESET); - } - vsllink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); + + vsllink_reset(cmd->cmd.reset->trst, + cmd->cmd.reset->srst); break; case JTAG_SLEEP: @@ -231,12 +242,13 @@ static int vsllink_execute_queue(void) break; case JTAG_STABLECLOCKS: - DEBUG_JTAG_IO("add %d clocks", \ - cmd->cmd.stableclocks->num_cycles); - switch (tap_get_state()) - { + DEBUG_JTAG_IO("add %d clocks", + cmd->cmd.stableclocks->num_cycles); + switch (tap_get_state()) { case TAP_RESET: - // tms should be '1' to stay in TAP_RESET mode + /* tms must be '1' to stay + * n TAP_RESET mode + */ scan_size = 1; break; case TAP_DRSHIFT: @@ -244,21 +256,24 @@ static int vsllink_execute_queue(void) case TAP_DRPAUSE: case TAP_IRSHIFT: case TAP_IRPAUSE: - // in other mode, tms should be '0' + /* else, tms should be '0' */ scan_size = 0; - break; /* above stable states are OK */ + break; + /* above stable states are OK */ default: - LOG_ERROR("jtag_add_clocks() in non-stable state \"%s\"", - tap_state_name(tap_get_state())); - exit(-1); + LOG_ERROR("jtag_add_clocks() " + "in non-stable state \"%s\"", + tap_state_name(tap_get_state()) + ); + exit(-1); } - vsllink_stableclocks(cmd->cmd.stableclocks->num_cycles, \ - scan_size); + vsllink_stableclocks(cmd->cmd.stableclocks + ->num_cycles, scan_size); break; default: - LOG_ERROR("BUG: unknown JTAG command type encountered: %d", \ - cmd->type); + LOG_ERROR("BUG: unknown JTAG command type " + "encountered: %d", cmd->type); exit(-1); } cmd = cmd->next; @@ -278,11 +293,8 @@ static int vsllink_speed(int speed) result = vsllink_usb_write(vsllink_handle, 3); if (result == 3) - { return ERROR_OK; - } - else - { + else { LOG_ERROR("VSLLink setting speed failed (%d)", result); return ERROR_JTAG_DEVICE_ERROR; } @@ -312,66 +324,60 @@ static int vsllink_init(void) vsllink_usb_in_buffer = malloc(vsllink_buffer_size); vsllink_usb_out_buffer = malloc(vsllink_buffer_size); - if ((vsllink_usb_in_buffer == NULL) || (vsllink_usb_out_buffer == NULL)) - { + if ((vsllink_usb_in_buffer == NULL) + || (vsllink_usb_out_buffer == NULL)) { LOG_ERROR("Not enough memory"); exit(-1); } vsllink_handle = vsllink_usb_open(); - if (vsllink_handle == 0) - { + if (vsllink_handle == 0) { LOG_ERROR("Can't find USB JTAG Interface!"\ - "Please check connection and permissions."); + "Please check connection and permissions."); return ERROR_JTAG_INIT_FAILED; } - LOG_DEBUG("vsllink found on %04X:%04X", vsllink_usb_vid, vsllink_usb_pid); + LOG_DEBUG("vsllink found on %04X:%04X", + vsllink_usb_vid, vsllink_usb_pid); to_tmp = VSLLINK_USB_TIMEOUT; VSLLINK_USB_TIMEOUT = 100; check_cnt = 0; - while (check_cnt < 5) - { + while (check_cnt < 5) { vsllink_simple_command(VERSALOON_GET_INFO); result = vsllink_usb_read(vsllink_handle); - if (result > 2) - { + if (result > 2) { vsllink_usb_in_buffer[result] = 0; - vsllink_buffer_size = vsllink_usb_in_buffer[0] + \ - (vsllink_usb_in_buffer[1] << 8); - strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, \ + vsllink_buffer_size = vsllink_usb_in_buffer[0] + + (vsllink_usb_in_buffer[1] << 8); + strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, sizeof(version_str)); LOG_INFO("%s", version_str); - // free the pre-alloc memroy + /* free the pre-allocated memory */ free(vsllink_usb_in_buffer); free(vsllink_usb_out_buffer); vsllink_usb_in_buffer = NULL; vsllink_usb_out_buffer = NULL; - // alloc new memory + /* alloc new memory */ vsllink_usb_in_buffer = malloc(vsllink_buffer_size); vsllink_usb_out_buffer = malloc(vsllink_buffer_size); - if ((vsllink_usb_in_buffer == NULL) || \ - (vsllink_usb_out_buffer == NULL)) - { + if ((vsllink_usb_in_buffer == NULL) || + (vsllink_usb_out_buffer == NULL)) { LOG_ERROR("Not enough memory"); exit(-1); - } - else - { - LOG_INFO("buffer size for USB is %d bytes", \ + } else + LOG_INFO("buffer size for USB is %d bytes", vsllink_buffer_size); - } - // alloc tms/tdi/tdo buffer + + /* alloc tms/tdi/tdo buffer */ tap_buffer_size = (vsllink_buffer_size - 3) / 2; - tms_buffer = (uint8_t*)malloc(tap_buffer_size); - tdi_buffer = (uint8_t*)malloc(tap_buffer_size); - tdo_buffer = (uint8_t*)malloc(tap_buffer_size); - if ((tms_buffer == NULL) || (tdi_buffer == NULL) || \ - (tdo_buffer == NULL)) - { + tms_buffer = (uint8_t *)malloc(tap_buffer_size); + tdi_buffer = (uint8_t *)malloc(tap_buffer_size); + tdo_buffer = (uint8_t *)malloc(tap_buffer_size); + if ((tms_buffer == NULL) || (tdi_buffer == NULL) || + (tdo_buffer == NULL)) { LOG_ERROR("Not enough memory"); exit(-1); } @@ -380,9 +386,8 @@ static int vsllink_init(void) vsllink_simple_command(VSLLINK_CMD_DISCONN); check_cnt++; } - if (check_cnt == 3) - { - // Fail to access Versaloon + if (check_cnt == 3) { + /* Fail to access Versaloon */ LOG_ERROR("VSLLink initial failed"); exit(-1); } @@ -394,33 +399,27 @@ static int vsllink_init(void) vsllink_simple_command(VERSALOON_GET_TVCC); result = vsllink_usb_read(vsllink_handle); if (result != 2) - { LOG_WARNING("Fail to get target voltage"); - } else - { - LOG_INFO("Target runs at %d mV", vsllink_usb_in_buffer[0] + \ + LOG_INFO("Target runs at %d mV", vsllink_usb_in_buffer[0] + (vsllink_usb_in_buffer[1] << 8)); - } - // connect to vsllink + /* connect to vsllink */ vsllink_usb_out_buffer[0] = VSLLINK_CMD_CONN; vsllink_usb_out_buffer[1] = 1; vsllink_usb_message(vsllink_handle, 2, 0); - if (vsllink_usb_read(vsllink_handle) > 2) - { - strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, \ + if (vsllink_usb_read(vsllink_handle) > 2) { + strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, sizeof(version_str)); LOG_INFO("%s", version_str); } - // Set SRST and TRST to output, Set USR1 and USR2 to input + /* Set SRST and TRST to output, Set USR1 and USR2 to input */ vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_PORTDIR; - vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | \ - JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; + vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST + | JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; vsllink_usb_out_buffer[2] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST; - if (vsllink_usb_write(vsllink_handle, 3) != 3) - { + if (vsllink_usb_write(vsllink_handle, 3) != 3) { LOG_ERROR("VSLLink USB send data error"); exit(-1); } @@ -436,15 +435,14 @@ static int vsllink_init(void) static int vsllink_quit(void) { - if ((vsllink_usb_in_buffer != NULL) && (vsllink_usb_out_buffer != NULL)) - { + if ((vsllink_usb_in_buffer != NULL) + && (vsllink_usb_out_buffer != NULL)) { // Set all pins to input vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_PORTDIR; - vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | \ - JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; + vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST + | JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; vsllink_usb_out_buffer[2] = 0; - if (vsllink_usb_write(vsllink_handle, 3) != 3) - { + if (vsllink_usb_write(vsllink_handle, 3) != 3) { LOG_ERROR("VSLLink USB send data error"); exit(-1); } @@ -455,13 +453,11 @@ static int vsllink_quit(void) vsllink_handle = NULL; } - if (vsllink_usb_in_buffer != NULL) - { + if (vsllink_usb_in_buffer != NULL) { free(vsllink_usb_in_buffer); vsllink_usb_in_buffer = NULL; } - if (vsllink_usb_out_buffer != NULL) - { + if (vsllink_usb_out_buffer != NULL) { free(vsllink_usb_out_buffer); vsllink_usb_out_buffer = NULL; } @@ -475,11 +471,8 @@ static int vsllink_quit(void) static void vsllink_end_state(tap_state_t state) { if (tap_is_state_stable(state)) - { tap_set_end_state(state); - } - else - { + else { LOG_ERROR("BUG: %i is not a valid end state", state); exit(-1); } @@ -489,34 +482,27 @@ static void vsllink_end_state(tap_state_t state) static void vsllink_state_move(void) { int i; - uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state()); - uint8_t tms_scan_bits = \ - tap_get_tms_path_len(tap_get_state(), tap_get_end_state()); + uint8_t tms_scan = tap_get_tms_path(tap_get_state(), + tap_get_end_state()); + uint8_t tms_scan_bits = tap_get_tms_path_len(tap_get_state(), + tap_get_end_state()); for (i = 0; i < tms_scan_bits; i++) - { vsllink_tap_append_step((tms_scan >> i) & 1, 0); - } tap_set_state(tap_get_end_state()); } static void vsllink_path_move(int num_states, tap_state_t *path) { - for (int i = 0; i < num_states; i++) - { + for (int i = 0; i < num_states; i++) { if (path[i] == tap_state_transition(tap_get_state(), false)) - { vsllink_tap_append_step(0, 0); - } else if (path[i] == tap_state_transition(tap_get_state(), true)) - { vsllink_tap_append_step(1, 0); - } - else - { - LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", \ - tap_state_name(tap_get_state()), \ + else { + LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", + tap_state_name(tap_get_state()), tap_state_name(path[i])); exit(-1); } @@ -529,8 +515,7 @@ static void vsllink_path_move(int num_states, tap_state_t *path) static void vsllink_stableclocks(int num_cycles, int tms) { - while (num_cycles > 0) - { + while (num_cycles > 0) { vsllink_tap_append_step(tms, 0); num_cycles--; } @@ -540,9 +525,8 @@ static void vsllink_runtest(int num_cycles) { tap_state_t saved_end_state = tap_get_end_state(); - if (tap_get_state() != TAP_IDLE) - { - // enter into IDLE state + if (tap_get_state() != TAP_IDLE) { + /* enter IDLE state */ vsllink_end_state(TAP_IDLE); vsllink_state_move(); } @@ -553,13 +537,11 @@ static void vsllink_runtest(int num_cycles) // set end_state vsllink_end_state(saved_end_state); if (tap_get_end_state() != tap_get_end_state()) - { vsllink_state_move(); - } } -static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, \ - int scan_size, struct scan_command *command) +static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, + int scan_size, struct scan_command *command) { tap_state_t saved_end_state; @@ -569,9 +551,7 @@ static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, \ vsllink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT); if (tap_get_state() != tap_get_end_state()) - { vsllink_state_move(); - } vsllink_end_state(saved_end_state); /* Scan */ @@ -584,9 +564,7 @@ static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, \ tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE); if (tap_get_state() != tap_get_end_state()) - { vsllink_state_move(); - } } static void vsllink_reset(int trst, int srst) @@ -600,19 +578,14 @@ static void vsllink_reset(int trst, int srst) vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST; vsllink_usb_out_buffer[2] = 0; if (srst == 0) - { vsllink_usb_out_buffer[2] |= JTAG_PINMSK_SRST; - } if (trst == 0) - { vsllink_usb_out_buffer[2] |= JTAG_PINMSK_TRST; - } result = vsllink_usb_write(vsllink_handle, 3); if (result != 3) - { - LOG_ERROR("VSLLink command VSLLINK_CMD_SET_PORT failed (%d)", result); - } + LOG_ERROR("VSLLink command VSLLINK_CMD_SET_PORT failed (%d)", + result); } static void vsllink_simple_command(uint8_t command) @@ -625,9 +598,8 @@ static void vsllink_simple_command(uint8_t command) result = vsllink_usb_write(vsllink_handle, 1); if (result != 1) - { - LOG_ERROR("VSLLink command 0x%02x failed (%d)", command, result); - } + LOG_ERROR("VSLLink command 0x%02x failed (%d)", + command, result); } COMMAND_HANDLER(vsllink_handle_mode_command) @@ -643,8 +615,7 @@ COMMAND_HANDLER(vsllink_handle_mode_command) COMMAND_HANDLER(vsllink_handle_usb_vid_command) { - if (CMD_ARGC != 1) - { + if (CMD_ARGC != 1) { LOG_ERROR("parameter error, " "should be one parameter for VID"); return ERROR_OK; @@ -656,8 +627,7 @@ COMMAND_HANDLER(vsllink_handle_usb_vid_command) COMMAND_HANDLER(vsllink_handle_usb_pid_command) { - if (CMD_ARGC != 1) - { + if (CMD_ARGC != 1) { LOG_ERROR("parameter error, " "should be one parameter for PID"); return ERROR_OK; @@ -668,10 +638,9 @@ COMMAND_HANDLER(vsllink_handle_usb_pid_command) COMMAND_HANDLER(vsllink_handle_usb_bulkin_command) { - if (CMD_ARGC != 1) - { + if (CMD_ARGC != 1) { LOG_ERROR("parameter error, " - "should be one parameter for BULKIN endpoint"); + "should be one parameter for BULKIN endpoint"); return ERROR_OK; } @@ -684,10 +653,9 @@ COMMAND_HANDLER(vsllink_handle_usb_bulkin_command) COMMAND_HANDLER(vsllink_handle_usb_bulkout_command) { - if (CMD_ARGC != 1) - { + if (CMD_ARGC != 1) { LOG_ERROR("parameter error, " - "should be one parameter for BULKOUT endpoint"); + "should be one parameter for BULKOUT endpoint"); return ERROR_OK; } @@ -700,10 +668,9 @@ COMMAND_HANDLER(vsllink_handle_usb_bulkout_command) COMMAND_HANDLER(vsllink_handle_usb_interface_command) { - if (CMD_ARGC != 1) - { + if (CMD_ARGC != 1) { LOG_ERROR("parameter error, " - "should be one parameter for interface number"); + "should be one parameter for interface number"); return ERROR_OK; } @@ -723,13 +690,11 @@ static void vsllink_tap_init(void) static void vsllink_tap_ensure_pending(int scans) { - int available_scans = \ + int available_scans = MAX_PENDING_SCAN_RESULTS - pending_scan_results_length; if (scans > available_scans) - { vsllink_tap_execute(); - } } static void vsllink_tap_append_step(int tms, int tdi) @@ -740,52 +705,40 @@ static void vsllink_tap_append_step(int tms, int tdi) uint8_t bit = 1 << bit_index; if (tms) - { tms_buffer[index] |= bit; - } else - { tms_buffer[index] &= ~bit; - } if (tdi) - { tdi_buffer[index] |= bit; - } else - { tdi_buffer[index] &= ~bit; - } tap_length++; + if (tap_buffer_size * 8 <= tap_length) - { vsllink_tap_execute(); - } } -static void vsllink_tap_append_scan(int length, uint8_t *buffer, \ - struct scan_command *command) +static void vsllink_tap_append_scan(int length, uint8_t *buffer, + struct scan_command *command) { struct pending_scan_result *pending_scan_result; int len_tmp, len_all, i; len_all = 0; - while (len_all < length) - { + while (len_all < length) { vsllink_tap_ensure_pending(1); - pending_scan_result = \ - &pending_scan_results_buffer[pending_scan_results_length]; + pending_scan_result = + &pending_scan_results_buffer[ + pending_scan_results_length]; - if ((length - len_all) > (tap_buffer_size * 8 - tap_length)) - { - /* Use all memory available + if ((length - len_all) > (tap_buffer_size * 8 - tap_length)) { + /* Use all memory available vsllink_tap_append_step will commit automatically */ len_tmp = tap_buffer_size * 8 - tap_length; pending_scan_result->last = false; - } - else - { + } else { len_tmp = length - len_all; pending_scan_result->last = true; } @@ -796,10 +749,11 @@ static void vsllink_tap_append_scan(int length, uint8_t *buffer, \ pending_scan_result->buffer = buffer; pending_scan_results_length++; - for (i = 0; i < len_tmp; i++) - { - vsllink_tap_append_step(((len_all + i) < length-1 ? 0 : 1), \ - (buffer[(len_all + i)/8] >> ((len_all + i)%8)) & 1); + for (i = 0; i < len_tmp; i++) { + vsllink_tap_append_step(((len_all + i) < length-1 + ? 0 : 1), + (buffer[(len_all + i)/8] + >> ((len_all + i)%8)) & 1); } len_all += len_tmp; @@ -813,61 +767,70 @@ static int vsllink_tap_execute(void) int result; if (tap_length <= 0) - { return ERROR_OK; - } /* Pad data so that tap_length is divisible by 8 */ - if ((tap_length % 8) != 0) - { - if (vsllink_tms_offset > 0) - { - /* append tms:0 at vsllink_tms_offset, which is in Pause */ + if ((tap_length % 8) != 0) { + if (vsllink_tms_offset > 0) { + /* append tms:0 at vsllink_tms_offset, + * which is in Pause + */ int start_pos = DIV_ROUND_UP(tap_length, 8) - 1; int end_pos = DIV_ROUND_UP(vsllink_tms_offset, 8) - 1; int shift_cnt = (start_pos + 1) * 8 - tap_length; - uint8_t last_mask = ~((1 << (vsllink_tms_offset % 8)) - 1); - - while (1) - { - if (start_pos == end_pos) - { - tms_buffer[start_pos] = \ - (tms_buffer[start_pos] & ~last_mask) | \ - ((tms_buffer[start_pos] & last_mask) << shift_cnt); - tdi_buffer[start_pos] = \ - (tdi_buffer[start_pos] & ~last_mask) | \ - ((tdi_buffer[start_pos] & last_mask) << shift_cnt); + uint8_t last_mask = ~( + (1 << (vsllink_tms_offset % 8)) - 1); + + while (1) { + if (start_pos == end_pos) { + tms_buffer[start_pos] = + (tms_buffer[start_pos] + & ~last_mask) + | ((tms_buffer[start_pos] + & last_mask) + << shift_cnt); + tdi_buffer[start_pos] = + (tdi_buffer[start_pos] + & ~last_mask) + | + ((tdi_buffer[start_pos] + & last_mask) + << shift_cnt); break; - } - else if (start_pos == (end_pos + 1)) - { - tms_buffer[start_pos] = \ - (tms_buffer[start_pos] << shift_cnt) | \ - ((tms_buffer[start_pos - 1] & last_mask) >> (8 - shift_cnt)); - tdi_buffer[start_pos] = \ - (tdi_buffer[start_pos] << shift_cnt) | \ - ((tdi_buffer[start_pos - 1] & last_mask) >> (8 - shift_cnt)); - } - else - { - tms_buffer[start_pos] = \ - (tms_buffer[start_pos] << shift_cnt) | \ - (tms_buffer[start_pos - 1] >> (8 - shift_cnt)); - tdi_buffer[start_pos] = \ - (tdi_buffer[start_pos] << shift_cnt) | \ - (tdi_buffer[start_pos - 1] >> (8 - shift_cnt)); + } else if (start_pos == (end_pos + 1)) { + tms_buffer[start_pos] = + (tms_buffer[start_pos] + << shift_cnt) | + ((tms_buffer[start_pos - 1] + & last_mask) + >> (8 - shift_cnt)); + tdi_buffer[start_pos] = + (tdi_buffer[start_pos] + << shift_cnt) | + ((tdi_buffer[start_pos - 1] + & last_mask) + >> (8 - shift_cnt)); + } else { + tms_buffer[start_pos] = + (tms_buffer[start_pos] + << shift_cnt) | + (tms_buffer[start_pos - 1] + >> (8 - shift_cnt)); + tdi_buffer[start_pos] = + (tdi_buffer[start_pos] + << shift_cnt) | + (tdi_buffer[start_pos - 1] + >> (8 - shift_cnt)); } start_pos--; } tap_length = DIV_ROUND_UP(tap_length, 8) * 8; - } - else - { + } else { /* append data at last */ - while ((tap_length % 8) != 0) - { - vsllink_tap_append_step((tap_get_state() == TAP_RESET)?1:0, 0); + while ((tap_length % 8) != 0) { + vsllink_tap_append_step( + (tap_get_state() == TAP_RESET) + ? 1 : 0, 0); } } } @@ -878,51 +841,48 @@ static int vsllink_tap_execute(void) vsllink_usb_out_buffer[2] = ((byte_length * 2 + 3) >> 8) & 0xff; memcpy(&vsllink_usb_out_buffer[3], tdi_buffer, byte_length); - memcpy(&vsllink_usb_out_buffer[3 + byte_length], tms_buffer, byte_length); + memcpy(&vsllink_usb_out_buffer[3 + byte_length], tms_buffer, + byte_length); - result = vsllink_usb_message(vsllink_handle, 3 + 2 * byte_length, \ - byte_length); + result = vsllink_usb_message(vsllink_handle, 3 + 2 * byte_length, + byte_length); - if (result == byte_length) - { - for (i = 0; i < pending_scan_results_length; i++) - { - struct pending_scan_result *pending_scan_result = \ - &pending_scan_results_buffer[i]; + if (result == byte_length) { + for (i = 0; i < pending_scan_results_length; i++) { + struct pending_scan_result *pending_scan_result = + &pending_scan_results_buffer[i]; uint8_t *buffer = pending_scan_result->buffer; int length = pending_scan_result->length; int src_first = pending_scan_result->src_offset; int dest_first = pending_scan_result->dest_offset; bool last = pending_scan_result->last; - struct scan_command *command = pending_scan_result->command; - buf_set_buf(vsllink_usb_in_buffer, src_first, buffer, \ + struct scan_command *command; + + command = pending_scan_result->command; + buf_set_buf(vsllink_usb_in_buffer, src_first, buffer, dest_first, length); - DEBUG_JTAG_IO("JTAG scan read(%d bits, from %d bits):", \ - length, dest_first); + DEBUG_JTAG_IO("JTAG scan read(%d bits, from %d bits):", + length, dest_first); #ifdef _DEBUG_JTAG_IO_ - vsllink_debug_buffer(buffer + dest_first / 8, DIV_ROUND_UP(length, 7)); + vsllink_debug_buffer(buffer + dest_first / 8, + DIV_ROUND_UP(length, 7)); #endif - if (last) - { - if (jtag_read_buffer(buffer, command) != ERROR_OK) - { + if (last) { + if (jtag_read_buffer(buffer, command) + != ERROR_OK) { vsllink_tap_init(); return ERROR_JTAG_QUEUE_FAILED; } if (pending_scan_result->buffer != NULL) - { free(pending_scan_result->buffer); - } } } - } - else - { - LOG_ERROR("vsllink_tap_execute, wrong result %d, expected %d", \ + } else { + LOG_ERROR("vsllink_tap_execute, wrong result %d, expected %d", result, byte_length); return ERROR_JTAG_QUEUE_FAILED; } @@ -935,7 +895,7 @@ static int vsllink_tap_execute(void) /*****************************************************************************/ /* VSLLink USB low-level functions */ -static struct vsllink* vsllink_usb_open(void) +static struct vsllink *vsllink_usb_open(void) { usb_init(); @@ -947,17 +907,16 @@ static struct vsllink* vsllink_usb_open(void) /* usb_set_configuration required under win32 */ struct usb_device *udev = usb_device(dev); - int ret = usb_set_configuration(dev, udev->config[0].bConfigurationValue); - if (ret != 0) - { + int ret = usb_set_configuration(dev, + udev->config[0].bConfigurationValue); + if (ret != 0) { LOG_ERROR("fail to set configuration to %d (error %d)." "Not enough permissions for the device?", udev->config[0].bConfigurationValue, ret); return NULL; } ret = usb_claim_interface(dev, vsllink_usb_interface); - if (ret != 0) - { + if (ret != 0) { LOG_ERROR("fail to claim interface %d, %d returned", vsllink_usb_interface, ret); return NULL; @@ -979,17 +938,16 @@ static void vsllink_usb_close(struct vsllink *vsllink) { int ret; - ret = usb_release_interface(vsllink->usb_handle, vsllink_usb_interface); - if (ret != 0) - { - LOG_ERROR("fail to release interface %d, %d returned", \ + ret = usb_release_interface(vsllink->usb_handle, + vsllink_usb_interface); + if (ret != 0) { + LOG_ERROR("fail to release interface %d, %d returned", vsllink_usb_interface, ret); exit(-1); } ret = usb_close(vsllink->usb_handle); - if (ret != 0) - { + if (ret != 0) { LOG_ERROR("fail to close usb, %d returned", ret); exit(-1); } @@ -998,33 +956,27 @@ static void vsllink_usb_close(struct vsllink *vsllink) } /* Send a message and receive the reply. */ -static int vsllink_usb_message(struct vsllink *vsllink, int out_length, \ +static int vsllink_usb_message(struct vsllink *vsllink, int out_length, int in_length) { int result; result = vsllink_usb_write(vsllink, out_length); - if (result == out_length) - { - if (in_length > 0) - { + if (result == out_length) { + if (in_length > 0) { result = vsllink_usb_read(vsllink); if (result == in_length) - { return result; - } - else - { - LOG_ERROR("usb_bulk_read failed (requested=%d, result=%d)", \ + else { + LOG_ERROR("usb_bulk_read failed " + "(requested=%d, result=%d)", in_length, result); return -1; } } return 0; - } - else - { - LOG_ERROR("usb_bulk_write failed (requested=%d, result=%d)", \ + } else { + LOG_ERROR("usb_bulk_write failed (requested=%d, result=%d)", out_length, result); return -1; } @@ -1035,17 +987,17 @@ static int vsllink_usb_write(struct vsllink *vsllink, int out_length) { int result; - if (out_length > vsllink_buffer_size) - { - LOG_ERROR("vsllink_write illegal out_length=%d (max=%d)", \ + if (out_length > vsllink_buffer_size) { + LOG_ERROR("vsllink_write illegal out_length=%d (max=%d)", out_length, vsllink_buffer_size); return -1; } - result = usb_bulk_write(vsllink->usb_handle, vsllink_usb_bulkout, \ - (char *)vsllink_usb_out_buffer, out_length, VSLLINK_USB_TIMEOUT); + result = usb_bulk_write(vsllink->usb_handle, vsllink_usb_bulkout, + (char *)vsllink_usb_out_buffer, out_length, + VSLLINK_USB_TIMEOUT); - DEBUG_JTAG_IO("vsllink_usb_write, out_length = %d, result = %d", \ + DEBUG_JTAG_IO("vsllink_usb_write, out_length = %d, result = %d", out_length, result); #ifdef _DEBUG_USB_COMMS_ @@ -1063,8 +1015,8 @@ static int vsllink_usb_write(struct vsllink *vsllink, int out_length) /* Read data from USB into in_buffer. */ static int vsllink_usb_read(struct vsllink *vsllink) { - int result = usb_bulk_read(vsllink->usb_handle, vsllink_usb_bulkin, \ - (char *)vsllink_usb_in_buffer, vsllink_buffer_size, \ + int result = usb_bulk_read(vsllink->usb_handle, vsllink_usb_bulkin, + (char *)vsllink_usb_in_buffer, vsllink_buffer_size, VSLLINK_USB_TIMEOUT); DEBUG_JTAG_IO("vsllink_usb_read, result = %d", result); @@ -1086,18 +1038,16 @@ static void vsllink_debug_buffer(uint8_t *buffer, int length) int i; int j; - for (i = 0; i < length; i += BYTES_PER_LINE) - { + for (i = 0; i < length; i += BYTES_PER_LINE) { snprintf(line, 5, "%04x", i); - for (j = i; j < i + BYTES_PER_LINE && j < length; j++) - { + for (j = i; j < i + BYTES_PER_LINE && j < length; j++) { snprintf(s, 4, " %02x", buffer[j]); strcat(line, s); } LOG_DEBUG("%s", line); } } -#endif // _DEBUG_USB_COMMS_ || _DEBUG_JTAG_IO_ +#endif /* _DEBUG_USB_COMMS_ || _DEBUG_JTAG_IO_ */ static const struct command_registration vsllink_command_handlers[] = { { commit db464f3cd4ed83b9f3411a98362dd67aad7bc3fd Author: simon qian <sim...@gm...> Date: Thu Mar 11 14:11:30 2010 -0800 New JTAG driver for Versaloon This patch greatly simplifies the Versaloon driver: - reducing the code size from more than 50K to less than 28K - adding support for IR/DR scan with unlimited size - using tap_get_tms_path and tap_get_tms_path_len. Signed-off-by: David Brownell <dbr...@us...> diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c index 65c3bf1..451d5f8 100644 --- a/src/jtag/drivers/vsllink.c +++ b/src/jtag/drivers/vsllink.c @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009 by Simon Qian <Sim...@Si...> * + * Copyright (C) 2009-2010 by Simon Qian <Sim...@Si...> * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -18,7 +18,7 @@ ***************************************************************************/ /* Versaloon is a programming tool for multiple MCUs. - * OpenOCD and MSP430 supports are distributed under GPLv2. + * It's distributed under GPLv3. * You can find it at http://www.SimonQian.com/en/Versaloon. */ @@ -32,179 +32,85 @@ //#define _VSLLINK_IN_DEBUG_MODE_ -#define VSLLINK_MODE_NORMAL 0 -#define VSLLINK_MODE_DMA 1 - static uint16_t vsllink_usb_vid; static uint16_t vsllink_usb_pid; -static uint8_t vsllink_usb_bulkout; -static uint8_t vsllink_usb_bulkin; -static uint8_t vsllink_usb_interface; -static uint8_t vsllink_mode = VSLLINK_MODE_NORMAL; -static int VSLLINK_USB_TIMEOUT = 10000; +static uint8_t vsllink_usb_bulkout; +static uint8_t vsllink_usb_bulkin; +static uint8_t vsllink_usb_interface; +static int VSLLINK_USB_TIMEOUT = 1000; -static int VSLLINK_BufferSize = 1024; +static int vsllink_tms_offset = 0; /* Global USB buffers */ -static int vsllink_usb_out_buffer_idx; -static int vsllink_usb_in_want_length; -static uint8_t* vsllink_usb_in_buffer = NULL; +static uint8_t* vsllink_usb_in_buffer = NULL; static uint8_t* vsllink_usb_out_buffer = NULL; +static int vsllink_buffer_size = 128; -/* Constants for VSLLink command */ -#define VSLLINK_CMD_CONN 0x80 -#define VSLLINK_CMD_DISCONN 0x81 -#define VSLLINK_CMD_SET_SPEED 0x82 -#define VSLLINK_CMD_SET_PORT 0x90 -#define VSLLINK_CMD_GET_PORT 0x91 -#define VSLLINK_CMD_SET_PORTDIR 0x92 -#define VSLLINK_CMD_HW_JTAGSEQCMD 0xA0 -#define VSLLINK_CMD_HW_JTAGHLCMD 0xA1 -#define VSLLINK_CMD_HW_SWDCMD 0xA2 -#define VSLLINK_CMD_HW_JTAGRAWCMD 0xA3 - -#define VSLLINK_CMDJTAGSEQ_TMSBYTE 0x00 -#define VSLLINK_CMDJTAGSEQ_TMSCLOCK 0x40 -#define VSLLINK_CMDJTAGSEQ_SCAN 0x80 - -#define VSLLINK_CMDJTAGSEQ_CMDMSK 0xC0 -#define VSLLINK_CMDJTAGSEQ_LENMSK 0x3F - -#define JTAG_PINMSK_SRST (1 << 0) -#define JTAG_PINMSK_TRST (1 << 1) -#define JTAG_PINMSK_USR1 (1 << 2) -#define JTAG_PINMSK_USR2 (1 << 3) -#define JTAG_PINMSK_TCK (1 << 4) -#define JTAG_PINMSK_TMS (1 << 5) -#define JTAG_PINMSK_TDI (1 << 6) -#define JTAG_PINMSK_TDO (1 << 7) - - -#define VSLLINK_TAP_MOVE(from, to) VSLLINK_tap_move[tap_move_ndx(from)][tap_move_ndx(to)] - -/* VSLLINK_tap_move[i][j]: tap movement command to go from state i to state j - * 0: Test-Logic-Reset - * 1: Run-Test/Idle - * 2: Shift-DR - * 3: Pause-DR - * 4: Shift-IR - * 5: Pause-IR - * - * SD->SD and SI->SI have to be caught in interface specific code - */ -static uint8_t VSLLINK_tap_move[6][6] = -{ -/* TLR RTI SD PD SI PI */ - {0xff, 0x7f, 0x2f, 0x0a, 0x37, 0x16}, /* TLR */ - {0xff, 0x00, 0x45, 0x05, 0x4b, 0x0b}, /* RTI */ - {0xff, 0x61, 0x00, 0x01, 0x0f, 0x2f}, /* SD */ - {0xfe, 0x60, 0x40, 0x5c, 0x3c, 0x5e}, /* PD */ - {0xff, 0x61, 0x07, 0x17, 0x00, 0x01}, /* SI */ - {0xfe, 0x60, 0x38, 0x5c, 0x40, 0x5e} /* PI */ -}; - -struct insert_insignificant_operation { - unsigned char insert_value; - unsigned char insert_position; -}; - -static struct insert_insignificant_operation VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[6][6] = -{ -/* stuff offset */ - {/* TLR */ - {1, 0,}, /* TLR */ - {1, 0,}, /* RTI */ - {1, 0,}, /* SD */ - {1, 0,}, /* PD */ - {1, 0,}, /* SI */ - {1, 0,}}, /* PI */ - {/* RTI */ - {1, 0,}, /* TLR */ - {0, 0,}, /* RTI */ - {0, 4,}, /* SD */ - {0, 7,}, /* PD */ - {0, 5,}, /* SI */ - {0, 7,}}, /* PI */ - {/* SD */ - {0, 0,}, /* TLR */ - {0, 0,}, /* RTI */ - {0, 0,}, /* SD */ - {0, 0,}, /* PD */ - {0, 0,}, /* SI */ - {0, 0,}}, /* PI */ - {/* PD */ - {0, 0,}, /* TLR */ - {0, 0,}, /* RTI */ - {0, 0,}, /* SD */ - {0, 0,}, /* PD */ - {0, 0,}, /* SI */ - {0, 0,}}, /* PI */ - {/* SI */ - {0, 0,}, /* TLR */ - {0, 0,}, /* RTI */ - {0, 0,}, /* SD */ - {0, 0,}, /* PD */ - {0, 0,}, /* SI */ - {0, 0,}}, /* PI */ - {/* PI */ - {0, 0,}, /* TLR */ - {0, 0,}, /* RTI */ - {0, 0,}, /* SD */ - {0, 0,}, /* PD */ - {0, 0,}, /* SI */ - {0, 0,}}, /* PI */ -}; +/* Constants for Versaloon command */ +#define VERSALOON_GET_INFO 0x00 +#define VERSALOON_GET_TVCC 0x01 -static uint8_t VSLLINK_BIT_MSK[8] = -{ - 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f -}; +/* Constants for VSLLink command */ +#define VSLLINK_CMD_CONN 0x80 +#define VSLLINK_CMD_DISCONN 0x81 +#define VSLLINK_CMD_SET_SPEED 0x82 +#define VSLLINK_CMD_SET_PORT 0x90 +#define VSLLINK_CMD_GET_PORT 0x91 +#define VSLLINK_CMD_SET_PORTDIR 0x92 +#define VSLLINK_CMD_HW_JTAGSEQCMD 0xA0 +#define VSLLINK_CMD_HW_JTAGHLCMD 0xA1 +#define VSLLINK_CMD_HW_SWDCMD 0xA2 +#define VSLLINK_CMD_HW_JTAGRAWCMD 0xA3 + +#define VSLLINK_CMDJTAGSEQ_TMSBYTE 0x00 +#define VSLLINK_CMDJTAGSEQ_TMSCLOCK 0x40 +#define VSLLINK_CMDJTAGSEQ_SCAN 0x80 + +#define VSLLINK_CMDJTAGSEQ_CMDMSK 0xC0 +#define VSLLINK_CMDJTAGSEQ_LENMSK 0x3F + +#define JTAG_PINMSK_SRST (1 << 0) +#define JTAG_PINMSK_TRST (1 << 1) +#define JTAG_PINMSK_USR1 (1 << 2) +#define JTAG_PINMSK_USR2 (1 << 3) +#define JTAG_PINMSK_TCK (1 << 4) +#define JTAG_PINMSK_TMS (1 << 5) +#define JTAG_PINMSK_TDI (1 << 6) +#define JTAG_PINMSK_TDO (1 << 7) struct pending_scan_result { - int offset; + int src_offset; + int dest_offset; int length; /* Number of bits to read */ struct scan_command *command; /* Corresponding scan command */ uint8_t *buffer; + bool last; /* indicate the last scan pending */ }; #define MAX_PENDING_SCAN_RESULTS 256 static int pending_scan_results_length; -static struct pending_scan_result pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS]; +static struct pending_scan_result \ + pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS]; /* Queue command functions */ static void vsllink_end_state(tap_state_t state); -static void vsllink_state_move_dma(void); -static void vsllink_state_move_normal(void); -static void (*vsllink_state_move)(void); -static void vsllink_path_move_dma(int num_states, tap_state_t *path); -static void vsllink_path_move_normal(int num_states, tap_state_t *path); -static void (*vsllink_path_move)(int num_states, tap_state_t *path); +static void vsllink_state_move(void); +static void vsllink_path_move(int num_states, tap_state_t *path); static void vsllink_runtest(int num_cycles); -static void vsllink_stableclocks_dma(int num_cycles, int tms); -static void vsllink_stableclocks_normal(int num_cycles, int tms); -static void (*vsllink_stableclocks)(int num_cycles, int tms); -static void vsllink_scan_dma(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size, struct scan_command *command); -static void vsllink_scan_normal(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size, struct scan_command *command); -static void (*vsllink_scan)(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size, struct scan_command *command); +static void vsllink_stableclocks(int num_cycles, int tms); +static void vsllink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, \ + int scan_size, struct scan_command *command); static void vsllink_reset(int trst, int srst); static void vsllink_simple_command(uint8_t command); -static int vsllink_connect(void); -static int vsllink_disconnect(void); /* VSLLink tap buffer functions */ static void vsllink_tap_append_step(int tms, int tdi); -static void vsllink_tap_init_dma(void); -static void vsllink_tap_init_normal(void); -static void (*vsllink_tap_init)(void); -static int vsllink_tap_execute_dma(void); -static int vsllink_tap_execute_normal(void); -static int (*vsllink_tap_execute)(void); -static void vsllink_tap_ensure_space_dma(int scans, int length); -static void vsllink_tap_ensure_space_normal(int scans, int length); -static void (*vsllink_tap_ensure_space)(int scans, int length); -static void vsllink_tap_append_scan_dma(int length, uint8_t *buffer, struct scan_command *command); -static void vsllink_tap_append_scan_normal(int length, uint8_t *buffer, struct scan_command *command, int offset); +static void vsllink_tap_init(void); +static int vsllink_tap_execute(void); +static void vsllink_tap_ensure_pending(int scans); +static void vsllink_tap_append_scan(int length, uint8_t *buffer, \ + struct scan_command *command); /* VSLLink lowlevel functions */ struct vsllink { @@ -213,7 +119,8 @@ struct vsllink { static struct vsllink *vsllink_usb_open(void); static void vsllink_usb_close(struct vsllink *vsllink); -static int vsllink_usb_message(struct vsllink *vsllink, int out_length, int in_length); +static int vsllink_usb_message(struct vsllink *vsllink, int out_length, \ + int in_length); static int vsllink_usb_write(struct vsllink *vsllink, int out_length); static int vsllink_usb_read(struct vsllink *vsllink); @@ -221,29 +128,17 @@ static int vsllink_usb_read(struct vsllink *vsllink); static void vsllink_debug_buffer(uint8_t *buffer, int length); #endif -static int vsllink_tms_data_len = 0; -static uint8_t* vsllink_tms_cmd_pos; - static int tap_length = 0; static int tap_buffer_size = 0; static uint8_t *tms_buffer = NULL; static uint8_t *tdi_buffer = NULL; static uint8_t *tdo_buffer = NULL; -static int last_tms; static struct vsllink* vsllink_handle = NULL; static void reset_command_pointer(void) { - if (vsllink_mode == VSLLINK_MODE_NORMAL) - { - vsllink_usb_out_buffer[0] = VSLLINK_CMD_HW_JTAGSEQCMD; - vsllink_usb_out_buffer_idx = 3; - } - else - { - tap_length = 0; - } + tap_length = 0; } static int vsllink_execute_queue(void) @@ -253,7 +148,9 @@ static int vsllink_execute_queue(void) enum scan_type type; uint8_t *buffer; - DEBUG_JTAG_IO("--------------------------------- vsllink -------------------------------------"); + DEBUG_JTAG_IO( "-------------------------------------" + " vsllink " + "-------------------------------------"); reset_command_pointer(); while (cmd != NULL) @@ -261,15 +158,17 @@ static int vsllink_execute_queue(void) switch (cmd->type) { case JTAG_RUNTEST: - DEBUG_JTAG_IO("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, \ - tap_state_name(cmd->cmd.runtest->end_state)); + DEBUG_JTAG_IO("runtest %i cycles, end in %s", \ + cmd->cmd.runtest->num_cycles, \ + tap_state_name(cmd->cmd.runtest->end_state)); vsllink_end_state(cmd->cmd.runtest->end_state); vsllink_runtest(cmd->cmd.runtest->num_cycles); break; case JTAG_STATEMOVE: - DEBUG_JTAG_IO("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state)); + DEBUG_JTAG_IO("statemove end in %s", \ + tap_state_name(cmd->cmd.statemove->end_state)); vsllink_end_state(cmd->cmd.statemove->end_state); vsllink_state_move(); @@ -280,7 +179,8 @@ static int vsllink_execute_queue(void) cmd->cmd.pathmove->num_states, \ tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); - vsllink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path); + vsllink_path_move(cmd->cmd.pathmove->num_states, \ + cmd->cmd.pathmove->path); break; case JTAG_SCAN: @@ -289,24 +189,31 @@ static int vsllink_execute_queue(void) scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer); if (cmd->cmd.scan->ir_scan) { - DEBUG_JTAG_IO("JTAG Scan write IR(%d bits), end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state)); + DEBUG_JTAG_IO("JTAG Scan write IR(%d bits), end in %s:", \ + scan_size, \ + tap_state_name(cmd->cmd.scan->end_state)); } else { - DEBUG_JTAG_IO("JTAG Scan write DR(%d bits), end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state)); + DEBUG_JTAG_IO("JTAG Scan write DR(%d bits), end in %s:", \ + scan_size, \ + tap_state_name(cmd->cmd.scan->end_state)); } #ifdef _DEBUG_JTAG_IO_ - vsllink_debug_buffer(buffer, (scan_size + 7) >> 3); + vsllink_debug_buffer(buffer, DIV_ROUND_UP(scan_size, 8)); #endif type = jtag_scan_type(cmd->cmd.scan); - vsllink_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size, cmd->cmd.scan); + vsllink_scan(cmd->cmd.scan->ir_scan, type, buffer, \ + scan_size, cmd->cmd.scan); break; case JTAG_RESET: - DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); + DEBUG_JTAG_IO("reset trst: %i srst %i", \ + cmd->cmd.reset->trst, \ + cmd->cmd.reset->srst); vsllink_tap_execute(); @@ -324,7 +231,8 @@ static int vsllink_execute_queue(void) break; case JTAG_STABLECLOCKS: - DEBUG_JTAG_IO("add %d clocks", cmd->cmd.stableclocks->num_cycles); + DEBUG_JTAG_IO("add %d clocks", \ + cmd->cmd.stableclocks->num_cycles); switch (tap_get_state()) { case TAP_RESET: @@ -340,15 +248,17 @@ static int vsllink_execute_queue(void) scan_size = 0; break; /* above stable states are OK */ default: - LOG_ERROR("jtag_add_clocks() was called with TAP in non-stable state \"%s\"", - tap_state_name(tap_get_state())); + LOG_ERROR("jtag_add_clocks() in non-stable state \"%s\"", + tap_state_name(tap_get_state())); exit(-1); } - vsllink_stableclocks(cmd->cmd.stableclocks->num_cycles, scan_size); + vsllink_stableclocks(cmd->cmd.stableclocks->num_cycles, \ + scan_size); break; default: - LOG_ERROR("BUG: unknown JTAG command type encountered: %d", cmd->type); + LOG_ERROR("BUG: unknown JTAG command type encountered: %d", \ + cmd->type); exit(-1); } cmd = cmd->next; @@ -400,8 +310,8 @@ static int vsllink_init(void) int result; char version_str[100]; - vsllink_usb_in_buffer = malloc(VSLLINK_BufferSize); - vsllink_usb_out_buffer = malloc(VSLLINK_BufferSize); + vsllink_usb_in_buffer = malloc(vsllink_buffer_size); + vsllink_usb_out_buffer = malloc(vsllink_buffer_size); if ((vsllink_usb_in_buffer == NULL) || (vsllink_usb_out_buffer == NULL)) { LOG_ERROR("Not enough memory"); @@ -409,10 +319,10 @@ static int vsllink_init(void) } vsllink_handle = vsllink_usb_open(); - if (vsllink_handle == 0) { - LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions."); + LOG_ERROR("Can't find USB JTAG Interface!"\ + "Please check connection and permissions."); return ERROR_JTAG_INIT_FAILED; } LOG_DEBUG("vsllink found on %04X:%04X", vsllink_usb_vid, vsllink_usb_pid); @@ -422,14 +332,16 @@ static int vsllink_init(void) check_cnt = 0; while (check_cnt < 5) { - vsllink_simple_command(0x00); + vsllink_simple_command(VERSALOON_GET_INFO); result = vsllink_usb_read(vsllink_handle); if (result > 2) { vsllink_usb_in_buffer[result] = 0; - VSLLINK_BufferSize = vsllink_usb_in_buffer[0] + (vsllink_usb_in_buffer[1] << 8); - strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, sizeof(version_str)); + vsllink_buffer_size = vsllink_usb_in_buffer[0] + \ + (vsllink_usb_in_buffer[1] << 8); + strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, \ + sizeof(version_str)); LOG_INFO("%s", version_str); // free the pre-alloc memroy @@ -439,29 +351,29 @@ static int vsllink_init(void) vsllink_usb_out_buffer = NULL; // alloc new memory - vsllink_usb_in_buffer = malloc(VSLLINK_BufferSize); - vsllink_usb_out_buffer = malloc(VSLLINK_BufferSize); - if ((vsllink_usb_in_buffer == NULL) || (vsllink_usb_out_buffer == NULL)) + vsllink_usb_in_buffer = malloc(vsllink_buffer_size); + vsllink_usb_out_buffer = malloc(vsllink_buffer_size); + if ((vsllink_usb_in_buffer == NULL) || \ + (vsllink_usb_out_buffer == NULL)) { LOG_ERROR("Not enough memory"); exit(-1); } else { - LOG_INFO("buffer size for USB is %d bytes", VSLLINK_BufferSize); + LOG_INFO("buffer size for USB is %d bytes", \ + vsllink_buffer_size); } - // alloc memory for dma mode - if (vsllink_mode == VSLLINK_MODE_DMA) + // alloc tms/tdi/tdo buffer + tap_buffer_size = (vsllink_buffer_size - 3) / 2; + tms_buffer = (uint8_t*)malloc(tap_buffer_size); + tdi_buffer = (uint8_t*)malloc(tap_buffer_size); + tdo_buffer = (uint8_t*)malloc(tap_buffer_size); + if ((tms_buffer == NULL) || (tdi_buffer == NULL) || \ + (tdo_buffer == NULL)) { - tap_buffer_size = (VSLLINK_BufferSize - 3) / 2; - tms_buffer = (uint8_t*)malloc(tap_buffer_size); - tdi_buffer = (uint8_t*)malloc(tap_buffer_size); - tdo_buffer = (uint8_t*)malloc(tap_buffer_size); - if ((tms_buffer == NULL) || (tdi_buffer == NULL) || (tdo_buffer == NULL)) - { - LOG_ERROR("Not enough memory"); - exit(-1); - } + LOG_ERROR("Not enough memory"); + exit(-1); } break; } @@ -470,7 +382,7 @@ static int vsllink_init(void) } if (check_cnt == 3) { - // It's dangerout to proced + // Fail to access Versaloon LOG_ERROR("VSLLink initial failed"); exit(-1); } @@ -479,49 +391,33 @@ static int vsllink_init(void) /* Some older firmware versions sometimes fail if the * voltage isn't read first. */ - vsllink_simple_command(0x01); + vsllink_simple_command(VERSALOON_GET_TVCC); result = vsllink_usb_read(vsllink_handle); if (result != 2) - LOG_WARNING("Fail to get target voltage"); - else - LOG_INFO("Target runs at %d mV", vsllink_usb_in_buffer[0] - + (vsllink_usb_in_buffer[1] << 8)); - - // connect to vsllink - vsllink_connect(); - // initialize function pointers - if (vsllink_mode == VSLLINK_MODE_NORMAL) { - // normal mode - vsllink_state_move = vsllink_state_move_normal; - vsllink_path_move = vsllink_path_move_normal; - vsllink_stableclocks = vsllink_stableclocks_normal; - vsllink_scan = vsllink_scan_normal; - - vsllink_tap_init = vsllink_tap_init_normal; - vsllink_tap_execute = vsllink_tap_execute_normal; - vsllink_tap_ensure_space = vsllink_tap_ensure_space_normal; - - LOG_INFO("vsllink run in NORMAL mode"); + LOG_WARNING("Fail to get target voltage"); } else { - // dma mode - vsllink_state_move = vsllink_state_move_dma; - vsllink_path_move = vsllink_path_move_dma; - vsllink_stableclocks = vsllink_stableclocks_dma; - vsllink_scan = vsllink_scan_dma; - - vsllink_tap_init = vsllink_tap_init_dma; - vsllink_tap_execute = vsllink_tap_execute_dma; - vsllink_tap_ensure_space = vsllink_tap_ensure_space_dma; + LOG_INFO("Target runs at %d mV", vsllink_usb_in_buffer[0] + \ + (vsllink_usb_in_buffer[1] << 8)); + } - LOG_INFO("vsllink run in DMA mode"); + // connect to vsllink + vsllink_usb_out_buffer[0] = VSLLINK_CMD_CONN; + vsllink_usb_out_buffer[1] = 1; + vsllink_usb_message(vsllink_handle, 2, 0); + if (vsllink_usb_read(vsllink_handle) > 2) + { + strncpy(version_str, (char *)vsllink_usb_in_buffer + 2, \ + sizeof(version_str)); + LOG_INFO("%s", version_str); } // Set SRST and TRST to output, Set USR1 and USR2 to input vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_PORTDIR; - vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; + vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | \ + JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; vsllink_usb_out_buffer[2] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST; if (vsllink_usb_write(vsllink_handle, 3) != 3) { @@ -531,7 +427,7 @@ static int vsllink_init(void) vsllink_reset(0, 0); - LOG_INFO("VSLLink JTAG Interface ready"); + LOG_INFO("VSLLink Interface ready"); vsllink_tap_init(); @@ -544,7 +440,8 @@ static int vsllink_quit(void) { // Set all pins to input vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_PORTDIR; - vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; + vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST | \ + JTAG_PINMSK_USR1 | JTAG_PINMSK_USR2; vsllink_usb_out_buffer[2] = 0; if (vsllink_usb_write(vsllink_handle, 3) != 3) { @@ -553,7 +450,7 @@ static int vsllink_quit(void) } // disconnect - vsllink_disconnect(); + vsllink_simple_command(VSLLINK_CMD_DISCONN); vsllink_usb_close(vsllink_handle); vsllink_handle = NULL; } @@ -574,61 +471,6 @@ static int vsllink_quit(void) /***************************************************************************/ /* Queue command implementations */ -static int vsllink_disconnect(void) -{ - vsllink_simple_command(VSLLINK_CMD_DISCONN); - return ERROR_OK; -} - -static int vsllink_connect(void) -{ - char vsllink_str[100]; - - vsllink_usb_out_buffer[0] = VSLLINK_CMD_CONN; - vsllink_usb_out_buffer[1] = vsllink_mode; - vsllink_usb_message(vsllink_handle, 2, 0); - if (vsllink_usb_read(vsllink_handle) > 2) - { - strncpy(vsllink_str, (char *)vsllink_usb_in_buffer + 2, sizeof(vsllink_str)); - LOG_INFO("%s", vsllink_str); - } - - return ERROR_OK; -} - -// when vsllink_tms_data_len > 0, vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] is the byte that need to be appended. -// length of VSLLINK_CMDJTAGSEQ_TMSBYTE has been set, no need to set it here. -static void vsllink_append_tms(void) -{ - uint8_t tms_scan = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state()); - uint16_t tms2; - struct insert_insignificant_operation *insert = \ - &VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(tap_get_end_state())]; - - if (((tap_get_state() != TAP_RESET) && (tap_get_state() != TAP_IDLE) && (tap_get_state() != TAP_DRPAUSE) && (tap_get_state() != TAP_IRPAUSE)) || \ - (vsllink_tms_data_len <= 0) || (vsllink_tms_data_len >= 8) || \ - (vsllink_tms_cmd_pos == NULL)) - { - LOG_ERROR("There MUST be some bugs in the driver"); - exit(-1); - } - - tms2 = (tms_scan & VSLLINK_BIT_MSK[insert->insert_position]) << \ - vsllink_tms_data_len; - if (insert->insert_value == 1) - { - tms2 |= VSLLINK_BIT_MSK[8 - vsllink_tms_data_len] << \ - (vsllink_tms_data_len + insert->insert_position); - } - tms2 |= (tms_scan >> insert->insert_position) << \ - (8 + insert->insert_position); - - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] |= (tms2 >> 0) & 0xff; - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = (tms2 >> 8) & 0xff; - - vsllink_tms_data_len = 0; - vsllink_tms_cmd_pos = NULL; -} static void vsllink_end_state(tap_state_t state) { @@ -644,482 +486,53 @@ static void vsllink_end_state(tap_state_t state) } /* Goes to the end state. */ -static void vsllink_state_move_normal(void) +static void vsllink_state_move(void) { - if (vsllink_tms_data_len > 0) - { - vsllink_append_tms(); - } - else - { - vsllink_tap_ensure_space(0, 2); - - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_TMSBYTE; - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state()); - } - - tap_set_state(tap_get_end_state()); -} -static void vsllink_state_move_dma(void) -{ - int i, insert_length = (tap_length % 8) ? (8 - (tap_length % 8)) : 0; - struct insert_insignificant_operation *insert = \ - &VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(tap_get_end_state())]; - uint8_t tms_scan = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state()); - - if (tap_get_state() == TAP_RESET) - { - vsllink_tap_ensure_space(0, 8); - - for (i = 0; i < 8; i++) - { - vsllink_tap_append_step(1, 0); - } - } - - if (insert_length > 0) - { - vsllink_tap_ensure_space(0, 16); + int i; + uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state()); + uint8_t tms_scan_bits = \ + tap_get_tms_path_len(tap_get_state(), tap_get_end_state()); - for (i = 0; i < insert->insert_position; i++) - { - vsllink_tap_append_step((tms_scan >> i) & 1, 0); - } - for (i = 0; i < insert_length; i++) - { - vsllink_tap_append_step(insert->insert_value, 0); - } - for (i = insert->insert_position; i < 8; i++) - { - vsllink_tap_append_step((tms_scan >> i) & 1, 0); - } - } - else + for (i = 0; i < tms_scan_bits; i++) { - vsllink_tap_ensure_space(0, 8); - - for (i = 0; i < 8; i++) - { - vsllink_tap_append_step((tms_scan >> i) & 1, 0); - } + vsllink_tap_append_step((tms_scan >> i) & 1, 0); } tap_set_state(tap_get_end_state()); } -// write tms from current vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] -static void vsllink_add_path(int start, int num, tap_state_t *path) +static void vsllink_path_move(int num_states, tap_state_t *path) { - int i; - - for (i = start; i < (start + num); i++) + for (int i = 0; i < num_states; i++) { - if ((i & 7) == 0) - { - if (i > 0) - { - vsllink_usb_out_buffer_idx++; - } - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] = 0; - } - - if (path[i - start] == tap_state_transition(tap_get_state(), true)) + if (path[i] == tap_state_transition(tap_get_state(), false)) { - vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] |= 1 << (i & 7); + vsllink_tap_append_step(0, 0); } - else if (path[i - start] == tap_state_transition(tap_get_state(), false)) + else if (path[i] == tap_state_transition(tap_get_state(), true)) { - // nothing to do + vsllink_tap_append_step(1, 0); } else { - LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i])); + LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", \ + tap_state_name(tap_get_state()), \ + tap_state_name(path[i])); exit(-1); } - tap_set_state(path[i - start]); - } - if ((i > 0) && ((i & 7) == 0)) - { - ... [truncated message content] |