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:
parent
a2935397b4
commit
7743e0fb43
|
@ -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 */
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue