jlink: use tap buffer as 2k
[openocd.git] / src / jtag / drivers / jlink.c
index f1b9711500a46d109680775dbe3e54836bbc05d3..6507403e34763c61df499c7997c5bfab69609723 100644 (file)
@@ -55,10 +55,10 @@ static unsigned int jlink_hw_jtag_version = 2;
 
 #define JLINK_USB_TIMEOUT              1000
 
-// See Section 1.3.2 of the Segger JLink USB protocol manual
+// See Section 3.3.2 of the Segger JLink USB protocol manual
 /* 2048 is the max value we can use here */
-//#define JLINK_TAP_BUFFER_SIZE 2048
-#define JLINK_TAP_BUFFER_SIZE 256
+#define JLINK_TAP_BUFFER_SIZE 2048
+//#define JLINK_TAP_BUFFER_SIZE 256
 //#define JLINK_TAP_BUFFER_SIZE 384
 
 #define JLINK_IN_BUFFER_SIZE                   2048
@@ -88,8 +88,73 @@ static uint8_t usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
 #define EMU_CMD_GET_HW_VERSION 0xf0
 
 /* bits return from EMU_CMD_GET_CAPS */
+#define EMU_CAP_RESERVED_1             0
 #define EMU_CAP_GET_HW_VERSION         1
+#define EMU_CAP_WRITE_DCC              2
+#define EMU_CAP_ADAPTIVE_CLOCKING      3
+#define EMU_CAP_READ_CONFIG            4
+#define EMU_CAP_WRITE_CONFIG           5
+#define EMU_CAP_TRACE                  6
+#define EMU_CAP_WRITE_MEM              7
+#define EMU_CAP_READ_MEM               8
+#define EMU_CAP_SPEED_INFO             9
+#define EMU_CAP_EXEC_CODE              10
 #define EMU_CAP_GET_MAX_BLOCK_SIZE     11
+#define EMU_CAP_GET_HW_INFO            12
+#define EMU_CAP_SET_KS_POWER           13
+#define EMU_CAP_RESET_STOP_TIMED       14
+#define EMU_CAP_RESERVED_2             15
+#define EMU_CAP_MEASURE_RTCK_REACT     16
+#define EMU_CAP_SELECT_IF              17
+#define EMU_CAP_RW_MEM_ARM79           18
+#define EMU_CAP_GET_COUNTERS           19
+#define EMU_CAP_READ_DCC               20
+#define EMU_CAP_GET_CPU_CAPS           21
+#define EMU_CAP_EXEC_CPU_CMD           22
+#define EMU_CAP_SWO                    23
+#define EMU_CAP_WRITE_DCC_EX           24
+#define EMU_CAP_UPDATE_FIRMWARE_EX     25
+#define EMU_CAP_FILE_IO                        26
+#define EMU_CAP_REGISTER               27
+#define EMU_CAP_INDICATORS             28
+#define EMU_CAP_TEST_NET_SPEED         29
+#define EMU_CAP_RAWTRACE               30
+#define EMU_CAP_RESERVED_3             31
+
+static char *jlink_cap_str[] = {
+       "Always 1.",
+       "Supports command EMU_CMD_GET_HARDWARE_VERSION",
+       "Supports command EMU_CMD_WRITE_DCC",
+       "Supports adaptive clocking",
+       "Supports command EMU_CMD_READ_CONFIG",
+       "Supports command EMU_CMD_WRITE_CONFIG",
+       "Supports trace commands",
+       "Supports command EMU_CMD_WRITE_MEM",
+       "Supports command EMU_CMD_READ_MEM",
+       "Supports command EMU_CMD_GET_SPEED",
+       "Supports command EMU_CMD_CODE_...",
+       "Supports command EMU_CMD_GET_MAX_BLOCK_SIZE",
+       "Supports command EMU_CMD_GET_HW_INFO",
+       "Supports command EMU_CMD_SET_KS_POWER",
+       "Supports command EMU_CMD_HW_RELEASE_RESET_STOP_TIMED",
+       "Reserved",
+       "Supports command EMU_CMD_MEASURE_RTCK_REACT",
+       "Supports command EMU_CMD_HW_SELECT_IF",
+       "Supports command EMU_CMD_READ/WRITE_MEM_ARM79",
+       "Supports command EMU_CMD_GET_COUNTERS",
+       "Supports command EMU_CMD_READ_DCC",
+       "Supports command EMU_CMD_GET_CPU_CAPS",
+       "Supports command EMU_CMD_EXEC_CPU_CMD",
+       "Supports command EMU_CMD_SWO",
+       "Supports command EMU_CMD_WRITE_DCC_EX",
+       "Supports command EMU_CMD_UPDATE_FIRMWARE_EX",
+       "Supports command EMU_CMD_FILE_IO",
+       "Supports command EMU_CMD_REGISTER",
+       "Supports command EMU_CMD_INDICATORS",
+       "Supports command EMU_CMD_TEST_NET_SPEED",
+       "Supports command EMU_CMD_RAWTRACE",
+       "Reserved",
+};
 
 /* max speed 12MHz v5.0 jlink */
 #define JLINK_MAX_SPEED 12000
@@ -136,6 +201,12 @@ static enum tap_state jlink_last_state = TAP_RESET;
 
 static struct jlink* jlink_handle;
 
