support Fraucheky
authorNIIBE Yutaka <gniibe@fsij.org>
Wed, 6 Nov 2013 08:53:02 +0000 (17:53 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 7 Nov 2013 01:35:50 +0000 (10:35 +0900)
.gitignore
.gitmodules
ChangeLog
NEUG_USB_DEVICE_ID
NEWS
README
fraucheky [new submodule]
src/Makefile.in
src/config.h.in
src/configure
src/main.c

index f8edeb7..f9ad64a 100644 (file)
@@ -2,3 +2,6 @@
 *.lst
 *.pyc
 src/board.h
+src/INDEX
+src/README
+src/*.inc
index 32387ba..1c314ed 100644 (file)
@@ -1,3 +1,6 @@
 [submodule "chopstx"]
        path = chopstx
        url = git@gitorious.org:chopstx/chopstx.git
+[submodule "fraucheky"]
+       path = fraucheky
+       url = git@gitorious.org:chopstx/fraucheky.git
index 58df0ec..9c82f77 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2013-11-06  Niibe Yutaka  <gniibe@fsij.org>
 
+       * fraucheky: New submodule.
+       * .gitignore: Add generated files by Fraucheky.
+       * NEUG_USB_DEVICE_ID: Add USB id of Fraucheky.
+       * src/Makefile.in, src/config.h.in, src/configure: Support
+       Fraucheky.
+       *src/main.c: Likewise.
+
        * vender/flying-stone-technology: New.
 
 2013-11-05  Niibe Yutaka  <gniibe@fsij.org>
index 5dffd2c..6563a0e 100644 (file)
@@ -1,3 +1,4 @@
 # VID:PID      bcdDev  Product_STRING  Vender_STRING
+234b:0004      0100    Fraucheky       Free Software Initiative of Japan
 234b:0001      0100    NeuG True RNG   Free Software Initiative of Japan
 ##########<TAB>        ##<TAB> ##########<TAB> #################
diff --git a/NEWS b/NEWS
index 446049e..29f7166 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,21 @@
 NeuG NEWS - User visible changes
 
+* Major changes in NeuG 1.0
+
+  Released 2013-11-xx, by NIIBE Yutaka
+
+** Upgrade of Chopstx
+Now, we use Chopstx 0.01.
+
+** Stable upgrade process
+For firmware upgrade, it has been unstable and it has been recommended
+not to access its stream (/dev/ttyACM0) before running
+neug_upgrade.py.  This bug was fixed in 1.0, and it's more stable.
+
+** Add support of Fraucheky
+Fraucheky is a GPL container which makes sure to deliver GPL to users.
+
+
 * Major changes in NeuG 0.11
 
   Released 2013-08-22, by NIIBE Yutaka
diff --git a/README b/README
index 22e864b..7b2bec9 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
 NeuG - a true random number generator implementation (for STM32F103)
 
-                                                          Version 0.11
-                                                            2013-08-22
+                                                           Version 1.0
+                                                            2013-11-xx
                                                           Niibe Yutaka
                                      Free Software Initiative of Japan
 
@@ -29,14 +29,16 @@ Release notes
 =============
 
 This is new release of NeuG with Chopstx, version number bumped to
-0.11.  Basic features (generating random numbers) are stable, but
-newly added things like reGNUal support should be considered unstable.
+1.0.  Basic features (generating random numbers) are stable, but newly
+added things like fraucheky (USB Mass Storage Class) support and
+reGNUal (firmware upgrad) support should be considered experimental.
 
 Note that you need Chopstx (the thread library) as external source
 code (instead of ChibiOS/RT).
 
-The "boards" directory is obsolete one for old versions of NeuG with
-ChibiOS/RT.  We leave it to port new NeuG to other boards.
+The "boards" directory is now obsolete, it's for old versions of NeuG
+with ChibiOS/RT.  When you find a board under this directory, it means
+it doesn't work.  We leave them to port new NeuG.
 
 
 FAQ
@@ -88,6 +90,11 @@ Souce code
 
 NeuG source code is under src/ directory.
 
+Note that SHA-2 hash function implementation, src/sha256.c, is based
+on the original implementation by Dr. Brian Gladman.  See:
+
+  http://gladman.plushost.co.uk/oldsite/cryptography_technology/sha/index.php
+
 
 License
 =======
@@ -103,6 +110,8 @@ To build NeuG device, you need external source code.
 
 * chopstx/ -- Chopstx, the RT Thread Library
 
+* [optional] fraucheky/ -- Fraucheky, the GPL container
+
 It is available at:
 
   http://gitorious.org/chopstx/chopstx
diff --git a/fraucheky b/fraucheky
new file mode 160000 (submodule)
index 0000000..96ba65e
--- /dev/null
+++ b/fraucheky
@@ -0,0 +1 @@
+Subproject commit 96ba65e63b52642334b68aeffb309c52be1f9846
index ef0065d..f818b4f 100644 (file)
@@ -4,6 +4,7 @@
 PROJECT = neug
 
 CHOPSTX = ../chopstx
+FRAUCHEKY = ../fraucheky
 
 # Define linker script file here
 LDSCRIPT= neug.ld
@@ -11,6 +12,7 @@ LDSCRIPT= neug.ld
 CSRC = sys.c aes-constant-ft.c \
        main.c sha256.c neug.c usb_stm32f103.c adc_stm32f103.c
 
+@ENABLE_FRAUCHEKY@include $(FRAUCHEKY)/src.mk
 ###################################
 CROSS = arm-none-eabi-
 CC   = $(CROSS)gcc
@@ -27,12 +29,15 @@ LIBS  =
 #######################
 include $(CHOPSTX)/rules.mk
 
+@ENABLE_FRAUCHEKY@include $(FRAUCHEKY)/build.mk
+###################################
+
 board.h:
        @echo Please run configure to have a symbolic link \'board.h\'
        @exit 1
 
 sys.c: board.h
 
-distclean: clean
+distclean:: clean
        -rm -f neug.ld config.h board.h Makefile \
               usb-strings.c.inc usb-vid-pid-ver.c.inc
index c27fbf0..08a6d4d 100644 (file)
@@ -1,3 +1,5 @@
 @DFU_DEFINE@
 @TARGET_DEFINE@
 @SERIALNO_STR_LEN@
+@FRAUCHEKY_DEFINE@
+@FRAUCHEKY_MSC_DEFINE@
index 71fd479..d0541d4 100755 (executable)
@@ -29,6 +29,7 @@ with_dfu=default
 debug=no
 sys1_compat=yes
 with_fraucheky=no
+with_index=none
 
 # Process each option
 for option; do
@@ -58,6 +59,8 @@ for option; do
     with_fraucheky=$optarg ;;
   --without-fraucheky)
     with_fraucheky=no ;;
+  --with-index=*)
+    with_index=$optarg ;;
   *)
     echo "Unrecognized option \`$option'" >&2
     echo "Try \`$0 --help' for more information." >&2
@@ -90,7 +93,7 @@ Configuration:
 
   --with-fraucheky=VID:PID
                        include fraucheky support       [no]
-  --with-index=INDEX   specify INDEX file              [INDEX.HTM]
+  --with-index=INDEX   specify INDEX file              [none]
 EOF
   exit 0
 fi
@@ -100,6 +103,16 @@ if test "$vidpid" = "none"; then
   exit 1
 fi
 
+if ! test "$with_fraucheky" = "no"; then
+  ../fraucheky/configure $with_fraucheky $with_index
+  ENABLE_FRAUCHEKY=""
+  FRAUCHEKY_DEFINE="#define FRAUCHEKY_SUPPORT 1"
+  FRAUCHEKY_MSC_DEFINE="#define MSC_INTERFACE_NO    2"
+else
+  FRAUCHEKY_DEFINE="#undef FRAUCHEKY_SUPPORT"
+  FRAUCHEKY_MSC_DEFINE="#undef MSC_INTERFACE_NO"
+fi
+
 TARGET_DEFINE="#define BOARD_$target 1"
 BOARD_HEADER_FILE=board-`echo $target | tr '_[:upper:]' '-[:lower:]'`.h
 echo Header file is: $BOARD_HEADER_FILE
@@ -163,36 +176,47 @@ SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
 
 CONFIG="$target:dfu=$with_dfu"
 
+output_vid_pid_version () {
+  echo $VIDPID | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\):\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* idVendor  */\n  0x\4, 0x\3, /* idProduct */%p"
+  echo $VERSION | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* bcdDevice  */%p"
+}
+
+output_vendor_product_serial_strings () {
+  prefix=$1
+
+  echo "static const uint8_t ${prefix}string_vendor[] = {"
+  echo "  ${#VENDOR}*2+2,                      /* bLength */"
+  echo "  USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType */"
+  echo "  /* Manufacturer: \"$VENDOR\" */"
+  echo $VENDOR | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
+  echo '};'
+  echo
+  echo "static const uint8_t ${prefix}string_product[] = {"
+  echo "  ${#PRODUCT}*2+2,                     /* bLength */"
+  echo "  USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType */"
+  echo "  /* Product name: \"$PRODUCT\" */"
+  echo $PRODUCT | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
+  echo '};'
+
+  if test -n "$prefix"; then
+  echo
+  echo "static uint8_t ${prefix}string_serial[] = {"
+  echo "  ${#SERIALNO}*2+2+16,                 /* bLength */"
+  echo "  USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType */"
+  echo "  /* Serial number: \"$SERIALNO\" */"
+  echo $SERIALNO | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
+  echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
+  echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
+  echo '};'
+  fi
+}
+
 if !(IFS="     "
   while read VIDPID VERSION PRODUCT VENDOR; do
     if test "$vidpid" = "$VIDPID"; then
-      (echo $VIDPID | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\):\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* idVendor  */\n  0x\4, 0x\3, /* idProduct */%p"
-       echo $VERSION | sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%  0x\2, 0x\1, /* bcdDevice  */%p"
-      ) > usb-vid-pid-ver.c.inc
-      (echo 'static const uint8_t neug_string_vendor[] = {'
-       echo "  ${#VENDOR}*2+2,                 /* bLength */"
-       echo "  USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType */"
-       echo "  /* Manufacturer: \"$VENDOR\" */"
-       echo $VENDOR | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
-       echo '};'
-       echo
-       echo 'static const uint8_t neug_string_product[] = {'
-       echo "  ${#PRODUCT}*2+2,                        /* bLength */"
-       echo "  USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType */"
-       echo "  /* Product name: \"$PRODUCT\" */"
-       echo $PRODUCT | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
-       echo '};'
-       echo
-       echo 'static uint8_t neug_string_serial[] = {'
-       echo "  ${#SERIALNO}*2+2+16,                    /* bLength */"
-       echo "  USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType */"
-       echo "  /* Serial number: \"$SERIALNO\" */"
-       echo $SERIALNO | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
-       echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
-       echo "  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
-       echo '};'
+      output_vid_pid_version > usb-vid-pid-ver.c.inc
+      (output_vendor_product_serial_strings neug_
        echo
-       echo '#ifdef USB_STRINGS_FOR_NEUG'
        echo 'static const uint8_t neug_revision_detail[] = {'
        echo "  ${#REVISION}*2+2,                       /* bLength */"
        echo "  USB_STRING_DESCRIPTOR_TYPE,     /* bDescriptorType */"
@@ -206,9 +230,11 @@ if !(IFS=" "
        echo "  /* configure options: \"$CONFIG\" */"
        echo $CONFIG | sed -n -e "s/\(........\)/\1\n/gp" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/  /" -e "s/ $//p"
        echo '};'
-       echo '#endif'
        ) >usb-strings.c.inc
       exit 0
+    elif test "$with_fraucheky" = "$VIDPID"; then
+      output_vid_pid_version > fraucheky-vid-pid-ver.c.inc
+      output_vendor_product_serial_strings >fraucheky-usb-strings.c.inc
     fi
   done; exit 1) < ../NEUG_USB_DEVICE_ID
 then
@@ -229,6 +255,7 @@ fi
 
 
 sed -e "s%@HAVE_SYS_H@%$have_sys_h%" \
+    -e "s%@ENABLE_FRAUCHEKY@%$ENABLE_FRAUCHEKY%" \
        < Makefile.in > Makefile
 sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
     -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
@@ -237,5 +264,7 @@ sed -e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
 sed -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
     -e "s/@TARGET_DEFINE@/$TARGET_DEFINE/" \
     -e "s/@SERIALNO_STR_LEN@/$SERIALNO_STR_LEN_DEFINE/" \
+    -e "s/@FRAUCHEKY_DEFINE@/$FRAUCHEKY_DEFINE/" \
+    -e "s/@FRAUCHEKY_MSC_DEFINE@/$FRAUCHEKY_MSC_DEFINE/" \
        < config.h.in > config.h
 exit 0
index 4b0347b..fbefa86 100644 (file)
@@ -43,6 +43,8 @@ enum {
   FSIJ_DEVICE_NEUG_EXIT_REQUESTED = 255
 }; 
 
+static uint8_t running_neug;
+
 static chopstx_mutex_t usb_mtx;
 static chopstx_cond_t cnd_usb;
 static uint32_t bDeviceState = UNCONNECTED; /* USB device status */
@@ -174,11 +176,20 @@ static const uint8_t vcom_string0[4] = {
   0x09, 0x04                   /* LangID = 0x0409: US-English */
 };
 
-#define USB_STRINGS_FOR_NEUG 1
 #include "usb-strings.c.inc"
 
-#define NUM_INTERFACES 2
+#ifdef FRAUCHEKY_SUPPORT
+extern int fraucheky_enabled (void);
+extern void fraucheky_main (void);
 
+extern void fraucheky_setup_endpoints_for_interface (int stop);
+extern int fraucheky_setup (uint8_t req, uint8_t req_no, uint16_t value,
+                           uint16_t len);
+extern int fraucheky_get_descriptor (uint8_t rcp, uint8_t desc_type,
+                                    uint8_t desc_index, uint16_t index);
+#endif
+
+#define NUM_INTERFACES 2
 
 void
 usb_cb_device_reset (void)
@@ -430,8 +441,20 @@ usb_cb_setup (uint8_t req, uint8_t req_no,
        }
     }
   else if (type_rcp == (CLASS_REQUEST | INTERFACE_RECIPIENT))
