diff --git a/Makefile b/Makefile
index 68c70f3..6c278d9 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@
 
 LDFLAGS = -lusb
 
-CFLAGS = -c -O2 -Wall
+CFLAGS = -O2 -Wall
 
 BIN = USBMissileLauncherUtils
 OBJS = USBMissileLauncherUtils.o USBMissileLauncher.o InputEvent.o
@@ -45,15 +45,15 @@ USBMissileLauncherUtils:	${OBJS}
 
 InputEvent.o:
 	@echo "CC $@"
-	@${CC} ${CFLAGS} InputEvent.c -o $@
+	@${CC} ${CFLAGS} -c InputEvent.c -o $@
 
 USBMissileLauncher.o:
 	@echo "CC $@"
-	@${CC} ${CFLAGS} USBMissileLauncher.c -o $@
+	@${CC} ${CFLAGS} -c USBMissileLauncher.c -o $@
 
 USBMissileLauncherUtils.o:
 	@echo "CC $@"
-	@${CC} ${CFLAGS} USBMissileLauncherUtils.c -o $@
+	${CC} ${CFLAGS} -c USBMissileLauncherUtils.c -o $@
 
 
 clean:		
diff --git a/USBMissileLauncher.c b/USBMissileLauncher.c
index 4e2a35d..bcef318 100644
--- a/USBMissileLauncher.c
+++ b/USBMissileLauncher.c
@@ -129,6 +129,12 @@ int missile_usb_finddevice(missile_usb *control, int device_num,
 	  found_device = 1;
 	break;
 	
+      case DEVICE_TYPE_WINBOND:
+	if (dev->descriptor.idVendor  == WINBOND_VENDOR_ID &&
+	    dev->descriptor.idProduct == WINBOND_PRODUCT_ID)
+	  found_device = 1;
+	break;
+	
       default:
  	printf("Device Type (%d) not implemented, please do it!\n",
 	       device_type);
@@ -168,10 +174,12 @@ int missile_usb_finddevice(missile_usb *control, int device_num,
     fprintf(stderr, 
 	    "missile_usb_finddevice(%d) failed to find "
 	    "missile launcher device %04x-%04x or "
-	    "circus cannon device %04x-%04x\n",
+	    "circus cannon device %04x-%04x or "
+	    "winbond device %04x-%04x\n",
 	    device_count, 
 	    MISSILE_LAUNCHER_VENDOR_ID, MISSILE_LAUNCHER_PRODUCT_ID,
-	    CIRCUS_CANNON_VENDOR_ID, CIRCUS_CANNON_PRODUCT_ID);
+	    CIRCUS_CANNON_VENDOR_ID, CIRCUS_CANNON_PRODUCT_ID,
+	    WINBOND_VENDOR_ID, WINBOND_PRODUCT_ID);
   
   return -1;
 }
@@ -296,6 +304,22 @@ int missile_do(missile_usb *control, int cmd, int device_type) {
     }
     break;
         
+  case DEVICE_TYPE_WINBOND:
+
+    a = ( cmd & MISSILE_LAUNCHER_CMD_DOWN  ? 0x01 : 0 ) |
+        ( cmd & MISSILE_LAUNCHER_CMD_UP    ? 0x02 : 0 ) |
+        ( cmd & MISSILE_LAUNCHER_CMD_RIGHT ? 0x04 : 0 ) |
+        ( cmd & MISSILE_LAUNCHER_CMD_LEFT  ? 0x08 : 0 ) |
+        ( cmd & MISSILE_LAUNCHER_CMD_FIRE  ? 0x10 : 0 );
+
+   if (missile_usb_sendcommand5(control, a)) {
+      fprintf(stderr, "missile_usb_sendcommand() failed: %s\n", 
+	      strerror(errno));
+      return -1;
+    }
+
+    break;
+
   default:
     printf("Device Type (%d) not implemented, please do it!\n", device_type);
     return -1;
@@ -345,6 +369,39 @@ int missile_usb_sendcommand(missile_usb *control,
   return 0;
 }
 
