commit 51048b297dd7c584297723aea1c8702a0f9d2647
parent 36d0e17438b04a7f965619346d8df56bd112ecb5
Author: Brian Swetland <swetland@frotz.net>
Date: Thu, 25 Sep 2014 00:57:16 -0700
dap: work in progress, some table dumping
Diffstat:
M | dap.c | | | 128 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- |
1 file changed, 115 insertions(+), 13 deletions(-)
diff --git a/dap.c b/dap.c
@@ -132,7 +132,6 @@ int dap_ap_wr(DAP *dap, u32 apnum, u32 addr, u32 val) {
}
int dap_ap_wr_x(DAP *dap, u32 apnum, u32 addr, u32 val) {
- u64 u;
if ((dap->cache_apnum != apnum) || (dap->cache_apaddr != (addr & 0xFFFFFFF0))) {
if (dap_dp_wr(dap, DPACC_SELECT,
DPSEL_APSEL(apnum) | DPSEL_APBANKSEL(addr))) {
@@ -144,11 +143,10 @@ int dap_ap_wr_x(DAP *dap, u32 apnum, u32 addr, u32 val) {
dap->cache_apaddr = addr;
}
dap_ir_wr(dap, DAP_IR_APACC);
- u = XPACC_WR(addr);
- u |= (((u64) val) << 3);
- dap_dr_io(dap, 35, u, NULL);
return 0;
}
+
+
void dap_flush_cache(DAP *dap) {
dap->cache_ir = 0xFFFFFFFF;
dap->cache_apnum = 0xFFFFFFFF;
@@ -166,6 +164,15 @@ DAP *dap_init(JTAG *jtag) {
int dap_attach(DAP *dap) {
unsigned n;
u32 x;
+ u64 u;
+
+ // make sure we abort any ongoing transactions first
+ x = DAP_IR_ABORT;
+ u = 8;
+ jtag_ir_wr(dap->jtag, 4, &x);
+ jtag_dr_wr(dap->jtag, 35, &u);
+ dap_flush_cache(dap);
+
// attempt to power up and clear errors
for (n = 0; n < 100; n++) {
if (dap_dp_wr(dap, DPACC_CSW,
@@ -186,32 +193,90 @@ int dap_attach(DAP *dap) {
return -1;
}
-int dap_mem_wr32(DAP *dap, u32 addr, u32 val) {
+/// ap0csw 43800042 read okay
+/// ap0csw 438000c2 after fail and stuck
+
+int dap_mem_wr32(DAP *dap, u32 n, u32 addr, u32 val) {
if (addr & 3)
return -1;
- if (dap_ap_wr(dap, 0, APACC_TAR, addr))
+ if (dap_ap_wr(dap, n, APACC_TAR, addr))
return -1;
- if (dap_ap_wr(dap, 0, APACC_DRW, val))
+ if (dap_ap_wr(dap, n, APACC_DRW, val))
return -1;
return 0;
}
-int dap_mem_rd32(DAP *dap, u32 addr, u32 *val) {
+int dap_mem_rd32(DAP *dap, u32 n, u32 addr, u32 *val) {
if (addr & 3)
return -1;
- if (dap_ap_wr(dap, 0, APACC_TAR, addr))
+ if (dap_ap_wr(dap, n, APACC_TAR, addr))
return -1;
- if (dap_ap_rd(dap, 0, APACC_DRW, val))
+ if (dap_ap_rd(dap, n, APACC_DRW, val))
return -1;
return 0;
}
+int read4xid(DAP *dap, u32 n, u32 addr, u32 *val) {
+ u32 a,b,c,d;
+ if (dap_mem_rd32(dap, n, addr + 0x00, &a)) return -1;
+ if (dap_mem_rd32(dap, n, addr + 0x04, &b)) return -1;
+ if (dap_mem_rd32(dap, n, addr + 0x08, &c)) return -1;
+ if (dap_mem_rd32(dap, n, addr + 0x0C, &d)) return -1;
+ *val = (a & 0xFF) | ((b & 0xFF) << 8) | ((c & 0xFF) << 16) | ((d & 0xFF) << 24);
+ return 0;
+}
+
+int readinfo(DAP *dap, u32 n, u32 base, u32 *cid, u32 *pid0, u32 *pid1) {
+ if (read4xid(dap, n, base + 0xFF0, cid)) return -1;
+ if (read4xid(dap, n, base + 0xFE0, pid0)) return -1;
+ if (read4xid(dap, n, base + 0xFD0, pid1)) return -1;
+ return 0;
+}
+
+void dumptable(DAP *dap, u32 n, u32 base) {
+ u32 cid, pid0, pid1, memtype;
+ u32 x, addr;
+ int i;
+
+ printf("TABLE @ %08x\n", base);
+ if (readinfo(dap, n, addr, &cid, &pid0, &pid1)) {
+ printf(" <error reading cid & pid>\n");
+ return;
+ }
+ if (dap_mem_rd32(dap, n, base + 0xFCC, &memtype)) {
+ printf(" <error reading memtype>\n");
+ return;
+ }
+ printf(" CID %08x PID %08x %08d %dKB%s\n", cid, pid1, pid0,
+ 4 * (1 + ((pid1 & 0xF0) >> 4)),
+ (memtype & 1) ? " SYSMEM": "");
+ for (i = 0; i < 128; i++) {
+ if (dap_mem_rd32(dap, n, base + i * 4, &x)) break;
+ if (x == 0) break;
+ addr = base + (x & 0xFFFFF000);
+ printf(" %02d: @%08x%s%s\n", i, addr,
+ (x & 1) ? " PRESENT" : "", (x & 2) ? " 32bit" : " 16bit");
+ if ((x & 3) != 3) continue;
+ if (readinfo(dap, n, addr, &cid, &pid0, &pid1)) {
+ printf(" <error reading cid & pid>\n");
+ continue;
+ }
+ printf(" CID %08x PID %08x %08d %dKB%s\n", cid, pid1, pid0,
+ 4 * (1 + ((pid1 & 0xF0) >> 4)));
+ if (((cid >> 12) & 0xF) == 1) {
+ dumptable(dap, n, addr);
+ }
+ }
+}
+
int main(int argc, char **argv) {
JTAG *jtag;
DAP *dap;
unsigned n;
u64 u;
- u32 x;
+ u32 x, y;
+ int i;
+ u32 val = 0xbbbbbbbb;
if (jtag_mpsse_open(&jtag)) return -1;
if (jtag_enumerate(jtag) < 0) return -1;
@@ -221,22 +286,36 @@ int main(int argc, char **argv) {
if (dap_attach(dap))
return -1;
+ dap_dp_rd(dap, DPACC_CSW, &x);
+ printf("DPCSW=%08x\n", x);
+
for (n = 0; n < 256; n++) {
if (dap_ap_rd(dap, n, APACC_IDR, &x))
break;
if (x == 0)
break;
- printf("AP%d ID=%08x\n", n, x);
+ y = 0;
+ dap_ap_rd(dap, n, APACC_BASE, &y);
+ printf("AP%d ID=%08x BASE=%08x\n", n, x, y);
+ if (y && (y != 0xFFFFFFFF)) {
+ dumptable(dap, n, y);
+ }
if (dap_ap_rd(dap, n, APACC_CSW, &x) == 0)
printf("AP%d CSW=%08x\n", n, x);
}
+ dap_dp_rd(dap, DPACC_CSW, &x);
+ printf("DPCSW=%08x\n", x);
+
#if 1
for (n = 0; n < 8; n++) {
- dap_mem_rd32(dap, n*4, &x);
+ x = 0xefefefef;
+ dap_mem_rd32(dap, 0, n*4, &x);
printf("%08x: %08x\n", n*4, x);
}
#endif
+ dap_dp_rd(dap, DPACC_CSW, &x);
+ printf("DPCSW=%08x\n", x);
#if 0
for (n = 0; n < 4096; n++) {
@@ -245,6 +324,29 @@ int main(int argc, char **argv) {
return 0;
#endif
+#if 0
+
+ dap_ap_rd(dap, 0, APACC_CSW, &x);
+ dap_dp_rd(dap, DPACC_CSW, &y);
+ fprintf(stderr, "APCSW=%08x DPCSW=%08x\n", x, y);
+
+ dap_ap_wr(dap, 0, APACC_CSW, APCSW_DBGSWEN | APCSW_INCR_SINGLE | APCSW_SIZE32);
+ dap_ap_wr(dap, 0xf0000000, APACC_TAR, n);
+ dap_ap_wr_x(dap, 0, APACC_DRW, val);
+ u = XPACC_WR(APACC_DRW);
+ u |= (((u64) val) << 3);
+ for (i = 0; i < 1024; i++) {
+ for (n = 0; n < 1024; n++) {
+ jtag_dr_wr(dap->jtag, 35, &u);
+ }
+ jtag_commit(dap->jtag);
+ }
+ dap_ap_rd(dap, 0, APACC_CSW, &x);
+ dap_dp_rd(dap, DPACC_CSW, &y);
+ fprintf(stderr, "APCSW=%08x DPCSW=%08x\n", x, y);
+
+#endif
+
#if 0
dap_ap_wr(dap, 0, APACC_CSW, APCSW_DBGSWEN | APCSW_INCR_SINGLE | APCSW_SIZE32);
dap_ap_wr(dap, 0, APACC_TAR, n);