diff options
Diffstat (limited to 'external')
-rw-r--r-- | external/xscom-utils/getsram.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/external/xscom-utils/getsram.c b/external/xscom-utils/getsram.c index 65acc19..18c52c7 100644 --- a/external/xscom-utils/getsram.c +++ b/external/xscom-utils/getsram.c @@ -26,9 +26,12 @@ static void print_usage(int code) { - printf("usage: getsram [-c|--chip chip-id] addr\n"); - printf(" [--occ-channel|n <chan>]\n"); - printf(" getsram -v|--version\n"); + printf("usage: getsram [opts] addr\n"); + printf(" -c|--chip <chip-id>\n"); + printf(" -l|--length <size to read>\n"); + printf(" -n|--occ-channel <chan>\n"); + printf(" -f|--file <filename>\n"); + printf(" -v|--version\n"); exit(code); } @@ -36,10 +39,12 @@ extern const char version[]; int main(int argc, char *argv[]) { - uint64_t val, addr = -1ull; + uint64_t val, addr = -1ull, length = 8; uint32_t def_chip, chip_id = 0xffffffff; int rc; int occ_channel = 0; + char *filename = NULL; + FILE *f = stdout; while(1) { static struct option long_opts[] = { @@ -47,10 +52,12 @@ int main(int argc, char *argv[]) {"occ-channel", required_argument, NULL, 'n'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'v'}, + {"length", required_argument, NULL, 'l'}, + {"file", required_argument, NULL, 'f'}, }; int c, oidx = 0; - c = getopt_long(argc, argv, "-c:n:hlv", long_opts, &oidx); + c = getopt_long(argc, argv, "-c:n:hl:vf:", long_opts, &oidx); if (c == EOF) break; switch(c) { @@ -73,6 +80,13 @@ int main(int argc, char *argv[]) case 'v': printf("xscom utils version %s\n", version); exit(0); + case 'f': + filename = optarg; + break; + case 'l': + length = strtoul(optarg, NULL, 0); + length = (length + 7) & ~0x7; /* round up to an eight byte interval */ + break; default: exit(1); } @@ -91,11 +105,37 @@ int main(int argc, char *argv[]) if (chip_id == 0xffffffff) chip_id = def_chip; - rc = sram_read(chip_id, occ_channel, addr, &val); + if (filename) { + f = fopen(filename, "wb"); + if (!f) { + fprintf(stderr, "unable to open %s for writing\n", filename); + exit(1); + } + } + + rc = 0; + while (length) { + rc = sram_read(chip_id, occ_channel, addr, &val); + if (rc) + break; + + if (f) { + int i; + + /* make sure we write it out big endian */ + for (i = 1; i <= 8; i++) + fputc((val >> (64 - i * 8)) & 0xff, f); + } else { + printf("OCC%d: %" PRIx64 "\n", occ_channel, val); + } + + length -= 8; + addr += 8; + } + if (rc) { fprintf(stderr,"Error %d reading XSCOM\n", rc); exit(1); } - printf("OCC%d: %" PRIx64 "\n", occ_channel, val); return 0; } |