Add ACKBTN support for FST-01SZ.
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 2 Oct 2018 02:13:35 +0000 (11:13 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 2 Oct 2018 04:01:25 +0000 (13:01 +0900)
ChangeLog
chopstx
src/config.h.in
src/configure
src/main.c
src/stack-def.h

index d6af1ed..3644192 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2018-10-02  NIIBE Yutaka  <gniibe@fsij.org>
+
+       * chopstx: Update to 1.11.
+       * src/config.h.in (ACKBTN_DEFINE): New.
+       * src/configure: Add ACKBTN_SUPPORT.
+       (FST_01SZ): New.
+       * src/main.c (usb_main): Follow the change of Chopstx 1.11.
+       [FRAUCHEKY_SUPPORT]: Add ACKBTN_SUPPORT.
+       (main) [FRAUCHEKY_SUPPORT]: Call usb_main with ~0.
+
 2018-05-10  NIIBE Yutaka  <gniibe@fsij.org>
 
        * VERSION: 1.0.8.
diff --git a/chopstx b/chopstx
index 802dbbd..fffb8aa 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 802dbbd639f0f85969724b24ab5100c6e44e6b9d
+Subproject commit fffb8aa3b3731fb242d9b99f7d935d85425c1404
index 638595b..86d98ba 100644 (file)
@@ -2,3 +2,4 @@
 @SERIALNO_STR_LEN_DEFINE@
 @FRAUCHEKY_DEFINE@
 @FRAUCHEKY_MSC_DEFINE@
+@ACKBTN_DEFINE@
index d6740f0..dcd2ee3 100755 (executable)
@@ -41,6 +41,7 @@ verbose=no
 with_dfu=default
 debug=no
 sys1_compat=yes
+ackbtn_support=no
 with_fraucheky=no
 with_index=none
 # For emulation
@@ -127,6 +128,7 @@ Configuration:
                        supported targets are:
                           FST_01
                           FST_01G
+                          FST_01SZ
                           STM8S_DISCOVERY
                           OLIMEX_STM32_H103
                           MAPLE_MINI
@@ -207,6 +209,10 @@ BLUE_PILL|STM8S_DISCOVERY)
 BLUE_PILL_G)
   MHZ=96
   ;;
+FST_01SZ)
+  MHZ=96
+  ackbtn_support=yes
+  ;;
 *)
   ;;
 esac
@@ -266,6 +272,15 @@ else
   DFU_DEFINE="#undef DFU_SUPPORT"
 fi
 
+# Acknowledge button support
+if test "$ackbtn_support" = "yes"; then
+  ACKBTN_DEFINE="#define ACKBTN_SUPPORT 1"
+  echo "Acknowledge button is supported"
+else
+  ACKBTN_DEFINE="#undef ACKBTN_SUPPORT"
+  echo "Acknowledge button is not supported"
+fi
+
 ### !!! Replace following string of "FSIJ" to yours !!! ####
 SERIALNO="FSIJ-$(sed -e 's%^[^/]*/%%' <../VERSION)-"
 
@@ -410,6 +425,9 @@ fi
  echo "LIBS=$libs";
  echo "ENABLE_FRAUCHEKY=$enable_fraucheky";
  echo "ENABLE_OUTPUT_HEX=$enable_hexoutput"
+ if test "$ackbtn_support" = "yes"; then
+   echo "USE_ACKBTN=yes"
+ fi
  if test "$emulation" = "yes"; then
    echo "prefix=$prefix"
    echo "exec_prefix=$exec_prefix"
@@ -424,5 +442,6 @@ sed -e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
     -e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
     -e "s/@FRAUCHEKY_DEFINE@/$FRAUCHEKY_DEFINE/" \
     -e "s/@FRAUCHEKY_MSC_DEFINE@/$FRAUCHEKY_MSC_DEFINE/" \
+    -e "s/@ACKBTN_DEFINE@/$ACKBTN_DEFINE/" \
        < config.h.in > config.h
 exit 0
