Hi all, This patch unwinds the logic in jlink_tap_execute.
Cheers, Zach
Index: src/jtag/jlink.c =================================================================== --- src/jtag/jlink.c (revision 1497) +++ src/jtag/jlink.c (working copy) @@ -651,82 +641,79 @@ int i; int result; - if (tap_length > 0) + if (!tap_length) + return ERROR_OK; + + /* Pad last byte so that tap_length is divisible by 8 */ + while (tap_length % 8 != 0) { - /* Pad last byte so that tap_length is divisible by 8 */ - while (tap_length % 8 != 0) - { - /* More of the last TMS value keeps us in the same state, - * analogous to free-running JTAG interfaces. */ - jlink_tap_append_step(last_tms, 0); - } + /* More of the last TMS value keeps us in the same state, + * analogous to free-running JTAG interfaces. */ + jlink_tap_append_step(last_tms, 0); + } - byte_length = tap_length / 8; + byte_length = tap_length / 8; - usb_out_buffer[0] = EMU_CMD_HW_JTAG3; - usb_out_buffer[1] = 0; - usb_out_buffer[2] = (tap_length >> 0) & 0xff; - usb_out_buffer[3] = (tap_length >> 8) & 0xff; + usb_out_buffer[0] = EMU_CMD_HW_JTAG3; + usb_out_buffer[1] = 0; + usb_out_buffer[2] = (tap_length >> 0) & 0xff; + usb_out_buffer[3] = (tap_length >> 8) & 0xff; - tms_offset = 4; - for (i = 0; i < byte_length; i++) - { - usb_out_buffer[tms_offset + i] = tms_buffer[i]; - } + tms_offset = 4; + for (i = 0; i < byte_length; i++) + { + usb_out_buffer[tms_offset + i] = tms_buffer[i]; + } - tdi_offset = tms_offset + byte_length; - for (i = 0; i < byte_length; i++) - { - usb_out_buffer[tdi_offset + i] = tdi_buffer[i]; - } + tdi_offset = tms_offset + byte_length; + for (i = 0; i < byte_length; i++) + { + usb_out_buffer[tdi_offset + i] = tdi_buffer[i]; + } - result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length); + result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length); - if (result == byte_length) - { - for (i = 0; i < byte_length; i++) - { - tdo_buffer[i] = usb_in_buffer[i]; - } + if (result != byte_length) + { + LOG_ERROR("jlink_tap_execute, wrong result %d (expected %d)", + result, byte_length); + return ERROR_JTAG_QUEUE_FAILED; + } - for (i = 0; i < pending_scan_results_length; i++) - { - pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i]; - u8 *buffer = pending_scan_result->buffer; - int length = pending_scan_result->length; - int first = pending_scan_result->first; - scan_command_t *command = pending_scan_result->command; + for (i = 0; i < byte_length; i++) + tdo_buffer[i] = usb_in_buffer[i]; - /* Copy to buffer */ - buf_set_buf(tdo_buffer, first, buffer, 0, length); + for (i = 0; i < pending_scan_results_length; i++) + { + pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i]; + u8 *buffer = pending_scan_result->buffer; + int length = pending_scan_result->length; + int first = pending_scan_result->first; + scan_command_t *command = pending_scan_result->command; - DEBUG_JTAG_IO("pending scan result, length = %d", length); + /* Copy to buffer */ + buf_set_buf(tdo_buffer, first, buffer, 0, length); + DEBUG_JTAG_IO("pending scan result, length = %d", length); + #ifdef _DEBUG_USB_COMMS_ - jlink_debug_buffer(buffer, byte_length); + jlink_debug_buffer(buffer, byte_length); #endif - if (jtag_read_buffer(buffer, command) != ERROR_OK) - { - jlink_tap_init(); - return ERROR_JTAG_QUEUE_FAILED; - } - - if (pending_scan_result->buffer != NULL) - { - free(pending_scan_result->buffer); - } - } - } - else + if (jtag_read_buffer(buffer, command) != ERROR_OK) { - LOG_ERROR("jlink_tap_execute, wrong result %d, expected %d", result, byte_length); + jlink_tap_init(); return ERROR_JTAG_QUEUE_FAILED; } - jlink_tap_init(); + if (pending_scan_result->buffer != NULL) + { + free(pending_scan_result->buffer); + } } + jlink_tap_init(); + return ERROR_OK; }
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development