butterfly.c

来自「这是一个非常有价值的参考代码」· C语言 代码 · 共 694 行 · 第 1/2 页

C
694
字号
static void butterfly_disable(PROGRAMMER * pgm){  no_show_func_info();  butterfly_leave_prog_mode(pgm);  return;}static void butterfly_enable(PROGRAMMER * pgm){  no_show_func_info();  return;}static int butterfly_open(PROGRAMMER * pgm, char * port){  no_show_func_info();  strcpy(pgm->port, port);  /*   *  If baudrate was not specified use 19200 Baud   */  if(pgm->baudrate == 0) {    pgm->baudrate = 19200;  }  pgm->fd = serial_open(port, pgm->baudrate);  /*   * drain any extraneous input   */  butterfly_drain (pgm, 0);  return 0;}static void butterfly_close(PROGRAMMER * pgm){  no_show_func_info();  /* "exit programmer" added by Martin Thomas 2/2004 */  butterfly_send(pgm, "E", 1);  serial_close(pgm->fd);  pgm->fd = -1;}static void butterfly_display(PROGRAMMER * pgm, char * p){  no_show_func_info();  return;}static void butterfly_set_addr(PROGRAMMER * pgm, unsigned long addr){  char cmd[3];  cmd[0] = 'A';  cmd[1] = (addr >> 8) & 0xff;  cmd[2] = addr & 0xff;    butterfly_send(pgm, cmd, sizeof(cmd));  butterfly_vfy_cmd_sent(pgm, "set addr");}static int butterfly_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                             unsigned long addr, unsigned char value){  char cmd[6];  int size;  no_show_func_info();  if ((strcmp(m->desc, "flash") == 0) || (strcmp(m->desc, "eeprom") == 0))  {    cmd[0] = 'B';    cmd[1] = 0;    if ((cmd[3] = toupper(m->desc[0])) == 'E') {	/* write to eeprom */      cmd[2] = 1;      cmd[4] = value;      size = 5;    } else {						/* write to flash */      /* @@@ not yet implemented */      cmd[2] = 2;      size = 6;      return -1;    }    butterfly_set_addr(pgm, addr);  }  else if (strcmp(m->desc, "lock") == 0)  {    cmd[0] = 'l';    cmd[1] = value;    size = 2;  }  else    return -1;  butterfly_send(pgm, cmd, size);  butterfly_vfy_cmd_sent(pgm, "write byte");  return 0;}static int butterfly_read_byte_flash(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                                  unsigned long addr, unsigned char * value){  static int cached = 0;  static unsigned char cvalue;  static unsigned long caddr;  if (cached && ((caddr + 1) == addr)) {    *value = cvalue;    cached = 0;  }  else {    char buf[2];    butterfly_set_addr(pgm, addr >> 1);    butterfly_send(pgm, "g\000\002F", 4);    /* Read back the program mem word (MSB first) */    butterfly_recv(pgm, buf, sizeof(buf));    if ((addr & 0x01) == 0) {      *value = buf[1];      cached = 1;      cvalue = buf[0];      caddr = addr;    }    else {      *value = buf[0];    }  }  return 0;}static int butterfly_read_byte_eeprom(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                                   unsigned long addr, unsigned char * value){  butterfly_set_addr(pgm, addr);  butterfly_send(pgm, "g\000\001E", 4);  butterfly_recv(pgm, (char *)value, 1);  return 0;}static int butterfly_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                            unsigned long addr, unsigned char * value){  char cmd;  no_show_func_info();  if (strcmp(m->desc, "flash") == 0) {    return butterfly_read_byte_flash(pgm, p, m, addr, value);  }  if (strcmp(m->desc, "eeprom") == 0) {    return butterfly_read_byte_eeprom(pgm, p, m, addr, value);  }  if (strcmp(m->desc, "lfuse") == 0) {    cmd = 'F';  }  else if (strcmp(m->desc, "hfuse") == 0) {    cmd = 'N';  }  else if (strcmp(m->desc, "efuse") == 0) {    cmd = 'Q';  }  else if (strcmp(m->desc, "lock") == 0) {    cmd = 'r';  }  else    return -1;  butterfly_send(pgm, &cmd, 1);  butterfly_recv(pgm, (char *)value, 1);  return *value == '?'? -1: 0;}static int butterfly_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                               int page_size, int n_bytes){  unsigned int addr = 0;  unsigned int max_addr = n_bytes;  char *cmd;  unsigned int blocksize = buffersize;  if (strcmp(m->desc, "flash") && strcmp(m->desc, "eeprom"))     return -2;  if (m->desc[0] == 'e')    blocksize = 1;		/* Write to eeprom single bytes only */  butterfly_set_addr(pgm, addr);#if 0  usleep(1000000);  butterfly_send(pgm, "y", 1);  butterfly_vfy_cmd_sent(pgm, "clear LED");#endif  cmd = malloc(4+blocksize);  if (!cmd) return -1;  cmd[0] = 'B';  cmd[3] = toupper(m->desc[0]);  while (addr < max_addr) {    if ((max_addr - addr) < blocksize) {      blocksize = max_addr - addr;    };    memcpy(&cmd[4], &m->buf[addr], blocksize);    cmd[1] = (blocksize >> 8) & 0xff;    cmd[2] = blocksize & 0xff;    butterfly_send(pgm, cmd, 4+blocksize);    butterfly_vfy_cmd_sent(pgm, "write block");    addr += blocksize;    report_progress (addr, max_addr, NULL);  } /* while */  free(cmd);  return addr;}static int butterfly_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,                              int page_size, int n_bytes){  unsigned int addr = 0;  unsigned int max_addr = n_bytes;  int rd_size = 1;  /* check parameter syntax: only "flash" or "eeprom" is allowed */  if (strcmp(m->desc, "flash") && strcmp(m->desc, "eeprom"))     return -2;  {		/* use buffered mode */    char cmd[4];    int blocksize = buffersize;    cmd[0] = 'g';    cmd[3] = toupper(m->desc[0]);    butterfly_set_addr(pgm, addr);    while (addr < max_addr) {      if ((max_addr - addr) < blocksize) {        blocksize = max_addr - addr;      };      cmd[1] = (blocksize >> 8) & 0xff;      cmd[2] = blocksize & 0xff;      butterfly_send(pgm, cmd, 4);      butterfly_recv(pgm, (char *)&m->buf[addr], blocksize);      addr += blocksize;      report_progress (addr, max_addr, NULL);    } /* while */  }  return addr * rd_size;}/* Signature byte reads are always 3 bytes. */static int butterfly_read_sig_bytes(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m){  unsigned char tmp;  no_show_func_info();  if (m->size < 3) {    fprintf(stderr, "%s: memsize too small for sig byte read", progname);    return -1;  }  butterfly_send(pgm, "s", 1);  butterfly_recv(pgm, (char *)m->buf, 3);  /* Returned signature has wrong order. */  tmp = m->buf[2];  m->buf[2] = m->buf[0];  m->buf[0] = tmp;  return 3;}void butterfly_initpgm(PROGRAMMER * pgm){  no_show_func_info();  strcpy(pgm->type, "avr910");  /*   * mandatory functions   */  pgm->rdy_led        = butterfly_rdy_led;  pgm->err_led        = butterfly_err_led;  pgm->pgm_led        = butterfly_pgm_led;  pgm->vfy_led        = butterfly_vfy_led;  pgm->initialize     = butterfly_initialize;  pgm->display        = butterfly_display;  pgm->enable         = butterfly_enable;  pgm->disable        = butterfly_disable;  pgm->powerup        = butterfly_powerup;  pgm->powerdown      = butterfly_powerdown;  pgm->program_enable = butterfly_program_enable;  pgm->chip_erase     = butterfly_chip_erase;/*  pgm->cmd		not supported, use default error message */  pgm->open           = butterfly_open;  pgm->close          = butterfly_close;  /*   * optional functions   */  pgm->write_byte = butterfly_write_byte;  pgm->read_byte = butterfly_read_byte;  pgm->paged_write = butterfly_paged_write;  pgm->paged_load = butterfly_paged_load;  pgm->read_sig_bytes = butterfly_read_sig_bytes;}

⌨️ 快捷键说明

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