- fix jlink accessing incorrect buffer element
[fw/openocd] / src / jtag / jlink.c
index 16bd30d077dcb149a7b48daed467c41f7d78457a..96e4efd343d2290afa46bbc171599caae4759274 100644 (file)
@@ -51,8 +51,8 @@
 
 #define JLINK_USB_TIMEOUT              100
 
-#define JLINK_IN_BUFFER_SIZE                                   2064
-#define JLINK_OUT_BUFFER_SIZE                                  2064
+#define JLINK_IN_BUFFER_SIZE                                   8192
+#define JLINK_OUT_BUFFER_SIZE                                  8192
 #define JLINK_EMU_RESULT_BUFFER_SIZE   64
 
 
@@ -65,7 +65,7 @@ static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
 #define EMU_CMD_VERSION     0x01
 #define EMU_CMD_SET_SPEED   0x05
 #define EMU_CMD_GET_STATE   0x07
-#define EMU_CMD_HW_JTAG     0xcf
+#define EMU_CMD_HW_JTAG3    0xcf
 #define EMU_CMD_HW_RESET0   0xdc
 #define EMU_CMD_HW_RESET1   0xdd
 #define EMU_CMD_HW_TRST0    0xde
@@ -170,8 +170,7 @@ int jlink_execute_queue(void)
                                break;
        
                        case JTAG_STATEMOVE:
-                               DEBUG_JTAG_IO("statemove end in %i",
-                               cmd->cmd.statemove->end_state);
+                               DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
                        
                                if (cmd->cmd.statemove->end_state != -1)
                                {
@@ -181,9 +180,9 @@ int jlink_execute_queue(void)
                                break;
        
                        case JTAG_PATHMOVE:
-                               DEBUG_JTAG_IO("pathmove: %i states, end in %i",
-                               cmd->cmd.pathmove->num_states,
-                               cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
+                               DEBUG_JTAG_IO("pathmove: %i states, end in %i", \
+                                       cmd->cmd.pathmove->num_states, \
+                                       cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
                        
                                jlink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
                                break;
@@ -207,9 +206,7 @@ int jlink_execute_queue(void)
                                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);
                        
                                jlink_tap_execute();
                        
@@ -549,8 +546,8 @@ int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd
 /***************************************************************************/
 /* J-Link tap functions */
 
-/* We use the maximal value observed */
-#define JLINK_TAP_BUFFER_SIZE 390
+/* 2048 is the max value we can use here */
+#define JLINK_TAP_BUFFER_SIZE 2048
 
 static int tap_length;
 static u8 tms_buffer[JLINK_TAP_BUFFER_SIZE];
@@ -565,7 +562,7 @@ typedef struct
        u8 *buffer;
 } pending_scan_result_t;
 
-#define MAX_PENDING_SCAN_RESULTS 16
+#define MAX_PENDING_SCAN_RESULTS 256
 
 static int pending_scan_results_length;
 static pending_scan_result_t pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS];
@@ -664,7 +661,7 @@ int jlink_tap_execute()
        
                byte_length = tap_length / 8;
        
-               usb_out_buffer[0] = EMU_CMD_HW_JTAG;
+               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;
@@ -796,27 +793,43 @@ int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
        if (result == out_length)
        {
                result = jlink_usb_read(jlink_jtag);
-               if (result == in_length)
+               if (result == in_length || result == in_length+1)
                {
-                       /* Must read the result from the EMU too */
-                       result2 = jlink_usb_read_emu_result(jlink_jtag);
-                       if (1 == result2)
+                       if (result == in_length)
                        {
-                               /* Check the result itself */
-                               if (0 == usb_emu_result_buffer[0])
+                               /* Must read the result from the EMU too */
+                               result2 = jlink_usb_read_emu_result(jlink_jtag);
+                               if (1 == result2)
                                {
-                                       return result;
+                                       /* Check the result itself */
+                                       if (0 == usb_emu_result_buffer[0])
+                                       {
+                                               return result;
+                                       }
+                                       else
+                                       {
+                                               LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_emu_result_buffer[0]);
+                                               return -1;                              
+                                       }
                                }
                                else
                                {
-                                       LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_emu_result_buffer[0]);
-                                       return -1;                              
+                                       LOG_ERROR("jlink_usb_read_emu_result len (requested=1, result=%d)", result2);
+                                       return -1;
                                }
                        }
                        else
                        {
-                               LOG_ERROR("jlink_usb_read_emu_result len (requested=1, result=%d)", result2);
-                               return -1;
+                               /* Check the result itself */
+                               if (0 == usb_in_buffer[result-1])
+                               {
+                                       return result-1;
+                               }
+                               else
+                               {
+                                       LOG_ERROR("jlink_usb_read_emu_result (requested=0, result=%d)", usb_in_buffer[result]);
+                                       return -1;                              
+                               }
                        }
                }
                else
@@ -882,7 +895,6 @@ int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag)
        return result;
 }
 
-
 #ifdef _DEBUG_USB_COMMS_
 #define BYTES_PER_LINE  16