Index: apps/gui/wps_debug.c
===================================================================
--- apps/gui/wps_debug.c	(revision 16149)
+++ apps/gui/wps_debug.c	(working copy)
@@ -33,10 +33,8 @@
 #define PARSE_FAIL_COND_SYNTAX_ERROR    3
 #define PARSE_FAIL_COND_INVALID_PARAM   4
 
-#if defined(SIMULATOR) || defined(__PCTOOL__)
 extern bool debug_wps;
 extern int wps_verbose_level;
-#endif
 
 static char *next_str(bool next) {
     return next ? "next " : "";
Index: firmware/debug.c
===================================================================
--- firmware/debug.c	(revision 16149)
+++ firmware/debug.c	(working copy)
@@ -38,6 +38,11 @@
 #include "system.h"
 
 #ifdef DEBUG
+
+#if !defined(SIMULATOR) && !defined(__PCTOOL__)
+int wps_verbose_level = 0;
+#endif
+
 #if CONFIG_CPU == SH7034 /* these are still very SH-oriented */
 void debug_init(void)
 {
@@ -229,8 +234,22 @@
 }
 
 #endif /* HAVE_GDB_API */
+
+#ifdef HAVE_USBSTACK
+void debug_init(void)
+{
+}
+
+int usb_serial_send(void*);
+static void debug(char *msg)
+{
+    usb_serial_send(msg);
+}
+#endif
+
 #endif /* end of DEBUG section */
 
+
 #ifdef __GNUC__
 void debugf(const char *fmt, ...)
 #endif
Index: firmware/usbstack/usb_core.c
===================================================================
--- firmware/usbstack/usb_core.c	(revision 16149)
+++ firmware/usbstack/usb_core.c	(working copy)
@@ -24,9 +24,9 @@
 #include "logf.h"
 
 //#define USB_STORAGE
-//#define USB_SERIAL
+#define USB_SERIAL
 //#define USB_BENCHMARK
-#define USB_CHARGING_ONLY
+//#define USB_CHARGING_ONLY
 
 #include "usb_ch9.h"
 #include "usb_drv.h"
Index: firmware/usbstack/usb_serial.c
===================================================================
--- firmware/usbstack/usb_serial.c	(revision 16149)
+++ firmware/usbstack/usb_serial.c	(working copy)
@@ -23,16 +23,53 @@
 //#define LOGF_ENABLE
 #include "logf.h"
 
-static unsigned char _transfer_buffer[16];
+static unsigned char _transfer_buffer[128];
 static unsigned char* transfer_buffer;
 
+static const char usbserial_thread_name[] = "usb_serial";
+static struct thread_entry* usbserial_thread;
+static long usbserial_stack[DEFAULT_STACK_SIZE];
+static void usb_serial_thread(void);
+
 /* called by usb_code_init() */
 void usb_serial_init(void)
 {
     logf("serial: init");
     transfer_buffer = (void*)UNCACHED_ADDR(&_transfer_buffer);
+
+#if 0
+    usbserial_thread =
+        create_thread(usb_serial_thread, usbserial_stack, sizeof(usbserial_stack), 0,
+                      usbserial_thread_name
+                      IF_PRIO(, PRIORITY_SYSTEM)
+                      IF_COP(, CPU));
+#endif
 }
 
+void usb_serial_thread(void)
+{
+    char* string = "foo like heck!\r\n";
+    while (1) {
+        usb_drv_submit(EP_TX, UNCACHED_ADDR(string), strlen(string));
+        sleep(HZ);
+    }
+}
+
+int usb_serial_send(char* msg)
+{
+#if 0
+    int len = strlen(msg);
+    snprintf(transfer_buffer, sizeof _transfer_buffer, "%d:%s\r", len,msg);
+    return usb_drv_send(EP_TX, transfer_buffer, strlen(transfer_buffer));
+#else
+    _buttonlight_on();
+    usb_drv_submit(EP_TX, msg, strlen(msg));
+    //    udelay(100);
+    _buttonlight_off();
+    return 0;
+#endif    
+}
+
 /* called by usb_core_transfer_complete() */
 void usb_serial_transfer_complete(int endpoint)
 {
@@ -44,7 +81,7 @@
             usb_drv_recv(EP_RX, transfer_buffer, sizeof _transfer_buffer);
 
             /* echo back :) */
-            usb_drv_send(EP_TX, transfer_buffer, sizeof transfer_buffer);
+            usb_drv_send(EP_TX, transfer_buffer, sizeof _transfer_buffer);
             break;
 
         case EP_TX:
Index: firmware/target/arm/usb-fw-pp502x.c
===================================================================
--- firmware/target/arm/usb-fw-pp502x.c	(revision 16149)
+++ firmware/target/arm/usb-fw-pp502x.c	(working copy)
@@ -59,6 +59,7 @@
     if (on) {
         /* until we have native mass-storage mode, we want to reboot on
            usb host connect */
+#ifndef DEBUG /* no reboot in debug mode */
 #if defined(IRIVER_H10) || defined (IRIVER_H10_5GB)
         if (button_status()==BUTTON_RIGHT)
 #endif /* defined(IRIVER_H10) || defined (IRIVER_H10_5GB) */
@@ -78,6 +79,7 @@
 
             system_reboot(); /* Reboot */
         }
+#endif /* DEBUG */
     }
     else
         usb_core_exit();
Index: firmware/target/arm/usb-drv-pp502x.c
===================================================================
--- firmware/target/arm/usb-drv-pp502x.c	(revision 16149)
+++ firmware/target/arm/usb-drv-pp502x.c	(working copy)
@@ -317,9 +317,11 @@
     0x04, 0x040000,
 };
 
