};
/** */
-static int stlink_usb_error_check(void *handle)
+static int stlink_usb_error_check(void *handle, int api)
{
int res;
const char *err_msg = 0;
assert(handle != NULL);
/* TODO: no error checking yet on api V1 */
- if (h->jtag_api == STLINK_JTAG_API_V1)
+ if (api == STLINK_JTAG_API_V1)
h->databuf[0] = STLINK_DEBUG_ERR_OK;
switch (h->databuf[0]) {
int res;
int rx_size = 0;
struct stlink_usb_handle_s *h = handle;
+ int api = h->jtag_api;
+
+ api = 1;
assert(handle != NULL);
* status
* TODO: we need the test on api V1 too
*/
- if (h->jtag_api == STLINK_JTAG_API_V2)
+ if (api == STLINK_JTAG_API_V2)
rx_size = 2;
stlink_usb_init_buffer(handle, STLINK_RX_EP, rx_size);
switch (type) {
- case STLINK_MODE_DEBUG_JTAG:
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
- if (h->jtag_api == STLINK_JTAG_API_V1)
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
- else
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_ENTER_JTAG;
- break;
- case STLINK_MODE_DEBUG_SWD:
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
- if (h->jtag_api == STLINK_JTAG_API_V1)
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
- else
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
- h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_ENTER_SWD;
- break;
- case STLINK_MODE_DEBUG_SWIM:
- h->cmdbuf[h->cmdidx++] = STLINK_SWIM_COMMAND;
- h->cmdbuf[h->cmdidx++] = STLINK_SWIM_ENTER;
- break;
- case STLINK_MODE_DFU:
- case STLINK_MODE_MASS:
- default:
- return ERROR_FAIL;
+ case STLINK_MODE_DEBUG_JTAG:
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
+ if (api == STLINK_JTAG_API_V1)
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
+ else
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_ENTER_JTAG;
+ break;
+ case STLINK_MODE_DEBUG_SWD:
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_COMMAND;
+ if (api == STLINK_JTAG_API_V1)
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV1_ENTER;
+ else
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_APIV2_ENTER;
+ h->cmdbuf[h->cmdidx++] = STLINK_DEBUG_ENTER_SWD;
+ break;
+ case STLINK_MODE_DEBUG_SWIM:
+ h->cmdbuf[h->cmdidx++] = STLINK_SWIM_COMMAND;
+ h->cmdbuf[h->cmdidx++] = STLINK_SWIM_ENTER;
+ break;
+ case STLINK_MODE_DFU:
+ case STLINK_MODE_MASS:
+ default:
+ return ERROR_FAIL;
}
+ LOG_DEBUG("mode enter command: (%d bytes)", h->cmdidx);
+ for (res = 0; res < h->cmdidx; res++)
+ LOG_DEBUG("\t%02x", h->cmdbuf[res]);
res = stlink_usb_xfer(handle, h->databuf, rx_size);
+ LOG_DEBUG("mode enter result: (%d bytes)", rx_size);
+ for (res = 0; res < rx_size; res++)
+ LOG_DEBUG("\t%02x", h->databuf[res]);
if (res != ERROR_OK)
return res;
- res = stlink_usb_error_check(h);
+ res = stlink_usb_error_check(h, api);
return res;
}
}
}
- LOG_DEBUG("MODE: 0x%02X", mode);
-
/* set selected mode */
switch (h->transport) {
case HL_TRANSPORT_SWD:
break;
}
+ LOG_DEBUG("MODE: 0x%02X -> 0x%02x under reset %d", mode, emode, connect_under_reset);
+
if (emode == STLINK_MODE_UNKNOWN) {
LOG_ERROR("selected mode (transport) not supported");
return ERROR_FAIL;
LOG_DEBUG("mode %d", mode);
break;
}
- LOG_ERROR("current mode failed");
- if (++times == 3)
+ if (++times == 3) {
+ LOG_ERROR("current mode failed");
goto error_open;
+ }
}
enum stlink_mode emode;