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:
committed by
Spencer Oliver
parent
a2935397b4
commit
7743e0fb43
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user