-    if (index == 0)
-      return vcom_port_data_setup (req, req_no, value, len);
+    {
+      if (index == 0)
+       {
+#ifdef FRAUCHEKY_SUPPORT
+         if (running_neug)
+           return vcom_port_data_setup (req, req_no, value, len);
+         else
+           fraucheky_setup (req, req_no, value, len);
+#else
+         return vcom_port_data_setup (req, req_no, value, len);
+#endif
+       }
+    }
+
 
   return USB_UNSUPPORT;
 }
@@ -440,7 +463,13 @@ int
 usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index,
                       uint16_t index)
 {
+#ifdef FRAUCHEKY_SUPPORT
+  if (!running_neug)
+    return fraucheky_get_descriptor (rcp, desc_type, desc_index, index);
+#else
   (void)index;
+#endif
+
   if (rcp != DEVICE_RECIPIENT)
     return USB_UNSUPPORT;
 
@@ -506,10 +535,14 @@ neug_setup_endpoints_for_interface (uint16_t interface, int stop)
 {
   if (interface == 0)
     {
+#ifdef FRAUCHEKY_SUPPORT
+      fraucheky_setup_endpoints_for_interface (stop);
+#else
       if (!stop)
        usb_lld_setup_endpoint (ENDP2, EP_INTERRUPT, 0, 0, ENDP2_TXADDR, 0);
       else
        usb_lld_stall_tx (ENDP2);
+#endif
     }
   else if (interface == 1)
     {
@@ -644,9 +677,11 @@ static void fill_serial_no_by_unique_id (void)
       nibble = (b >> 4);
       nibble += (nibble >= 10 ? ('A' - 10) : '0');
       p[i*4] = nibble;
+      p[i*4+1] = 0;
       nibble = (b & 0x0f);
       nibble += (nibble >= 10 ? ('A' - 10) : '0');
       p[i*4+2] = nibble;
+      p[i*4+3] = 0;
     }
 }
 \f
@@ -809,12 +844,25 @@ main (int argc, char **argv)
 
   event_flag_init (&led_event);
   
+  chopstx_mutex_init (&usb_mtx);
+  chopstx_cond_init (&cnd_usb);
+
   led_thread = chopstx_create (PRIO_LED, __stackaddr_led, __stacksize_led,
                               led_blinker, NULL);
 
-  chopstx_mutex_init (&usb_mtx);
-  chopstx_cond_init (&cnd_usb);
+#ifdef FRAUCHEKY_SUPPORT
+  if (fraucheky_enabled ())
+    {
+      usb_thd = chopstx_create (PRIO_USB, __stackaddr_usb, __stacksize_usb,
+                               usb_intr, NULL);
+      fraucheky_main ();
+      chopstx_cancel (usb_thd);
+      chopstx_join (usb_thd, NULL);
+      usb_lld_shutdown ();
+    }
+#endif
 
+  running_neug = 1;
   usb_thd = chopstx_create (PRIO_USB, __stackaddr_usb, __stacksize_usb,
                            usb_intr, NULL);