Update Chopstx, and follow the change.
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 18 Jan 2018 05:45:32 +0000 (14:45 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 18 Jan 2018 05:45:32 +0000 (14:45 +0900)
ChangeLog
chopstx
src/Makefile
src/main.c
src/neug.c

index d57e18e..6693ffc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2018-01-18  NIIBE Yutaka  <gniibe@fsij.org>
+
+       * src/neug.c: Update from Gnuk.
+
+       * src/Makefile (USE_EVENTFLAG): Enable.
+
+       * src/main.c (event_flag_init, event_flag_waitone)
+       (event_flag_signal): Remove.
+       (led_blinker, main): Use eventflag in Chopstx.
+       (vcom_config_desc): Fix size for ENDP2 buffer.
+       (*): Use USB_DEVICE_STATE_* enum.
+
+       * chopstx: Update to 1.7.
+
 2017-10-11  NIIBE Yutaka  <gniibe@fsij.org>
 
        * VERSION: 1.0.6.
diff --git a/chopstx b/chopstx
index 96d2a81..88ed310 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 96d2a81331a43c920045ba0d3850caffac85a123
+Subproject commit 88ed310232f8994cfa645be8ed16c34d9946bae0
index 0d6db4b..5f179dc 100644 (file)
@@ -13,6 +13,7 @@ include config.mk
 USE_SYS = yes
 USE_USB = yes
 USE_ADC = yes
+USE_EVENTFLAG = yes
 
 ifneq ($(ENABLE_FRAUCHEKY),)
 include $(FRAUCHEKY)/src.mk
index 280d49d..6fe943c 100644 (file)
@@ -2,7 +2,7 @@
  * main.c - main routine of neug
  *
  * Main routine:
- * Copyright (C) 2011, 2012, 2013, 2015, 2016, 2017
+ * Copyright (C) 2011, 2012, 2013, 2015, 2016, 2017, 2018
  *              Free Software Initiative of Japan
  * Author: NIIBE Yutaka <gniibe@fsij.org>
  *
@@ -28,6 +28,7 @@
 #include <stdint.h>
 #include <string.h>
 #include <chopstx.h>
+#include <eventflag.h>
 
 #include "config.h"
 #include "neug.h"
@@ -60,7 +61,7 @@ extern void EP6_OUT_Callback (uint16_t len);
 
 static chopstx_mutex_t usb_mtx;
 static chopstx_cond_t usb_cnd;
-static uint32_t bDeviceState = UNCONNECTED; /* USB device status */
+static uint32_t bDeviceState = USB_DEVICE_STATE_UNCONNECTED;
 static uint8_t fsij_device_state = FSIJ_DEVICE_RUNNING;
 static uint8_t connected;
 
@@ -69,7 +70,8 @@ static uint8_t connected;
 #define ENDP0_TXADDR        (0x80)
 #define ENDP1_TXADDR        (0xc0)
 #define ENDP2_TXADDR        (0x100)
-#define ENDP3_RXADDR        (0x140)
+#define ENDP3_RXADDR        (0x10A)
+/* Next available space for USB is: 0x14A */
 
 #define USB_CDC_REQ_SET_LINE_CODING             0x20
 #define USB_CDC_REQ_GET_LINE_CODING             0x21
@@ -153,7 +155,7 @@ static const uint8_t vcom_config_desc[67] = {
   ENDPOINT_DESCRIPTOR,
   ENDP2|0x80,    /* bEndpointAddress.    */
   0x03,          /* bmAttributes (Interrupt).        */
-  0x08, 0x00,   /* wMaxPacketSize.                  */
+  0x0A, 0x00,   /* wMaxPacketSize.                  */
   0xFF,                 /* bInterval.                       */
   /* Interface Descriptor.*/
   9,
@@ -227,7 +229,7 @@ usb_device_reset (struct usb_dev *dev)
 
   /* Notify upper layer.  */
   chopstx_mutex_lock (&usb_mtx);
-  bDeviceState = ATTACHED;
+  bDeviceState = USB_DEVICE_STATE_ATTACHED;
   connected = 0;
   chopstx_cond_signal (&usb_cnd);
   chopstx_mutex_unlock (&usb_mtx);
@@ -690,7 +692,7 @@ usb_set_configuration (struct usb_dev *dev)
       for (i = 0; i < NUM_INTERFACES; i++)
        neug_setup_endpoints_for_interface (dev, i, 0);
       chopstx_mutex_lock (&usb_mtx);
-      bDeviceState = CONFIGURED;
+      bDeviceState = USB_DEVICE_STATE_CONFIGURED;
       chopstx_mutex_unlock (&usb_mtx);
     }
   else if (current_conf != dev->dev_req.value)
@@ -702,7 +704,7 @@ usb_set_configuration (struct usb_dev *dev)
       for (i = 0; i < NUM_INTERFACES; i++)
        neug_setup_endpoints_for_interface (dev, i, 1);
       chopstx_mutex_lock (&usb_mtx);
-      bDeviceState = ADDRESSED;
+      bDeviceState = USB_DEVICE_STATE_ADDRESSED;
       chopstx_cond_signal (&usb_cnd);
       chopstx_mutex_unlock (&usb_mtx);
     }
