arm_adi_v5: add API send_sequence() and use it

The method to send an arbitrary sequence to DAP depends on the
transport and is thus different on JTAG and SWD. This is already
coded in dap_to_jtag() and dap_to_swd().

Add a new API send_sequence() in struct dap_ops.
Add the implementations of send_sequence() in adi_v5_jtag.c and
adi_v5_swd.c
Rewrite dap_to_jtag() and dap_to_swd() using the new API.
Move the enum swd_special_seq in arm_adi_v5.h to solve a circular
dependencies among swd.h and arm_adi_v5.h

Change-Id: I9db13a00f129761eab283783c094cfff2dd92610
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/4902
Tested-by: jenkins
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
This commit is contained in:
Antonio Borneo
2019-01-23 16:46:31 +01:00
committed by Tomas Vanek
parent 5d08bcb715
commit be2d25efcc
5 changed files with 63 additions and 44 deletions

View File

@@ -158,6 +158,15 @@
#define DP_APSEL_MAX (255)
#define DP_APSEL_INVALID (-1)
/* FIXME: not SWD specific; should be renamed, e.g. adiv5_special_seq */
enum swd_special_seq {
LINE_RESET,
JTAG_TO_SWD,
SWD_TO_JTAG,
SWD_TO_DORMANT,
DORMANT_TO_SWD,
};
/**
* This represents an ARM Debug Interface (v5) Access Port (AP).
* Most common is a MEM-AP, for memory access.
@@ -291,6 +300,10 @@ struct adiv5_dap {
struct dap_ops {
/** connect operation for SWD */
int (*connect)(struct adiv5_dap *dap);
/** send a sequence to the DAP */
int (*send_sequence)(struct adiv5_dap *dap, enum swd_special_seq seq);
/** DP register read. */
int (*queue_dp_read)(struct adiv5_dap *dap, unsigned reg,
uint32_t *data);
@@ -338,6 +351,21 @@ enum ap_type {
AP_TYPE_AHB5_AP = 0x5, /* AHB5 Memory-AP. */
};
/**
* Send an adi-v5 sequence to the DAP.
*
* @param dap The DAP used for reading.
* @param seq The sequence to send.
*
* @return ERROR_OK for success, else a fault code.
*/
static inline int dap_send_sequence(struct adiv5_dap *dap,
enum swd_special_seq seq)
{
assert(dap->ops != NULL);
return dap->ops->send_sequence(dap, seq);
}
/**
* Queue a DP register read.
* Note that not all DP registers are readable; also, that JTAG and SWD