libjaylink: Update for API changes
[openocd.git] / src / jtag / drivers / jlink.c
index cda51bc0ce8bd0d50305e9fe454a160cfb049282..95c6d8db3068d3ab21f2dd3bef98c397c4585f9a 100644 (file)
@@ -217,7 +217,7 @@ static void jlink_execute_scan(struct jtag_command *cmd)
                                         field->num_bits - 1,
                                         1);
                        tap_set_state(tap_state_transition(tap_get_state(), 1));
-                       jlink_clock_data(&last_bit,
+                       jlink_clock_data(NULL,
                                         0,
                                         &tms_bits,
                                         1,
@@ -314,12 +314,11 @@ static int jlink_execute_queue(void)
 static int jlink_speed(int speed)
 {
        int ret;
-       uint32_t freq;
-       uint16_t divider;
+       struct jaylink_speed tmp;
        int max_speed;
 
        if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_GET_SPEEDS)) {
-               ret = jaylink_get_speeds(devh, &freq, &divider);
+               ret = jaylink_get_speeds(devh, &tmp);
 
                if (ret != JAYLINK_OK) {
                        LOG_ERROR("jaylink_get_speeds() failed: %s.",
@@ -327,8 +326,8 @@ static int jlink_speed(int speed)
                        return ERROR_JTAG_DEVICE_ERROR;
                }
 
-               freq = freq / 1000;
-               max_speed = freq / divider;
+               tmp.freq /= 1000;
+               max_speed = tmp.freq / tmp.div;
        } else {
                max_speed = JLINK_MAX_SPEED;
        }
@@ -433,15 +432,16 @@ static int select_interface(void)
 static int jlink_register(void)
 {
        int ret;
-       int i;
+       size_t i;
        bool handle_found;
+       size_t count;
 
        if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_REGISTER))
                return ERROR_OK;
 
-       ret = jaylink_register(devh, &conn, connlist, NULL, NULL);
+       ret = jaylink_register(devh, &conn, connlist, &count);
 
-       if (ret < 0) {
+       if (ret != JAYLINK_OK) {
                LOG_ERROR("jaylink_register() failed: %s.",
                        jaylink_strerror_name(ret));
                return ERROR_FAIL;
@@ -449,7 +449,7 @@ static int jlink_register(void)
 
        handle_found = false;
 
-       for (i = 0; i < ret; i++) {
+       for (i = 0; i < count; i++) {
                if (connlist[i].handle == conn.handle) {
                        handle_found = true;
                        break;
@@ -502,6 +502,36 @@ static bool adjust_swd_buffer_size(void)
        return true;
 }
 
+static int jaylink_log_handler(const struct jaylink_context *ctx,
+               enum jaylink_log_level level, const char *format, va_list args,
+               void *user_data)
+{
+       enum log_levels tmp;
+
+       switch (level) {
+       case JAYLINK_LOG_LEVEL_ERROR:
+               tmp = LOG_LVL_ERROR;
+               break;
+       case JAYLINK_LOG_LEVEL_WARNING:
+               tmp = LOG_LVL_WARNING;
+               break;
+       /*
+        * Forward info messages to the debug output because they are more verbose
+        * than info messages of OpenOCD.
+        */
+       case JAYLINK_LOG_LEVEL_INFO:
+       case JAYLINK_LOG_LEVEL_DEBUG:
+               tmp = LOG_LVL_DEBUG;
+               break;
+       default:
+               tmp = LOG_LVL_WARNING;
+       }
+
+       log_vprintf_lf(tmp, __FILE__, __LINE__, __func__, format, args);
+
+       return 0;
+}
+
 static int jlink_init(void)
 {
        int ret;
@@ -523,10 +553,28 @@ static int jlink_init(void)
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       ret = jaylink_get_device_list(jayctx, &devs);
+       ret = jaylink_log_set_callback(jayctx, &jaylink_log_handler, NULL);
 
-       if (ret < 0) {
-               LOG_ERROR("jaylink_get_device_list() failed: %s.",
+       if (ret != JAYLINK_OK) {
+               LOG_ERROR("jaylink_log_set_callback() failed: %s.",
+                       jaylink_strerror_name(ret));
+               jaylink_exit(jayctx);
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       ret = jaylink_discovery_scan(jayctx, 0);
+
+       if (ret != JAYLINK_OK) {
+               LOG_ERROR("jaylink_discovery_scan() failed: %s.",
+                       jaylink_strerror_name(ret));
+               jaylink_exit(jayctx);
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       ret = jaylink_get_devices(jayctx, &devs, NULL);
+
+       if (ret != JAYLINK_OK) {
+               LOG_ERROR("jaylink_get_devices() failed: %s.",
                        jaylink_strerror_name(ret));
                jaylink_exit(jayctx);
                return ERROR_JTAG_INIT_FAILED;
@@ -576,7 +624,7 @@ static int jlink_init(void)
                LOG_ERROR("Failed to open device: %s.", jaylink_strerror_name(ret));
        }
 
-       jaylink_free_device_list(devs, 1);
+       jaylink_free_devices(devs, true);
 
        if (!found_device) {
                LOG_ERROR("No J-Link device found.");
@@ -685,7 +733,7 @@ static int jlink_init(void)
 
        conn.handle = 0;
        conn.pid = 0;
-       conn.hid = 0;
+       strcpy(conn.hid, "0.0.0.0");
        conn.iid = 0;
        conn.cid = 0;
 
@@ -729,6 +777,7 @@ static int jlink_init(void)
 static int jlink_quit(void)
 {
        int ret;
+       size_t count;
 
        if (trace_enabled) {
                ret = jaylink_swo_stop(devh);
@@ -739,9 +788,9 @@ static int jlink_quit(void)
        }
 
        if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_REGISTER)) {
-               ret = jaylink_unregister(devh, &conn, connlist, NULL, NULL);
+               ret = jaylink_unregister(devh, &conn, connlist, &count);
 
-               if (ret < 0)
+               if (ret != JAYLINK_OK)
                        LOG_ERROR("jaylink_unregister() failed: %s.",
                                jaylink_strerror_name(ret));
        }
@@ -878,14 +927,22 @@ COMMAND_HANDLER(jlink_usb_command)
 
 COMMAND_HANDLER(jlink_serial_command)
 {
+       int ret;
+
        if (CMD_ARGC != 1) {
                command_print(CMD_CTX, "Need exactly one argument for jlink serial.");
                return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       if (sscanf(CMD_ARGV[0], "%" SCNd32, &serial_number) != 1) {
+       ret = jaylink_parse_serial_number(CMD_ARGV[0], &serial_number);
+
+       if (ret == JAYLINK_ERR) {
                command_print(CMD_CTX, "Invalid serial number: %s.", CMD_ARGV[0]);
                return ERROR_FAIL;
+       } else if (ret != JAYLINK_OK) {
+               command_print(CMD_CTX, "jaylink_parse_serial_number() failed: %s.",
+                       jaylink_strerror_name(ret));
+               return ERROR_FAIL;
        }
 
        use_serial_number = true;
@@ -1708,7 +1765,8 @@ static void jlink_tap_init(void)
 {
        tap_length = 0;
        pending_scan_results_length = 0;
-       memset(tms_buffer, 0, sizeof(tdi_buffer));
+       memset(tms_buffer, 0, sizeof(tms_buffer));
+       memset(tdi_buffer, 0, sizeof(tdi_buffer));
 }
 
 static void jlink_clock_data(const uint8_t *out, unsigned out_offset,

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)