stlink: add error status check
This patch add the status check. Change-Id: I0fdb9bf66dad5ae416c7aa4c6e19116f846571f9 Signed-off-by: Mathias K <kesmtp@freenet.de> Reviewed-on: http://openocd.zylin.com/463 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
445770c081
commit
631b80fd08
|
@ -84,8 +84,8 @@ struct stlink_usb_handle_s {
|
||||||
enum stlink_jtag_api_version jtag_api;
|
enum stlink_jtag_api_version jtag_api;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STLINK_OK 0x80
|
#define STLINK_DEBUG_ERR_OK 0x80
|
||||||
#define STLINK_FALSE 0x81
|
#define STLINK_DEBUG_ERR_FAULT 0x81
|
||||||
#define STLINK_CORE_RUNNING 0x80
|
#define STLINK_CORE_RUNNING 0x80
|
||||||
#define STLINK_CORE_HALTED 0x81
|
#define STLINK_CORE_HALTED 0x81
|
||||||
#define STLINK_CORE_STAT_UNKNOWN -1
|
#define STLINK_CORE_STAT_UNKNOWN -1
|
||||||
|
@ -134,12 +134,19 @@ struct stlink_usb_handle_s {
|
||||||
#define STLINK_DEBUG_READCOREID 0x22
|
#define STLINK_DEBUG_READCOREID 0x22
|
||||||
|
|
||||||
#define STLINK_DEBUG_APIV2_ENTER 0x30
|
#define STLINK_DEBUG_APIV2_ENTER 0x30
|
||||||
|
#define STLINK_DEBUG_APIV2_READ_IDCODES 0x31
|
||||||
#define STLINK_DEBUG_APIV2_RESETSYS 0x32
|
#define STLINK_DEBUG_APIV2_RESETSYS 0x32
|
||||||
#define STLINK_DEBUG_APIV2_READREG 0x33
|
#define STLINK_DEBUG_APIV2_READREG 0x33
|
||||||
#define STLINK_DEBUG_APIV2_WRITEREG 0x34
|
#define STLINK_DEBUG_APIV2_WRITEREG 0x34
|
||||||
|
|
||||||
#define STLINK_DEBUG_APIV2_READALLREGS 0x3A
|
#define STLINK_DEBUG_APIV2_READALLREGS 0x3A
|
||||||
|
|
||||||
|
#define STLINK_DEBUG_APIV2_DRIVE_NRST 0x3C
|
||||||
|
|
||||||
|
#define STLINK_DEBUG_APIV2_DRIVE_NRST_LOW 0x00
|
||||||
|
#define STLINK_DEBUG_APIV2_DRIVE_NRST_HIGH 0x01
|
||||||
|
#define STLINK_DEBUG_APIV2_DRIVE_NRST_PULSE 0x02
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
enum stlink_mode {
|
enum stlink_mode {
|
||||||
STLINK_MODE_UNKNOWN = 0,
|
STLINK_MODE_UNKNOWN = 0,
|
||||||
|
@ -352,7 +359,44 @@ static void stlink_usb_init_buffer(void *handle)
|
||||||
|
|
||||||
h = (struct stlink_usb_handle_s *)handle;
|
h = (struct stlink_usb_handle_s *)handle;
|
||||||
|
|
||||||
memset(h->txbuf, 0, STLINK_CMD_SIZE);
|
memset(h->txbuf, 0, STLINK_TX_SIZE);
|
||||||
|
memset(h->rxbuf, 0, STLINK_RX_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char * const stlink_usb_error_msg[] = {
|
||||||
|
"unknown"
|
||||||
|
};
|
||||||
|
|
||||||
|
/** */
|
||||||
|
static int stlink_usb_error_check(void *handle)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
const char *err_msg = 0;
|
||||||
|
struct stlink_usb_handle_s *h;
|
||||||
|
|
||||||
|
assert(handle != NULL);
|
||||||
|
|
||||||
|
h = (struct stlink_usb_handle_s *)handle;
|
||||||
|
|
||||||
|
/* TODO: no error checking yet on api V1 */
|
||||||
|
if (h->jtag_api == STLINK_JTAG_API_V1)
|
||||||
|
h->rxbuf[0] = STLINK_DEBUG_ERR_OK;
|
||||||
|
|
||||||
|
switch (h->rxbuf[0]) {
|
||||||
|
case STLINK_DEBUG_ERR_OK:
|
||||||
|
res = ERROR_OK;
|
||||||
|
break;
|
||||||
|
case STLINK_DEBUG_ERR_FAULT:
|
||||||
|
default:
|
||||||
|
err_msg = stlink_usb_error_msg[0];
|
||||||
|
res = ERROR_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res != ERROR_OK)
|
||||||
|
LOG_DEBUG("status error: %d ('%s')", h->rxbuf[0], err_msg);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
@ -431,6 +475,7 @@ static int stlink_usb_current_mode(void *handle, uint8_t *mode)
|
||||||
static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
|
static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
int rx_size = 0;
|
||||||
struct stlink_usb_handle_s *h;
|
struct stlink_usb_handle_s *h;
|
||||||
|
|
||||||
assert(handle != NULL);
|
assert(handle != NULL);
|
||||||
|
@ -466,11 +511,21 @@ static int stlink_usb_mode_enter(void *handle, enum stlink_mode type)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = stlink_usb_recv(handle, h->txbuf, STLINK_CMD_SIZE, 0, 0);
|
/* on api V2 we are able the read the latest command
|
||||||
|
* status
|
||||||
|
* TODO: we need the test on api V1 too
|
||||||
|
*/
|
||||||
|
if (h->jtag_api == STLINK_JTAG_API_V2)
|
||||||
|
rx_size = 2;
|
||||||
|
|
||||||
|
res = stlink_usb_recv(handle, h->txbuf, STLINK_CMD_SIZE, h->rxbuf, rx_size);
|
||||||
|
|
||||||
if (res != ERROR_OK)
|
if (res != ERROR_OK)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
return ERROR_OK;
|
res = stlink_usb_error_check(h);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
@ -505,6 +560,7 @@ static int stlink_usb_mode_leave(void *handle, enum stlink_mode type)
|
||||||
}
|
}
|
||||||
|
|
||||||
res = stlink_usb_recv(handle, h->txbuf, STLINK_CMD_SIZE, 0, 0);
|
res = stlink_usb_recv(handle, h->txbuf, STLINK_CMD_SIZE, 0, 0);
|
||||||
|
|
||||||
if (res != ERROR_OK)
|
if (res != ERROR_OK)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
@ -542,6 +598,7 @@ static int stlink_usb_init_mode(void *handle)
|
||||||
emode = STLINK_MODE_DEBUG_SWIM;
|
emode = STLINK_MODE_DEBUG_SWIM;
|
||||||
break;
|
break;
|
||||||
case STLINK_DEV_BOOTLOADER_MODE:
|
case STLINK_DEV_BOOTLOADER_MODE:
|
||||||
|
case STLINK_DEV_MASS_MODE:
|
||||||
default:
|
default:
|
||||||
emode = STLINK_MODE_UNKNOWN;
|
emode = STLINK_MODE_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue