OK, I find it's even not easy to add swd_reset.
Here is what I do:
In arm_adi_v5.c, seems simple:
void adi_v5_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);
}
void adi_v5_deassert_reset(void)
{
if (transport_is_jtag())
jtag_add_reset(0, 0);
else if (transport_is_swd())
swd_add_reset(0);
}
In core.c:
void swd_add_reset(int req_srst)
{
int new_srst = 0;
if (req_srst) {
if (!(jtag_reset_config & RESET_HAS_SRST)) {
LOG_ERROR("BUG: can't assert SRST");
jtag_set_error(ERROR_FAIL);
return;
}
new_srst = 1;
}
/* Maybe change TRST and/or SRST signal state */
if (jtag_srst != new_srst) {
int retval;
retval = interface_swd_add_reset(new_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 */
if (jtag_srst != new_srst) {
jtag_srst = new_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);
}
}
}
I didn't change the name of jtag_reset_config, jtag_set_error,
jtag_execute_queue, and even jtag_add_sleep.
Despite the jtag_ prefix, I can make things working.
Should I add a set of same functions with swd_ prefix?
simonqian.openocd
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel