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
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development