⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileio.c

📁 这是一个非常有价值的参考代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (offset+2  > len)       return -1;    for (i=0; i<2; i++)       buf[i] = rec[offset++];    buf[i] = 0;    srec->data[j] = strtoul(buf, &e, 16);    if (e == buf || *e != 0)       return -1;    cksum += srec->data[j];  }  /* cksum */  if (offset + 2 > len)     return -1;  for (i=0; i<2; i++)     buf[i] = rec[offset++];  buf[i] = 0;  srec->cksum = strtoul(buf, &e, 16);  if (e == buf || *e != 0)     return -1;  rc = 0xff - cksum;  return rc;}int srec2b(char * infile, FILE * inf,           unsigned char * outbuf, int bufsize){  char buffer [ MAX_LINE_LEN ];  unsigned char * buf;  unsigned int nextaddr, baseaddr, maxaddr;  int i;  int lineno;  int len;  struct ihexrec srec;  int rc;  int reccount;  unsigned char datarec;  char * msg = 0;  lineno   = 0;  buf      = outbuf;  baseaddr = 0;  maxaddr  = 0;  reccount = 0;  while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) {    lineno++;    len = strlen(buffer);    if (buffer[len-1] == '\n')       buffer[--len] = 0;    if (buffer[0] != 0x53)      continue;    rc = srec_readrec(&srec, buffer);    if (rc < 0) {      fprintf(stderr, "%s: ERROR: invalid record at line %d of \"%s\"\n",              progname, lineno, infile);      return -1;    }    else if (rc != srec.cksum) {      fprintf(stderr, "%s: ERROR: checksum mismatch at line %d of \"%s\"\n",              progname, lineno, infile);      fprintf(stderr, "%s: checksum=0x%02x, computed checksum=0x%02x\n",              progname, srec.cksum, rc);      return -1;    }    datarec=0;	    switch (srec.rectyp) {      case 0x30: /* S0 - header record*/        /* skip */        break;      case 0x31: /* S1 - 16 bit address data record */        datarec=1;        msg="%s: ERROR: address 0x%04x out of range at line %d of %s\n";            break;      case 0x32: /* S2 - 24 bit address data record */        datarec=1;        msg="%s: ERROR: address 0x%06x out of range at line %d of %s\n";        break;      case 0x33: /* S3 - 32 bit address data record */        datarec=1;        msg="%s: ERROR: address 0x%08x out of range at line %d of %s\n";        break;      case 0x34: /* S4 - symbol record (LSI extension) */        fprintf(stderr,                 "%s: ERROR: not supported record at line %d of %s\n",                progname, lineno, infile);        return -1;      case 0x35: /* S5 - count of S1,S2 and S3 records previously tx'd */        if (srec.loadofs != reccount){          fprintf(stderr,                   "%s: ERROR: count of transmitted data records mismatch "                  "at line %d of \"%s\"\n",                  progname, lineno, infile);          fprintf(stderr, "%s: transmitted data records= %d, expected "                  "value= %d\n",                  progname, reccount, srec.loadofs);          return -1;        }        break;      case 0x37: /* S7 Record - end record for 32 bit address data */      case 0x38: /* S8 Record - end record for 24 bit address data */      case 0x39: /* S9 Record - end record for 16 bit address data */        return maxaddr;      default:        fprintf(stderr,                 "%s: ERROR: don't know how to deal with rectype S%d "                 "at line %d of %s\n",                progname, srec.rectyp, lineno, infile);        return -1;    }    if (datarec == 1) {      nextaddr = srec.loadofs + baseaddr;      if (nextaddr + srec.reclen > bufsize) {        fprintf(stderr, msg, progname, nextaddr+srec.reclen, lineno, infile);        return -1;      }      for (i=0; i<srec.reclen; i++)         buf[nextaddr+i] = srec.data[i];      if (nextaddr+srec.reclen > maxaddr)        maxaddr = nextaddr+srec.reclen;      reccount++;	    }  }   fprintf(stderr,           "%s: WARNING: no end of file record found for Motorola S-Records "          "file \"%s\"\n",          progname, infile);  return maxaddr;}int fileio_rbin(struct fioparms * fio,                  char * filename, FILE * f, unsigned char * buf, int size){  int rc;  switch (fio->op) {    case FIO_READ:      rc = fread(buf, 1, size, f);      break;    case FIO_WRITE:      rc = fwrite(buf, 1, size, f);      break;    default:      fprintf(stderr, "%s: fileio: invalid operation=%d\n",              progname, fio->op);      return -1;  }  if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) {    fprintf(stderr,             "%s: %s error %s %s: %s; %s %d of the expected %d bytes\n",             progname, fio->iodesc, fio->dir, filename, strerror(errno),            fio->rw, rc, size);    return -1;  }  return rc;}int fileio_imm(struct fioparms * fio,               char * filename, FILE * f, unsigned char * buf, int size){  int rc = 0;  char * e, * p;  unsigned long b;  int loc;  switch (fio->op) {    case FIO_READ:      loc = 0;      p = strtok(filename, " ,");      while (p != NULL && loc < size) {        b = strtoul(p, &e, 0);        if (*e != 0) {          fprintf(stderr,                  "%s: invalid byte value (%s) specified for immediate mode\n",                  progname, p);          return -1;        }        buf[loc++] = b;        p = strtok(NULL, " ,");        rc = loc;      }      break;    default:      fprintf(stderr, "%s: fileio: invalid operation=%d\n",              progname, fio->op);      return -1;  }  if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) {    fprintf(stderr,             "%s: %s error %s %s: %s; %s %d of the expected %d bytes\n",             progname, fio->iodesc, fio->dir, filename, strerror(errno),            fio->rw, rc, size);    return -1;  }  return rc;}int fileio_ihex(struct fioparms * fio,                   char * filename, FILE * f, unsigned char * buf, int size){  int rc;  switch (fio->op) {    case FIO_WRITE:      rc = b2ihex(buf, size, 32, 0, filename, f);      if (rc < 0) {        return -1;      }      break;    case FIO_READ:      rc = ihex2b(filename, f, buf, size);      if (rc < 0)        return -1;      break;    default:      fprintf(stderr, "%s: invalid Intex Hex file I/O operation=%d\n",              progname, fio->op);      return -1;      break;  }  return rc;}int fileio_srec(struct fioparms * fio,                  char * filename, FILE * f, unsigned char * buf, int size){  int rc;  switch (fio->op) {    case FIO_WRITE:      rc = b2srec(buf, size, 32, 0, filename, f);      if (rc < 0) {        return -1;      }      break;    case FIO_READ:      rc = srec2b(filename, f, buf, size);      if (rc < 0)        return -1;      break;    default:      fprintf(stderr, "%s: ERROR: invalid Motorola S-Records file I/O "              "operation=%d\n",              progname, fio->op);      return -1;      break;  }  return rc;}int fileio_setparms(int op, struct fioparms * fp){  fp->op = op;  switch (op) {    case FIO_READ:      fp->mode   = "r";      fp->iodesc = "input";      fp->dir    = "from";      fp->rw     = "read";      break;    case FIO_WRITE:      fp->mode   = "w";      fp->iodesc = "output";      fp->dir    = "to";      fp->rw     = "wrote";      break;    default:      fprintf(stderr, "%s: invalid I/O operation %d\n",              progname, op);      return -1;      break;  }  return 0;}int fmt_autodetect(char * fname){  FILE * f;  unsigned char buf[MAX_LINE_LEN];  int i;  int len;  int found;  f = fopen(fname, "r");  if (f == NULL) {    fprintf(stderr, "%s: error opening %s: %s\n",            progname, fname, strerror(errno));    return -1;  }  while (fgets((char *)buf, MAX_LINE_LEN, f)!=NULL) {    buf[MAX_LINE_LEN-1] = 0;    len = strlen((char *)buf);    if (buf[len-1] == '\n')      buf[--len] = 0;    /* check for binary data */    found = 0;    for (i=0; i<len; i++) {      if (buf[i] > 127) {        found = 1;        break;      }    }    if (found)      return FMT_RBIN;    /* check for lines that look like intel hex */    if ((buf[0] == ':') && (len >= 11)) {      found = 1;      for (i=1; i<len; i++) {        if (!isxdigit(buf[1])) {          found = 0;          break;        }      }      if (found)        return FMT_IHEX;    }    /* check for lines that look like motorola s-record */    if ((buf[0] == 'S') && (len >= 10) && isdigit(buf[1])) {      found = 1;      for (i=1; i<len; i++) {        if (!isxdigit(buf[1])) {          found = 0;          break;        }      }      if (found)        return FMT_SREC;    }  }  return -1;}int fileio(int op, char * filename, FILEFMT format,              struct avrpart * p, char * memtype, int size){  int rc;  FILE * f;  char * fname;  unsigned char * buf;  struct fioparms fio;  AVRMEM * mem;  int using_stdio;  mem = avr_locate_mem(p, memtype);  if (mem == NULL) {    fprintf(stderr,             "fileio(): memory type \"%s\" not configured for device \"%s\"\n",            memtype, p->desc);    return -1;  }  rc = fileio_setparms(op, &fio);  if (rc < 0)    return -1;  #if defined(WIN32NATIVE)  /* Open Raw Binary format in binary mode on Windows.*/  if(format == FMT_RBIN)  {      if(fio.op == FIO_READ)      {          fio.mode = "rb";      }      if(fio.op == FIO_WRITE)      {          fio.mode = "wb";      }  }  #endif  /* point at the requested memory buffer */  buf = mem->buf;  if (fio.op == FIO_READ)    size = mem->size;  if (fio.op == FIO_READ) {    /* 0xff fill unspecified memory */    memset(buf, 0xff, size);  }  using_stdio = 0;  if (strcmp(filename, "-")==0) {    if (fio.op == FIO_READ) {      fname = "<stdin>";      f = stdin;    }    else {      fname = "<stdout>";      f = stdout;    }    using_stdio = 1;  }  else {    fname = filename;    f = NULL;  }  if (format == FMT_AUTO) {    if (using_stdio) {      fprintf(stderr,               "%s: can't auto detect file format when using stdin/out.\n"              "     Please specify a file format using the -f option and try again.\n",               progname);      exit(1);    }    format = fmt_autodetect(fname);    if (format < 0) {      fprintf(stderr,               "%s: can't determine file format for %s, specify explicitly\n",              progname, fname);      return -1;    }    if (quell_progress < 2) {      fprintf(stderr, "%s: %s file %s auto detected as %s\n",               progname, fio.iodesc, fname, fmtstr(format));    }  }  if (format != FMT_IMM) {    if (!using_stdio) {      f = fopen(fname, fio.mode);      if (f == NULL) {        fprintf(stderr, "%s: can't open %s file %s: %s\n",                progname, fio.iodesc, fname, strerror(errno));        return -1;      }    }  }  switch (format) {    case FMT_IHEX:      rc = fileio_ihex(&fio, fname, f, buf, size);      break;    case FMT_SREC:      rc = fileio_srec(&fio, fname, f, buf, size);      break;    case FMT_RBIN:      rc = fileio_rbin(&fio, fname, f, buf, size);      break;    case FMT_IMM:      rc = fileio_imm(&fio, fname, f, buf, size);      break;    default:      fprintf(stderr, "%s: invalid %s file format: %d\n",              progname, fio.iodesc, format);      return -1;  }  if (rc > 0) {    if ((op == FIO_READ) && (strcasecmp(mem->desc, "flash") == 0)) {      /*       * if we are reading flash, just mark the size as being the       * highest non-0xff byte       */      rc = avr_mem_hiaddr(mem);    }  }  return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -