summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2010-10-31 07:11:47 +0100
committerMarek Vasut <marek.vasut@gmail.com>2010-11-05 11:25:57 +0100
commit887cac65b0672910bda4fec34ed05d72ce7208aa (patch)
tree662ed901203e699ba529a1b30e2d402e721ad73c /src
parent0649fb2f6c7e1bea138769ecc2ec8dc17ae98044 (diff)
downloadopenocd_libswd-887cac65b0672910bda4fec34ed05d72ce7208aa.tar.gz
openocd_libswd-887cac65b0672910bda4fec34ed05d72ce7208aa.tar.bz2
openocd_libswd-887cac65b0672910bda4fec34ed05d72ce7208aa.tar.xz
openocd_libswd-887cac65b0672910bda4fec34ed05d72ce7208aa.zip
ADIv5: Implement function to lookup CoreSight component
This patch implements "dap_lookup_cs_component()", which allows to lookup CS component by it's identification. Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/target/arm_adi_v5.c41
-rw-r--r--src/target/arm_adi_v5.h4
2 files changed, 45 insertions, 0 deletions
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c
index 4950121a..81edba4e 100644
--- a/src/target/arm_adi_v5.c
+++ b/src/target/arm_adi_v5.c
@@ -1062,6 +1062,47 @@ int dap_get_debugbase(struct adiv5_dap *dap, int apsel,
return ERROR_OK;
}
+int dap_lookup_cs_component(struct adiv5_dap *dap, int apsel,
+ uint32_t dbgbase, uint8_t type, uint32_t *addr)
+{
+ uint32_t apselold;
+ uint32_t romentry, entry_offset = 0, component_base, devtype;
+ int retval = ERROR_FAIL;
+
+ if (apsel >= 256)
+ return ERROR_INVALID_ARGUMENTS;
+
+ apselold = dap->apsel;
+ dap_ap_select(dap, apsel);
+
+ do
+ {
+ retval = mem_ap_read_atomic_u32(dap, (dbgbase&0xFFFFF000) |
+ entry_offset, &romentry);
+ if (retval != ERROR_OK)
+ return retval;
+
+ component_base = (dbgbase & 0xFFFFF000)
+ + (romentry & 0xFFFFF000);
+
+ if (romentry & 0x1) {
+ retval = mem_ap_read_atomic_u32(dap,
+ (component_base & 0xfffff000) | 0xfcc,
+ &devtype);
+ if ((devtype & 0xff) == type) {
+ *addr = component_base;
+ retval = ERROR_OK;
+ break;
+ }
+ }
+ entry_offset += 4;
+ } while (romentry > 0);
+
+ dap_ap_select(dap, apselold);
+
+ return retval;
+}
+
static int dap_info_command(struct command_context *cmd_ctx,
struct adiv5_dap *dap, int apsel)
{
diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h
index 27a2f2f8..6c1808a5 100644
--- a/src/target/arm_adi_v5.h
+++ b/src/target/arm_adi_v5.h
@@ -383,6 +383,10 @@ int ahbap_debugport_init(struct adiv5_dap *swjdp);
int dap_get_debugbase(struct adiv5_dap *dap, int apsel,
uint32_t *dbgbase, uint32_t *apid);
+/* 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;
/* Put debug link into SWD mode */