ADIv5: Implement function to lookup CoreSight component
[openocd.git] / src / target / arm_adi_v5.h
index e71feb96a368c87cfa431863c09636c663cf18bc..6c1808a5cb68c007fa86dd38faf5a76b41c36a85 100644 (file)
 
 #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
  * 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,67 +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);
-int dap_ap_write_reg_u32(struct swjdp_common *swjdp,
-               uint32_t addr, uint32_t value);
-int dap_ap_read_reg_u32(struct swjdp_common *swjdp,
-               uint32_t addr, uint32_t *value);
 
 /* 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;
 
@@ -403,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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)