diff options
author | Paul Fertser <fercerpav@gmail.com> | 2014-06-25 22:50:03 +0400 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-07-03 18:40:59 +0000 |
commit | 3039f01aaf63cd2c4d2c1f15dbba99ede6f49392 (patch) | |
tree | 76cb268c525667d7128f8f46ed7fe67752b9da5f /src/jtag/drivers | |
parent | aa79f7b7e0124f993da379690f3b629ef6d76c6c (diff) |
drivers/cmsis_dap_usb: restructure init sequence a bit
This fixes the issue of improper initialisation sequence and in
particular makes "cmsis_dap_vid_pid" config specification functional.
Not really elegant but it's in line with the ftdi driver and so can be
reworked in a uniform way later when the internal API is changed.
Change-Id: Ief9fc64ad0ac24e1c66727153f383e4f30a830c7
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2192
Reviewed-by: Andrey Yurovsky <yurovsky@gmail.com>
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/jtag/drivers')
-rw-r--r-- | src/jtag/drivers/cmsis_dap_usb.c | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/src/jtag/drivers/cmsis_dap_usb.c b/src/jtag/drivers/cmsis_dap_usb.c index 7d4c579a..4073d215 100644 --- a/src/jtag/drivers/cmsis_dap_usb.c +++ b/src/jtag/drivers/cmsis_dap_usb.c @@ -60,6 +60,7 @@ /* vid = pid = 0 marks the end of the list */ static uint16_t cmsis_dap_vid[MAX_USB_IDS + 1] = { 0 }; static uint16_t cmsis_dap_pid[MAX_USB_IDS + 1] = { 0 }; +static bool swd_mode; #define PACKET_SIZE (64 + 1) /* 64 bytes plus report id */ #define USB_TIMEOUT 1000 @@ -720,11 +721,50 @@ static int cmsis_dap_reset_link(void) return retval; } +static int cmsis_dap_swd_open(void) +{ + int retval; + + DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_open"); + + if (cmsis_dap_handle == NULL) { + + /* SWD init */ + retval = cmsis_dap_usb_open(); + if (retval != ERROR_OK) + return retval; + + retval = cmsis_dap_get_caps_info(); + if (retval != ERROR_OK) + return retval; + } + + if (!(cmsis_dap_handle->caps & INFO_CAPS_SWD)) { + LOG_ERROR("CMSIS-DAP: SWD not supported"); + return ERROR_JTAG_DEVICE_ERROR; + } + + retval = cmsis_dap_cmd_DAP_Connect(CONNECT_SWD); + if (retval != ERROR_OK) + return retval; + + /* Add more setup here.??... */ + + LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)"); + return ERROR_OK; +} + static int cmsis_dap_init(void) { int retval; uint8_t *data; + if (swd_mode) { + retval = cmsis_dap_swd_open(); + if (retval != ERROR_OK) + return retval; + } + if (cmsis_dap_handle == NULL) { /* JTAG init */ @@ -832,34 +872,7 @@ static int cmsis_dap_init(void) static int cmsis_dap_swd_init(void) { - int retval; - - DEBUG_IO("CMSIS-DAP: cmsis_dap_swd_init"); - - if (cmsis_dap_handle == NULL) { - - /* SWD init */ - retval = cmsis_dap_usb_open(); - if (retval != ERROR_OK) - return retval; - - retval = cmsis_dap_get_caps_info(); - if (retval != ERROR_OK) - return retval; - } - - if (!(cmsis_dap_handle->caps & INFO_CAPS_SWD)) { - LOG_ERROR("CMSIS-DAP: SWD not supported"); - return ERROR_JTAG_DEVICE_ERROR; - } - - retval = cmsis_dap_cmd_DAP_Connect(CONNECT_SWD); - if (retval != ERROR_OK) - return retval; - - /* Add more setup here.??... */ - - LOG_INFO("CMSIS-DAP: Interface Initialised (SWD)"); + swd_mode = true; return ERROR_OK; } |