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 + -
显示快捷键?