summaryrefslogtreecommitdiff
path: root/src/target/arm_adi_v5.c
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2010-12-30 04:54:24 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-12-30 08:19:47 +0100
commit0136977c40e41cdaab5d775c4e370763006ad99c (patch)
tree6d799420d9c1b800843b99a07c0f1e55751b6b32 /src/target/arm_adi_v5.c
parent50e79d60ce148f86bc93cc3248c3f6f0f81b3c3e (diff)
downloadopenocd+libswd-0136977c40e41cdaab5d775c4e370763006ad99c.tar.gz
openocd+libswd-0136977c40e41cdaab5d775c4e370763006ad99c.tar.bz2
openocd+libswd-0136977c40e41cdaab5d775c4e370763006ad99c.tar.xz
openocd+libswd-0136977c40e41cdaab5d775c4e370763006ad99c.zip
CORTEX A8: Fix broken CPU identification
This patch fixes the issue where the OMAP CPU (and possibly others) was mistaken for iMX51 and therefore had misadjusted debug base. Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Diffstat (limited to 'src/target/arm_adi_v5.c')
-rw-r--r--src/target/arm_adi_v5.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c
index 69a3ce7a..7df0d4f8 100644
--- a/src/target/arm_adi_v5.c
+++ b/src/target/arm_adi_v5.c
@@ -1013,10 +1013,11 @@ is_dap_cid_ok(uint32_t cid3, uint32_t cid2, uint32_t cid1, uint32_t cid0)
struct broken_cpu {
uint32_t dbgbase;
uint32_t apid;
+ uint32_t idcode;
uint32_t correct_dbgbase;
char *model;
} broken_cpus[] = {
- { 0x80000000, 0x04770002, 0x60000000, "imx51" },
+ { 0x80000000, 0x04770002, 0x1ba00477, 0x60000000, "imx51" },
};
int dap_get_debugbase(struct adiv5_dap *dap, int apsel,
@@ -1025,7 +1026,7 @@ int dap_get_debugbase(struct adiv5_dap *dap, int apsel,
uint32_t apselold;
int retval;
unsigned int i;
- uint32_t dbgbase, apid;
+ uint32_t dbgbase, apid, idcode;
/* AP address is in bits 31:24 of DP_SELECT */
if (apsel >= 256)
@@ -1044,10 +1045,23 @@ int dap_get_debugbase(struct adiv5_dap *dap, int apsel,
if (retval != ERROR_OK)
return retval;
+ /* Excavate the device ID code */
+ struct jtag_tap *tap = dap->jtag_info->tap;
+ while (tap != NULL) {
+ if (tap->hasidcode) {
+ idcode = tap->idcode;
+ break;
+ }
+ tap = tap->next_tap;
+ }
+ if (tap == NULL || !tap->hasidcode)
+ return ERROR_OK;
+
/* Some CPUs are messed up, so fixup if needed. */
for (i = 0; i < sizeof(broken_cpus)/sizeof(struct broken_cpu); i++)
if (broken_cpus[i].dbgbase == dbgbase &&
- broken_cpus[i].apid == apid) {
+ broken_cpus[i].apid == apid &&
+ broken_cpus[i].idcode == idcode) {
LOG_WARNING("Found broken CPU (%s), trying to fixup "
"ROM Table location from 0x%08x to 0x%08x",
broken_cpus[i].model, dbgbase,