rem: "%sCopyright (c) 2000-2003 Brian Dean, bsd@bsdhome.com\n\n",
add: "%sCopyright (c) 2000-2004 Brian Dean, bsd@bsdhome.com\n\n",
context: int main(int argc, char * argv []){  int              rc;          /* general return code checking */  int              exitrc;      /* exit code for main() */  int              i;           /* general loop counter */  int              ch;          /* options flag */  int              len;         /* length for various strings */  struct avrpart * p;           /* which avr part we are programming */  struct avrpart * v;           /* used for verify */  AVRMEM         * sig;         /* signature data */  struct stat      sb;  UPDATE         * upd;  LNODEID        * ln;  /* options / operating mode variables */  int     erase;       /* 1=erase chip, 0=don't */  int     auto_erase;  /* 0=never erase unless explicity told to do                          so, 1=erase if we are going to program flash */  int     ovsigck;     /* 1=override sig check, 0=don't */  char  * port;        /* device port (/dev/xxx) */  int     terminal;    /* 1=enter terminal mode, 0=don't */  int     nowrite;     /* don't actually write anything to the chip */  int     verify;      /* perform a verify operation */  int     ppisetbits;  /* bits to set in ppi data register at exit */  int     ppiclrbits;  /* bits to clear in ppi data register at exit */  char  * exitspecs;   /* exit specs string from command line */  char  * programmer;  /* programmer id */  char  * partdesc;    /* part id */  char    sys_config[PATH_MAX]; /* system wide config file */  char    usr_config[PATH_MAX]; /* per-user config file */  int     cycles;      /* erase-rewrite cycles */  int     set_cycles;  /* value to set the erase-rewrite cycles to */  char  * e;           /* for strtol() error checking */  int     quell_progress;  int     baudrate;    /* override default programmer baud rate */#if !defined(WIN32NATIVE)  char  * homedir;#endif  progname = rindex(argv[0],'/');    #if defined (WIN32NATIVE)  /* take care of backslash as dir sep in W32 */  if (!progname) progname = rindex(argv[0],'\\');  #endif /* WIN32NATIVE */    if (progname)    progname++;  else    progname = argv[0];  default_parallel[0] = 0;  default_serial[0]   = 0;  init_config();  updates = lcreat(NULL, 0);  if (updates == NULL) {    fprintf(stderr, "%s: cannot initialize updater list\n", progname);    exit(1);  }  partdesc      = NULL;  port          = default_parallel;  erase         = 0;  auto_erase    = 1;  p             = NULL;  ovsigck       = 0;  terminal      = 0;  nowrite       = 0;  verify        = 1;        /* on by default */  quell_progress = 0;  ppisetbits    = 0;  ppiclrbits    = 0;  exitspecs     = NULL;  pgm           = NULL;  programmer    = default_programmer;  verbose       = 0;  do_cycles     = 0;  set_cycles    = -1;  baudrate      = 0;  #if defined(WIN32NATIVE)  win_sys_config_set(sys_config);  win_usr_config_set(usr_config);    #else  strcpy(sys_config, CONFIG_DIR);  i = strlen(sys_config);  if (i && (sys_config[i-1] != '/'))    strcat(sys_config, "/");  strcat(sys_config, "avrdude.conf");  usr_config[0] = 0;  homedir = getenv("HOME");  if (homedir != NULL) {    strcpy(usr_config, homedir);    i = strlen(usr_config);    if (i && (usr_config[i-1] != '/'))      strcat(usr_config, "/");    strcat(usr_config, ".avrduderc");  }  #endif  len = strlen(progname) + 2;  for (i=0; i<len; i++)    progbuf[i] = ' ';  progbuf[i] = 0;  /*   * check for no arguments   */  if (argc == 1) {    usage();    return 0;  }  /*   * process command line arguments   */  while ((ch = getopt(argc,argv,"?b:c:C:DeE:Fnp:P:qtU:vVyY:")) != -1) {    switch (ch) {      case 'b': /* override default programmer baud rate */        baudrate = strtol(optarg, &e, 0);        if ((e == optarg) || (*e != 0)) {          fprintf(stderr, "%s: invalid baud rate specified '%s'\n",                  progname, optarg);          exit(1);        }        break;      case 'c': /* programmer id */        programmer = optarg;        break;      case 'C': /* system wide configuration file */        strncpy(sys_config, optarg, PATH_MAX);        sys_config[PATH_MAX-1] = 0;        break;      case 'D': /* disable auto erase */        auto_erase = 0;        break;      case 'e': /* perform a chip erase */        erase = 1;        break;      case 'E':        exitspecs = optarg;        break;      case 'F': /* override invalid signature check */        ovsigck = 1;        break;      case 'n':        nowrite = 1;        break;      case 'p' : /* specify AVR part */        partdesc = optarg;        break;      case 'P':        port = optarg;        break;      case 'q' : /* Quell progress output */        quell_progress = 1;        break;      case 't': /* enter terminal mode */        terminal = 1;        break;      case 'U':        upd = parse_op(optarg);        if (upd == NULL) {          fprintf(stderr, "%s: error parsing update operation '%s'\n",                  progname, optarg);          exit(1);        }        ladd(updates, upd);        if (verify && upd->op == DEVICE_WRITE) {          upd = dup_update(upd);          upd->op = DEVICE_VERIFY;          ladd(updates, upd);        }        break;      case 'v':        verbose++;        break;      case 'V':        verify = 0;        break;      case 'y':        do_cycles = 1;        break;      case 'Y':        set_cycles = strtol(optarg, &e, 0);        if ((e == optarg) || (*e != 0)) {          fprintf(stderr, "%s: invalid cycle count '%s'\n",                  progname, optarg);          exit(1);        }        do_cycles = 1;        break;      case '?': /* help */        usage();        exit(0);        break;      default:        fprintf(stderr, "%s: invalid option -%c\n\n", progname, ch);        usage();        exit(1);        break;    }  }  if (quell_progress == 0) {    if (isatty (STDERR_FILENO))      update_progress = update_progress_tty;    else {      update_progress = update_progress_no_tty;      #if defined(WIN32NATIVE)      /* disable all buffering of stderr for compatibility with         software that captures and redirects output to a GUI         i.e. Programmers Notepad */      setvbuf( stderr, NULL, _IONBF, 0 );      setvbuf( stdout, NULL, _IONBF, 0 );      #endif /* WIN32NATIVE */	}  }  if (verbose) {    /*     * Print out an identifying string so folks can tell what version     * they are running     */    fprintf(stderr,            "\n%s: Version %s\n"            "%sCopyright (c) 2000-2003 Brian Dean, bsd@bsdhome.com\n\n",            progname, version, progbuf);	#if defined(WIN32NATIVE)	#warning "Experimental Win32 Native Build"	fprintf(stderr,"%sExperimental Windows32 native build by Martin Thomas\n\n",		progbuf);	#endif  }  if (verbose) {    fprintf(stderr, "%sSystem wide configuration file is \"%s\"\n",            progbuf, sys_config);  }  rc = read_config(sys_config);  if (rc) {    fprintf(stderr,            "%s: error reading system wide configuration file \"%s\"\n",            progname, sys_config);    exit(1);  }  if (usr_config[0] != 0) {    if (verbose) {      fprintf(stderr, "%sUser configuration file is \"%s\"\n",              progbuf, usr_config);    }    rc = stat(usr_config, &sb);    if ((rc < 0) || ((sb.st_mode & S_IFREG) == 0)) {      if (verbose) {        fprintf(stderr,                "%sUser configuration file does not exist or is not a "                "regular file, skipping\n",                progbuf);      }    }    else {      rc = read_config(usr_config);      if (rc) {        fprintf(stderr, "%s: error reading user configuration file \"%s\"\n",                progname, usr_config);        exit(1);      }    }  }  if (verbose) {    fprintf(stderr, "\n");  }  if (partdesc) {    if (strcmp(partdesc, "?") == 0) {      fprintf(stderr, "\n");      fprintf(stderr,"Valid parts are:\n");      list_parts(stderr, "  ", part_list);      fprintf(stderr, "\n");      exit(1);    }  }  if (programmer) {    if (strcmp(programmer, "?") == 0) {      fprintf(stderr, "\n");      fprintf(stderr,"Valid programmers are:\n");      list_programmers(stderr, "  ", programmers);      fprintf(stderr,"\n");      exit(1);    }  }  if (programmer[0] == 0) {    fprintf(stderr,            "\n%s: no programmer has been specified on the command line "            "or the config file\n",            progname);    fprintf(stderr,            "%sSpecify a programmer using the -c option and try again\n\n",            progbuf);    exit(1);  }  pgm = locate_programmer(programmers, programmer);  if (pgm == NULL) {    fprintf(stderr,"\n");    fprintf(stderr,            "%s: Can't find programmer id \"%s\"\n",            progname, programmer);    fprintf(stderr,"\nValid programmers are:\n");    list_programmers(stderr, "  ", programmers);    fprintf(stderr,"\n");    exit(1);  }  if ((strcmp(pgm->type, "STK500") == 0)      || (strcmp(pgm->type, "avr910") == 0)){    if (port == default_parallel) {      port = default_serial;    }  }  if (partdesc == NULL) {    fprintf(stderr,            "%s: No AVR part has been specified, use \"-p Part\"\n\n",            progname);    fprintf(stderr,"Valid parts are:\n");    list_parts(stderr, "  ", part_list);    fprintf(stderr, "\n");    exit(1);  }  p = locate_part(part_list, partdesc);  if (p == NULL) {    fprintf(stderr,            "%s: AVR Part \"%s\" not found.\n\n",            progname, partdesc);    fprintf(stderr,"Valid parts are:\n");    list_parts(stderr, "  ", part_list);    fprintf(stderr, "\n");    exit(1);  }  if (exitspecs != NULL) {    if (strcmp(pgm->type, "PPI") != 0) {      fprintf(stderr,              "%s: WARNING: -E option is only valid with \"PPI\" "              "programmer types\n",              progname);      exitspecs = NULL;    }    else if (getexitspecs(exitspecs, &ppisetbits, &ppiclrbits) < 0) {      usage();      exit(1);    }  }  /*   * set up seperate instances of the avr part, one for use in   * programming, one for use in verifying.  These are separate   * because they need separate flash and eeprom buffer space   */  p = avr_dup_part(p);  v = avr_dup_part(p);  if (strcmp(pgm->type, "PPI") == 0) {    verify_pin_assigned(PIN_AVR_RESET, "AVR RESET");    verify_pin_assigned(PIN_AVR_SCK,   "AVR SCK");    verify_pin_assigned(PIN_AVR_MISO,  "AVR MISO");    verify_pin_assigned(PIN_AVR_MOSI,  "AVR MOSI");  }  /*   * open the programmer   */  if (port[0] == 0) {    fprintf(stderr, "\n%s: no port has been specified on the command line "            "or the config file\n",            progname);    fprintf(stderr, "%sSpecify a port using the -P option and try again\n\n",            progbuf);    exit(1);  }  if (verbose) {    fprintf(stderr, "%sUsing Port            : %s\n", progbuf, port);    fprintf(stderr, "%sUsing Programmer      : %s\n", progbuf, programmer);  }  if (baudrate != 0) {    if (verbose) {      fprintf(stderr, "%sOverriding Baud Rate  : %d\n", progbuf, baudrate);    }    pgm->baudrate = baudrate;  }  rc = pgm->open(pgm, port);  if (rc < 0) {    exitrc = 1;    pgm->ppidata = 0; /* clear all bits at exit */    goto main_exit;  }  if (verbose) {    avr_display(stderr, p, progbuf, verbose);    fprintf(stderr, "\n");    programmer_display(progbuf);  }  fprintf(stderr, "\n");  exitrc = 0;  /*   * handle exit specs. FIXME: this should be moved to "par.c"   */  if (strcmp(pgm->type, "PPI") == 0) {    pgm->ppidata &= ~ppiclrbits;    pgm->ppidata |= ppisetbits;  }  /*   * enable the programmer   */  pgm->enable(pgm);  /*   * turn off all the status leds   */  pgm->rdy_led(pgm, OFF);  pgm->err_led(pgm, OFF);  pgm->pgm_led(pgm, OFF);  pgm->vfy_led(pgm, OFF);  /*   * initialize the chip in preperation for accepting commands   */  rc = pgm->initialize(pgm, p);  if (rc < 0) {    fprintf(stderr, "%s: initialization failed, rc=%d\n", progname, rc);    if (!ovsigck) {      fprintf(stderr, "%sDouble check connections and try again, "              "or use -F to override\n"              "%sthis check.\n\n",              progbuf, progbuf);      exitrc = 1;      goto main_exit;    }  }  /* indicate ready */  pgm->rdy_led(pgm, ON);  fprintf(stderr,            "%s: AVR device initialized and ready to accept instructions\n",            progname);  /*   * Let's read the signature bytes to make sure there is at least a   * chip on the other end that is responding correctly.  A check   * against 0xffffffff should ensure that the signature bytes are   * valid.   */  rc = avr_signature(pgm, p);  if (rc != 0) {    fprintf(stderr, "%s: error reading signature data, rc=%d\n",            progname, rc);    exit(1);  }  sig = avr_locate_mem(p, "signature");  if (sig == NULL) {    fprintf(stderr,            "%s: WARNING: signature data not defined for device \"%s\"\n",            progname, p->desc);  }  if (sig != NULL) {    int ff;    fprintf(stderr, "%s: Device signature = 0x", progname);    ff = 1;    for (i=0; i<sig->size; i++) {      fprintf(stderr, "%02x", sig->buf[i]);      if (sig->buf[i] != 0xff)        ff = 0;    }    fprintf(stderr, "\n");    if (ff) {      fprintf(stderr,              "%s: Yikes!  Invalid device signature.\n", progname);      if (!ovsigck) {        fprintf(stderr, "%sDouble check connections and try again, "                "or use -F to override\n"                "%sthis check.\n\n",                progbuf, progbuf);        exitrc = 1;        goto main_exit;      }    }  }  if ((erase == 0) && (auto_erase == 1)) {    AVRMEM * m;    for (ln=lfirst(updates); ln; ln=lnext(ln)) {      upd = ldata(ln);      m = avr_locate_mem(p, upd->memtype);      if (m == NULL)        continue;      if ((strcasecmp(m->desc, "flash") == 0) && (upd->op == DEVICE_WRITE)) {        erase = 1;        fprintf(stderr,                "%s: NOTE: FLASH memory has been specified, an erase cycle will be performed\n"                "%sTo disable this feature, specify the -D option.\n",                progname, progbuf);        break;      }    }  }    /*   * Display cycle count, if and only if it is not set later on.   *   * The cycle count will be displayed anytime it will be changed later.     */  if ((set_cycles == -1) && ((erase == 0) || (do_cycles == 0))) {    /*     * see if the cycle count in the last four bytes of eeprom seems     * reasonable     */    rc = avr_get_cycle_count(pgm, p, &cycles);    if ((rc >= 0) && (cycles != 0)) {      fprintf(stderr,              "%s: current erase-rewrite cycle count is %d%s\n",              progname, cycles,              do_cycles ? "" : " (if being tracked)");    }  }  if (set_cycles != -1) {    rc = avr_get_cycle_count(pgm, p, &cycles);    if (rc == 0) {      /*       * only attempt to update the cycle counter if we can actually       * read the old value       */      cycles = set_cycles;      fprintf(stderr, "%s: setting erase-rewrite cycle count to %d\n",              progname, cycles);      rc = avr_put_cycle_count(pgm, p, cycles);      if (rc < 0) {        fprintf(stderr,                "%s: WARNING: failed to update the erase-rewrite cycle "                "counter\n",                progname);      }    }  }  if (erase) {    /*     * erase the chip's flash and eeprom memories, this is required     * before the chip can accept new programming     */    fprintf(stderr, "%s: erasing chip\n", progname);    avr_chip_erase(pgm, p);  }  if (terminal) {    /*     * terminal mode     */    exitrc = terminal_mode(pgm, p);  }  for (ln=lfirst(updates); ln; ln=lnext(ln)) {    upd = ldata(ln);    rc = do_op(pgm, p, upd, nowrite, verify);    if (rc) {      exitrc = 1;      break;    }  } main_exit:  /*   * program complete   */  pgm->powerdown(pgm);  pgm->disable(pgm);  pgm->rdy_led(pgm, OFF);  pgm->close(pgm);  fprintf(stderr, "\n%s done.  Thank you.\n\n", progname);  return exitrc;}