+static bool initialized = false;
+
 /*-------------------------------------------------------------------------*/
 static void transfer_completed(void);
-static int prime_transfer(int endpoint, void* ptr, int len, bool send);
+static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait);
 static void bus_reset(void);
 static void init_queue_heads(void);
 static void init_endpoints(void);
@@ -333,6 +335,9 @@
 /* manual: 32.14.1 Device Controller Initialization */
 void usb_drv_init(void)
 {
+    if (initialized)
+        return;
+
     REG_USBCMD &= ~USBCMD_RUN;
     udelay(50000);
     REG_USBCMD |= USBCMD_CTRL_RESET;
@@ -361,6 +366,7 @@
 
     /* go go go */
     REG_USBCMD |= USBCMD_RUN;
+    initialized = true;
 
     logf("usb_drv_init() finished");
     logf("usb id %x", REG_ID);
@@ -377,6 +383,7 @@
 
     /* stop usb controller */
     REG_USBCMD &= ~USBCMD_RUN;
+    initialized = false;
 }
 
 void usb_drv_int(void)
@@ -447,17 +454,34 @@
 
 int usb_drv_send(int endpoint, void* ptr, int length)
 {
-    return prime_transfer(endpoint, ptr, length, true);
+    if (!initialized)
+        return -1;
+
+    return prime_transfer(endpoint, ptr, length, true, true);
 }
 
+int usb_drv_submit(int endpoint, void* ptr, int length)
+{
+    if (!initialized)
+        return -1;
+
+    return prime_transfer(endpoint, ptr, length, true, false);
+}
+
 int usb_drv_recv(int endpoint, void* ptr, int length)
 {
+    if (!initialized)
+        return -1;
+
     //logf("usbrecv(%x, %d)", ptr, length);
-    return prime_transfer(endpoint, ptr, length, false);
+    return prime_transfer(endpoint, ptr, length, false, false);
 }
 
 void usb_drv_wait(int endpoint, bool send)
 {
+    if (!initialized)
+        return;
+
     int pipe = endpoint * 2 + (send ? 1 : 0);
     struct queue_head* qh = &qh_array[pipe];
 
@@ -485,7 +509,7 @@
 /*-------------------------------------------------------------------------*/
 
 /* manual: 32.14.5.2 */
-static int prime_transfer(int endpoint, void* ptr, int len, bool send)
+static int prime_transfer(int endpoint, void* ptr, int len, bool send, bool wait)
 {
     int timeout;
     int pipe = endpoint * 2 + (send ? 1 : 0);
@@ -527,7 +551,7 @@
         return -3;
     }
 
-    if (send) {
+    if (wait) {
         /* wait for transfer to finish */
         timeout = 100000;
         while ((td->size_ioc_sts & DTD_STATUS_ACTIVE) && --timeout) {
Index: firmware/app.lds
===================================================================
--- firmware/app.lds	(revision 16149)
+++ firmware/app.lds	(working copy)
@@ -30,7 +30,7 @@
 #define PLUGINSIZE PLUGIN_BUFFER_SIZE
 #define CODECSIZE CODEC_SIZE
 
-#ifdef DEBUG
+#ifdef GDBDEBUG
 #define STUBOFFSET 0x10000
 #else
 #define STUBOFFSET 0
