- remove texi warnings
[fw/openocd] / src / jtag / jlink.c
index 07ce9a2cbf870e3c58a4efbbd547340071087ea8..c81e9a0291a9a61d7ce4d0aba639d906181b97a1 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2007 by Juergen Stuber <juergen@jstuber.net>            *
  *   based on Dominic Rath's and Benedikt Sauter's usbprog.c               *
  *                                                                         *
+ *   Copyright (C) 2008 by Spencer Oliver                                  *
+ *   spen@spen-soft.co.uk                                                  *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
 
 #define JLINK_USB_TIMEOUT              100
 
-#define JLINK_IN_BUFFER_SIZE                                   8192
-#define JLINK_OUT_BUFFER_SIZE                                  8192
+#define JLINK_IN_BUFFER_SIZE                   8192
+#define JLINK_OUT_BUFFER_SIZE                  8192
 #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];
@@ -65,7 +67,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
@@ -96,8 +98,8 @@ void jlink_simple_command(u8 command);
 int jlink_get_status(void);
 
 /* J-Link tap buffer functions */
-void jlink_tap_init();
-int jlink_tap_execute();
+void jlink_tap_init(void);
+int jlink_tap_execute(void);
 void jlink_tap_ensure_space(int scans, int bits);
 void jlink_tap_append_step(int tms, int tdi);
 void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command);
@@ -170,8 +172,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 +182,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 +208,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();
                        
@@ -293,7 +292,7 @@ int jlink_init(void)
        
        if (jlink_jtag_handle == 0)
        {
-               LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
+               LOG_ERROR("Cannot find jlink Interface! Please check connection and permissions.");
                return ERROR_JTAG_INIT_FAILED;
        }
                
@@ -488,17 +487,17 @@ int jlink_get_status(void)
        jlink_simple_command(EMU_CMD_GET_STATE);
        result = jlink_usb_read(jlink_jtag_handle);
        
-       if(result == 8)
+       if (result == 8)
        {
                int vref = usb_in_buffer[0] + (usb_in_buffer[1] << 8);
-               LOG_INFO("Vref = %d.%d TCK=%d TDI=%d TDO=%d TMS=%d SRST=%d TRST=%d\n", \
+               LOG_INFO("Vref = %d.%d TCK = %d TDI = %d TDO = %d TMS = %d SRST = %d TRST = %d\n", \
                        vref / 1000, vref % 1000, \
                        usb_in_buffer[2], usb_in_buffer[3], usb_in_buffer[4], \
                        usb_in_buffer[5], usb_in_buffer[6], usb_in_buffer[7]);
                
-               if(vref < 1500)
+               if (vref < 1500)
                {
-                       LOG_ERROR("Vref too low. Eventually the target isn't powered or disconnected?\n");
+                       LOG_ERROR("Vref too low. Check Target Power\n");
                }
        }
        else
@@ -523,7 +522,7 @@ int jlink_get_version_info(void)
                len = buf_get_u32(usb_in_buffer, 0, 16);
                result = jlink_usb_read(jlink_jtag_handle);
                
-               if(result == len)
+               if (result == len)
                {
                        usb_in_buffer[result] = 0;
                        LOG_INFO(usb_in_buffer);
@@ -572,7 +571,7 @@ static pending_scan_result_t pending_scan_results_buffer[MAX_PENDING_SCAN_RESULT
 
 static int last_tms;
 
-void jlink_tap_init()
+void jlink_tap_init(void)
 {
        tap_length = 0;
        pending_scan_results_length = 0;
@@ -644,7 +643,7 @@ void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command)
 
 /* Pad and send a tap sequence to the device, and receive the answer.
  * For the purpose of padding we assume that we are in idle or pause state. */
-int jlink_tap_execute()
+int jlink_tap_execute(void)
 {
        int byte_length;
        int tms_offset;
@@ -664,7 +663,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 +795,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 +897,6 @@ int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag)
        return result;
 }
 
-
 #ifdef _DEBUG_USB_COMMS_
 #define BYTES_PER_LINE  16