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

📄 stk500.c

📁 AVR的USB文件
💻 C
📖 第 1 页 / 共 2 页
字号:
    buf[13] = 0;    buf[14] = 0;    buf[17] = 0;    buf[18] = 0;    buf[19] = 0;    buf[20] = 0;  }  m = avr_locate_mem(p, "eeprom");  if (m) {    buf[11] = m->readback[0];    buf[12] = m->readback[1];    buf[15] = (m->size >> 8) & 0x00ff;    buf[16] = m->size & 0x00ff;  }  else {    buf[11] = 0xff;    buf[12] = 0xff;    buf[15] = 0;    buf[16] = 0;  }  buf[21] = Sync_CRC_EOP;  stk500_send(pgm, buf, 22);  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_NOSYNC) {    fprintf(stderr,            "%s: stk500_initialize(): programmer not in sync, resp=0x%02x\n",             progname, buf[0]);    if (tries > 33)      return -1;    stk500_getsync(pgm);    goto retry;    return -1;  }  else if (buf[0] != Resp_STK_INSYNC) {    fprintf(stderr,            "%s: stk500_initialize(): (a) protocol error, "            "expect=0x%02x, resp=0x%02x\n",             progname, Resp_STK_INSYNC, buf[0]);    return -1;  }  stk500_recv(pgm, buf, 1);  if (buf[0] != Resp_STK_OK) {    fprintf(stderr,            "%s: stk500_initialize(): (b) protocol error, "            "expect=0x%02x, resp=0x%02x\n",             progname, Resp_STK_OK, buf[0]);    return -1;  }  if (n_extparms) {    if ((p->pagel == 0) || (p->bs2 == 0)) {      fprintf(stderr,               "%s: please define PAGEL and BS2 signals in the configuration "              "file for part %s\n",               progname, p->desc);    }    else {      buf[0] = n_extparms+1;      /*       * m is currently pointing to eeprom memory if the part has it       */      if (m)        buf[1] = m->page_size;      else        buf[1] = 0;            buf[2] = p->pagel;      buf[3] = p->bs2;            if (n_extparms == 4) {        if (p->reset_disposition == RESET_DEDICATED)          buf[4] = 0;        else          buf[4] = 1;      }            rc = stk500_set_extended_parms(pgm, n_extparms+1, buf);      if (rc) {        fprintf(stderr, "%s: stk500_initialize(): failed\n", progname);        exit(1);      }    }  }  return pgm->program_enable(pgm, p);}static int stk500_save(PROGRAMMER * pgm){  return 0;}static void stk500_restore(PROGRAMMER * pgm){  return;}static void stk500_disable(PROGRAMMER * pgm){  unsigned char buf[16];  int tries=0; retry:    tries++;  buf[0] = Cmnd_STK_LEAVE_PROGMODE;  buf[1] = Sync_CRC_EOP;  stk500_send(pgm, buf, 2);  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_NOSYNC) {    if (tries > 33) {      fprintf(stderr, "%s: stk500_disable(): can't get into sync\n",              progname);      return;    }    stk500_getsync(pgm);    goto retry;  }  else if (buf[0] != Resp_STK_INSYNC) {    fprintf(stderr,            "%s: stk500_disable(): protocol error, expect=0x%02x, "            "resp=0x%02x\n",             progname, Resp_STK_INSYNC, buf[0]);    return;  }  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_OK) {    return;  }  else if (buf[0] == Resp_STK_NODEVICE) {    fprintf(stderr, "%s: stk500_disable(): no device\n",            progname);    return;  }  fprintf(stderr, "%s: stk500_disable(): unknown response=0x%02x\n",          progname, buf[0]);  return;}static void stk500_enable(PROGRAMMER * pgm){  return;}static int stk500_setattr(int fd){  int rc;  struct termios termios;    if (!isatty(fd))    return -1;    /*   * initialize terminal modes   */  rc = tcgetattr(fd, &termios);  if (rc < 0) {    fprintf(stderr, "%s: stk500_setattr(): tcgetattr() failed, %s",             progname, strerror(errno));    return -errno;  }  termios.c_iflag = 0;  termios.c_oflag = 0;  termios.c_cflag = 0;  termios.c_cflag |=   (CS8 | CREAD | CLOCAL);  termios.c_lflag = 0;  termios.c_cc[VMIN]  = 1;  termios.c_cc[VTIME] = 0;  cfsetospeed(&termios, B115200);  cfsetispeed(&termios, B115200);    rc = tcsetattr(fd, TCSANOW, &termios);  if (rc < 0) {    fprintf(stderr, "%s: stk500_setattr(): tcsetattr() failed, %s",             progname, strerror(errno));    return -errno;  }  return 0;}static void stk500_open(PROGRAMMER * pgm, char * port){  int rc;  strcpy(pgm->port, port);  /*   * open the serial port   */  pgm->fd = open(port, O_RDWR | O_NOCTTY /*| O_NONBLOCK*/);  if (pgm->fd < 0) {    fprintf(stderr, "%s: stk500_open(): can't open device \"%s\": %s\n",            progname, port, strerror(errno));    exit(1);  }  /*   * set serial line attributes   */  rc = stk500_setattr(pgm->fd);  if (rc) {    fprintf(stderr,             "%s: stk500_open(): can't set attributes for device \"%s\"\n",            progname, port);    exit(1);  }  /*   * drain any extraneous input   */  stk500_drain(pgm, 0);  stk500_getsync(pgm);  stk500_drain(pgm, 0);}static void stk500_close(PROGRAMMER * pgm){  close(pgm->fd);  pgm->fd = -1;}static int stk500_loadaddr(PROGRAMMER * pgm, unsigned int addr){  unsigned char buf[16];  int tries;  tries = 0; retry:  tries++;  buf[0] = Cmnd_STK_LOAD_ADDRESS;  buf[1] = addr & 0xff;  buf[2] = (addr >> 8) & 0xff;  buf[3] = Sync_CRC_EOP;  stk500_send(pgm, buf, 4);  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_NOSYNC) {    if (tries > 33) {      fprintf(stderr, "%s: stk500_loadaddr(): can't get into sync\n",              progname);      return -1;    }    stk500_getsync(pgm);    goto retry;  }  else if (buf[0] != Resp_STK_INSYNC) {    fprintf(stderr,            "%s: stk500_loadaddr(): (a) protocol error, "            "expect=0x%02x, resp=0x%02x\n",             progname, Resp_STK_INSYNC, buf[0]);    return -1;  }  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_OK) {    return 0;  }  fprintf(stderr,          "%s: loadaddr(): (b) protocol error, "          "expect=0x%02x, resp=0x%02x\n",           progname, Resp_STK_INSYNC, buf[0]);  return -1;}static int stk500_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                               int page_size, int n_bytes){  unsigned char buf[16];  int memtype;  unsigned int addr;  int a_div;  int i;  int tries;  unsigned int n;  if (page_size == 0) {    page_size = 128;  }  if (strcmp(m->desc, "flash") == 0) {    memtype = 'F';  }  else if (strcmp(m->desc, "eeprom") == 0) {    memtype = 'E';  }  else {    return -2;  }  if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))    a_div = 2;  else    a_div = 1;  if (n_bytes > m->size) {    n_bytes = m->size;    n = m->size;  }  else {    if ((n_bytes % page_size) != 0) {      n = n_bytes + page_size - (n_bytes % page_size);    }    else {      n = n_bytes;    }  }#if 0  fprintf(stderr,           "n_bytes   = %d\n"          "n         = %u\n"          "a_div     = %d\n"          "page_size = %d\n",          n_bytes, n, a_div, page_size);#endif       for (addr = 0; addr < n; addr += page_size) {    fprintf(stderr, "\r      \r%6u", addr);    tries = 0;  retry:    tries++;    stk500_loadaddr(pgm, addr/a_div);    buf[0] = Cmnd_STK_PROG_PAGE;    buf[1] = (page_size >> 8) & 0xff;    buf[2] = page_size & 0xff;    buf[3] = memtype;    stk500_send(pgm, buf, 4);    for (i=0; i<page_size; i++) {      buf[0] = m->buf[addr + i];      stk500_send(pgm, buf, 1);    }    buf[0] = Sync_CRC_EOP;    stk500_send(pgm, buf, 1);    stk500_recv(pgm, buf, 1);    if (buf[0] == Resp_STK_NOSYNC) {      if (tries > 33) {        fprintf(stderr, "\n%s: stk500_paged_write(): can't get into sync\n",                progname);        return -3;      }      stk500_getsync(pgm);      goto retry;    }    else if (buf[0] != Resp_STK_INSYNC) {      fprintf(stderr,              "\n%s: stk500_paged_write(): (a) protocol error, "              "expect=0x%02x, resp=0x%02x\n",               progname, Resp_STK_INSYNC, buf[0]);      return -4;    }        stk500_recv(pgm, buf, 1);    if (buf[0] != Resp_STK_OK) {      fprintf(stderr,              "\n%s: stk500_paged_write(): (a) protocol error, "              "expect=0x%02x, resp=0x%02x\n",               progname, Resp_STK_INSYNC, buf[0]);      return -5;    }  }  fprintf(stderr, "\r      \r%6u", addr-1);  fprintf(stderr, "\n");  return n;}static int stk500_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                              int page_size, int n_bytes){  unsigned char buf[16];  int memtype;  unsigned int addr;  int a_div;  int tries;  unsigned int n;  if (strcmp(m->desc, "flash") == 0) {    memtype = 'F';  }  else if (strcmp(m->desc, "eeprom") == 0) {    memtype = 'E';  }  else {    return -2;  }  if ((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO]))    a_div = 2;  else    a_div = 1;  if (n_bytes > m->size) {    n_bytes = m->size;    n = m->size;  }  else {    if ((n_bytes % page_size) != 0) {      n = n_bytes + page_size - (n_bytes % page_size);    }    else {      n = n_bytes;    }  }  for (addr = 0; addr < n; addr += page_size) {    fprintf(stderr, "\r      \r%6u", addr);    tries = 0;  retry:    tries++;    stk500_loadaddr(pgm, addr/a_div);    buf[0] = Cmnd_STK_READ_PAGE;    buf[1] = (page_size >> 8) & 0xff;    buf[2] = page_size & 0xff;    buf[3] = memtype;    buf[4] = Sync_CRC_EOP;    stk500_send(pgm, buf, 5);    stk500_recv(pgm, buf, 1);    if (buf[0] == Resp_STK_NOSYNC) {      if (tries > 33) {        fprintf(stderr, "\n%s: stk500_paged_load(): can't get into sync\n",                progname);        return -3;      }      stk500_getsync(pgm);      goto retry;    }    else if (buf[0] != Resp_STK_INSYNC) {      fprintf(stderr,              "\n%s: stk500_paged_load(): (a) protocol error, "              "expect=0x%02x, resp=0x%02x\n",               progname, Resp_STK_INSYNC, buf[0]);      return -4;    }    stk500_recv(pgm, &m->buf[addr], page_size);    stk500_recv(pgm, buf, 1);    if (buf[0] != Resp_STK_OK) {      fprintf(stderr,              "\n%s: stk500_paged_load(): (a) protocol error, "              "expect=0x%02x, resp=0x%02x\n",               progname, Resp_STK_INSYNC, buf[0]);      return -5;    }  }  fprintf(stderr, "\r      \r%6u", addr-1);  fprintf(stderr, "\n");  return n;}static int stk500_getparm(PROGRAMMER * pgm, unsigned parm, unsigned * value){  unsigned char buf[16];  unsigned v;  int tries = 0; retry:  tries++;  buf[0] = Cmnd_STK_GET_PARAMETER;  buf[1] = parm;  buf[2] = Sync_CRC_EOP;  stk500_send(pgm, buf, 3);  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_NOSYNC) {    if (tries > 33) {      fprintf(stderr, "\n%s: stk500_getparm(): can't get into sync\n",              progname);      return -1;    }    stk500_getsync(pgm);    goto retry;  }  else if (buf[0] != Resp_STK_INSYNC) {    fprintf(stderr,            "\n%s: stk500_getparm(): (a) protocol error, "            "expect=0x%02x, resp=0x%02x\n",             progname, Resp_STK_INSYNC, buf[0]);    return -2;  }  stk500_recv(pgm, buf, 1);  v = buf[0];  stk500_recv(pgm, buf, 1);  if (buf[0] == Resp_STK_FAILED) {    fprintf(stderr,            "\n%s: stk500_getparm(): parameter 0x%02x failed\n",            progname, v);    return -3;  }  else if (buf[0] != Resp_STK_OK) {    fprintf(stderr,            "\n%s: stk500_getparm(): (a) protocol error, "            "expect=0x%02x, resp=0x%02x\n",             progname, Resp_STK_INSYNC, buf[0]);    return -3;  }  *value = v;  return 0;}  static void stk500_display(PROGRAMMER * pgm, char * p){  unsigned maj, min, hdw;  stk500_getparm(pgm, Parm_STK_HW_VER, &hdw);  stk500_getparm(pgm, Parm_STK_SW_MAJOR, &maj);  stk500_getparm(pgm, Parm_STK_SW_MINOR, &min);  fprintf(stderr, "%sHardware Version: %d\n", p, hdw);  fprintf(stderr, "%sFirmware Version: %d.%d\n", p, maj, min);  return;}void stk500_initpgm(PROGRAMMER * pgm){  strcpy(pgm->type, "STK500");  /*   * mandatory functions   */  pgm->rdy_led        = stk500_rdy_led;  pgm->err_led        = stk500_err_led;  pgm->pgm_led        = stk500_pgm_led;  pgm->vfy_led        = stk500_vfy_led;  pgm->initialize     = stk500_initialize;  pgm->display        = stk500_display;  pgm->save           = stk500_save;  pgm->restore        = stk500_restore;  pgm->enable         = stk500_enable;  pgm->disable        = stk500_disable;  pgm->powerup        = stk500_powerup;  pgm->powerdown      = stk500_powerdown;  pgm->program_enable = stk500_program_enable;  pgm->chip_erase     = stk500_chip_erase;  pgm->cmd            = stk500_cmd;  pgm->open           = stk500_open;  pgm->close          = stk500_close;  /*   * optional functions   */  pgm->paged_write    = stk500_paged_write;  pgm->paged_load     = stk500_paged_load;  pgm->page_size      = 256;}

⌨️ 快捷键说明

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