adiv6: add dap flags -adiv5 and -adiv6

Add flags to 'dap create' command and set the field adi_version
in struct adiv5_dap.

Actually only ADIv5 is functional. Other patches are needed to get
ADIv6 working.

Split from change https://review.openocd.org/6077/

Change-Id: I63d3902f99a7f139c15ee4e07c19eae9ed4534b9
Signed-off-by: Kevin Burke <kevinb@os.amperecomputing.com>
Signed-off-by: Daniel Goehring <dgoehrin@os.amperecomputing.com>
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6456
Tested-by: jenkins
This commit is contained in:
Kevin Burke 2021-08-06 15:01:34 +02:00 committed by Antonio Borneo
parent 35a503b08d
commit 1fe82f9f1d
3 changed files with 38 additions and 1 deletions

View File

@ -4646,8 +4646,12 @@ 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{-adiv5}
Specify that it's an ADIv5 DAP. This is the default if not specified.
@item @code{-adiv6}
Specify that it's an ADIv6 DAP.
@item @code{-ignore-syspwrupack}
@*Specify this to ignore the CSYSPWRUPACK bit in the ARM DAP DP CTRL/STAT
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.

View File

@ -353,6 +353,9 @@ struct adiv5_dap {
* Record if enter in SWD required passing through DORMANT
*/
bool switch_through_dormant;
/** Indicates ADI version (5, 6 or 0 for unknown) being used */
unsigned int adi_version;
};
/**
@ -426,6 +429,18 @@ static inline bool is_64bit_ap(struct adiv5_ap *ap)
return (ap->cfg_reg & MEM_AP_REG_CFG_LA) != 0;
}
/**
* Check if DAP is ADIv6
*
* @param dap The DAP to test
*
* @return true for ADIv6, false for either ADIv5 or unknown version
*/
static inline bool is_adiv6(const struct adiv5_dap *dap)
{
return dap->adi_version == 6;
}
/**
* Send an adi-v5 sequence to the DAP.
*

View File

@ -129,6 +129,14 @@ static int dap_init_all(void)
} else
dap->ops = &jtag_dp_ops;
if (dap->adi_version == 0) {
LOG_DEBUG("DAP %s configured by default to use ADIv5 protocol", jtag_tap_name(dap->tap));
dap->adi_version = 5;
} else {
LOG_DEBUG("DAP %s configured to use %s protocol by user cfg file", jtag_tap_name(dap->tap),
is_adiv6(dap) ? "ADIv6" : "ADIv5");
}
retval = dap->ops->connect(dap);
if (retval != ERROR_OK)
return retval;
@ -163,6 +171,8 @@ enum dap_cfg_param {
CFG_IGNORE_SYSPWRUPACK,
CFG_DP_ID,
CFG_INSTANCE_ID,
CFG_ADIV6,
CFG_ADIV5,
};
static const struct jim_nvp nvp_config_opts[] = {
@ -170,6 +180,8 @@ static const struct jim_nvp nvp_config_opts[] = {
{ .name = "-ignore-syspwrupack", .value = CFG_IGNORE_SYSPWRUPACK },
{ .name = "-dp-id", .value = CFG_DP_ID },
{ .name = "-instance-id", .value = CFG_INSTANCE_ID },
{ .name = "-adiv6", .value = CFG_ADIV6 },
{ .name = "-adiv5", .value = CFG_ADIV5 },
{ .name = NULL, .value = -1 }
};
@ -249,6 +261,12 @@ static int dap_configure(struct jim_getopt_info *goi, struct arm_dap_object *dap
dap->dap.multidrop_instance_id_valid = true;
break;
}
case CFG_ADIV6:
dap->dap.adi_version = 6;
break;
case CFG_ADIV5:
dap->dap.adi_version = 5;
break;
default:
break;
}