@@ -808,7 +810,7 @@ usb_main (void *arg)
 
              case USB_EVENT_DEVICE_ADDRESSED:
                chopstx_mutex_lock (&usb_mtx);
-               bDeviceState = ADDRESSED;
+               bDeviceState = USB_DEVICE_STATE_ADDRESSED;
                chopstx_cond_signal (&usb_cnd);
                chopstx_mutex_unlock (&usb_mtx);
                continue;
@@ -934,46 +936,6 @@ usb_rx_ready (uint8_t ep_num, uint16_t len)
 #endif
 }
 \f
-typedef uint32_t eventmask_t;
-#define ALL_EVENTS (~0)
-
-struct event_flag {
-  chopstx_mutex_t mutex;
-  chopstx_cond_t cond;
-  eventmask_t flag;
-};
-
-static void event_flag_init (struct event_flag *ev)
-{
-  ev->flag = 0;
-  chopstx_mutex_init (&ev->mutex);
-  chopstx_cond_init (&ev->cond);
-}
-
-
-static eventmask_t event_flag_waitone (struct event_flag *ev, eventmask_t m)
-{
-  int n;
-
-  chopstx_mutex_lock (&ev->mutex);
-  while (!(ev->flag & m))
-    chopstx_cond_wait (&ev->cond, &ev->mutex);
-
-  n = __builtin_ffs ((ev->flag & m));
-  ev->flag &= ~(1 << (n - 1));
-  chopstx_mutex_unlock (&ev->mutex);
-
-  return (1 << (n - 1));
-}
-
-static void event_flag_signal (struct event_flag *ev, eventmask_t m)
-{
-  chopstx_mutex_lock (&ev->mutex);
-  ev->flag |= m;
-  chopstx_cond_signal (&ev->cond);
-  chopstx_mutex_unlock (&ev->mutex);
-}
-
 #define STACK_MAIN
 #define STACK_PROCESS_1
 #define STACK_PROCESS_3
@@ -985,7 +947,7 @@ static void event_flag_signal (struct event_flag *ev, eventmask_t m)
 
 
 #define PRIO_LED 3
-static struct event_flag led_event;
+static struct eventflag led_event;
 
 #define LED_ONESHOT_SHORT      ((eventmask_t)1)
 #define LED_TWOSHOTS           ((eventmask_t)2)
