X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Farm_adi_v5.h;h=6c1808a5cb68c007fa86dd38faf5a76b41c36a85;hp=e867b85504bb209a9fe1a9af550b1e1857917f68;hb=f1f8d9a6c9b1fd35d79627b568faa2409f13311f;hpb=381ce4308c60c54e3a03d97e883302909b834875 diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index e867b85504..6c1808a5cb 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -32,15 +32,11 @@ #include "arm_jtag.h" -/* JTAG instructions/registers for JTAG-DP and SWJ-DP */ -#define JTAG_DP_ABORT 0x8 +/* FIXME remove these JTAG-specific decls when mem_ap_read_buf_u32() + * is no longer JTAG-specific + */ #define JTAG_DP_DPACC 0xA #define JTAG_DP_APACC 0xB -#define JTAG_DP_IDCODE 0xE - -/* three-bit ACK values for DPACC and APACC reads */ -#define JTAG_ACK_OK_FAULT 0x2 -#define JTAG_ACK_WAIT 0x1 /* three-bit ACK values for SWD access (sent LSB first) */ #define SWD_ACK_OK 0x4 @@ -133,10 +129,8 @@ * a choice made at board design time (by only using the SWD pins), or * as part of setting up a debug session (if all the dual-role JTAG/SWD * signals are available). - * - * @todo Rename "swjdp_common" as "dap". Use of SWJ-DP is optional! */ -struct swjdp_common +struct adiv5_dap { const struct dap_ops *ops; @@ -184,7 +178,6 @@ struct swjdp_common uint32_t memaccess_tck; /* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */ uint32_t tar_autoincr_block; - }; /** @@ -201,27 +194,27 @@ struct dap_ops { bool is_swd; /** Reads the DAP's IDCODe register. */ - int (*queue_idcode_read)(struct swjdp_common *dap, + int (*queue_idcode_read)(struct adiv5_dap *dap, uint8_t *ack, uint32_t *data); /** DP register read. */ - int (*queue_dp_read)(struct swjdp_common *dap, unsigned reg, + int (*queue_dp_read)(struct adiv5_dap *dap, unsigned reg, uint32_t *data); /** DP register write. */ - int (*queue_dp_write)(struct swjdp_common *dap, unsigned reg, + int (*queue_dp_write)(struct adiv5_dap *dap, unsigned reg, uint32_t data); /** AP register read. */ - int (*queue_ap_read)(struct swjdp_common *dap, unsigned reg, + int (*queue_ap_read)(struct adiv5_dap *dap, unsigned reg, uint32_t *data); /** AP register write. */ - int (*queue_ap_write)(struct swjdp_common *dap, unsigned reg, + int (*queue_ap_write)(struct adiv5_dap *dap, unsigned reg, uint32_t data); /** AP operation abort. */ - int (*queue_ap_abort)(struct swjdp_common *dap, uint8_t *ack); + int (*queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack); /** Executes all queued DAP operations. */ - int (*run)(struct swjdp_common *dap); + int (*run)(struct adiv5_dap *dap); }; /** @@ -235,9 +228,10 @@ struct dap_ops { * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_idcode_read(struct swjdp_common *dap, +static inline int dap_queue_idcode_read(struct adiv5_dap *dap, uint8_t *ack, uint32_t *data) { + assert(dap->ops != NULL); return dap->ops->queue_idcode_read(dap, ack, data); } @@ -253,9 +247,10 @@ static inline int dap_queue_idcode_read(struct swjdp_common *dap, * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_dp_read(struct swjdp_common *dap, +static inline int dap_queue_dp_read(struct adiv5_dap *dap, unsigned reg, uint32_t *data) { + assert(dap->ops != NULL); return dap->ops->queue_dp_read(dap, reg, data); } @@ -270,9 +265,10 @@ static inline int dap_queue_dp_read(struct swjdp_common *dap, * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_dp_write(struct swjdp_common *dap, +static inline int dap_queue_dp_write(struct adiv5_dap *dap, unsigned reg, uint32_t data) { + assert(dap->ops != NULL); return dap->ops->queue_dp_write(dap, reg, data); } @@ -286,9 +282,10 @@ static inline int dap_queue_dp_write(struct swjdp_common *dap, * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_ap_read(struct swjdp_common *dap, +static inline int dap_queue_ap_read(struct adiv5_dap *dap, unsigned reg, uint32_t *data) { + assert(dap->ops != NULL); return dap->ops->queue_ap_read(dap, reg, data); } @@ -301,9 +298,10 @@ static inline int dap_queue_ap_read(struct swjdp_common *dap, * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_ap_write(struct swjdp_common *dap, +static inline int dap_queue_ap_write(struct adiv5_dap *dap, unsigned reg, uint32_t data) { + assert(dap->ops != NULL); return dap->ops->queue_ap_write(dap, reg, data); } @@ -318,8 +316,9 @@ static inline int dap_queue_ap_write(struct swjdp_common *dap, * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_queue_ap_abort(struct swjdp_common *dap, uint8_t *ack) +static inline int dap_queue_ap_abort(struct adiv5_dap *dap, uint8_t *ack) { + assert(dap->ops != NULL); return dap->ops->queue_ap_abort(dap, ack); } @@ -333,63 +332,60 @@ static inline int dap_queue_ap_abort(struct swjdp_common *dap, uint8_t *ack) * * @return ERROR_OK for success, else a fault code. */ -static inline int dap_run(struct swjdp_common *dap) +static inline int dap_run(struct adiv5_dap *dap) { + assert(dap->ops != NULL); return dap->ops->run(dap); } /** Accessor for currently selected DAP-AP number (0..255) */ -static inline uint8_t dap_ap_get_select(struct swjdp_common *swjdp) +static inline uint8_t dap_ap_get_select(struct adiv5_dap *swjdp) { return (uint8_t)(swjdp ->apsel >> 24); } /* AP selection applies to future AP transactions */ -void dap_ap_select(struct swjdp_common *dap,uint8_t apsel); +void dap_ap_select(struct adiv5_dap *dap,uint8_t apsel); /* Queued AP transactions */ -int dap_setup_accessport(struct swjdp_common *swjdp, +int dap_setup_accessport(struct adiv5_dap *swjdp, uint32_t csw, uint32_t tar); /* Queued MEM-AP memory mapped single word transfers */ -int mem_ap_read_u32(struct swjdp_common *swjdp, uint32_t address, uint32_t *value); -int mem_ap_write_u32(struct swjdp_common *swjdp, uint32_t address, uint32_t value); +int mem_ap_read_u32(struct adiv5_dap *swjdp, uint32_t address, uint32_t *value); +int mem_ap_write_u32(struct adiv5_dap *swjdp, uint32_t address, uint32_t value); /* Synchronous MEM-AP memory mapped single word transfers */ -int mem_ap_read_atomic_u32(struct swjdp_common *swjdp, +int mem_ap_read_atomic_u32(struct adiv5_dap *swjdp, uint32_t address, uint32_t *value); -int mem_ap_write_atomic_u32(struct swjdp_common *swjdp, +int mem_ap_write_atomic_u32(struct adiv5_dap *swjdp, uint32_t address, uint32_t value); /* MEM-AP memory mapped bus block transfers */ -int mem_ap_read_buf_u8(struct swjdp_common *swjdp, +int mem_ap_read_buf_u8(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); -int mem_ap_read_buf_u16(struct swjdp_common *swjdp, +int mem_ap_read_buf_u16(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); -int mem_ap_read_buf_u32(struct swjdp_common *swjdp, +int mem_ap_read_buf_u32(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); -int mem_ap_write_buf_u8(struct swjdp_common *swjdp, +int mem_ap_write_buf_u8(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); -int mem_ap_write_buf_u16(struct swjdp_common *swjdp, +int mem_ap_write_buf_u16(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); -int mem_ap_write_buf_u32(struct swjdp_common *swjdp, +int mem_ap_write_buf_u32(struct adiv5_dap *swjdp, uint8_t *buffer, int count, uint32_t address); /* Initialisation of the debug system, power domains and registers */ -int ahbap_debugport_init(struct swjdp_common *swjdp); - +int ahbap_debugport_init(struct adiv5_dap *swjdp); -/* Commands for user dap access */ -int dap_info_command(struct command_context *cmd_ctx, - struct swjdp_common *swjdp, int apsel); +/* Probe the AP for ROM Table location */ +int dap_get_debugbase(struct adiv5_dap *dap, int apsel, + uint32_t *dbgbase, uint32_t *apid); -#define DAP_COMMAND_HANDLER(name) \ - COMMAND_HELPER(name, struct swjdp_common *swjdp) -DAP_COMMAND_HANDLER(dap_baseaddr_command); -DAP_COMMAND_HANDLER(dap_memaccess_command); -DAP_COMMAND_HANDLER(dap_apsel_command); -DAP_COMMAND_HANDLER(dap_apid_command); +/* Lookup CoreSight component */ +int dap_lookup_cs_component(struct adiv5_dap *dap, int apsel, + uint32_t dbgbase, uint8_t type, uint32_t *addr); struct target; @@ -399,4 +395,6 @@ int dap_to_swd(struct target *target); /* Put debug link into JTAG mode */ int dap_to_jtag(struct target *target); +extern const struct command_registration dap_command_handlers[]; + #endif