# HG changeset patch # User Mychaela Falconia # Date 1445204461 0 # Node ID 38c7078712ab8e98bb766db8eff9d8ff2eb34806 # Parent 7cb0b32f19979396077515f75c1252a163a074d1 fc-dspapidump utility written, compiles diff -r 7cb0b32f1997 -r 38c7078712ab .hgignore --- a/.hgignore Tue Sep 08 23:33:38 2015 +0000 +++ b/.hgignore Sun Oct 18 21:41:01 2015 +0000 @@ -28,6 +28,7 @@ ^rvinterf/asyncshell/fc-shell$ ^rvinterf/ctracedec/ctracedec$ +^rvinterf/etmsync/fc-dspapidump$ ^rvinterf/etmsync/fc-fsio$ ^rvinterf/etmsync/fc-getpirimei$ ^rvinterf/etmsync/fc-pirhackinit$ diff -r 7cb0b32f1997 -r 38c7078712ab rvinterf/etmsync/Makefile --- a/rvinterf/etmsync/Makefile Tue Sep 08 23:33:38 2015 +0000 +++ b/rvinterf/etmsync/Makefile Sun Oct 18 21:41:01 2015 +0000 @@ -1,8 +1,11 @@ CC= gcc CFLAGS= -O2 -I../include -PROGS= fc-fsio fc-getpirimei fc-pirhackinit +PROGS= fc-dspapidump fc-fsio fc-getpirimei fc-pirhackinit INSTBIN=/usr/local/bin +DSPDUMP_OBJS= connect.o dspapidump.o interf.o launchrvif.o memops.o \ + simplemain.o + FSIO_OBJS= connect.o dispatch.o fdcmd.o fileio.o fsbasics.o fscmdtab.o \ fserr.o fsiomain.o fsmisc.o fspath.o fsread.o fsupload.o \ fswrite.o interf.o launchrvif.o memcmd.o memops.o rfcap.o \ @@ -16,6 +19,9 @@ all: ${PROGS} +fc-dspapidump: ${DSPDUMP_OBJS} + ${CC} ${CFLAGS} -o $@ ${DSPDUMP_OBJS} + fc-fsio: ${FSIO_OBJS} ${CC} ${CFLAGS} -o $@ ${FSIO_OBJS} diff -r 7cb0b32f1997 -r 38c7078712ab rvinterf/etmsync/dspapidump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/dspapidump.c Sun Oct 18 21:41:01 2015 +0000 @@ -0,0 +1,39 @@ +/* + * This utility uses ETM in synchronous mode to read and dump the contents + * of the DSP API RAM in a target Calypso GSM device while the firmware is + * running. + */ + +#include +#include +#include +#include +#include +#include +#include "localtypes.h" +#include "exitcodes.h" + +#define APIF_ADDR 0xFFD00000 +#define API_SIZE_IN_WORDS 0x2000 + +single_op_main() +{ + u16 buf[64], *linebase; + unsigned off; + int rc, i, j; + + for (off = 0; off < API_SIZE_IN_WORDS; ) { + rc = do_memory_read_16(APIF_ADDR + off * 2, buf, 0x40); + if (rc) + return(rc); + for (i = 0; i < 8; i++) { + printf("%04X:", off); + linebase = buf + i * 8; + for (j = 0; j < 8; j++) + printf(" %04X", linebase[j]); + putchar('\n'); + off += 8; + } + } + return(0); +} diff -r 7cb0b32f1997 -r 38c7078712ab rvinterf/etmsync/memops.c --- a/rvinterf/etmsync/memops.c Tue Sep 08 23:33:38 2015 +0000 +++ b/rvinterf/etmsync/memops.c Sun Oct 18 21:41:01 2015 +0000 @@ -55,6 +55,46 @@ return(0); } +do_memory_read_16(memaddr, databuf, nwords) + u32 memaddr; + u_char *databuf; +{ + u_char cmdpkt[10]; + int rc; + + if (nwords > MAX_MEMREAD_16BIT) { + printf("error: # of 16-bit words to read may not exceed %d\n", + MAX_MEMREAD_16BIT); + return(ERROR_USAGE); + } + cmdpkt[1] = ETM_CORE; + cmdpkt[2] = TMCORE_OPC_MEM; + cmdpkt[3] = 0x02; + cmdpkt[4] = nwords; + cmdpkt[5] = memaddr; + cmdpkt[6] = memaddr >> 8; + cmdpkt[7] = memaddr >> 16; + cmdpkt[8] = memaddr >> 24; + rc = etm_pkt_exch(cmdpkt, 8); + if (rc) + return(rc); + if (rvi_msg[3]) { + printf("ETM error response to mem read 16 request: 0x%02X\n", + rvi_msg[3]); + return(ERROR_TARGET); + } + if (rvi_msg_len != nwords * 2 + 7) { + printf("error: mem read 16 response has wrong length\n"); + return(ERROR_TARGET); + } + if (rvi_msg[4] != TMCORE_OPC_MEM || rvi_msg[5] != 0x02) { + printf("error: mem read 16 response has wrong opcode\n"); + return(ERROR_TARGET); + } + bcopy(rvi_msg + 6, databuf, nwords * 2); + return(0); +} + do_dieid_read(databuf) u_char *databuf; { diff -r 7cb0b32f1997 -r 38c7078712ab rvinterf/include/etm.h --- a/rvinterf/include/etm.h Tue Sep 08 23:33:38 2015 +0000 +++ b/rvinterf/include/etm.h Sun Oct 18 21:41:01 2015 +0000 @@ -50,3 +50,4 @@ #define TMCORE_OPC_DIEID 0x68 #define MAX_MEMREAD_BYTES 238 +#define MAX_MEMREAD_16BIT 119