jtagmkii.c

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

C
1,822
字号
    jtagmkII_prmsg(pgm, resp, status);  } else if (verbose == 2)    fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);  c = resp[0];  free(resp);  if (c != RSP_OK) {    fprintf(stderr,	    "%s: jtagmkII_program_disable(): "	    "bad response to leave progmode command: 0x%02x\n",	    progname, c);    return -1;  }  prog_enabled = 0;  (void)jtagmkII_reset(pgm);  return 0;}static unsigned char jtagmkII_get_baud(long baud){  static struct {    long baud;    unsigned char val;  } baudtab[] = {    { 2400L, PAR_BAUD_2400 },    { 4800L, PAR_BAUD_4800 },    { 9600L, PAR_BAUD_9600 },    { 19200L, PAR_BAUD_19200 },    { 38400L, PAR_BAUD_38400 },    { 57600L, PAR_BAUD_57600 },    { 115200L, PAR_BAUD_115200 },    { 14400L, PAR_BAUD_14400 },  };  int i;  for (i = 0; i < sizeof baudtab / sizeof baudtab[0]; i++)    if (baud == baudtab[i].baud)      return baudtab[i].val;  return 0;}/* * initialize the AVR device and prepare it to accept commands */static int jtagmkII_initialize(PROGRAMMER * pgm, AVRPART * p){  AVRMEM hfuse;  unsigned char b;  if (!(p->flags & AVRPART_HAS_JTAG)) {    fprintf(stderr, "%s: jtagmkII_initialize(): part %s has no JTAG interface\n",	    progname, p->desc);    return -1;  }  if (pgm->baudrate && pgm->baudrate != 19200) {    if ((b = jtagmkII_get_baud(pgm->baudrate)) == 0) {      fprintf(stderr, "%s: jtagmkII_initialize(): unsupported baudrate %d\n",	      progname, pgm->baudrate);    } else {      if (verbose >= 2)	fprintf(stderr, "%s: jtagmkII_initialize(): "		"trying to set baudrate to %d\n",		progname, pgm->baudrate);      if (jtagmkII_setparm(pgm, PAR_BAUD_RATE, &b) == 0)	serial_setspeed(pgm->fd, pgm->baudrate);    }  }  if (pgm->bitclock != 0.0) {    if (verbose >= 2)      fprintf(stderr, "%s: jtagmkII_initialize(): "	      "trying to set JTAG clock period to %.1f us\n",	      progname, pgm->bitclock);    if (jtagmkII_set_sck_period(pgm, pgm->bitclock) != 0)      return -1;  }  /*   * Must set the device descriptor before entering programming mode.   */  jtagmkII_set_devdescr(pgm, p);  free(flash_pagecache);  free(eeprom_pagecache);  if ((flash_pagecache = malloc(flash_pagesize)) == NULL) {    fprintf(stderr, "%s: jtagmkII_initialize(): Out of memory\n",	    progname);    return -1;  }  if ((eeprom_pagecache = malloc(eeprom_pagesize)) == NULL) {    fprintf(stderr, "%s: jtagmkII_initialize(): Out of memory\n",	    progname);    free(flash_pagecache);    return -1;  }  flash_pageaddr = eeprom_pageaddr = (unsigned long)-1L;  if (jtagmkII_reset(pgm) < 0)    return -1;  strcpy(hfuse.desc, "hfuse");  if (jtagmkII_read_byte(pgm, p, &hfuse, 1, &b) < 0)    return -1;  if ((b & OCDEN) != 0)    fprintf(stderr,	    "%s: jtagmkII_initialize(): warning: OCDEN fuse not programmed, "	    "single-byte EEPROM updates not possible\n",	    progname);  return 0;}static void jtagmkII_disable(PROGRAMMER * pgm){  free(flash_pagecache);  flash_pagecache = NULL;  free(eeprom_pagecache);  eeprom_pagecache = NULL;  (void)jtagmkII_program_disable(pgm);}static void jtagmkII_enable(PROGRAMMER * pgm){  return;}static int jtagmkII_open(PROGRAMMER * pgm, char * port){  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_open()\n", progname);#if defined(HAVE_LIBUSB)  /*   * If the port name starts with "usb", divert the serial routines   * to the USB ones.   */  if (strncmp(port, "usb", 3) == 0)    serdev = &usb_serdev;#endif  strcpy(pgm->port, port);  /*   * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon   * attaching.  If the config file or command-line parameters specify   * a higher baud rate, we switch to it later on, after establishing   * the connection with the ICE.   */  pgm->fd = serial_open(port, 19200);  /*   * drain any extraneous input   */  jtagmkII_drain(pgm, 0);  jtagmkII_getsync(pgm);  return 0;}static void jtagmkII_close(PROGRAMMER * pgm){  int status;  unsigned char buf[1], *resp, c;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_close()\n", progname);  buf[0] = CMND_GO;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_close(): Sending GO command: ",	    progname);  jtagmkII_send(pgm, buf, 1);  status = jtagmkII_recv(pgm, &resp);  if (status <= 0) {    if (verbose >= 2)      putc('\n', stderr);    fprintf(stderr,	    "%s: jtagmkII_close(): "	    "timeout/error communicating with programmer (status %d)\n",	    progname, status);  } else {    if (verbose >= 3) {      putc('\n', stderr);      jtagmkII_prmsg(pgm, resp, status);    } else if (verbose == 2)      fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);    c = resp[0];    free(resp);    if (c != RSP_OK) {      fprintf(stderr,	      "%s: jtagmkII_close(): "	      "bad response to GO command: 0x%02x\n",	      progname, c);    }  }  buf[0] = CMND_SIGN_OFF;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_close(): Sending sign-off command: ",	    progname);  jtagmkII_send(pgm, buf, 1);  status = jtagmkII_recv(pgm, &resp);  if (status <= 0) {    if (verbose >= 2)      putc('\n', stderr);    fprintf(stderr,	    "%s: jtagmkII_close(): "	    "timeout/error communicating with programmer (status %d)\n",	    progname, status);    return;  }  if (verbose >= 3) {    putc('\n', stderr);    jtagmkII_prmsg(pgm, resp, status);  } else if (verbose == 2)    fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);  c = resp[0];  free(resp);  if (c != RSP_OK) {    fprintf(stderr,	    "%s: jtagmkII_close(): "	    "bad response to sign-off command: 0x%02x\n",	    progname, c);  }  serial_close(pgm->fd);  pgm->fd = -1;}static int jtagmkII_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,				int page_size, int n_bytes){  int addr, block_size;  unsigned char *cmd;  unsigned char *resp;  int status, tries;  long otimeout = serial_recv_timeout;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_paged_write(.., %s, %d, %d)\n",	    progname, m->desc, page_size, n_bytes);  if (jtagmkII_program_enable(pgm) < 0)    return -1;  if ((cmd = malloc(page_size + 10)) == NULL) {    fprintf(stderr, "%s: jtagmkII_paged_write(): Out of memory\n",	    progname);    return -1;  }  cmd[0] = CMND_WRITE_MEMORY;  if (strcmp(m->desc, "flash") == 0) {    cmd[1] = MTYPE_FLASH_PAGE;    flash_pageaddr = (unsigned long)-1L;    page_size = flash_pagesize;  } else if (strcmp(m->desc, "eeprom") == 0) {    cmd[1] = MTYPE_EEPROM_PAGE;    eeprom_pageaddr = (unsigned long)-1L;    page_size = eeprom_pagesize;  }  if (page_size == 0) page_size = 256;  serial_recv_timeout = 100;  for (addr = 0; addr < n_bytes; addr += page_size) {    report_progress(addr, n_bytes,NULL);    if ((n_bytes-addr) < page_size)      block_size = n_bytes - addr;    else      block_size = page_size;    if (verbose >= 3)      fprintf(stderr, "%s: jtagmkII_paged_write(): "	      "block_size at addr %d is %d\n",	      progname, addr, block_size);    u32_to_b4(cmd + 2, page_size);    u32_to_b4(cmd + 6, addr);    /*     * The JTAG ICE will refuse to write anything but a full page, at     * least for the flash ROM.  If a partial page has been requested,     * set the remainder to 0xff.  (Maybe we should rather read back     * the existing contents instead before?  Doesn't matter much, as     * bits cannot be written to 1 anyway.)     */    memset(cmd + 10, 0xff, page_size);    memcpy(cmd + 10, m->buf + addr, block_size);    tries = 0;    retry:    if (verbose >= 2)      fprintf(stderr, "%s: jtagmkII_paged_write(): "	      "Sending write memory command: ",	      progname);    jtagmkII_send(pgm, cmd, page_size + 10);    status = jtagmkII_recv(pgm, &resp);    if (status <= 0) {      if (verbose >= 2)	putc('\n', stderr);      if (verbose >= 1)	fprintf(stderr,		"%s: jtagmkII_paged_write(): "		"timeout/error communicating with programmer (status %d)\n",		progname, status);      if (tries++ < 4) {	serial_recv_timeout *= 2;	goto retry;      }      fprintf(stderr,	      "%s: jtagmkII_paged_write(): fatal timeout/"	      "error communicating with programmer (status %d)\n",	      progname, status);      free(cmd);      serial_recv_timeout = otimeout;      return -1;    }    if (verbose >= 3) {      putc('\n', stderr);      jtagmkII_prmsg(pgm, resp, status);    } else if (verbose == 2)      fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);    if (resp[0] != RSP_OK) {      fprintf(stderr,	      "%s: jtagmkII_paged_write(): "	      "bad response to write memory command: 0x%02x\n",	      progname, resp[0]);      free(resp);      free(cmd);      serial_recv_timeout = otimeout;      return -1;    }    free(resp);  }  free(cmd);  serial_recv_timeout = otimeout;  return n_bytes;}static int jtagmkII_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,			       int page_size, int n_bytes){  int addr, block_size;  unsigned char cmd[10];  unsigned char *resp;  int status, tries;  long otimeout = serial_recv_timeout;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_paged_load(.., %s, %d, %d)\n",	    progname, m->desc, page_size, n_bytes);  if (jtagmkII_program_enable(pgm) < 0)    return -1;  page_size = m->readsize;  cmd[0] = CMND_READ_MEMORY;  if (strcmp(m->desc, "flash") == 0) {    cmd[1] = MTYPE_FLASH_PAGE;  } else if (strcmp(m->desc, "eeprom") == 0) {    cmd[1] = MTYPE_EEPROM_PAGE;  }  serial_recv_timeout = 100;  for (addr = 0; addr < n_bytes; addr += page_size) {    report_progress(addr, n_bytes,NULL);    if ((n_bytes-addr) < page_size)      block_size = n_bytes - addr;    else      block_size = page_size;    if (verbose >= 3)      fprintf(stderr, "%s: jtagmkII_paged_load(): "	      "block_size at addr %d is %d\n",	      progname, addr, block_size);    u32_to_b4(cmd + 2, block_size);    u32_to_b4(cmd + 6, addr);    tries = 0;    retry:    if (verbose >= 2)      fprintf(stderr, "%s: jtagmkII_paged_load(): Sending read memory command: ",	      progname);    jtagmkII_send(pgm, cmd, 10);    status = jtagmkII_recv(pgm, &resp);    if (status <= 0) {      if (verbose >= 2)	putc('\n', stderr);      if (verbose >= 1)	fprintf(stderr,		"%s: jtagmkII_paged_load(): "		"timeout/error communicating with programmer (status %d)\n",		progname, status);      if (tries++ < 4) {	serial_recv_timeout *= 2;	goto retry;      }      fprintf(stderr,	      "%s: jtagmkII_paged_load(): fatal timeout/"	      "error communicating with programmer (status %d)\n",	      progname, status);      serial_recv_timeout = otimeout;      return -1;    }    if (verbose >= 3) {      putc('\n', stderr);      jtagmkII_prmsg(pgm, resp, status);    } else if (verbose == 2)      fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);    if (resp[0] != RSP_MEMORY) {      fprintf(stderr,	      "%s: jtagmkII_paged_load(): "	      "bad response to read memory command: 0x%02x\n",	      progname, resp[0]);      free(resp);      serial_recv_timeout = otimeout;      return -1;    }    memcpy(m->buf + addr, resp + 1, status);    free(resp);  }  serial_recv_timeout = otimeout;  return n_bytes;}static int jtagmkII_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,			      unsigned long addr, unsigned char * value){  unsigned char cmd[10];  unsigned char *resp = NULL, *cache_ptr = NULL;  int status, tries;  unsigned long paddr = 0UL, *paddr_ptr = NULL;  unsigned int pagesize = 0;  if (verbose >= 2)    fprintf(stderr, "%s: jtagmkII_read_byte(.., %s, 0x%lx, ...)\n",

⌨️ 快捷键说明

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