static int vsllink_init(void) { vsllink_handle = vsllink_usb_open(); if (vsllink_handle == 0) { LOG_ERROR("Can't find USB JTAG Interface!" \ "Please check connection and permissions."); return ERROR_JTAG_INIT_FAILED; } LOG_DEBUG("vsllink found on %04X:%04X", versaloon_interface.usb_setting.vid, versaloon_interface.usb_setting.pid); versaloon_usb_device_handle = vsllink_handle->usb_handle; if (ERROR_OK != versaloon_interface.init()) return ERROR_FAIL; if (versaloon_interface.usb_setting.buf_size < 32) { versaloon_interface.fini(); return ERROR_FAIL; } /* malloc buffer size for tap */ tap_buffer_size = versaloon_interface.usb_setting.buf_size - 32; vsllink_free_buffer(); tdi_buffer = (uint8_t *)malloc(tap_buffer_size); tdo_buffer = (uint8_t *)malloc(tap_buffer_size); tms_buffer = (uint8_t *)malloc(tap_buffer_size); if ((NULL == tdi_buffer) || (NULL == tdo_buffer) || (NULL == tms_buffer)) { vsllink_quit(); return ERROR_FAIL; } versaloon_interface.adaptors.jtag_raw.init(0); versaloon_interface.adaptors.jtag_raw.config(0, jtag_get_speed_khz()); versaloon_interface.adaptors.gpio.init(0); versaloon_interface.adaptors.gpio.config(0, GPIO_SRST | GPIO_TRST, GPIO_TRST, GPIO_SRST, GPIO_SRST); if (ERROR_OK != versaloon_interface.adaptors.peripheral_commit()) return ERROR_FAIL; vsllink_reset(0, 0); vsllink_tap_init(); return ERROR_OK; }
static int jlink_init(void) { 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; ret = jaylink_init(&jayctx); if (ret != JAYLINK_OK) { LOG_ERROR("jaylink_init() failed: %s.", jaylink_strerror_name(ret)); return ERROR_JTAG_INIT_FAILED; } ret = jaylink_get_device_list(jayctx, &devs); if (ret < 0) { LOG_ERROR("jaylink_get_device_list() failed: %s.", jaylink_strerror_name(ret)); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } found_device = false; if (!use_serial_number && !use_usb_address) LOG_INFO("No device selected, using first device."); for (i = 0; devs[i]; i++) { jaylink_device_get_serial_number(devs[i], &tmp); ret = jaylink_device_get_usb_address(devs[i]); if (use_usb_address && usb_address != ret) continue; if (use_serial_number && tmp != serial_number) continue; ret = jaylink_open(devs[i], &devh); if (ret != JAYLINK_OK) { LOG_ERROR("Failed to open device: %s.", jaylink_strerror_name(ret)); continue; } found_device = true; break; } jaylink_free_device_list(devs, 1); if (!found_device) { LOG_ERROR("No J-Link device found."); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } /* * Be careful with changing the following initialization sequence because * some devices are known to be sensitive regarding the order. */ ret = jaylink_get_firmware_version(devh, &firmware_version); if (ret > 0) { LOG_INFO("%s", firmware_version); free(firmware_version); } else if (!ret) { LOG_WARNING("Device responds empty firmware version string."); } else { LOG_ERROR("jaylink_get_firmware_version() failed: %s.", jaylink_strerror_name(ret)); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } memset(caps, 0, JAYLINK_DEV_EXT_CAPS_SIZE); ret = jaylink_get_caps(devh, caps); if (ret != JAYLINK_OK) { LOG_ERROR("jaylink_get_caps() failed: %s.", jaylink_strerror_name(ret)); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_GET_EXT_CAPS)) { ret = jaylink_get_extended_caps(devh, caps); if (ret != JAYLINK_OK) { LOG_ERROR("jaylink_get_extended_caps() failed: %s.", jaylink_strerror_name(ret)); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } } jtag_command_version = JAYLINK_JTAG_V2; if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_GET_HW_VERSION)) { ret = jaylink_get_hardware_version(devh, &hwver); if (ret != JAYLINK_OK) { LOG_ERROR("Failed to retrieve hardware version: %s.", jaylink_strerror_name(ret)); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } LOG_INFO("Hardware version: %u.%02u", hwver.major, hwver.minor); if (hwver.major >= 5) jtag_command_version = JAYLINK_JTAG_V3; } if (iface == JAYLINK_TIF_SWD) { /* * Adjust the SWD transaction buffer size in case there is already * allocated memory on the device. This happens for example if the * memory for SWO capturing is still allocated because the software * which used the device before has not been shut down properly. */ if (!adjust_swd_buffer_size()) { jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } } if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_READ_CONFIG)) { if (!read_device_config(&config)) { LOG_ERROR("Failed to read device configuration data."); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } memcpy(&tmp_config, &config, sizeof(struct device_config)); } ret = jaylink_get_hardware_status(devh, &hwstatus); if (ret != JAYLINK_OK) { LOG_ERROR("jaylink_get_hardware_status() failed: %s.", jaylink_strerror_name(ret)); jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } LOG_INFO("VTarget = %u.%03u V", hwstatus.target_voltage / 1000, hwstatus.target_voltage % 1000); conn.handle = 0; conn.pid = 0; conn.hid = 0; conn.iid = 0; conn.cid = 0; ret = jlink_register(); if (ret != ERROR_OK) { jaylink_close(devh); jaylink_exit(jayctx); return ERROR_JTAG_INIT_FAILED; } ret = select_interface(); if (ret != ERROR_OK) { jaylink_close(devh); jaylink_exit(jayctx); return ret; } jlink_reset(0, 0); jtag_sleep(3000); jlink_tap_init(); jlink_speed(jtag_get_speed_khz()); if (iface == JAYLINK_TIF_JTAG) { /* * J-Link devices with firmware version v5 and v6 seems to have an issue * if the first tap move is not divisible by 8, so we send a TLR on * first power up. */ uint8_t tms = 0xff; jlink_clock_data(NULL, 0, &tms, 0, NULL, 0, 8); jlink_flush(); } return ERROR_OK; }