jtagonizer

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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:
Mdap.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);