jtag/drivers/jlink: implement register command to fix SWD 31/2331/6
authorPaul Fertser <fercerpav@gmail.com>
Fri, 31 Oct 2014 11:30:57 +0000 (14:30 +0300)
committerSpencer Oliver <spen@spen-soft.co.uk>
Mon, 24 Nov 2014 22:18:30 +0000 (22:18 +0000)
Some J-Link fw versions require registration to be performed before
SWD operation is possible. It doesn't harm anyway, vendor's utilities
do it unconditionally.

Thanks go to Segger for providing the necessary information.

Change-Id: Iabd76c743eca86e2c817a97cb93c969fec3f7ac6
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2331
Tested-by: jenkins
src/jtag/drivers/jlink.c

index 57eea64d192ba352aa49d7d8cefe1df88ae53b5c..40d91cc43264c442c6ccbcc96194f54e0575a4ca 100644 (file)
@@ -77,6 +77,7 @@ static uint8_t usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
 #define EMU_CMD_SET_SPEED              0x05
 #define EMU_CMD_GET_STATE              0x07
 #define EMU_CMD_SET_KS_POWER   0x08
 #define EMU_CMD_SET_SPEED              0x05
 #define EMU_CMD_GET_STATE              0x07
 #define EMU_CMD_SET_KS_POWER   0x08
+#define EMU_CMD_REGISTER               0x09
 #define EMU_CMD_GET_SPEEDS             0xc0
 #define EMU_CMD_GET_HW_INFO            0xc1
 #define EMU_CMD_GET_COUNTERS   0xc2
 #define EMU_CMD_GET_SPEEDS             0xc0
 #define EMU_CMD_GET_HW_INFO            0xc1
 #define EMU_CMD_GET_COUNTERS   0xc2
@@ -112,6 +113,10 @@ static uint8_t usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
 #define EMU_CMD_WRITE_MEM_ARM79                0xf7
 #define EMU_CMD_READ_MEM_ARM79         0xf8
 
 #define EMU_CMD_WRITE_MEM_ARM79                0xf7
 #define EMU_CMD_READ_MEM_ARM79         0xf8
 
+/* Register subcommands */
+#define REG_CMD_REGISTER               100
+#define REG_CMD_UNREGISTER             101
+
 /* bits return from EMU_CMD_GET_CAPS */
 #define EMU_CAP_RESERVED_1             0
 #define EMU_CAP_GET_HW_VERSION         1
 /* bits return from EMU_CMD_GET_CAPS */
 #define EMU_CAP_RESERVED_1             0
 #define EMU_CAP_GET_HW_VERSION         1
@@ -433,6 +438,41 @@ static int jlink_khz(int khz, int *jtag_speed)
        return ERROR_OK;
 }
 
        return ERROR_OK;
 }
 
+static int jlink_register(void)
+{
+       int result;
+       usb_out_buffer[0] = EMU_CMD_REGISTER;
+       usb_out_buffer[1] = REG_CMD_REGISTER;
+       /* 2 - 11 is "additional parameter",
+        * 12 - 13 is connection handle, zero initially */
+       memset(&usb_out_buffer[2], 0, 10 + 2);
+
+       result = jlink_usb_write(jlink_handle, 14);
+       if (result != 14) {
+               LOG_ERROR("J-Link register write failed (%d)", result);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       /* Returns:
+        * 0 - 1 connection handle,
+        * 2 - 3 number of information entities,
+        * 4 - 5 size of a single information struct,
+        * 6 - 7 number of additional bytes,
+        * 8 - ... reply data
+        *
+        * Try to read the whole USB bulk packet
+        */
+       result = jtag_libusb_bulk_read(jlink_handle->usb_handle, jlink_read_ep,
+                                      (char *)usb_in_buffer, sizeof(usb_in_buffer),
+                                      JLINK_USB_TIMEOUT);
+       if (!result) {
+               LOG_ERROR("J-Link register read failed (0 bytes received)");
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       return ERROR_OK;
+}
+
 /*
  * select transport interface
  *
 /*
  * select transport interface
  *
@@ -513,6 +553,10 @@ static int jlink_init(void)
                jlink_get_status();
        }
 
                jlink_get_status();
        }
 
+       /* Registration is sometimes necessary for SWD to work */
+       if (jlink_caps & (1<<EMU_CAP_REGISTER))
+               jlink_register();
+
        /*
         * Some versions of Segger's software do not select JTAG interface by default.
         *
        /*
         * Some versions of Segger's software do not select JTAG interface by default.
         *

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)