index 35a8af5..4750001 100644 (file)
@@ -209,6 +209,11 @@ static const uint8_t vcom_string0[4] = {
 static void neug_setup_endpoints_for_interface (struct usb_dev *dev,
                                                uint16_t interface, int stop);
 #ifdef FRAUCHEKY_SUPPORT
+#ifdef ACKBTN_SUPPORT
+#include <contrib/ackbtn.h>
+#endif
+extern int fraucheky_main_active;
+
 #define MSC_MASS_STORAGE_RESET_COMMAND 0xFF
 extern int fraucheky_enabled (void);
 extern void fraucheky_init (void);
@@ -779,26 +784,56 @@ static void usb_rx_ready (uint8_t ep_num, uint16_t len);
 static void *
 usb_main (void *arg)
 {
-  chopstx_intr_t interrupt;
+  chopstx_intr_t usb_intr;
+#if defined(ACKBTN_SUPPORT) && defined(FRAUCHEKY_SUPPORT)
+  chopstx_intr_t ack_intr;
+  struct chx_poll_head *const poll_ptrs[] = {
+    (struct chx_poll_head *const)&usb_intr,
+    (struct chx_poll_head *const)&ack_intr,
+  };
+#endif
   struct usb_dev dev;
-  int e;
 
+#if defined(ACKBTN_SUPPORT) && defined(FRAUCHEKY_SUPPORT)
+  if (arg)
+    {
+      ackbtn_init (&ack_intr);
+      ackbtn_enable ();
+    }
+#else
   (void)arg;
+#endif
   usb_lld_init (&dev, VCOM_FEATURE_BUS_POWERED);
-  chopstx_claim_irq (&interrupt, INTR_REQ_USB);
+  chopstx_claim_irq (&usb_intr, INTR_REQ_USB);
   goto event_handle;   /* For old SYS < 3.0 */
 
   while (1)
     {
-      chopstx_intr_wait (&interrupt);
+#if defined(ACKBTN_SUPPORT) && defined(FRAUCHEKY_SUPPORT)
+      chopstx_poll (NULL, arg ? 2 : 1, poll_ptrs);
+#else
+      chopstx_intr_wait (&usb_intr);
+#endif
+
+#if defined(ACKBTN_SUPPORT) && defined(FRAUCHEKY_SUPPORT)
+      if (arg && ack_intr.ready)
+       {
+         ackbtn_disable ();
+         chopstx_intr_done (&ack_intr);
+         fraucheky_main_active = 0;
+         continue;
+       }
+#endif
 
-      if (interrupt.ready)
+      if (usb_intr.ready)
        {
+         int e;
          uint8_t ep_num;
 
        event_handle:
          e = usb_lld_event_handler (&dev);
          ep_num = USB_EVENT_ENDP (e);
+         chopstx_intr_done (&usb_intr);
 
          if (ep_num != 0)
            {
@@ -1130,7 +1165,7 @@ main (int argc, char **argv)
     go_fraucheky:
       bDeviceState = USB_DEVICE_STATE_UNCONNECTED;
       usb_thd = chopstx_create (PRIO_USB, STACK_ADDR_USB, STACK_SIZE_USB,
-                               usb_main, NULL);
+                               usb_main, (void *)~0);
       fraucheky_init ();
       while (bDeviceState != USB_DEVICE_STATE_CONFIGURED)
        chopstx_usec_wait (250*1000);
index bf1a6e7..f07c7ba 100644 (file)
@@ -6,7 +6,7 @@
 #define SIZE_0 0x0160 /* Main */
 #define SIZE_1 0x00e0 /* LED */
 #define SIZE_2 0x0180 /* RNG */
-#define SIZE_3 0x0140 /* USB */
+#define SIZE_3 0x0180 /* USB */
 #endif
 
 #if defined(STACK_MAIN) && !defined(GNU_LINUX_EMULATION)