@@ -1005,7 +967,7 @@ led_blinker (void *arg)
     {
       eventmask_t m;
 
-      m = event_flag_waitone (&led_event, ALL_EVENTS);
+      m = eventflag_wait (&led_event);
 
       set_led (1);
       if (m == LED_ONESHOT_SHORT)
@@ -1067,7 +1029,7 @@ check_usb_status (void *arg)
 {
   (void)arg;
 
-  return (connected || bDeviceState != CONFIGURED
+  return (connected || bDeviceState != USB_DEVICE_STATE_CONFIGURED
          || fsij_device_state != FSIJ_DEVICE_RUNNING);
 }
 
@@ -1129,7 +1091,7 @@ main (int argc, char **argv)
 
   adc_init ();
 
-  event_flag_init (&led_event);
+  eventflag_init (&led_event);
 
   chopstx_mutex_init (&usb_mtx);
   chopstx_cond_init (&usb_cnd);
@@ -1138,18 +1100,18 @@ main (int argc, char **argv)
   if (fraucheky_enabled ())
     {
     go_fraucheky:
-      bDeviceState = UNCONNECTED;
+      bDeviceState = USB_DEVICE_STATE_UNCONNECTED;
       running_neug = 0;
       usb_thd = chopstx_create (PRIO_USB, STACK_ADDR_USB, STACK_SIZE_USB,
                                usb_main, NULL);
-      while (bDeviceState != CONFIGURED)
+      while (bDeviceState != USB_DEVICE_STATE_CONFIGURED)
        chopstx_usec_wait (250*1000);
       set_led (1);
       fraucheky_main ();
       chopstx_cancel (usb_thd);
       chopstx_join (usb_thd, NULL);
       usb_lld_shutdown ();
-      bDeviceState = UNCONNECTED;
+      bDeviceState = USB_DEVICE_STATE_UNCONNECTED;
     }
 
   running_neug = 1;
@@ -1168,7 +1130,7 @@ main (int argc, char **argv)
  not_configured:
   count = 0;
   /* Initial run-up */
-  while (count < NEUG_PRE_LOOP || bDeviceState != CONFIGURED)
+  while (count < NEUG_PRE_LOOP || bDeviceState != USB_DEVICE_STATE_CONFIGURED)
     {
       if (fsij_device_state != FSIJ_DEVICE_RUNNING)
        break;
@@ -1178,7 +1140,7 @@ main (int argc, char **argv)
       neug_flush ();
 
       if ((count & 0x0007) == 0)
-       event_flag_signal (&led_event, LED_ONESHOT_SHORT);
+       eventflag_signal (&led_event, LED_ONESHOT_SHORT);
       chopstx_usec_wait (25*1000);
       count++;
       chopstx_mutex_lock (&usb_mtx);
@@ -1214,11 +1176,11 @@ main (int argc, char **argv)
          /* Timeout */
          neug_flush ();
          neug_mode_select (line_coding.paritytype);
-         event_flag_signal (&led_event, LED_TWOSHOTS);
+         eventflag_signal (&led_event, LED_TWOSHOTS);
        }
 
       chopstx_mutex_lock (&usb_mtx);
-      if (bDeviceState != CONFIGURED)
+      if (bDeviceState != USB_DEVICE_STATE_CONFIGURED)
        goto not_configured;
 
       /* The connection opened.  */
@@ -1240,7 +1202,7 @@ main (int argc, char **argv)
          neug_mode_select (line_coding.paritytype);
 
          if ((count & 0x03ff) == 0)
-           event_flag_signal (&led_event, LED_ONESHOT_SHORT);
+           eventflag_signal (&led_event, LED_ONESHOT_SHORT);
 
          i = neug_consume_random (copy_to_tx);
 
@@ -1249,7 +1211,7 @@ main (int argc, char **argv)
              neug_wait_full ();
 
              chopstx_mutex_lock (&usb_mtx);
-             if (bDeviceState != CONFIGURED || !connected
+             if (bDeviceState != USB_DEVICE_STATE_CONFIGURED || !connected
                  || fsij_device_state != FSIJ_DEVICE_RUNNING)
                break;
            }
@@ -1261,7 +1223,7 @@ main (int argc, char **argv)
                last_was_fullsizepacket = 0;
 
              chopstx_mutex_lock (&usb_mtx);
-             if (bDeviceState != CONFIGURED || !connected
+             if (bDeviceState != USB_DEVICE_STATE_CONFIGURED || !connected
                  || fsij_device_state != FSIJ_DEVICE_RUNNING)
                break;
 
index 805911c..9617527 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * neug.c - true random number generation
  *
- * Copyright (C) 2011, 2012, 2013, 2016, 2017
+ * Copyright (C) 2011, 2012, 2013, 2016, 2017, 2018
  *               Free Software Initiative of Japan
  * Author: NIIBE Yutaka <gniibe@fsij.org>
  *
@@ -143,6 +143,12 @@ rbit (uint32_t v)
   asm ("rbit   %0, %1" : "=r" (r) : "r" (v));
   return r;
 }
+
+void
+crc32_rv_stop (void)
+{
+  RCC->AHBENR &= ~RCC_AHBENR_CRCEN;
+}
 #endif
 
 static chopstx_mutex_t mode_mtx;
@@ -894,6 +900,7 @@ neug_fini (void)
   rng_should_terminate = 1;
   neug_get (1);
   chopstx_join (rng_thread, NULL);
+  crc32_rv_stop ();
 }
 
 void