- removed obsolete cmd JLINK_TAP_SEQUENCE_COMMAND, use EMU_CMD_HW_JTAG instead
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sat, 24 May 2008 08:53:42 +0000 (08:53 +0000)
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sat, 24 May 2008 08:53:42 +0000 (08:53 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@677 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/jlink.c

index 16dac2a..2cf39cd 100644 (file)
 
 #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