summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-24 08:53:42 +0000
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-24 08:53:42 +0000
commit575e3379f5a42c56b35c75e1e684b8244ae179e1 (patch)
treebae5e2b1933a3e0d81478ad32477af484ebc94ec /src/jtag
parentf1e317e53441ce01cf559d553dccab0624d50329 (diff)
downloadopenocd+libswd-575e3379f5a42c56b35c75e1e684b8244ae179e1.tar.gz
openocd+libswd-575e3379f5a42c56b35c75e1e684b8244ae179e1.tar.bz2
openocd+libswd-575e3379f5a42c56b35c75e1e684b8244ae179e1.tar.xz
openocd+libswd-575e3379f5a42c56b35c75e1e684b8244ae179e1.zip
- removed obsolete cmd JLINK_TAP_SEQUENCE_COMMAND, use EMU_CMD_HW_JTAG instead
git-svn-id: svn://svn.berlios.de/openocd/trunk@677 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/jlink.c61
1 files changed, 48 insertions, 13 deletions
diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c
index 16dac2a0..2cf39cd0 100644
--- a/src/jtag/jlink.c
+++ b/src/jtag/jlink.c
@@ -51,19 +51,17 @@
#define JLINK_USB_TIMEOUT 100
-#define JLINK_IN_BUFFER_SIZE 2064
-#define JLINK_OUT_BUFFER_SIZE 2064
+#define JLINK_IN_BUFFER_SIZE 2064
+#define JLINK_OUT_BUFFER_SIZE 2064
+#define JLINK_EMU_RESULT_BUFFER_SIZE 64
+
/* Global USB buffers */
static u8 usb_in_buffer[JLINK_IN_BUFFER_SIZE];
static u8 usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
+static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
/* Constants for JLink command */
-
-/* The JLINK_TAP_SEQUENCE_COMMAND is obsolete
- * and we should use EMU_CMD_HW_JTAG instead */
-#define JLINK_TAP_SEQUENCE_COMMAND 0xcd
-
#define EMU_CMD_VERSION 0x01
#define EMU_CMD_SET_SPEED 0x05
#define EMU_CMD_GET_STATE 0x07
@@ -115,6 +113,7 @@ void jlink_usb_close(jlink_jtag_t *jlink_jtag);
int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length);
int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length);
int jlink_usb_read(jlink_jtag_t *jlink_jtag);
+int jlink_usb_read_result(jlink_jtag_t *jlink_jtag);
/* helper functions */
int jlink_get_version_info(void);
@@ -665,11 +664,12 @@ int jlink_tap_execute()
byte_length = tap_length / 8;
- usb_out_buffer[0] = JLINK_TAP_SEQUENCE_COMMAND;
- usb_out_buffer[1] = (tap_length >> 0) & 0xff;
- usb_out_buffer[2] = (tap_length >> 8) & 0xff;
+ usb_out_buffer[0] = EMU_CMD_HW_JTAG;
+ usb_out_buffer[1] = 0;
+ usb_out_buffer[2] = (tap_length >> 0) & 0xff;
+ usb_out_buffer[3] = (tap_length >> 8) & 0xff;
- tms_offset = 3;
+ tms_offset = 4;
for (i = 0; i < byte_length; i++)
{
usb_out_buffer[tms_offset + i] = tms_buffer[i];
@@ -681,7 +681,7 @@ int jlink_tap_execute()
usb_out_buffer[tdi_offset + i] = tdi_buffer[i];
}
- result = jlink_usb_message(jlink_jtag_handle, 3 + 2 * byte_length, byte_length);
+ result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
if (result == byte_length)
{
@@ -783,6 +783,7 @@ void jlink_usb_close(jlink_jtag_t *jlink_jtag)
int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
{
int result;
+ int result2;
result = jlink_usb_write(jlink_jtag, out_length);
if (result == out_length)
@@ -790,7 +791,26 @@ int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
result = jlink_usb_read(jlink_jtag);
if (result == in_length)
{
- return result;
+ /* Must read the result from the EMU too */
+ result2 = jlink_usb_read_result(jlink_jtag);
+ if (1 == result2)
+ {
+ /* Check the result itself */
+ if (0 == usb_emu_result_buffer[0])
+ {
+ return result;
+ }
+ else
+ {
+ LOG_ERROR("jlink_usb_read_result len (requested=0, result=%d)", usb_emu_result_buffer[0]);
+ return -1;
+ }
+ }
+ else
+ {
+ LOG_ERROR("jlink_usb_read_result len (requested=1, result=%d)", result2);
+ return -1;
+ }
}
else
{
@@ -841,6 +861,21 @@ int jlink_usb_read(jlink_jtag_t *jlink_jtag)
return result;
}
+/* Read the result from the previous EMU cmd into result_buffer. */
+int jlink_usb_read_result(jlink_jtag_t *jlink_jtag)
+{
+ int result = usb_bulk_read(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT, \
+ usb_emu_result_buffer, JLINK_EMU_RESULT_BUFFER_SIZE, JLINK_USB_TIMEOUT);
+
+ DEBUG_JTAG_IO("jlink_usb_read_result, result = %d", result);
+
+#ifdef _DEBUG_USB_COMMS_
+ jlink_debug_buffer(usb_emu_result_buffer, result);
+#endif
+ return result;
+}
+
+
#ifdef _DEBUG_USB_COMMS_
#define BYTES_PER_LINE 16