try to fill Tx buffer of USB
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 16 Oct 2012 07:06:53 +0000 (16:06 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 16 Oct 2012 07:06:53 +0000 (16:06 +0900)
ChangeLog
NEWS
README
src/main.c
src/neug.h
src/random.c

index 16fb23c..a984bc1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-10-16  Niibe Yutaka  <gniibe@fsij.org>
+
+       * src/random.c (neug_get_nonblock): New function.
+
+       * src/main.c (RANDOM_BYTES_LENGTH): Now, it's 64 to fill Tx
+       buffer.
+       (main): Fill 64-byte Tx buffer if possible.
+
 2012-10-15  Niibe Yutaka  <gniibe@fsij.org>
 
        * tool/neug_check.py (main): Display USB strings.
diff --git a/NEWS b/NEWS
index b38574b..264e154 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,8 +5,9 @@
 ** Update of ChibiOS/RT
 ChibiOS/RT is updated to newer 2.4.3.
 
-** A bit of improved performance
-A few percent of improvement for generation speed, due to finer lock.
+** Improved performance
+Improvement on generation speed, even when it's not connected to USB
+2.0 Hub.
 
 ** Health tests run for NEUG_MODE_RAW
 Health tests run when NEUG_MODE_RAW (CRC32 filter output).
diff --git a/README b/README
index 581623b..597f4c2 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
 NeuG - a random number generator implementation (for STM32F103)
 
                                                           Version 0.04
-                                                            2012-10-09
+                                                            2012-10-2X
                                                           Niibe Yutaka
                                      Free Software Initiative of Japan
 
@@ -48,12 +48,14 @@ A0-double-dash: STM32F2xx and STM32F4xx have built-in TRNG, it would
                 looks not that good).
 
 Q1: How fast is NeuG device?
-A1: It's more than 50 Ki-byte/second.  Please note that the NeuG
-    device is USB "full-speed" device.  If you connect it to
-    full-speed hub or root hub which runs at full-speed, you just get
-    about 30 Ki-byte/second.  That's because host submits a frame to
-    device once per 1ms frame with full-speed hub.  When you connect
-    it to high-speed hub, you get higher performance.
+A1: It's more than 50 Ki-byte/sec for conditioned output (by SHA-256),
+    and more than 200 Ki-byte/sec for CRC-32 filtered output.  Please
+    note that the NeuG device is USB "full-speed" device.  If you
+    connect it to full-speed hub or root hub which runs at full-speed,
+    you get lower speed than the real capability of the device.
+    That's because host submits a frame to device once per 1ms frame
+    with full-speed hub.  When you connect it to high-speed hub, you
+    get higher performance for CRC-32 filtered output.
 
 Q2: Should we check condition of noise sources?
 A2: Yes, we should.  Three continuous tests are implemented, following
index 75a2fda..9e5dea7 100644 (file)
@@ -671,24 +671,24 @@ static msg_t led_blinker (void *arg)
 
       set_led (1);
       if (m == LED_ONESHOT_SHORT)
-       chThdSleep (MS2ST (100));
+       chThdSleepMilliseconds (100);
       else if (m == LED_TWOSHOTS)
        {
-         chThdSleep (MS2ST (50));
+         chThdSleepMilliseconds (50);
          set_led (0);
-         chThdSleep (MS2ST (50));
+         chThdSleepMilliseconds (50);
          set_led (1);
-         chThdSleep (MS2ST (50));
+         chThdSleepMilliseconds (50);
        }
       else
-       chThdSleep (MS2ST (250));
+       chThdSleepMilliseconds (250);
       set_led (0);
     }
 
   return 0;
 }
 \f
-#define RANDOM_BYTES_LENGTH 32
+#define RANDOM_BYTES_LENGTH 64
 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
 
 /*
@@ -719,6 +719,7 @@ main (int argc, char **argv)
   while (1)
     {
       unsigned int count = 0;
+      int last_was_fullsizepacket = 0;
 
       if (fsij_device_state != FSIJ_DEVICE_RUNNING)
        break;
@@ -733,7 +734,7 @@ main (int argc, char **argv)
 
          if ((count & 0x0007) == 0)
            chEvtSignalFlags (led_thread, LED_ONESHOT_SHORT);
-         chThdSleep (MS2ST (25));
+         chThdSleepMilliseconds (25);
          count++;
        }
 
@@ -745,7 +746,7 @@ main (int argc, char **argv)
 
          neug_flush ();
          chEvtSignalFlags (led_thread, LED_TWOSHOTS);
-         chThdSleep (MS2ST (5000));
+         chThdSleepMilliseconds (5000);
        }
 
       if (fsij_device_state != FSIJ_DEVICE_RUNNING)
@@ -761,19 +762,37 @@ main (int argc, char **argv)
 
       while (1)
        {
+         int i;
+
          if (fsij_device_state != FSIJ_DEVICE_RUNNING)
            break;
 
          if (bDeviceState != CONFIGURED)
            break;
 
-         neug_wait_full ();
-
          if ((count & 0x03ff) == 0)
            chEvtSignalFlags (led_thread, LED_ONESHOT_SHORT);
 
-         usb_lld_txcpy (random_word, ENDP1, 0, RANDOM_BYTES_LENGTH);
-         neug_flush ();
+         for (i = 0; i < 64/4; i++)
+           {
+             uint32_t v;
+
+             if (neug_get_nonblock (&v) < 0)
+               break;
+
+             usb_lld_txcpy (&v, ENDP1, i * 4, 4);
+           }
+
+         if (i == 0 && !last_was_fullsizepacket)
+           {    /* Only send ZLP when the last packet was fullsize.  */
+             chThdSleepMicroseconds (250);
+             continue;
+           }
+
+         if (i == 64/4)
+           last_was_fullsizepacket = 1;
+         else
+           last_was_fullsizepacket = 0;
 
          chSysLock ();
          if (connected == 0)
@@ -783,7 +802,7 @@ main (int argc, char **argv)
            }
          else
            {
-             usb_lld_tx_enable (ENDP1, RANDOM_BYTES_LENGTH);
+             usb_lld_tx_enable (ENDP1, i * 4);
              chSchGoSleepS (THD_STATE_SUSPENDED);
            }
          chSysUnlock ();
@@ -803,7 +822,7 @@ main (int argc, char **argv)
   fsij_device_state = FSIJ_DEVICE_EXITED;
 
   while (fsij_device_state == FSIJ_DEVICE_EXITED)
-    chThdSleep (MS2ST (500));
+    chThdSleepMilliseconds (500);
 
   flash_unlock ();             /* Flash unlock should be done here */
   set_led (1);
index 4b54b93..d35de2d 100644 (file)
@@ -19,6 +19,7 @@ extern uint16_t neug_p4k_max;
 void neug_init (uint32_t *buf, uint8_t size);
 void neug_prng_reseed (void);
 uint32_t neug_get (int kick);
+int neug_get_nonblock (uint32_t *p);
 void neug_kick_filling (void);
 void neug_flush (void);
 void neug_wait_full (void);
index 21673b0..5867ebc 100644 (file)
@@ -554,6 +554,25 @@ neug_get (int kick)
   return v;
 }
 
+int
+neug_get_nonblock (uint32_t *p)
+{
+  struct rng_rb *rb = &the_ring_buffer;
+  int r = 0;
+
+  chMtxLock (&rb->m);
+  if (rb->empty)
+    {
+      r = -1;
+      chCondSignal (&rb->space_available);
+    }
+  else
+    *p = rb_del (rb);
+  chMtxUnlock ();
+
+  return r;
+}
+
 void
 neug_wait_full (void)
 {