Index: avrdude.conf.in
===================================================================
--- avrdude.conf.in	(Revision 1039)
+++ avrdude.conf.in	(Arbeitskopie)
@@ -570,9 +570,39 @@
   id    = "usbasp";
   desc  = "USBasp, http://www.fischl.de/usbasp/";
   type  = usbasp;
+  
+  # following variants are autodetected for id "usbasp"
+  
+  # original usbasp from fischl.de
+  #usbvid    = 0x16C0; # VOTI
+  #usbpid    = 0x05DC; # Obdev's free shared PID
+  #usbvendor  = "www.fischl.de";
+  #usbproduct = "USBasp";
+  
+  # old usbasp from fischl.de
+  #usbvid    = 0x03EB; # ATMEL
+  #usbpid    = 0xC7B4; # (unoffical) USBasp
+  #usbvendor  = "www.fischl.de";
+  #usbproduct = "USBasp";
+
+  # NIBObee (only if -p nibobee is given on command line)
+  #usbvid    = 0x16C0; # VOTI
+  #usbpid    = 0x092F; # NIBObee PID
+  #usbvendor  = "www.nicai-systems.com";
+  #usbproduct = "NIBObee";
 ;
 
 programmer
+  id    = "usbasp-clone";
+  desc  = "Any usbasp clone with correct VID/PID ";
+  type  = usbasp;
+  usbvid    = 0x16C0; # VOTI
+  usbpid    = 0x05DC; # Obdev's free shared PID
+  #usbvendor  = "";
+  #usbproduct = "";
+;
+
+programmer
   id    = "usbtiny";
   desc  = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/";
   type  = usbtiny;
Index: usbasp.c
===================================================================
--- usbasp.c	(Revision 1039)
+++ usbasp.c	(Arbeitskopie)
@@ -280,7 +280,8 @@
 		        fprintf(stderr,
 				"%s: seen device from vendor ->%s<-\n",
 				progname, string);
-                    if (strcmp(string, vendorName) == 0){
+                    /* if vendorName not given ignore it (any vendor matches) */
+                    if ((vendorName == NULL) || (vendorName[0] == 0) || (strcmp(string, vendorName) == 0)) {
 			r = libusb_get_string_descriptor_ascii(handle, descriptor.iProduct & 0xff, string, sizeof(string));
                         if (r < 0) {
                             errorCode = USB_ERROR_IO;
@@ -293,7 +294,8 @@
 			        fprintf(stderr,
 					"%s: seen product ->%s<-\n",
 					progname, string);
-                            if(strcmp(string, productName) == 0)
+                            /* if productName not given ignore it (any product matches) */
+                            if((productName == NULL) || (productName[0] == 0) || (strcmp(string, productName) == 0))
                                 break;
                         }
                     }
@@ -357,7 +359,8 @@
 		        fprintf(stderr,
 				"%s: seen device from vendor ->%s<-\n",
 				progname, string);
-                    if(strcmp(string, vendorName) == 0){
+                    /* if vendorName not given ignore it (any vendor matches) */
+                    if ((vendorName == NULL) || (vendorName[0] == 0) || (strcmp(string, vendorName) == 0)) {
                         len = usb_get_string_simple(handle, dev->descriptor.iProduct,
 						    string, sizeof(string));
                         if(len < 0){
@@ -371,7 +374,8 @@
 			        fprintf(stderr,
 					"%s: seen product ->%s<-\n",
 					progname, string);
-                            if(strcmp(string, productName) == 0)
+                            /* if productName not given ignore it (any product matches) */
+                            if ((productName == NULL) || (productName[0] == 0) || (strcmp(string, productName) == 0))
                                 break;
                         }
                     }
@@ -400,37 +404,56 @@
 #else
   usb_init();
 #endif
-  if(strcasecmp(port, "nibobee") == 0) {
-    if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_NIBOBEE_VID, "www.nicai-systems.com",
-		    USBASP_NIBOBEE_PID, "NIBObee") != 0) {
-      fprintf(stderr,
-	      "%s: error: could not find USB device "
-	      "\"NIBObee\" with vid=0x%x pid=0x%x\n",
-  	      progname, USBASP_NIBOBEE_VID, USBASP_NIBOBEE_PID);
-      return -1;
-      
-    }
-  } else if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_SHARED_VID, "www.fischl.de",
-		    USBASP_SHARED_PID, "USBasp") != 0) {
+  if(strcasecmp(ldata(lfirst(pgm->id)), "usbasp") == 0) {
+  /* for id usbasp use autodetecting some variants */
+    if(strcasecmp(port, "nibobee") == 0) {
+      if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_NIBOBEE_VID, "www.nicai-systems.com",
+		      USBASP_NIBOBEE_PID, "NIBObee") != 0) {
+        fprintf(stderr,
+	        "%s: error: could not find USB device "
+	        "\"NIBObee\" with vid=0x%x pid=0x%x\n",
+  	        progname, USBASP_NIBOBEE_VID, USBASP_NIBOBEE_PID);
+        return -1;
+        
+      }
+    } else if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_SHARED_VID, "www.fischl.de",
+		      USBASP_SHARED_PID, "USBasp") != 0) {
 
-    /* check if device with old VID/PID is available */
-    if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_OLD_VID, "www.fischl.de",
-		      USBASP_OLD_PID, "USBasp") != 0) {
+      /* check if device with old VID/PID is available */
+      if (usbOpenDevice(&PDATA(pgm)->usbhandle, USBASP_OLD_VID, "www.fischl.de",
+		        USBASP_OLD_PID, "USBasp") != 0) {
 
-      /* no USBasp found */
-      fprintf(stderr,
-	      "%s: error: could not find USB device "
-	      "\"USBasp\" with vid=0x%x pid=0x%x\n",
-  	      progname, USBASP_SHARED_VID, USBASP_SHARED_PID);
-      return -1;
+        /* no USBasp found */
+        fprintf(stderr,
+	        "%s: error: could not find USB device "
+	        "\"USBasp\" with vid=0x%x pid=0x%x\n",
+	        progname, USBASP_SHARED_VID, USBASP_SHARED_PID);
+        return -1;
 
-    } else {
+      } else {
 
-      /* found USBasp with old IDs */
+        /* found USBasp with old IDs */
+        fprintf(stderr,
+		      "%s: Warning: Found USB device \"USBasp\" with "
+	        "old VID/PID! Please update firmware of USBasp!\n",
+	        progname);
+      }
+    }
+  } else {
+    /* otherwise rely on usb params given in config file */
+    if (usbOpenDevice(&PDATA(pgm)->usbhandle, pgm->usbvid, pgm->usbvendor,
+		    pgm->usbpid, pgm->usbproduct) != 0) {
       fprintf(stderr,
-	      "%s: Warning: Found USB device \"USBasp\" with "
-	      "old VID/PID! Please update firmware of USBasp!\n",
-  	      progname);
+          "%s: error: could not find USB device with vid=0x%x pid=0x%x",
+          progname, pgm->usbvid, pgm->usbpid);
+      if (pgm->usbvendor[0] != 0) {
+        fprintf(stderr, " vendor='%s'", pgm->usbvendor);
+      }
+      if (pgm->usbproduct[0] != 0) {
+        fprintf(stderr, " product='%s'", pgm->usbproduct);
+      }
+      fprintf(stderr,"\n");
+      return -1;
     }
   }
 