+/* pid could be specified at runtime */
+static uint16_t vids[] = { VID, 0 };
+static uint16_t pids[] = { PID, 0 };
+
+static uint32_t jlink_caps;
+
 /***************************************************************************/
 /* External interface implementation */
 
@@ -536,11 +607,31 @@ static int jlink_get_status(void)
        return ERROR_OK;
 }
 
+#define jlink_dump_printf(context, expr ...)   \
+       do {                                    \
+       if (context)                            \
+               command_print(context, expr);   \
+       else                                    \
+               LOG_INFO(expr);                 \
+       } while(0);
+
+
+static void jlink_caps_dump(struct command_context *ctx)
+{
+       int i;
+
+       jlink_dump_printf(ctx, "J-Link Capabilities");
+
+       for (i = 1; i < 31; i++)
+               if (jlink_caps & (1 << i))
+                       jlink_dump_printf(ctx, "%s", jlink_cap_str[i]);
+}
+
 static int jlink_get_version_info(void)
 {
        int result;
        int len;
-       uint32_t jlink_caps, jlink_max_size;
+       uint32_t jlink_max_size;
 
        /* query hardware version */
        jlink_simple_command(EMU_CMD_VERSION);
@@ -580,7 +671,7 @@ static int jlink_get_version_info(void)
        }
 
        jlink_caps = buf_get_u32(usb_in_buffer, 0, 32);
-       LOG_INFO("JLink caps 0x%x", (unsigned)jlink_caps);
+       LOG_INFO("J-Link caps 0x%x", (unsigned)jlink_caps);
 
        if (jlink_caps & (1 << EMU_CAP_GET_HW_VERSION))
        {
@@ -599,7 +690,7 @@ static int jlink_get_version_info(void)
                if (major_revision >= 5)
                        jlink_hw_jtag_version = 3;
 
-               LOG_INFO("JLink hw version %i", (int)jlink_hw_version);
+               LOG_INFO("J-Link hw version %i", (int)jlink_hw_version);
        }
 
        if (jlink_caps & (1 << EMU_CAP_GET_MAX_BLOCK_SIZE))
@@ -615,9 +706,24 @@ static int jlink_get_version_info(void)
                }
 
                jlink_max_size = buf_get_u32(usb_in_buffer, 0, 32);
-               LOG_INFO("JLink max mem block %i", (int)jlink_max_size);
+               LOG_INFO("J-Link max mem block %i", (int)jlink_max_size);
+       }
+
+       return ERROR_OK;
+}
+
+COMMAND_HANDLER(jlink_pid_command)
+{
+       if (CMD_ARGC != 1)
+       {
+               LOG_ERROR("Need exactly one argument to jlink_pid");
+               return ERROR_FAIL;
        }
 
+       pids[0] = strtoul(CMD_ARGV[0], NULL, 16);
+       pids[1] = 0;
+       vids[1] = 0;
+
        return ERROR_OK;
 }
 
@@ -632,11 +738,18 @@ COMMAND_HANDLER(jlink_handle_jlink_info_command)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(jlink_handle_jlink_caps_command)
+{
+       jlink_caps_dump(CMD_CTX);
+
+       return ERROR_OK;
+}
+
 COMMAND_HANDLER(jlink_handle_jlink_hw_jtag_command)
 {
        switch (CMD_ARGC) {
        case 0:
-               command_print(CMD_CTX, "jlink hw jtag  %i", jlink_hw_jtag_version);
+               command_print(CMD_CTX, "J-Link hw jtag  %i", jlink_hw_jtag_version);
                break;
        case 1: {
                int request_version = atoi(CMD_ARGV[0]);
@@ -656,20 +769,42 @@ COMMAND_HANDLER(jlink_handle_jlink_hw_jtag_command)
        return ERROR_OK;
 }
 
-static const struct command_registration jlink_command_handlers[] = {
+static const struct command_registration jlink_subcommand_handlers[] = {
+       {
+               .name = "caps",
+               .handler = &jlink_handle_jlink_caps_command,
+               .mode = COMMAND_EXEC,
+               .help = "show jlink capabilities",
+       },
        {
-               .name = "jlink_info",
+               .name = "info",
                .handler = &jlink_handle_jlink_info_command,
                .mode = COMMAND_EXEC,
                .help = "show jlink info",
        },
        {
-               .name = "jlink_hw_jtag",
+               .name = "hw_jtag",
                .handler = &jlink_handle_jlink_hw_jtag_command,
                .mode = COMMAND_EXEC,
                .help = "access J-Link HW JTAG command version",
                .usage = "[2|3]",
        },
+       {
+               .name = "pid",
+               .handler = &jlink_pid_command,
+               .mode = COMMAND_CONFIG,
+               .help = "set the pid of the interface we want to use",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+static const struct command_registration jlink_command_handlers[] = {
+       {
+               .name = "jlink",
+               .mode = COMMAND_ANY,
+               .help = "perform jlink management",
+               .chain = jlink_subcommand_handlers,
+       },
        COMMAND_REGISTRATION_DONE
 };
 
@@ -861,8 +996,6 @@ static struct jlink* jlink_usb_open()
 {
        usb_init();
 
-       const uint16_t vids[] = { VID, 0 };
-       const uint16_t pids[] = { PID, 0 };
        struct usb_dev_handle *dev;
        if (jtag_usb_open(vids, pids, &dev) != ERROR_OK)
                return NULL;

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)