diff --git a/src/platforms/pc-stlinkv2/stlinkv2.c b/src/platforms/pc-stlinkv2/stlinkv2.c index 4d8d6992..f3de39e4 100644 --- a/src/platforms/pc-stlinkv2/stlinkv2.c +++ b/src/platforms/pc-stlinkv2/stlinkv2.c @@ -800,10 +800,23 @@ void stlink_init(int argc, char **argv) Stlink.req_trans = libusb_alloc_transfer(0); Stlink.rep_trans = libusb_alloc_transfer(0); stlink_version(); - if (Stlink.ver_stlink < 3 && Stlink.ver_jtag < 32) { - DEBUG("Please update Firmware\n"); - goto error_1; - } else if (Stlink.ver_stlink == 3 && Stlink.ver_jtag < 3) { + if ((Stlink.ver_stlink < 3 && Stlink.ver_jtag < 32) || + (Stlink.ver_stlink == 3 && Stlink.ver_jtag < 3)) { + /* Maybe the adapter is in some strange state. Try to reset */ + int result = libusb_reset_device(Stlink.handle); + DEBUG("Trying reset\n"); + if (result == LIBUSB_ERROR_BUSY) { /* Try again */ + platform_delay(50); + result = libusb_reset_device(Stlink.handle); + } + if (result != LIBUSB_SUCCESS) { + DEBUG("libusb_reset_device failed\n"); + goto error_1; + } + stlink_version(); + } + if ((Stlink.ver_stlink < 3 && Stlink.ver_jtag < 32) || + (Stlink.ver_stlink == 3 && Stlink.ver_jtag < 3)) { DEBUG("Please update Firmware\n"); goto error_1; } @@ -1095,6 +1108,7 @@ void stlink_readmem(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) { if (len == 0) return; + size_t read_len = len; uint8_t type; char *CMD; if (src & 1 || len & 1) { @@ -1104,6 +1118,8 @@ void stlink_readmem(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) DEBUG(" Too large!\n"); return; } + if (len == 1) + read_len ++; /* Fix read length as in openocd*/ } else if (src & 3 || len & 3) { CMD = "READMEM_16BIT"; type = STLINK_DEBUG_APIV2_READMEM_16BIT; @@ -1120,7 +1136,7 @@ void stlink_readmem(ADIv5_AP_t *ap, void *dest, uint32_t src, size_t len) src & 0xff, (src >> 8) & 0xff, (src >> 16) & 0xff, (src >> 24) & 0xff, len & 0xff, len >> 8, ap->apsel}; - int res = read_retry(cmd, 16, dest, len); + int res = read_retry(cmd, 16, dest, read_len); if (res == STLINK_ERROR_OK) { uint8_t *p = (uint8_t*)dest; for (size_t i = 0; i < len ; i++) {