From 351f329ec8d6569f4a412e629fc4e1f616bb8670 Mon Sep 17 00:00:00 2001 From: joerg_wunsch Date: Mon, 20 Nov 2006 15:04:09 +0000 Subject: [PATCH] Replace the fallback of avr_read_byte() and avr_write_byte() to avr_read_byte_default() and avr_write_byte_default (resp.) by directly calling the latter functions from within all programmers that don't implement their own read_byte()/write_byte() methods. In turn, make the read_byte() and write_byte() methods mandatory, and the cmd() method (direct ISP command) optional instead (it's effectively mandatory for any programmer using avr_read_byte_default()/avr_write_byte_default() though). Remove all the pointless cmd() method stubs from those programmers that don't need it. Eliminate avr_read_byte() as it was now completely identical to pgm->read_byte(). git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@684 81a1dc3b-b13d-400b-aceb-764788c761c2 --- ChangeLog | 26 +++++++++++++++++++++ avr.c | 65 +++++++++++++++++++++++++---------------------------- avr.h | 7 ++++-- bitbang.c | 6 +++++ butterfly.c | 6 ++--- jtagmkI.c | 15 ++----------- jtagmkII.c | 20 ++++------------- par.c | 2 ++ pgm.c | 23 +++++++++++++------ safemode.c | 26 ++++++++++----------- stk500.c | 10 +++++++++ stk500v2.c | 36 ++++++++++++----------------- term.c | 11 +++++++-- usbasp.c | 2 ++ 14 files changed, 141 insertions(+), 114 deletions(-) diff --git a/ChangeLog b/ChangeLog index bbb57d65..9d94619f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2006-11-13 Joerg Wunsch + + * avr.c: Replace the fallback of avr_read_byte() and avr_write_byte() to + avr_read_byte_default() and avr_write_byte_default (resp.) by directly + calling the latter functions from within all programmers that don't + implement their own read_byte()/write_byte() methods. In turn, make the + read_byte() and write_byte() methods mandatory, and the cmd() method + (direct ISP command) optional instead (it's effectively mandatory for + any programmer using avr_read_byte_default()/avr_write_byte_default() + though). Remove all the pointless cmd() method stubs from those programmers + that don't need it. + Eliminate avr_read_byte() as it was now completely identical to + pgm->read_byte(). + * avr.h: (Ditto.) + * bitbang.c: (Ditto.) + * butterfly.c: (Ditto.) + * jtagmkI.c: (Ditto.) + * jtagmkII.c: (Ditto.) + * par.c: (Ditto.) + * pgm.c: (Ditto.) + * safemode.c: (Ditto.) + * stk500.c: (Ditto.) + * stk500v2.c: (Ditto.) + * term.c: (Ditto.) + * usbasp.c: (Ditto.) + 2006-11-13 Joerg Wunsch * jtagmkI.c: Avoid sending a CMD_RESET when leaving programming diff --git a/avr.c b/avr.c index 56783409..b8cc7e7c 100644 --- a/avr.c +++ b/avr.c @@ -53,6 +53,14 @@ int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, unsigned char data; OPCODE * readop, * lext; + if (pgm->cmd == NULL) { + fprintf(stderr, + "%s: Error: %s programmer uses avr_read_byte_default() but does not\n" + "provide a cmd() method.\n", + progname, pgm->type); + return -1; + } + pgm->pgm_led(pgm, ON); pgm->err_led(pgm, OFF); @@ -107,26 +115,6 @@ int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, } -/* - * read a byte of data from the indicated memory region - */ -int avr_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, - unsigned long addr, unsigned char * value) -{ - int rc; - - if (pgm->read_byte) { - rc = pgm->read_byte(pgm, p, mem, addr, value); - if (rc == 0) { - return rc; - } - /* read_byte() method failed, try again with default. */ - } - - return avr_read_byte_default(pgm, p, mem, addr, value); -} - - /* * Return the number of "interesting" bytes in a memory buffer, * "interesting" being defined as up to the last non-0xff data @@ -218,7 +206,7 @@ int avr_read(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size, } for (i=0; iread_byte(pgm, p, mem, i, &rbyte); if (rc != 0) { fprintf(stderr, "avr_read(): error reading address 0x%04lx\n", i); if (rc == -1) @@ -248,6 +236,14 @@ int avr_write_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, unsigned char res[4]; OPCODE * wp, * lext; + if (pgm->cmd == NULL) { + fprintf(stderr, + "%s: Error: %s programmer uses avr_write_page() but does not\n" + "provide a cmd() method.\n", + progname, pgm->type); + return -1; + } + wp = mem->op[AVR_OP_WRITEPAGE]; if (wp == NULL) { fprintf(stderr, @@ -312,13 +308,21 @@ int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, int readok=0; struct timeval tv; + if (pgm->cmd == NULL) { + fprintf(stderr, + "%s: Error: %s programmer uses avr_write_byte_default() but does not\n" + "provide a cmd() method.\n", + progname, pgm->type); + return -1; + } + if (!mem->paged) { /* * check to see if the write is necessary by reading the existing * value and only write if we are changing the value; we can't * use this optimization for paged addressing. */ - rc = avr_read_byte(pgm, p, mem, addr, &b); + rc = pgm->read_byte(pgm, p, mem, addr, &b); if (rc != 0) { if (rc != -1) { return -2; @@ -410,7 +414,7 @@ int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, * specified for the chip. */ usleep(mem->max_write_delay); - rc = avr_read_byte(pgm, p, mem, addr, &r); + rc = pgm->read_byte(pgm, p, mem, addr, &r); if (rc != 0) { pgm->pgm_led(pgm, OFF); pgm->err_led(pgm, OFF); @@ -424,7 +428,7 @@ int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, /* * Do polling, but timeout after max_write_delay. */ - rc = avr_read_byte(pgm, p, mem, addr, &r); + rc = pgm->read_byte(pgm, p, mem, addr, &r); if (rc != 0) { pgm->pgm_led(pgm, OFF); pgm->err_led(pgm, ON); @@ -509,7 +513,6 @@ int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, unsigned char safemode_hfuse; unsigned char safemode_efuse; unsigned char safemode_fuse; - int rc; /* If we write the fuses, then we need to tell safemode that they *should* change */ safemode_memfuses(0, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); @@ -529,15 +532,7 @@ int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, safemode_memfuses(1, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); - if (pgm->write_byte) { - rc = pgm->write_byte(pgm, p, mem, addr, data); - if (rc == 0) { - return rc; - } - /* write_byte() method failed, try again with default. */ - } - - return avr_write_byte_default(pgm, p, mem, addr, data); + return pgm->write_byte(pgm, p, mem, addr, data); } @@ -741,7 +736,7 @@ int avr_get_cycle_count(PROGRAMMER * pgm, AVRPART * p, int * cycles) } for (i=4; i>0; i--) { - rc = avr_read_byte(pgm, p, a, a->size-i, &v1); + rc = pgm->read_byte(pgm, p, a, a->size-i, &v1); if (rc < 0) { fprintf(stderr, "%s: WARNING: can't read memory for cycle count, rc=%d\n", progname, rc); diff --git a/avr.h b/avr.h index 9f6e9d36..5928cf6f 100644 --- a/avr.h +++ b/avr.h @@ -32,8 +32,8 @@ extern struct avrpart parts[]; -int avr_read_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, - unsigned long addr, unsigned char * value); +int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value); int avr_read(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size, int verbose); @@ -44,6 +44,9 @@ int avr_write_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, unsigned long addr, unsigned char data); +int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data); + int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size, int verbose); diff --git a/bitbang.c b/bitbang.c index a420dc2d..164cac5a 100644 --- a/bitbang.c +++ b/bitbang.c @@ -355,4 +355,10 @@ void bitbang_check_prerequisites(PROGRAMMER *pgm) verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK"); verify_pin_assigned(pgm, PIN_AVR_MISO, "AVR MISO"); verify_pin_assigned(pgm, PIN_AVR_MOSI, "AVR MOSI"); + + if (pgm->cmd == NULL) { + fprintf(stderr, "%s: error: no cmd() method defined for bitbang programmer\n", + progname); + exit(1); + } } diff --git a/butterfly.c b/butterfly.c index 2f9bccc7..3c3465a3 100644 --- a/butterfly.c +++ b/butterfly.c @@ -661,17 +661,15 @@ void butterfly_initpgm(PROGRAMMER * pgm) 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; + pgm->read_byte = butterfly_read_byte; + pgm->write_byte = butterfly_write_byte; /* * 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; diff --git a/jtagmkI.c b/jtagmkI.c index 46908c62..d4978fa7 100644 --- a/jtagmkI.c +++ b/jtagmkI.c @@ -334,16 +334,6 @@ static int jtagmkI_getsync(PROGRAMMER * pgm) return 0; } -static int jtagmkI_cmd(PROGRAMMER * pgm, unsigned char cmd[4], - unsigned char res[4]) -{ - - fprintf(stderr, "%s: jtagmkI_command(): no direct SPI supported for JTAG\n", - progname); - return -1; -} - - /* * issue the 'chip erase' command to the AVR device */ @@ -1354,17 +1344,16 @@ void jtagmkI_initpgm(PROGRAMMER * pgm) pgm->disable = jtagmkI_disable; pgm->program_enable = jtagmkI_program_enable_dummy; pgm->chip_erase = jtagmkI_chip_erase; - pgm->cmd = jtagmkI_cmd; pgm->open = jtagmkI_open; pgm->close = jtagmkI_close; + pgm->read_byte = jtagmkI_read_byte; + pgm->write_byte = jtagmkI_write_byte; /* * optional functions */ pgm->paged_write = jtagmkI_paged_write; pgm->paged_load = jtagmkI_paged_load; - pgm->read_byte = jtagmkI_read_byte; - pgm->write_byte = jtagmkI_write_byte; pgm->print_parms = jtagmkI_print_parms; pgm->set_sck_period = jtagmkI_set_sck_period; pgm->page_size = 256; diff --git a/jtagmkII.c b/jtagmkII.c index 660112b2..505b0107 100644 --- a/jtagmkII.c +++ b/jtagmkII.c @@ -757,16 +757,6 @@ int jtagmkII_getsync(PROGRAMMER * pgm, int mode) { return 0; } -static int jtagmkII_cmd(PROGRAMMER * pgm, unsigned char cmd[4], - unsigned char res[4]) -{ - - fprintf(stderr, "%s: jtagmkII_command(): no direct SPI supported for JTAG\n", - progname); - return -1; -} - - /* * issue the 'chip erase' command to the AVR device */ @@ -1951,17 +1941,16 @@ void jtagmkII_initpgm(PROGRAMMER * pgm) pgm->disable = jtagmkII_disable; pgm->program_enable = jtagmkII_program_enable_dummy; pgm->chip_erase = jtagmkII_chip_erase; - pgm->cmd = jtagmkII_cmd; pgm->open = jtagmkII_open; pgm->close = jtagmkII_close; + pgm->read_byte = jtagmkII_read_byte; + pgm->write_byte = jtagmkII_write_byte; /* * optional functions */ pgm->paged_write = jtagmkII_paged_write; pgm->paged_load = jtagmkII_paged_load; - pgm->read_byte = jtagmkII_read_byte; - pgm->write_byte = jtagmkII_write_byte; pgm->print_parms = jtagmkII_print_parms; pgm->set_sck_period = jtagmkII_set_sck_period; pgm->page_size = 256; @@ -1981,17 +1970,16 @@ void jtagmkII_dragon_initpgm(PROGRAMMER * pgm) pgm->disable = jtagmkII_disable; pgm->program_enable = jtagmkII_program_enable_dummy; pgm->chip_erase = jtagmkII_chip_erase; - pgm->cmd = jtagmkII_cmd; pgm->open = jtagmkII_dragon_open; pgm->close = jtagmkII_close; + pgm->read_byte = jtagmkII_read_byte; + pgm->write_byte = jtagmkII_write_byte; /* * optional functions */ pgm->paged_write = jtagmkII_paged_write; pgm->paged_load = jtagmkII_paged_load; - pgm->read_byte = jtagmkII_read_byte; - pgm->write_byte = jtagmkII_write_byte; pgm->print_parms = jtagmkII_print_parms; pgm->set_sck_period = jtagmkII_set_sck_period; pgm->page_size = 256; diff --git a/par.c b/par.c index 9b36c831..ce327bf0 100644 --- a/par.c +++ b/par.c @@ -425,6 +425,8 @@ void par_initpgm(PROGRAMMER * pgm) pgm->getpin = par_getpin; pgm->highpulsepin = par_highpulsepin; pgm->parseexitspecs = par_parseexitspecs; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; } #else /* !HAVE_PARPORT */ diff --git a/pgm.c b/pgm.c index b983dc81..994d6a38 100644 --- a/pgm.c +++ b/pgm.c @@ -30,9 +30,11 @@ extern char * progname; static int pgm_default_2 (struct programmer_t *, AVRPART *); +static int pgm_default_3 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value); static void pgm_default_4 (struct programmer_t *); -static int pgm_default_5 (struct programmer_t *, unsigned char cmd[4], - unsigned char res[4]); +static int pgm_default_5 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data); static void pgm_default_6 (struct programmer_t *, char *); @@ -96,9 +98,10 @@ PROGRAMMER * pgm_new(void) pgm->powerdown = pgm_default_powerup_powerdown; pgm->program_enable = pgm_default_2; pgm->chip_erase = pgm_default_2; - pgm->cmd = pgm_default_5; pgm->open = pgm_default_open; pgm->close = pgm_default_4; + pgm->read_byte = pgm_default_3; + pgm->write_byte = pgm_default_5; /* * predefined functions - these functions have a valid default @@ -114,11 +117,10 @@ PROGRAMMER * pgm_new(void) * optional functions - these are checked to make sure they are * assigned before they are called */ + pgm->cmd = NULL; pgm->paged_write = NULL; pgm->paged_load = NULL; pgm->write_setup = NULL; - pgm->write_byte = NULL; - pgm->read_byte = NULL; pgm->read_sig_bytes = NULL; pgm->set_vtarget = NULL; pgm->set_varef = NULL; @@ -141,13 +143,20 @@ static int pgm_default_2 (struct programmer_t * pgm, AVRPART * p) return -1; } +static int pgm_default_3 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value) +{ + pgm_default(); + return -1; +} + static void pgm_default_4 (struct programmer_t * pgm) { pgm_default(); } -static int pgm_default_5 (struct programmer_t * pgm, unsigned char cmd[4], - unsigned char res[4]) +static int pgm_default_5 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data) { pgm_default(); return -1; diff --git a/safemode.c b/safemode.c index d71500ba..ddeed6b0 100644 --- a/safemode.c +++ b/safemode.c @@ -50,7 +50,7 @@ int safemode_writefuse (unsigned char fuse, char * fusename, PROGRAMMER * pgm, /* Keep trying to write then read back the fuse values */ while (tries > 0) { avr_write_byte(pgm, p, m, 0, fuse); - avr_read_byte(pgm, p, m, 0, &fuseread); + pgm->read_byte(pgm, p, m, 0, &fuseread); /* Report information to user if needed */ if (verbose > 0) { @@ -99,10 +99,10 @@ int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, m = avr_locate_mem(p, "fuse"); if (m != NULL) { fusegood = 0; /* By default fuse is a failure */ - avr_read_byte(pgm, p, m, 0, &safemode_fuse); - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &safemode_fuse); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_fuse) { - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_fuse){ fusegood = 1; /* Fuse read OK three times */ } @@ -126,10 +126,10 @@ int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, m = avr_locate_mem(p, "lfuse"); if (m != NULL) { fusegood = 0; /* By default fuse is a failure */ - avr_read_byte(pgm, p, m, 0, &safemode_lfuse); - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &safemode_lfuse); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_lfuse) { - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_lfuse){ fusegood = 1; /* Fuse read OK three times */ } @@ -152,10 +152,10 @@ int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, m = avr_locate_mem(p, "hfuse"); if (m != NULL) { fusegood = 0; /* By default fuse is a failure */ - avr_read_byte(pgm, p, m, 0, &safemode_hfuse); - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &safemode_hfuse); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_hfuse) { - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_hfuse){ fusegood = 1; /* Fuse read OK three times */ } @@ -178,10 +178,10 @@ int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, m = avr_locate_mem(p, "efuse"); if (m != NULL) { fusegood = 0; /* By default fuse is a failure */ - avr_read_byte(pgm, p, m, 0, &safemode_efuse); - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &safemode_efuse); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_efuse) { - avr_read_byte(pgm, p, m, 0, &value); + pgm->read_byte(pgm, p, m, 0, &value); if (value == safemode_efuse){ fusegood = 1; /* Fuse read OK three times */ } diff --git a/stk500.c b/stk500.c index c5ed1ba6..cb839e35 100644 --- a/stk500.c +++ b/stk500.c @@ -176,6 +176,14 @@ static int stk500_chip_erase(PROGRAMMER * pgm, AVRPART * p) unsigned char cmd[4]; unsigned char res[4]; + if (pgm->cmd == NULL) { + fprintf(stderr, + "%s: Error: %s programmer uses stk500_chip_erase() but does not\n" + "provide a cmd() method.\n", + progname, pgm->type); + return -1; + } + if (p->op[AVR_OP_CHIP_ERASE] == NULL) { fprintf(stderr, "chip erase instruction not defined for part \"%s\"\n", p->desc); @@ -1236,6 +1244,8 @@ void stk500_initpgm(PROGRAMMER * pgm) pgm->cmd = stk500_cmd; pgm->open = stk500_open; pgm->close = stk500_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; /* * optional functions diff --git a/stk500v2.c b/stk500v2.c index 26599165..a20dcfa5 100644 --- a/stk500v2.c +++ b/stk500v2.c @@ -643,16 +643,6 @@ static int stk500v2_cmd(PROGRAMMER * pgm, unsigned char cmd[4], } -static int stk500hv_cmd(PROGRAMMER * pgm, unsigned char cmd[4], - unsigned char res[4]) -{ - - fprintf(stderr, "%s: stk500hv_command(): no direct SPI supported for PP mode\n", - progname); - return -1; -} - - /* * issue the 'chip erase' command to the AVR device */ @@ -2375,6 +2365,8 @@ void stk500v2_initpgm(PROGRAMMER * pgm) pgm->cmd = stk500v2_cmd; pgm->open = stk500v2_open; pgm->close = stk500v2_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; /* * optional functions @@ -2403,15 +2395,14 @@ void stk500pp_initpgm(PROGRAMMER * pgm) pgm->disable = stk500pp_disable; pgm->program_enable = stk500pp_program_enable; pgm->chip_erase = stk500pp_chip_erase; - pgm->cmd = stk500hv_cmd; pgm->open = stk500v2_open; pgm->close = stk500v2_close; + pgm->read_byte = stk500pp_read_byte; + pgm->write_byte = stk500pp_write_byte; /* * optional functions */ - pgm->read_byte = stk500pp_read_byte; - pgm->write_byte = stk500pp_write_byte; pgm->paged_write = stk500pp_paged_write; pgm->paged_load = stk500pp_paged_load; pgm->print_parms = stk500v2_print_parms; @@ -2435,15 +2426,14 @@ void stk500hvsp_initpgm(PROGRAMMER * pgm) pgm->disable = stk500hvsp_disable; pgm->program_enable = stk500hvsp_program_enable; pgm->chip_erase = stk500hvsp_chip_erase; - pgm->cmd = stk500hv_cmd; pgm->open = stk500v2_open; pgm->close = stk500v2_close; + pgm->read_byte = stk500hvsp_read_byte; + pgm->write_byte = stk500hvsp_write_byte; /* * optional functions */ - pgm->read_byte = stk500hvsp_read_byte; - pgm->write_byte = stk500hvsp_write_byte; pgm->paged_write = stk500hvsp_paged_write; pgm->paged_load = stk500hvsp_paged_load; pgm->print_parms = stk500v2_print_parms; @@ -2470,6 +2460,8 @@ void stk500v2_jtagmkII_initpgm(PROGRAMMER * pgm) pgm->cmd = stk500v2_cmd; pgm->open = stk500v2_jtagmkII_open; pgm->close = jtagmkII_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; /* * optional functions @@ -2498,6 +2490,8 @@ void stk500v2_dragon_isp_initpgm(PROGRAMMER * pgm) pgm->cmd = stk500v2_cmd; pgm->open = stk500v2_dragon_isp_open; pgm->close = jtagmkII_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; /* * optional functions @@ -2522,15 +2516,14 @@ void stk500v2_dragon_pp_initpgm(PROGRAMMER * pgm) pgm->disable = stk500pp_disable; pgm->program_enable = stk500pp_program_enable; pgm->chip_erase = stk500pp_chip_erase; - pgm->cmd = stk500hv_cmd; pgm->open = stk500v2_dragon_hv_open; pgm->close = jtagmkII_close; + pgm->read_byte = stk500pp_read_byte; + pgm->write_byte = stk500pp_write_byte; /* * optional functions */ - pgm->read_byte = stk500pp_read_byte; - pgm->write_byte = stk500pp_write_byte; pgm->paged_write = stk500pp_paged_write; pgm->paged_load = stk500pp_paged_load; pgm->print_parms = stk500v2_print_parms; @@ -2554,15 +2547,14 @@ void stk500v2_dragon_hvsp_initpgm(PROGRAMMER * pgm) pgm->disable = stk500hvsp_disable; pgm->program_enable = stk500hvsp_program_enable; pgm->chip_erase = stk500hvsp_chip_erase; - pgm->cmd = stk500hv_cmd; pgm->open = stk500v2_dragon_hv_open; pgm->close = jtagmkII_close; + pgm->read_byte = stk500hvsp_read_byte; + pgm->write_byte = stk500hvsp_write_byte; /* * optional functions */ - pgm->read_byte = stk500hvsp_read_byte; - pgm->write_byte = stk500hvsp_write_byte; pgm->paged_write = stk500hvsp_paged_write; pgm->paged_load = stk500hvsp_paged_load; pgm->print_parms = stk500v2_print_parms; diff --git a/term.c b/term.c index 34645dd5..191724ae 100644 --- a/term.c +++ b/term.c @@ -292,7 +292,7 @@ int cmd_dump(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]) } for (i=0; iread_byte(pgm, p, mem, addr+i, &buf[i]); if (rc != 0) { fprintf(stderr, "error reading %s address 0x%05lx of part %s\n", mem->desc, addr+i, p->desc); @@ -399,7 +399,7 @@ int cmd_write(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]) werror = 1; } - rc = avr_read_byte(pgm, p, mem, addr+i, &b); + rc = pgm->read_byte(pgm, p, mem, addr+i, &b); if (b != buf[i]) { fprintf(stderr, "%s (write): error writing 0x%02x at 0x%05lx cell=0x%02x\n", @@ -427,6 +427,13 @@ int cmd_send(PROGRAMMER * pgm, struct avrpart * p, int argc, char * argv[]) int i; int len; + if (pgm->cmd == NULL) { + fprintf(stderr, + "The %s programmer does not support direct ISP commands.\n", + pgm->type); + return -1; + } + if (argc != 5) { fprintf(stderr, "Usage: send \n"); return -1; diff --git a/usbasp.c b/usbasp.c index f931c1c2..654748e8 100644 --- a/usbasp.c +++ b/usbasp.c @@ -411,6 +411,8 @@ void usbasp_initpgm(PROGRAMMER * pgm) pgm->cmd = usbasp_cmd; pgm->open = usbasp_open; pgm->close = usbasp_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; /* * optional functions