FreeCalypso > hg > freecalypso-tools
view rvinterf/etmsync/memdump.c @ 416:30f6d1c32c6f
doc/Flash-boot-defect article removed (no longer relevant)
This article is no longer relevant because the issue in question
only affected one (1) defective FCDEV3B board which was not
and never will be sold.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 26 Oct 2018 07:11:08 +0000 |
parents | 9925fba699be |
children | e40bb5a6c6b9 |
line wrap: on
line source
/* * This utility uses one of TI's Test Mode memory read commands (either TM3 or * ETM) in a synchronous manner (using our etmsync infrastructure) to read the * memory of a GSM device running a compatible fw version. It supplants * the former fc-olddump tool. */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include "etm.h" #include "tm3.h" #include "localtypes.h" #include "exitcodes.h" int use_etm; extern char *socket_pathname; extern char *rvinterf_ttyport, *rvinterf_Bopt, *rvinterf_lopt, *rvinterf_wopt; single_op_main(argc, argv) char **argv; { u32 addr, len, chunk, maxchunk; char buf[MAX_MEMREAD_BYTES]; FILE *outf; int rc; if (argc != 3) { fprintf(stderr, "usage: fc-memdump [options] start-addr dump-length binfile\n"); exit(ERROR_USAGE); } addr = strtoul(argv[0], 0, 16); len = strtoul(argv[1], 0, 16); outf = fopen(argv[2], "w"); if (!outf) { perror(argv[2]); exit(ERROR_UNIX); } if (use_etm) maxchunk = MAX_MEMREAD_BYTES; else maxchunk = TM3_MEMREAD_MAX; while (len) { chunk = len; if (chunk > maxchunk) chunk = maxchunk; if (use_etm) rc = do_memory_read(addr, buf, chunk); else rc = do_memory_read_tm3(addr, buf, chunk); if (rc) exit(rc); fwrite(buf, 1, chunk, outf); putchar('.'); fflush(stdout); addr += chunk; len -= chunk; } putchar('\n'); fclose(outf); exit(0); } main(argc, argv) char **argv; { extern int optind; extern char *optarg; int c, sopt = 0; while ((c = getopt(argc, argv, "B:el:p:s:w:")) != EOF) switch (c) { case 'B': rvinterf_Bopt = optarg; continue; case 'e': use_etm++; continue; case 'l': rvinterf_lopt = optarg; continue; case 'p': rvinterf_ttyport = optarg; continue; case 's': socket_pathname = optarg; sopt++; continue; case 'w': rvinterf_wopt = optarg; continue; case '?': default: /* error msg already printed */ exit(ERROR_USAGE); } if (rvinterf_ttyport) { if (sopt) { fprintf(stderr, "%s error: -p and -s options are mutually exclusive\n", argv[0]); exit(ERROR_USAGE); } launch_rvinterf(); } else { if (rvinterf_Bopt || rvinterf_lopt || rvinterf_wopt) { fprintf(stderr, "%s error: -B, -l and -w options are meaningful only when launching rvinterf\n", argv[0]); exit(ERROR_USAGE); } connect_local_socket(); } return single_op_main(argc - optind, argv + optind); }