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

📄 fileio.c

📁 AVR的USB文件
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  fprintf(outf, tmpl, n + addr_width + 1, nextaddr);  cksum += n + addr_width +1;  for (i=addr_width; i>0; i--)     cksum += (nextaddr >> (i - 1) * 8) & 0xff;  cksum = 0xff - cksum;  fprintf(outf, "%02X\n", cksum);  return nbytes; }int srec_readrec(struct ihexrec * srec, char * rec){  int i, j;  char buf[8];  int offset, len, addr_width;  char * e;  unsigned char cksum;  int rc;  len = strlen(rec);  offset = 1;  cksum = 0;  addr_width = 2;  /* record type */  if (offset + 1 > len)     return -1;  srec->rectyp = rec[offset++];  if (srec->rectyp == 0x32 || srec->rectyp == 0x38)     addr_width = 3;	/* S2,S8-record */  else if (srec->rectyp == 0x33 || srec->rectyp == 0x37)     addr_width = 4;	/* S3,S7-record */  /* reclen */  if (offset + 2 > len)     return -1;  for (i=0; i<2; i++)     buf[i] = rec[offset++];  buf[i] = 0;  srec->reclen = strtoul(buf, &e, 16);  cksum += srec->reclen;  srec->reclen -= (addr_width+1);  if (e == buf || *e != 0)     return -1;  /* load offset */  if (offset + addr_width > len)     return -1;  for (i=0; i<addr_width*2; i++)     buf[i] = rec[offset++];  buf[i] = 0;  srec->loadofs = strtoull(buf, &e, 16);  if (e == buf || *e != 0)     return -1;  for (i=addr_width; i>0; i--)    cksum += (srec->loadofs >> (i - 1) * 8) & 0xff;  /* data */  for (j=0; j<srec->reclen; j++) {    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_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;  int i;  AVRMEM * mem;  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 (strcmp(filename, "-")==0) {    if (fio.op == FIO_READ) {      fname = "<stdin>";      f = stdin;    }    else {      fname = "<stdout>";      f = stdout;    }  }  else {    fname = filename;    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;    }  }  /* 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 */    for (i=0; i<size; i++) {      buf[i] = 0xff;    }  }  if (format == FMT_AUTO) {    format = fmt_autodetect(fname);    if (format < 0) {      fprintf(stderr,               "%s: can't determine file format for %s, specify explicitly\n",              progname, fname);      return -1;    }    fprintf(stderr, "%s: %s file %s auto detected as %s\n",             progname, fio.iodesc, fname, fmtstr(format));  }  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;    default:      fprintf(stderr, "%s: invalid %s file format: %d\n",              progname, fio.iodesc, format);      return -1;  }  return rc;}

⌨️ 快捷键说明

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