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