arm_adi_v5: Add ability to ignore the CSYSPWRUPACK bit
The CTRL/STAT register in the ARM DAP DP has a debug power up ack bit and a system power up ack bit. Some devices do not set the system power up ack bit until sometime later. To avoid having the initial target examination fail due to this or to have a sticky bit error report claim power failure due to this a user can now specify that this bit should be ignored. Change-Id: I2451234bbe904984e29562ef6f616cc6d6f60732 Signed-off-by: Eric Katzfey <eric.katzfey@mentalbee.com> Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com> Reviewed-on: http://openocd.zylin.com/3710 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
parent
06e6c2297f
commit
18fd1d8b47
|
@ -3786,6 +3786,11 @@ a TAP doesn't conform to the JTAG specification.
|
||||||
to verify that instruction scans work correctly.
|
to verify that instruction scans work correctly.
|
||||||
Such scans are not used by OpenOCD except to verify that
|
Such scans are not used by OpenOCD except to verify that
|
||||||
there seems to be no problems with JTAG scan chain operations.
|
there seems to be no problems with JTAG scan chain operations.
|
||||||
|
@item @code{-ignore-syspwrupack}
|
||||||
|
@*Specify this to ignore the CSYSPWRUPACK bit in the ARM DAP DP CTRL/STAT
|
||||||
|
register during initial examination and when checking the sticky error bit.
|
||||||
|
This bit is normally checked after setting the CSYSPWRUPREQ bit, but some
|
||||||
|
devices do not set the ack bit until sometime later.
|
||||||
@end itemize
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@ -4021,11 +4026,21 @@ instead of "@option{-chain-position} @var{dotted.name}" when the target is creat
|
||||||
|
|
||||||
The @command{dap} command group supports the following sub-commands:
|
The @command{dap} command group supports the following sub-commands:
|
||||||
|
|
||||||
@deffn Command {dap create} dap_name @option{-chain-position} dotted.name
|
@deffn Command {dap create} dap_name @option{-chain-position} dotted.name configparams...
|
||||||
Declare a DAP instance named @var{dap_name} linked to the JTAG tap
|
Declare a DAP instance named @var{dap_name} linked to the JTAG tap
|
||||||
@var{dotted.name}. This also creates a new command (@command{dap_name})
|
@var{dotted.name}. This also creates a new command (@command{dap_name})
|
||||||
which is used for various purposes including additional configuration.
|
which is used for various purposes including additional configuration.
|
||||||
There can only be one DAP for each JTAG tap in the system.
|
There can only be one DAP for each JTAG tap in the system.
|
||||||
|
|
||||||
|
A DAP may also provide optional @var{configparams}:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item @code{-ignore-syspwrupack}
|
||||||
|
@*Specify this to ignore the CSYSPWRUPACK bit in the ARM DAP DP CTRL/STAT
|
||||||
|
register during initial examination and when checking the sticky error bit.
|
||||||
|
This bit is normally checked after setting the CSYSPWRUPREQ bit, but some
|
||||||
|
devices do not set the ack bit until sometime later.
|
||||||
|
@end itemize
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@deffn Command {dap names}
|
@deffn Command {dap names}
|
||||||
|
|
|
@ -553,7 +553,7 @@ static int jtagdp_overrun_check(struct adiv5_dap *dap)
|
||||||
static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
|
static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
uint32_t ctrlstat;
|
uint32_t ctrlstat, pwrmask;
|
||||||
|
|
||||||
/* too expensive to call keep_alive() here */
|
/* too expensive to call keep_alive() here */
|
||||||
|
|
||||||
|
@ -571,8 +571,10 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
|
||||||
if (ctrlstat & SSTICKYERR) {
|
if (ctrlstat & SSTICKYERR) {
|
||||||
LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
|
LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
|
||||||
/* Check power to debug regions */
|
/* Check power to debug regions */
|
||||||
if ((ctrlstat & (CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ | CSYSPWRUPACK)) !=
|
pwrmask = CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ;
|
||||||
(CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ | CSYSPWRUPACK)) {
|
if (!dap->ignore_syspwrupack)
|
||||||
|
pwrmask |= CSYSPWRUPACK;
|
||||||
|
if ((ctrlstat & pwrmask) != pwrmask) {
|
||||||
LOG_ERROR("Debug regions are unpowered, an unexpected reset might have happened");
|
LOG_ERROR("Debug regions are unpowered, an unexpected reset might have happened");
|
||||||
dap->do_reconnect = true;
|
dap->do_reconnect = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -676,12 +676,14 @@ int dap_dp_init(struct adiv5_dap *dap)
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
LOG_DEBUG("DAP: wait CSYSPWRUPACK");
|
if (!dap->ignore_syspwrupack) {
|
||||||
retval = dap_dp_poll_register(dap, DP_CTRL_STAT,
|
LOG_DEBUG("DAP: wait CSYSPWRUPACK");
|
||||||
CSYSPWRUPACK, CSYSPWRUPACK,
|
retval = dap_dp_poll_register(dap, DP_CTRL_STAT,
|
||||||
DAP_POWER_DOMAIN_TIMEOUT);
|
CSYSPWRUPACK, CSYSPWRUPACK,
|
||||||
if (retval != ERROR_OK)
|
DAP_POWER_DOMAIN_TIMEOUT);
|
||||||
return retval;
|
if (retval != ERROR_OK)
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
|
retval = dap_queue_dp_read(dap, DP_CTRL_STAT, NULL);
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
|
|
|
@ -244,6 +244,10 @@ struct adiv5_dap {
|
||||||
* should be performed before the next access.
|
* should be performed before the next access.
|
||||||
*/
|
*/
|
||||||
bool do_reconnect;
|
bool do_reconnect;
|
||||||
|
|
||||||
|
/** Flag saying whether to ignore the syspwrupack flag in DAP. Some devices
|
||||||
|
* do not set this bit until later in the bringup sequence */
|
||||||
|
bool ignore_syspwrupack;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -141,10 +141,12 @@ int dap_cleanup_all(void)
|
||||||
|
|
||||||
enum dap_cfg_param {
|
enum dap_cfg_param {
|
||||||
CFG_CHAIN_POSITION,
|
CFG_CHAIN_POSITION,
|
||||||
|
CFG_IGNORE_SYSPWRUPACK,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const Jim_Nvp nvp_config_opts[] = {
|
static const Jim_Nvp nvp_config_opts[] = {
|
||||||
{ .name = "-chain-position", .value = CFG_CHAIN_POSITION },
|
{ .name = "-chain-position", .value = CFG_CHAIN_POSITION },
|
||||||
|
{ .name = "-ignore-syspwrupack", .value = CFG_IGNORE_SYSPWRUPACK },
|
||||||
{ .name = NULL, .value = -1 }
|
{ .name = NULL, .value = -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -177,6 +179,9 @@ static int dap_configure(Jim_GetOptInfo *goi, struct arm_dap_object *dap)
|
||||||
/* loop for more */
|
/* loop for more */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CFG_IGNORE_SYSPWRUPACK:
|
||||||
|
dap->dap.ignore_syspwrupack = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue