Update main.c for GNU/Linux emulation.
authorNIIBE Yutaka <gniibe@fsij.org>
Mon, 4 Sep 2017 06:27:48 +0000 (15:27 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Mon, 4 Sep 2017 06:27:48 +0000 (15:27 +0900)
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
ChangeLog
chopstx
src/main.c

index b37423e..fd63681 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2017-09-04  NIIBE Yutaka  <gniibe@fsij.org>
 
+       * src/main.c: Support GNU_LINUX_EMULATION.
+
        * src/Makefile: Rename from src/Makefile.in (as done in gnuk).
        * src/configure: Generate config.mk.
 
diff --git a/chopstx b/chopstx
index a4f28ee..a1b993c 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit a4f28ee17680742b0b0055f68b7a0741ccb17d6b
+Subproject commit a1b993c2e24d2e94fe5284cdbfec712b6d358785
index ae83f9b..f8a1e8d 100644 (file)
@@ -224,9 +224,11 @@ usb_device_reset (struct usb_dev *dev)
   chopstx_mutex_unlock (&usb_mtx);
 }
 
+#ifndef GNU_LINUX_EMULATION
 extern uint8_t _regnual_start, __heap_end__;
 
 static const uint8_t *const mem_info[] = { &_regnual_start,  &__heap_end__, };
+#endif
 
 /* USB vendor requests to control pipe */
 #define USB_FSIJ_MEMINFO         0
@@ -236,6 +238,9 @@ static const uint8_t *const mem_info[] = { &_regnual_start,  &__heap_end__, };
 #define USB_NEUG_GET_INFO      254
 #define USB_NEUG_EXIT          255 /* Ask to exit and to receive reGNUal */
 
+#define DEFAULT_PASSWD "12345678"
+#define DEFAULT_PASSWD_LEN 8
+
 uint8_t neug_passwd[33] __attribute__ ((section(".passwd"))) = {
   0xff,
   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -244,9 +249,7 @@ uint8_t neug_passwd[33] __attribute__ ((section(".passwd"))) = {
 };
 static uint8_t usbbuf[64];
 
-#define DEFAULT_PASSWD "12345678"
-#define DEFAULT_PASSWD_LEN 8
-
+#ifndef GNU_LINUX_EMULATION
 static void set_passwd (void)
 {
   flash_unlock ();
@@ -275,6 +278,7 @@ static int download_check_crc32 (struct usb_dev *dev, const uint32_t *end_p)
 
   return -1;
 }
+#endif
 
 
 #define NEUG_SPECIAL_BITRATE 110
@@ -315,14 +319,19 @@ usb_ctrl_write_finish (struct usb_dev *dev)
            }
          chopstx_mutex_unlock (&usb_mtx);
        }
+#ifndef GNU_LINUX_EMULATION
       else if (arg->request == USB_NEUG_SET_PASSWD)
        set_passwd ();
+#endif
       else if (arg->request == USB_NEUG_EXIT)
        {
          if ((neug_passwd[0] == 0xff && usbbuf[0] == DEFAULT_PASSWD_LEN
               && !memcmp (usbbuf + 1, DEFAULT_PASSWD, DEFAULT_PASSWD_LEN))
+#ifndef GNU_LINUX_EMULATION
              || (neug_passwd[0] == usbbuf[0]
-                 && !memcmp (neug_passwd+1, usbbuf+1, neug_passwd[0])))
+                 && !memcmp (neug_passwd+1, usbbuf+1, neug_passwd[0]))
+#endif
+             )
            {
              chopstx_mutex_lock (&usb_mtx);
              fsij_device_state = FSIJ_DEVICE_NEUG_EXIT_REQUESTED;
@@ -396,6 +405,9 @@ usb_setup (struct usb_dev *dev)
        {
          if (arg->request == USB_FSIJ_MEMINFO)
            {
+#ifdef GNU_LINUX_EMULATION
+             return -1;
+#else
              chopstx_mutex_lock (&usb_mtx);
              if (fsij_device_state != FSIJ_DEVICE_EXITED)
                {
@@ -404,6 +416,7 @@ usb_setup (struct usb_dev *dev)
                }
              chopstx_mutex_unlock (&usb_mtx);
              return usb_lld_ctrl_send (dev, mem_info, sizeof (mem_info));
+#endif
            }
          else if (arg->request == USB_NEUG_GET_INFO)
            {
@@ -433,6 +446,9 @@ usb_setup (struct usb_dev *dev)
 
          if (arg->request == USB_FSIJ_DOWNLOAD)
            {
+#ifdef GNU_LINUX_EMULATION
+             return -1;
+#else
              chopstx_mutex_lock (&usb_mtx);
              if (fsij_device_state != FSIJ_DEVICE_EXITED)
                {
@@ -448,9 +464,13 @@ usb_setup (struct usb_dev *dev)
                memset (addr + arg->index + arg->len, 0, 256 - (arg->index + arg->len));
 
              return usb_lld_ctrl_recv (dev, addr, arg->len);
+#endif
            }
          else if (arg->request == USB_FSIJ_EXEC && arg->len == 0)
            {
+#ifdef GNU_LINUX_EMULATION
+             return -1;
+#else
              chopstx_mutex_lock (&usb_mtx);
              if (fsij_device_state != FSIJ_DEVICE_EXITED)
                {
@@ -463,6 +483,7 @@ usb_setup (struct usb_dev *dev)
                return -1;
 
              return download_check_crc32 (dev, (uint32_t *)addr);
+#endif
            }
          else if (arg->request == USB_NEUG_SET_PASSWD && arg->len <= 32)
            {
@@ -937,8 +958,8 @@ static void event_flag_signal (struct event_flag *ev, eventmask_t m)
 }
 
 #ifdef GNU_LINUX_EMULATION
-extern char __process1_stack_base__[4096];
-extern char __process3_stack_base__[4096];
+static char __process1_stack_base__[4096];
+static char __process3_stack_base__[4096];
 #define STACK_SIZE_LED (sizeof __process1_stack_base__)
 #define STACK_SIZE_USB (sizeof __process3_stack_base__)
 #else
@@ -1010,6 +1031,7 @@ static void copy_to_tx (uint32_t v, int i)
 #endif
 }
 
+#ifndef GNU_LINUX_EMULATION
 /*
  * In Gnuk 1.0.[12], reGNUal was not relocatable.
  * Now, it's relocatable, but we need to calculate its entry address
@@ -1026,6 +1048,7 @@ calculate_regnual_entry_address (const uint8_t *addr)
   v += (uintptr_t)addr;
   return v;
 }
+#endif
 
 
 static int
@@ -1039,6 +1062,8 @@ check_usb_status (void *arg)
 
 
 #ifdef GNU_LINUX_EMULATION
+#include <stdlib.h>
+
 #define main emulated_main
 #endif
 
@@ -1050,7 +1075,9 @@ check_usb_status (void *arg)
 int
 main (int argc, char **argv)
 {
+#ifndef GNU_LINUX_EMULATION
   uintptr_t entry;
+#endif
   chopstx_t led_thread, usb_thd;
   unsigned int count;
 
@@ -1261,10 +1288,11 @@ main (int argc, char **argv)
   chopstx_cancel (usb_thd);
   chopstx_join (usb_thd, NULL);
 
-#ifndef GNU_LINUX_EMULATION
+#ifdef GNU_LINUX_EMULATION
+  exit (0);
+#else
   /* Set vector */
   SCB->VTOR = (uintptr_t)&_regnual_start;
-#endif
   entry = calculate_regnual_entry_address (&_regnual_start);
 #ifdef DFU_SUPPORT
 #define FLASH_SYS_START_ADDR 0x08000000
@@ -1296,6 +1324,7 @@ main (int argc, char **argv)
   /* Leave NeuG to exec reGNUal */
   flash_erase_all_and_exec ((void (*)(void))entry);
 #endif
+#endif
 
   /* Never reached */
   return 0;