channel selection
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 20 Sep 2012 01:37:00 +0000 (10:37 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 20 Sep 2012 01:37:00 +0000 (10:37 +0900)
ChangeLog
src/main.c
src/neug.h
src/random.c
tool/neug_upgrade.py

index 2ccd06c..dffec33 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2012-09-19  Niibe Yutaka  <gniibe@fsij.org>
 
+       * src/main.c (main): Call neug_select.
+       * src/random.c (neug_select): New.
+       (rng_gen): Implement Raw output.
+
+2012-09-19  Niibe Yutaka  <gniibe@fsij.org>
+
        * tool/neug_upgrade.py: New.
 
        * src/main.c (main): Support reGNUal.
index 197b177..0f3c104 100644 (file)
@@ -224,10 +224,11 @@ extern uint8_t _regnual_start, __heap_end__;
 
 static const uint8_t *const mem_info[] = { &_regnual_start,  &__heap_end__, };
 
-#define USB_FSIJ_MEMINFO  0
-#define USB_FSIJ_DOWNLOAD 1
-#define USB_FSIJ_EXEC     2
-#define USB_NEUG_EXIT   255    /* exit and receive reGNUal */
+/* USB vendor requests to control pipe */
+#define USB_FSIJ_MEMINFO         0
+#define USB_FSIJ_DOWNLOAD        1
+#define USB_FSIJ_EXEC            2
+#define USB_NEUG_EXIT          255 /* Ask to exit and to receive reGNUal */
 
 enum {
   FSIJ_DEVICE_RUNNING = 0,
@@ -272,15 +273,21 @@ static void neug_ctrl_write_finish (uint8_t req, uint8_t req_no,
   uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT);
 
   if (type_rcp == (VENDOR_REQUEST | DEVICE_RECIPIENT)
-      && USB_SETUP_SET (req) && req_no == USB_FSIJ_EXEC && len == 0)
-    {
-      if (fsij_device_state != FSIJ_DEVICE_EXITED)
-       return;
-
-      (void)value; (void)index;
-      usb_lld_prepare_shutdown (); /* No further USB communication */
-      fsij_device_state = FSIJ_DEVICE_EXEC_REQUESTED;
-    }
+      && USB_SETUP_SET (req) && len == 0)
+    if (req_no == USB_FSIJ_EXEC)
+      {
+       if (fsij_device_state != FSIJ_DEVICE_EXITED)
+         return;
+
+       (void)value; (void)index;
+       usb_lld_prepare_shutdown (); /* No further USB communication */
+       fsij_device_state = FSIJ_DEVICE_EXEC_REQUESTED;
+      }
+    else if (req_no == USB_NEUG_EXIT)
+      {
+       chEvtSignalFlagsI (main_thread, 1);
+       chSchReadyI (main_thread);
+      }
 }
 
 struct line_coding
@@ -387,8 +394,6 @@ neug_setup (uint8_t req, uint8_t req_no,
                return USB_UNSUPPORT;
 
              fsij_device_state = FSIJ_DEVICE_NEUG_EXIT_REQUESTED;
-             chEvtSignalFlagsI (main_thread, 1);
-             chSchReadyI (main_thread);
              return USB_SUCCESS;
            }
        }
@@ -659,6 +664,7 @@ main (int argc, char **argv)
   while (1)
     {
       unsigned int count = 0;
+      uint32_t bitrate_saved;
 
       if (fsij_device_state != FSIJ_DEVICE_RUNNING)
        break;
@@ -677,6 +683,7 @@ main (int argc, char **argv)
        }
 
     waiting_connection:
