}
-static int jlink_init(void)
+static int jlink_open_device(uint32_t ifaces, bool *found_device)
{
- int ret;
- struct jaylink_device **devs;
- unsigned int i;
- bool found_device;
- uint32_t tmp;
- char *firmware_version;
- struct jaylink_hardware_version hwver;
- struct jaylink_hardware_status hwstatus;
- enum jaylink_usb_address address;
- size_t length;
- size_t num_devices;
- uint32_t host_interfaces;
-
- LOG_DEBUG("Using libjaylink %s (compiled with %s).",
- jaylink_version_package_get_string(), JAYLINK_VERSION_PACKAGE_STRING);
-
- if (!jaylink_library_has_cap(JAYLINK_CAP_HIF_USB) && use_usb_address) {
- LOG_ERROR("J-Link driver does not support USB devices.");
- return ERROR_JTAG_INIT_FAILED;
- }
-
- ret = jaylink_init(&jayctx);
-
+ int ret = jaylink_discovery_scan(jayctx, ifaces);
if (ret != JAYLINK_OK) {
- LOG_ERROR("jaylink_init() failed: %s.", jaylink_strerror(ret));
- return ERROR_JTAG_INIT_FAILED;
- }
-
- ret = jaylink_log_set_callback(jayctx, &jaylink_log_handler, NULL);
-
- if (ret != JAYLINK_OK) {
- LOG_ERROR("jaylink_log_set_callback() failed: %s.",
- jaylink_strerror(ret));
- jaylink_exit(jayctx);
- return ERROR_JTAG_INIT_FAILED;
- }
-
- host_interfaces = JAYLINK_HIF_USB;
-
- if (use_serial_number)
- host_interfaces |= JAYLINK_HIF_TCP;
-
- ret = jaylink_discovery_scan(jayctx, host_interfaces);
-
- if (ret != JAYLINK_OK) {
- LOG_ERROR("jaylink_discovery_scan() failed: %s.",
- jaylink_strerror(ret));
+ LOG_ERROR("jaylink_discovery_scan() failed: %s.", jaylink_strerror(ret));
jaylink_exit(jayctx);
return ERROR_JTAG_INIT_FAILED;
}
+ size_t num_devices;
+ struct jaylink_device **devs;
ret = jaylink_get_devices(jayctx, &devs, &num_devices);
if (ret != JAYLINK_OK) {
return ERROR_JTAG_INIT_FAILED;
}
- found_device = false;
+ *found_device = false;
- for (i = 0; devs[i]; i++) {
+ for (size_t i = 0; devs[i]; i++) {
struct jaylink_device *dev = devs[i];
if (use_serial_number) {
+ uint32_t tmp;
ret = jaylink_device_get_serial_number(dev, &tmp);
if (ret == JAYLINK_ERR_NOT_AVAILABLE) {
}
if (use_usb_address) {
+ enum jaylink_usb_address address;
ret = jaylink_device_get_usb_address(dev, &address);
if (ret == JAYLINK_ERR_NOT_SUPPORTED) {
ret = jaylink_open(dev, &devh);
if (ret == JAYLINK_OK) {
- found_device = true;
+ *found_device = true;
break;
}
}
jaylink_free_devices(devs, true);
+ return ERROR_OK;
+}
+
+
+static int jlink_init(void)
+{
+ int ret;
+ char *firmware_version;
+ struct jaylink_hardware_version hwver;
+ struct jaylink_hardware_status hwstatus;
+ size_t length;
+
+ LOG_DEBUG("Using libjaylink %s (compiled with %s).",
+ jaylink_version_package_get_string(), JAYLINK_VERSION_PACKAGE_STRING);
+
+ if (!jaylink_library_has_cap(JAYLINK_CAP_HIF_USB) && use_usb_address) {
+ LOG_ERROR("J-Link driver does not support USB devices.");
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
+ ret = jaylink_init(&jayctx);
+
+ if (ret != JAYLINK_OK) {
+ LOG_ERROR("jaylink_init() failed: %s.", jaylink_strerror(ret));
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
+ ret = jaylink_log_set_callback(jayctx, &jaylink_log_handler, NULL);
+
+ if (ret != JAYLINK_OK) {
+ LOG_ERROR("jaylink_log_set_callback() failed: %s.",
+ jaylink_strerror(ret));
+ jaylink_exit(jayctx);
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
+ bool found_device;
+ ret = jlink_open_device(JAYLINK_HIF_USB, &found_device);
+ if (ret != ERROR_OK)
+ return ret;
+
+ if (!found_device && use_serial_number) {
+ ret = jlink_open_device(JAYLINK_HIF_TCP, &found_device);
+ if (ret != ERROR_OK)
+ return ret;
+ }
if (!found_device) {
LOG_ERROR("No J-Link device found.");