File avrdude_butterfly_mk.patch of Package avrdude

--- avrdude-5.10/avrdude.conf.in.orig	2010-01-19 11:39:11.000000000 +0100
+++ avrdude-5.10/avrdude.conf.in	2010-05-15 17:38:44.000000000 +0200
@@ -443,6 +443,19 @@ programmer
   desc  = "Atmel AppNote AVR911 AVROSP";
   type  = butterfly;
 ;
+ 
+# suggested in http://forum.mikrokopter.de/topic-post48317.html
+programmer
+  id    = "mkbutterfly";
+  desc  = "Mikrokopter.de Butterfly";
+  type  = butterfly_mk;
+;
+
+programmer
+  id    = "butterfly_mk";
+  desc  = "Mikrokopter.de Butterfly";
+  type  = butterfly_mk;
+;
 
 programmer
   id    = "jtagmkI";
--- avrdude-5.10/butterfly.c.orig	2010-01-19 11:39:11.000000000 +0100
+++ avrdude-5.10/butterfly.c	2010-05-15 17:43:05.000000000 +0200
@@ -43,6 +43,7 @@
 #include <string.h>
 #include <errno.h>
 #include <ctype.h>
+#include <unistd.h>
 
 #include "avrdude.h"
 #include "avr.h"
@@ -205,6 +206,7 @@ static void butterfly_powerdown(PROGRAMM
   return;
 }
 
+#define IS_BUTTERFLY_MK 0x0001
 
 /*
  * initialize the AVR device and prepare it to accept commands
@@ -223,26 +225,60 @@ static int butterfly_initialize(PROGRAMM
    * for plain avr109 bootloaders but does not harm there either.
    */
   fprintf(stderr, "Connecting to programmer: ");
-  do {
-    putc('.', stderr);
-    butterfly_send(pgm, "\033", 1);
-    butterfly_drain(pgm, 0);
-    butterfly_send(pgm, "S", 1);
-    butterfly_recv(pgm, &c, 1);
-    if (c != '?') {
-        putc('\n', stderr);
-        /*
-         * Got a useful response, continue getting the programmer
-         * identifier. Programmer returns exactly 7 chars _without_
-         * the null.
-         */
-      id[0] = c;
-      butterfly_recv(pgm, &id[1], sizeof(id)-2);
-      id[sizeof(id)-1] = '\0';
+  if (pgm->flag & IS_BUTTERFLY_MK || getenv("BUTTERFLY_MK"))
+    {
+      char mk_reset_cmd[6] = {"#aR@S\r"};
+      unsigned char mk_timeout = 0;
+
+      putc('.', stderr);
+      butterfly_send(pgm, mk_reset_cmd, sizeof(mk_reset_cmd));
+      usleep(20000); 
+
+      do
+	{
+	  c = 27; 
+	  butterfly_send(pgm, &c, 1);
+	  usleep(20000);
+	  c = 0xaa;
+	  butterfly_send(pgm, &c, 1);
+	  if (mk_timeout % 10 == 0) putc('.', stderr);
+	  butterfly_recv(pgm, &c, 1);
+	} while (c != 'M' && mk_timeout++ < 30);
+
+      if ( c != 'M' && c != '?') 
+        { 
+          fprintf(stderr, "\nConnection FAILED.\n");
+          exit(1);
+        }
+      else
+        {
+	  id[0] = 'M'; id[1] = 'K'; id[2] = '2'; id[3] = 0;
+	}
+    }
+  else
+    {
+      do {
+	putc('.', stderr);
+	butterfly_send(pgm, "\033", 1);
+	butterfly_drain(pgm, 0);
+	butterfly_send(pgm, "S", 1);
+	butterfly_recv(pgm, &c, 1);
+	if (c != '?') {
+	    putc('\n', stderr);
+	    /*
+	     * Got a useful response, continue getting the programmer
+	     * identifier. Programmer returns exactly 7 chars _without_
+	     * the null.
+	     */
+	  id[0] = c;
+	  butterfly_recv(pgm, &id[1], sizeof(id)-2);
+	  id[sizeof(id)-1] = '\0';
+	}
+      } while (c == '?');
     }
-  } while (c == '?');
 
   /* Get the HW and SW versions to see if the programmer is present. */
+  butterfly_drain(pgm, 0);
 
   butterfly_send(pgm, "V", 1);
   butterfly_recv(pgm, sw, sizeof(sw));
@@ -327,6 +363,7 @@ static int butterfly_initialize(PROGRAMM
 	    progname, (unsigned)buf[1]);
 
   butterfly_enter_prog_mode(pgm);
+  butterfly_drain(pgm, 0);
 
   return 0;
 }
@@ -663,7 +700,7 @@ static int butterfly_read_sig_bytes(PROG
 
 void butterfly_initpgm(PROGRAMMER * pgm)
 {
-  strcpy(pgm->type, "avr910");
+  strcpy(pgm->type, "butterfly");
 
   /*
    * mandatory functions
@@ -696,4 +733,12 @@ void butterfly_initpgm(PROGRAMMER * pgm)
 
   pgm->setup          = butterfly_setup;
   pgm->teardown       = butterfly_teardown;
+  pgm->flag = 0;
+}
+
+void butterfly_mk_initpgm(PROGRAMMER * pgm)
+{
+  butterfly_initpgm(pgm);
+  strcpy(pgm->type, "butterfly_mk");
+  pgm->flag = IS_BUTTERFLY_MK;
 }
--- avrdude-5.10/config_gram.y.orig	2010-01-19 11:39:11.000000000 +0100
+++ avrdude-5.10/config_gram.y	2010-05-15 17:38:44.000000000 +0200
@@ -151,6 +151,7 @@ static int parse_cmdbits(OPCODE * op);
 %token K_USBASP
 %token K_USBTINY
 %token K_BUTTERFLY
+%token K_BUTTERFLY_MK
 %token K_TYPE
 %token K_VCC
 %token K_VFYLED
@@ -480,6 +481,12 @@ prog_parm :
     }
   } |
 
+  K_TYPE TKN_EQUAL K_BUTTERFLY_MK {
+    { 
+      butterfly_mk_initpgm(current_prog);
+    }
+  } |
+
   K_TYPE TKN_EQUAL K_JTAG_MKI {
     {
       jtagmkI_initpgm(current_prog);
--- avrdude-5.10/butterfly.h.orig	2010-01-19 11:39:11.000000000 +0100
+++ avrdude-5.10/butterfly.h	2010-05-15 17:38:44.000000000 +0200
@@ -27,6 +27,7 @@ extern "C" {
 #endif
 
 void butterfly_initpgm (PROGRAMMER * pgm);
+void butterfly_mk_initpgm (PROGRAMMER * pgm);
 
 #ifdef __cplusplus
 }
--- avrdude-5.10/lexer.l.orig	2010-01-19 11:39:11.000000000 +0100
+++ avrdude-5.10/lexer.l	2010-05-15 17:38:44.000000000 +0200
@@ -129,6 +129,7 @@ bs2              { yylval=NULL; return K
 buff             { yylval=NULL; return K_BUFF; }
 buspirate        { yylval=NULL; return K_BUSPIRATE; }
 butterfly        { yylval=NULL; return K_BUTTERFLY; }
+butterfly_mk     { yylval=NULL; return K_BUTTERFLY_MK; }
 chip_erase_delay { yylval=NULL; return K_CHIP_ERASE_DELAY; }
 desc             { yylval=NULL; return K_DESC; }
 default_parallel { yylval=NULL; return K_DEFAULT_PARALLEL; }