topic: add reset functions for SWD

Add swd_init_reset and swd_add_reset.
Add adapter_assert_reset and adapter_deassert_reset, and call them instead
of JTAG reset functions.

Change-Id: Ib2551c6fbb45513e0ae0dc331cfe3ee3f922298a
Signed-off-by: Simon Qian <simonqian.openocd@gmail.com>
Reviewed-on: http://openocd.zylin.com/526
Tested-by: jenkins
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
Simon Qian 2012-03-17 15:21:59 +08:00 committed by Spencer Oliver
parent a2935397b4
commit 7743e0fb43
7 changed files with 110 additions and 12 deletions

View File

@ -29,6 +29,7 @@
#include "config.h"
#endif
#include "jtag/interface.h"
#include "imp.h"
#include <target/algorithm.h>
#include <target/armv7m.h>
@ -1330,7 +1331,7 @@ COMMAND_HANDLER(stellaris_handle_recover_command)
LOG_ERROR("Can't recover Stellaris flash without SRST");
return ERROR_FAIL;
}
jtag_add_reset(0, 1);
adapter_assert_reset();
for (int i = 0; i < 5; i++) {
retval = dap_to_swd(bank->target);
@ -1343,7 +1344,7 @@ COMMAND_HANDLER(stellaris_handle_recover_command)
}
/* de-assert SRST */
jtag_add_reset(0, 0);
adapter_deassert_reset();
retval = jtag_execute_queue();
/* wait 400+ msec ... OK, "1+ second" is simpler */

View File

@ -33,6 +33,7 @@
#endif
#include "jtag.h"
#include "swd.h"
#include "interface.h"
#include <transport/transport.h>
@ -606,6 +607,46 @@ void jtag_add_clocks(int num_cycles)
}
}
void swd_add_reset(int req_srst)
{
if (req_srst) {
if (!(jtag_reset_config & RESET_HAS_SRST)) {
LOG_ERROR("BUG: can't assert SRST");
jtag_set_error(ERROR_FAIL);
return;
}
req_srst = 1;
}
/* Maybe change SRST signal state */
if (jtag_srst != req_srst) {
int retval;
retval = interface_jtag_add_reset(0, req_srst);
if (retval != ERROR_OK)
jtag_set_error(retval);
else
retval = jtag_execute_queue();
if (retval != ERROR_OK) {
LOG_ERROR("TRST/SRST error");
return;
}
/* SRST resets everything hooked up to that signal */
jtag_srst = req_srst;
if (jtag_srst) {
LOG_DEBUG("SRST line asserted");
if (adapter_nsrst_assert_width)
jtag_add_sleep(adapter_nsrst_assert_width * 1000);
} else {
LOG_DEBUG("SRST line released");
if (adapter_nsrst_delay)
jtag_add_sleep(adapter_nsrst_delay * 1000);
}
}
}
void jtag_add_reset(int req_tlr_or_trst, int req_srst)
{
int trst_with_tlr = 0;
@ -1455,6 +1496,20 @@ int adapter_quit(void)
return ERROR_OK;
}
int swd_init_reset(struct command_context *cmd_ctx)
{
int retval = adapter_init(cmd_ctx);
if (retval != ERROR_OK)
return retval;
LOG_DEBUG("Initializing with hard SRST reset");
if (jtag_reset_config & RESET_HAS_SRST)
swd_add_reset(1);
swd_add_reset(0);
retval = jtag_execute_queue();
return retval;
}
int jtag_init_reset(struct command_context *cmd_ctx)
{
@ -1738,3 +1793,32 @@ bool transport_is_jtag(void)
{
return get_current_transport() == &jtag_transport;
}
void adapter_assert_reset(void)
{
if (transport_is_jtag()) {
if (jtag_reset_config & RESET_SRST_PULLS_TRST)
jtag_add_reset(1, 1);
else
jtag_add_reset(0, 1);
} else if (transport_is_swd())
swd_add_reset(1);
else if (get_current_transport() != NULL)
LOG_ERROR("reset is not supported on %s",
get_current_transport()->name);
else
LOG_ERROR("transport is not selected");
}
void adapter_deassert_reset(void)
{
if (transport_is_jtag())
jtag_add_reset(0, 0);
else if (transport_is_swd())
swd_add_reset(0);
else if (get_current_transport() != NULL)
LOG_ERROR("reset is not supported on %s",
get_current_transport()->name);
else
LOG_ERROR("transport is not selected");
}

View File

@ -304,4 +304,7 @@ extern const char *jtag_only[];
extern const struct swd_driver *swd;
void adapter_assert_reset(void);
void adapter_deassert_reset(void);
#endif /* OPENOCD_JTAG_INTERFACE_H */

View File

@ -17,6 +17,9 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef SWD_H
#define SWD_H
/* Bits in SWD command packets, written from host to target
* first bit on the wire is START
*/
@ -128,4 +131,9 @@ struct swd_driver {
int *(*trace)(bool swo);
};
int swd_init_reset(struct command_context *cmd_ctx);
void swd_add_reset(int req_srst);
bool transport_is_swd(void);
#endif /* SWD_H */

View File

@ -33,6 +33,7 @@
#endif
#include "jtag.h"
#include "swd.h"
#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
@ -672,6 +673,7 @@ static int jim_jtag_arp_init(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
int e = ERROR_OK;
Jim_GetOptInfo goi;
Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
if (goi.argc != 0) {
@ -679,7 +681,11 @@ static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const
return JIM_ERR;
}
struct command_context *context = current_command_context(interp);
int e = jtag_init_reset(context);
if (transport_is_jtag())
e = jtag_init_reset(context);
else if (transport_is_swd())
e = swd_init_reset(context);
if (e != ERROR_OK) {
Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e);
Jim_SetResultFormatted(goi.interp, "error: %#s", eObj);

View File

@ -69,6 +69,7 @@
#include "config.h"
#endif
#include "jtag/interface.h"
#include "arm.h"
#include "arm_adi_v5.h"
#include <helper/time_support.h>
@ -977,10 +978,7 @@ int dap_syssec_kinetis_mdmap(struct adiv5_dap *dap)
/* we need to assert reset */
if (jtag_reset_config & RESET_HAS_SRST) {
/* default to asserting srst */
if (jtag_reset_config & RESET_SRST_PULLS_TRST)
jtag_add_reset(1, 1);
else
jtag_add_reset(0, 1);
adapter_assert_reset();
} else {
LOG_DEBUG("SRST not configured");
dap_ap_select(dap, 0);

View File

@ -31,6 +31,7 @@
#include "config.h"
#endif
#include "jtag/interface.h"
#include "breakpoints.h"
#include "cortex_m.h"
#include "target_request.h"
@ -995,10 +996,7 @@ static int cortex_m3_assert_reset(struct target *target)
if (jtag_reset_config & RESET_HAS_SRST) {
/* default to asserting srst */
if (jtag_reset_config & RESET_SRST_PULLS_TRST)
jtag_add_reset(1, 1);
else
jtag_add_reset(0, 1);
adapter_assert_reset();
} else {
/* Use a standard Cortex-M3 software reset mechanism.
* We default to using VECRESET as it is supported on all current cores.
@ -1051,7 +1049,7 @@ static int cortex_m3_deassert_reset(struct target *target)
target_state_name(target));
/* deassert reset lines */
jtag_add_reset(0, 0);
adapter_deassert_reset();
return ERROR_OK;
}