+int missile_usb_sendcommand5(missile_usb *control, int val) {
+    
+  unsigned char buf[5];
+  int  ret;
+  
+  assert(control != NULL);
+  
+  ret = claim_interface(control);
+  if (ret != 0) {
+    return -1;
+  }
+  
+  buf[0] = 0x5f;
+  buf[1] = val;
+  buf[2] = 0xe0;
+  buf[3] = 0xff;
+  buf[4] = 0xfe;
+  
+  if (control->debug) {
+    printf("sending byte %02x\n", val);
+  }
+  
+  ret = usb_control_msg( control->handle, 0x21, 9, 0x0300, 0x00, (char*) buf, 
+			 5, control->timeout);
+  if (ret != 5) {
+    perror("usb_control_msg failed\n");
+    return -1;
+  }
+  
+  return 0;
+}
+
+
 //=============================================================================
 
 int missile_usb_sendcommand64(missile_usb *control, 
diff --git a/USBMissileLauncher.h b/USBMissileLauncher.h
index 44b8206..0e956a8 100644
--- a/USBMissileLauncher.h
+++ b/USBMissileLauncher.h
@@ -45,6 +45,7 @@
 #define DEVICE_TYPE_UNKNOWN          0
 #define DEVICE_TYPE_MISSILE_LAUNCHER 1
 #define DEVICE_TYPE_CIRCUS_CANNON    2
+#define DEVICE_TYPE_WINBOND	     3
 
 // missile launcher usb vendor and product id
 #define MISSILE_LAUNCHER_VENDOR_ID  0x1130
@@ -53,7 +54,11 @@
 // circus cannon usb vendor and product id
 #define CIRCUS_CANNON_VENDOR_ID  0x1941
 #define CIRCUS_CANNON_PRODUCT_ID 0x8021
-  
+
+// winbond cannon usb vendor and product id
+#define WINBOND_VENDOR_ID  0x0416
+#define WINBOND_PRODUCT_ID 0x9391
+
 // missile launcher packet cmd masks
 #define MISSILE_LAUNCHER_CMD_STOP  0
 #define MISSILE_LAUNCHER_CMD_LEFT  1
@@ -146,6 +151,7 @@ extern "C" {
   int missile_usb_sendcommand(missile_usb *control, 
 			      int, int, int, int, 
 			      int, int, int, int);
+  int missile_usb_sendcommand5(missile_usb *control, int);
   int missile_usb_sendcommand64(missile_usb *control, 
 				int, int, int, int, 
 				int, int, int, int);
diff --git a/USBMissileLauncherUtils.c b/USBMissileLauncherUtils.c
index bfd7a37..ee38189 100644
--- a/USBMissileLauncherUtils.c
+++ b/USBMissileLauncherUtils.c
@@ -61,7 +61,8 @@ void usage(char *filename) {
 	  "-d level      Debug on and set to 'level'\n"
 	  "-c device     Path to Input Event Device (e.g. /dev/input/event0)\n"
 	  "-t type       Device Type (1 - Missile Launcher - default\n"
-	  "                           2 - Circus Cannon)\n"
+	  "                           2 - Circus Cannon\n"
+	  "                           3 - Winbond)\n"
 	  "-F            Fire Missile\n"
 	  "-L            Rotate Left\n"
 	  "-R            Rotate Right\n"
@@ -208,6 +209,7 @@ int main(int argc, char **argv) {
   switch (device_type) {
     
   case DEVICE_TYPE_MISSILE_LAUNCHER:
+  case DEVICE_TYPE_WINBOND:
   
     if (set_left)
       msg |= MISSILE_LAUNCHER_CMD_LEFT;
@@ -291,6 +293,7 @@ int HandleKeyboardEvent(struct input_event *ev, int events, int device_type) {
       switch (device_type) {
 	
       case DEVICE_TYPE_MISSILE_LAUNCHER:
+      case DEVICE_TYPE_WINBOND:
 	
 	switch (ev[i].code) {
 	  
