int do_op(PROGRAMMER * pgm, struct avrpart * p, AVRUPD * upd, int nowrite, int verify) { struct avrpart * v; AVRMEM * mem = NULL; int size, vsize; int rc; /* NEW */ if(strcmp(upd->memtype, "flash") == 0) { mem = p->flashmem; } else if(strcmp(upd->memtype, "lfuse") == 0) { mem = p->lfusemem; } else if(strcmp(upd->memtype, "hfuse") == 0) { mem = p->hfusemem; } if (mem == NULL) { logprintf(LOG_ERR, "\"%s\" memory type not defined for part \"%s\"", upd->memtype, p->desc); return -1; } if (upd->op == DEVICE_READ) { /* * read out the specified device memory and write it to a file */ report_progress(0,1,"Reading"); rc = avr_read(pgm, p, upd->memtype, 0); if (rc < 0) { logprintf(LOG_ERR, "failed to read all of %s memory, rc=%d", mem->desc, rc); return -1; } report_progress(1,1,NULL); size = rc; logprintf(LOG_INFO, "writing output file \"%s\"", strcmp(upd->filename, "-")==0 ? "<stdout>" : upd->filename); rc = fileio(FIO_WRITE, upd->filename, upd->format, p, upd->memtype, size); if (rc < 0) { logprintf(LOG_ERR, "write to file '%s' failed", upd->filename); return -1; } } else if (upd->op == DEVICE_WRITE) { /* * write the selected device memory using data from a file; first * read the data from the specified file */ logprintf(LOG_INFO, "reading input file \"%s\"", strcmp(upd->filename, "-")==0 ? "<stdin>" : upd->filename); rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); if (rc < 0) { logprintf(LOG_INFO, "write to file '%s' failed", upd->filename); return -1; } size = rc; /* * write the buffer contents to the selected memory type */ logprintf(LOG_INFO, "writing %s (%d bytes)", mem->desc, size); if (!nowrite) { report_progress(0,1,"Writing"); rc = avr_write(pgm, p, upd->memtype, size); report_progress(1,1,NULL); } else { /* * test mode, don't actually write to the chip, output the buffer * to stdout in intel hex instead */ rc = fileio(FIO_WRITE, "-", FMT_IHEX, p, upd->memtype, size); } if (rc < 0) { logprintf(LOG_ERR, "failed to write %s memory, rc=%d", mem->desc, rc); return -1; } vsize = rc; logprintf(LOG_INFO, "%d bytes of %s written", vsize, mem->desc); } else if (upd->op == DEVICE_VERIFY) { /* * verify that the in memory file (p->mem[AVR_M_FLASH|AVR_M_EEPROM]) * is the same as what is on the chip */ v = avr_dup_part(p); logprintf(LOG_INFO, "verifying %s memory against %s:", mem->desc, upd->filename); logprintf(LOG_INFO, "load data %s data from input file %s:", mem->desc, upd->filename); rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); if (rc < 0) { logprintf(LOG_ERR, "read from file '%s' failed", upd->filename); return -1; } size = rc; logprintf(LOG_INFO, "input file %s contains %d bytes", upd->filename, size); report_progress (0,1,"Reading"); rc = avr_read(pgm, v, upd->memtype, size); if (rc < 0) { logprintf(LOG_ERR, "failed to read all of %s memory, rc=%d", mem->desc, rc); return -1; } report_progress (1,1,NULL); logprintf(LOG_INFO, "verifying ..."); rc = avr_verify(p, v, upd->memtype, size); if (rc < 0) { logprintf(LOG_ERR, "verification error; content mismatch"); return -1; } logprintf(LOG_INFO, "%d bytes of %s verified", rc, mem->desc); FREE(v->sigmem->buf); FREE(v->sigmem); FREE(v->flashmem->buf); FREE(v->flashmem); FREE(v->hfusemem->buf); FREE(v->hfusemem); FREE(v->lfusemem->buf); FREE(v->lfusemem); FREE(v); } else { logprintf(LOG_ERR, "invalid update operation (%d) requested", upd->op); return -1; } return 0; }
void arg3(char file[], char file_name[], int start_range) { fileio(file, file_name, start_range); }
int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags flags) { struct avrpart * v; AVRMEM * mem; int size, vsize; int rc; mem = avr_locate_mem(p, upd->memtype); if (mem == NULL) { fprintf(stderr, "\"%s\" memory type not defined for part \"%s\"\n", upd->memtype, p->desc); return -1; } if (upd->op == DEVICE_READ) { /* * read out the specified device memory and write it to a file */ if (quell_progress < 2) { fprintf(stderr, "%s: reading %s memory:\n", progname, mem->desc); } report_progress(0,1,"Reading"); rc = avr_read(pgm, p, upd->memtype, 0); if (rc < 0) { fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n", progname, mem->desc, rc); return -1; } report_progress(1,1,NULL); size = rc; if (quell_progress < 2) { fprintf(stderr, "%s: writing output file \"%s\"\n", progname, strcmp(upd->filename, "-")==0 ? "<stdout>" : upd->filename); } rc = fileio(FIO_WRITE, upd->filename, upd->format, p, upd->memtype, size); if (rc < 0) { fprintf(stderr, "%s: write to file '%s' failed\n", progname, upd->filename); return -1; } } else if (upd->op == DEVICE_WRITE) { /* * write the selected device memory using data from a file; first * read the data from the specified file */ if (quell_progress < 2) { fprintf(stderr, "%s: reading input file \"%s\"\n", progname, strcmp(upd->filename, "-")==0 ? "<stdin>" : upd->filename); } rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); if (rc < 0) { fprintf(stderr, "%s: read from file '%s' failed\n", progname, upd->filename); return -1; } size = rc; /* * write the buffer contents to the selected memory type */ if (quell_progress < 2) { fprintf(stderr, "%s: writing %s (%d bytes):\n", progname, mem->desc, size); } if (!(flags & UF_NOWRITE)) { report_progress(0,1,"Writing"); rc = avr_write(pgm, p, upd->memtype, size, (flags & UF_AUTO_ERASE) != 0); report_progress(1,1,NULL); } else { /* * test mode, don't actually write to the chip, output the buffer * to stdout in intel hex instead */ rc = fileio(FIO_WRITE, "-", FMT_IHEX, p, upd->memtype, size); } if (rc < 0) { fprintf(stderr, "%s: failed to write %s memory, rc=%d\n", progname, mem->desc, rc); return -1; } vsize = rc; if (quell_progress < 2) { fprintf(stderr, "%s: %d bytes of %s written\n", progname, vsize, mem->desc); } } else if (upd->op == DEVICE_VERIFY) { /* * verify that the in memory file (p->mem[AVR_M_FLASH|AVR_M_EEPROM]) * is the same as what is on the chip */ pgm->vfy_led(pgm, ON); if (quell_progress < 2) { fprintf(stderr, "%s: verifying %s memory against %s:\n", progname, mem->desc, upd->filename); fprintf(stderr, "%s: load data %s data from input file %s:\n", progname, mem->desc, upd->filename); } rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); if (rc < 0) { fprintf(stderr, "%s: read from file '%s' failed\n", progname, upd->filename); return -1; } v = avr_dup_part(p); size = rc; if (quell_progress < 2) { fprintf(stderr, "%s: input file %s contains %d bytes\n", progname, upd->filename, size); fprintf(stderr, "%s: reading on-chip %s data:\n", progname, mem->desc); } report_progress (0,1,"Reading"); rc = avr_read(pgm, p, upd->memtype, v); if (rc < 0) { fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n", progname, mem->desc, rc); pgm->err_led(pgm, ON); return -1; } report_progress (1,1,NULL); if (quell_progress < 2) { fprintf(stderr, "%s: verifying ...\n", progname); } rc = avr_verify(p, v, upd->memtype, size); if (rc < 0) { fprintf(stderr, "%s: verification error; content mismatch\n", progname); pgm->err_led(pgm, ON); return -1; } if (quell_progress < 2) { fprintf(stderr, "%s: %d bytes of %s verified\n", progname, rc, mem->desc); } pgm->vfy_led(pgm, OFF); } else { fprintf(stderr, "%s: invalid update operation (%d) requested\n", progname, upd->op); return -1; } return 0; }
void arg2(char file[], char file_name[]) { fileio(file, file_name, 1); }