As Henrik Brix Andersen wrote:

> > If people think the current way of doing things is really useful,
> > I'd at least like to make the "cmd" method optional.

> Making it optional seems like a good compromise to me.

In retrospect, I think it would ultimately make more sense to rather
make the read_byte() and write_byte() methods madatory as well, and
offer avr_read_byte_default() and avr_write_byte_default() for those
(ISP) programmers that don't want to supply their own methods.  Right
now, there are already more programmers supplying their own methods
rather than those that use the ISP one.  The days when AVRDUDE was
just a little ISP-only tool are really over now.

By that, avr_read_byte() could completely go away, as it boils down to
just pgm->read_byte().  Alas, avr_write_byte() does some safemode
handling, so in order to not have to reproduce that in each individual
write_byte() method, this function would remain.

As the patch touches about the entire AVRDUDE implementation, I'd
prefer to see it reviewed by someone else before committing it to CVS.
I did make some quick tests, and it appears to work.

-- 
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Index: avr.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/avr.c,v
retrieving revision 1.67
diff -u -u -r1.67 avr.c
--- avr.c       22 Aug 2006 22:05:19 -0000      1.67
+++ avr.c       16 Nov 2006 10:32:59 -0000
@@ -53,6 +53,14 @@
   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);
 
@@ -108,26 +116,6 @@
 
 
 /*
- * 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
  * value. This is useful for determining where to stop when dealing
@@ -218,7 +206,7 @@
   }
 
   for (i=0; i<size; i++) {
-    rc = avr_read_byte(pgm, p, mem, i, &rbyte);
+    rc = pgm->read_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 @@
   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 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 @@
        * 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 @@
         /*
          * 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 @@
   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 @@
   
   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 @@
   }
 
   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);
Index: avr.h
===================================================================
RCS file: /home/cvs/avrdude/avrdude/avr.h,v
retrieving revision 1.31
diff -u -u -r1.31 avr.h
--- avr.h       22 Dec 2004 01:52:45 -0000      1.31
+++ avr.h       16 Nov 2006 10:34:08 -0000
@@ -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_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);
 
Index: bitbang.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/bitbang.c,v
retrieving revision 1.4
diff -u -u -r1.4 bitbang.c
--- bitbang.c   23 Aug 2006 21:06:28 -0000      1.4
+++ bitbang.c   16 Nov 2006 10:27:33 -0000
@@ -355,4 +355,10 @@
   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);
+  }
 }
Index: butterfly.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/butterfly.c,v
retrieving revision 1.14
diff -u -u -r1.14 butterfly.c
--- butterfly.c 1 Sep 2006 10:03:12 -0000       1.14
+++ butterfly.c 16 Nov 2006 10:09:31 -0000
@@ -661,17 +661,15 @@
   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;
 
Index: jtagmkI.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/jtagmkI.c,v
retrieving revision 1.5
diff -u -u -r1.5 jtagmkI.c
--- jtagmkI.c   13 Nov 2006 21:14:28 -0000      1.5
+++ jtagmkI.c   16 Nov 2006 10:09:26 -0000
@@ -334,16 +334,6 @@
   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 @@
   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;
Index: jtagmkII.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/jtagmkII.c,v
retrieving revision 1.18
diff -u -u -r1.18 jtagmkII.c
--- jtagmkII.c  1 Nov 2006 21:47:25 -0000       1.18
+++ jtagmkII.c  16 Nov 2006 10:09:58 -0000
@@ -757,16 +757,6 @@
   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 @@
   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 @@
   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;
Index: par.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/par.c,v
retrieving revision 1.19
diff -u -u -r1.19 par.c
--- par.c       29 Aug 2006 23:12:15 -0000      1.19
+++ par.c       16 Nov 2006 10:10:47 -0000
@@ -425,6 +425,8 @@
   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 */
Index: pgm.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/pgm.c,v
retrieving revision 1.19
diff -u -u -r1.19 pgm.c
--- pgm.c       9 Oct 2006 14:34:24 -0000       1.19
+++ pgm.c       16 Nov 2006 10:15:43 -0000
@@ -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 @@
   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 @@
    * 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 @@
   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;
Index: safemode.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/safemode.c,v
retrieving revision 1.3
diff -u -u -r1.3 safemode.c
--- safemode.c  21 Sep 2005 00:20:32 -0000      1.3
+++ safemode.c  16 Nov 2006 10:33:13 -0000
@@ -50,7 +50,7 @@
   /* 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 @@
   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 @@
   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 @@
   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 @@
   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 */
         }
Index: stk500.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/stk500.c,v
retrieving revision 1.51
diff -u -u -r1.51 stk500.c
--- stk500.c    9 Oct 2006 09:56:10 -0000       1.51
+++ stk500.c    16 Nov 2006 10:27:10 -0000
@@ -176,6 +176,14 @@
   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 @@
   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
Index: stk500v2.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/stk500v2.c,v
retrieving revision 1.30
diff -u -u -r1.30 stk500v2.c
--- stk500v2.c  1 Nov 2006 21:47:25 -0000       1.30
+++ stk500v2.c  16 Nov 2006 10:18:33 -0000
@@ -643,16 +643,6 @@
 }
 
 
-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 @@
   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 @@
   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 @@
   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 @@
   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 @@
   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 @@
   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 @@
   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;
Index: term.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/term.c,v
retrieving revision 1.35
diff -u -u -r1.35 term.c
--- term.c      22 Dec 2004 01:52:45 -0000      1.35
+++ term.c      16 Nov 2006 10:33:31 -0000
@@ -292,7 +292,7 @@
   }
 
   for (i=0; i<len; i++) {
-    rc = avr_read_byte(pgm, p, mem, addr+i, &buf[i]);
+    rc = pgm->read_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 @@
       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 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 <byte1> <byte2> <byte3> <byte4>\n");
     return -1;
Index: usbasp.c
===================================================================
RCS file: /home/cvs/avrdude/avrdude/usbasp.c,v
retrieving revision 1.2
diff -u -u -r1.2 usbasp.c
--- usbasp.c    17 Sep 2006 20:35:36 -0000      1.2
+++ usbasp.c    16 Nov 2006 10:22:01 -0000
@@ -411,6 +411,8 @@
   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
_______________________________________________
avrdude-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avrdude-dev

Reply via email to