+      bitrate_saved = line_coding.bitrate;
       while ((connected & 1) == 0)
        {
          if (fsij_device_state != FSIJ_DEVICE_RUNNING)
@@ -689,6 +696,8 @@ main (int argc, char **argv)
 
       /* The connection opened.  */
       count = 0;
+      if (bitrate_saved != line_coding.bitrate)
+       neug_select (line_coding.bitrate != 115200);
 
       while (1)
        {
index 898c865..c4ea3bd 100644 (file)
@@ -10,3 +10,4 @@ void neug_kick_filling (void);
 void neug_flush (void);
 void neug_wait_full (void);
 void neug_fini (void);
+void neug_select (uint8_t raw);
index f47c30f..c9ed4fe 100644 (file)
@@ -307,6 +307,8 @@ static uint32_t rb_del (struct rng_rb *rb)
   return v;
 }
 
+static uint8_t neug_raw;
+
 /**
  * @brief  Random number generation from ADC sampling.
  * @param  RB: Pointer to ring buffer structure
@@ -317,13 +319,15 @@ static uint32_t rb_del (struct rng_rb *rb)
 static int rng_gen (struct rng_rb *rb)
 {
   uint8_t round = 0;
-  uint8_t b;
+  uint32_t v = 0;
 
   while (1)
     {
+      uint8_t b;
+
       chEvtWaitOne (ADC_DATA_AVAILABLE);
 
-      /* Got, ADC sampling data */
+      /* Got an ADC sampling data */
       b = (((samp[0] & 0x01) << 0) | ((samp[1] & 0x01) << 1)
           | ((samp[2] & 0x01) << 2) | ((samp[3] & 0x01) << 3)
           | ((samp[4] & 0x01) << 4) | ((samp[5] & 0x01) << 5)
@@ -331,29 +335,46 @@ static int rng_gen (struct rng_rb *rb)
 
       adcStartConversion (&ADCD1, &adcgrpcfg, samp, ADC_GRP1_BUF_DEPTH);
 
-      /*
-       * Put a random byte to entropy pool.
-       */
-      ep_add (b);
       noise_source_continuous_test (b);
-      round++;
-      if (round >= NUM_NOISE_INPUTS)
+      if (neug_raw)
+       {
+         v |= (b << (round * 8));
+         round++;
+         if (round >= 4)
+           {
+             rb_add (rb, v);
+             if (rb->full)
+               return 0;
+             v = 0;
+             round = 0;
+           }
+       }
+      else
        {
          /*
-          * We have enough entropy in the pool.
-          * Thus, we pull the random bits from the pool.
+          * Put a random byte to entropy pool.
           */
-         int i;
-         const uint32_t *vp = ep_output ();
-
-         /* We get the random bits, add it to the ring buffer.  */
-         for (i = 0; i < SHA256_DIGEST_SIZE / 4; i++)
+         ep_add (b);
+         round++;
+         if (round >= NUM_NOISE_INPUTS)
            {
-             rb_add (rb, *vp);
-             vp++;
-             if (rb->full)
-               /* fully generated */
-               return 0;       /* success */
+             /*
+              * We have enough entropy in the pool.
+              * Thus, we pull the random bits from the pool.
+              */
+             int i;
+             const uint32_t *vp = ep_output ();
+
+             /* We get the random bits, add it to the ring buffer.  */
+             for (i = 0; i < SHA256_DIGEST_SIZE / 4; i++)
+               {
+                 rb_add (rb, *vp);
+                 vp++;
+                 if (rb->full)
+                   return 0;
+               }
+
+             round = 0;
            }
        }
     }
@@ -397,6 +418,7 @@ neug_init (uint32_t *buf, uint8_t size)
 {
   struct rng_rb *rb = &the_ring_buffer;
 
+  neug_raw = 0;
   ep_init ();
   rb_init (rb, buf, size);
   chThdCreateStatic (wa_rng, sizeof (wa_rng), NORMALPRIO, rng, rb);
@@ -477,3 +499,11 @@ neug_fini (void)
       rng_thread = NULL;
     }
 }
+
+void
+neug_select (uint8_t raw)
+{
+  neug_wait_full ();
+  neug_raw = raw;
+  neug_flush ();
+}
index c953c92..098506c 100755 (executable)
@@ -1,7 +1,7 @@
 #! /usr/bin/python
 
 """
-neug_upgrade.py - a tool to upgrade firmware of Gnuk Token
+neug_upgrade.py - a tool to upgrade firmware of Gnuk Token / NeuG device
 
 Copyright (C) 2012 Free Software Initiative of Japan
 Author: NIIBE Yutaka <gniibe@fsij.org>
@@ -156,14 +156,9 @@ class neug(object):
         if interface.interfaceSubClass != COM_SUBCLASS:
             raise ValueError, "Wrong interface sub class"
         self.__devhandle = device.open()
-        try:
-            self.__devhandle.setConfiguration(configuration)
-        except:
-            pass
-
-        self.__devhandle.detachKernelDriver(interface)
-        self.__devhandle.claimInterface(interface)
-        self.__devhandle.setAltInterface(interface)
+        # self.__devhandle.detachKernelDriver(interface)
+        # self.__devhandle.claimInterface(interface)
+        # self.__devhandle.setAltInterface(interface)
 
         self.__intf = interface.interfaceNumber
         self.__alt = interface.alternateSetting
@@ -181,8 +176,8 @@ class neug(object):
         self.__devhandle.controlMsg(requestType = 0x40, request = 255,
                                     value = 0, index = 0, buffer = None,
                                     timeout = 10)
-        self.__devhandle.releaseInterface()
-        self.__devhandle.setConfiguration(0)
+        self.__devhandle.releaseInterface()
+        self.__devhandle.setConfiguration(0)
         return
 
     def mem_info(self):