Newer Chopstx
[gnuk/neug.git] / src / main.c
index 89dd5dd..f3248c4 100644 (file)
 #include "adc.h"
 
 chopstx_mutex_t usb_mtx;
-chopstx_cond_t cnd_usb_connection;
-chopstx_cond_t cnd_usb_buffer_ready;
+chopstx_cond_t cnd_usb;
+
+extern uint8_t __process0_stack_end__;
+static chopstx_t main_thd = (uint32_t)(&__process0_stack_end__ - 60);
 
 #define ENDP0_RXADDR        (0x40)
 #define ENDP0_TXADDR        (0x80)
@@ -263,16 +265,10 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value,
        }
       else if (req_no == USB_NEUG_EXIT)
        {
-#if 0
-         chSysLockFromIsr ();
-         if (main_thread->p_state == THD_STATE_SUSPENDED
-             || main_thread->p_state == THD_STATE_SLEEPING)
-           {
-             main_thread->p_u.rdymsg = RDY_OK;
-             chSchReadyI (main_thread);
-           }
-         chSysUnlockFromIsr ();
-#endif
+         /* Force exit from the main loop.  */
+         chopstx_mutex_lock (&usb_mtx);
+         chopstx_cond_signal (&cnd_usb);
+         chopstx_mutex_unlock (&usb_mtx);
        }
     }
 }
@@ -331,7 +327,7 @@ vcom_port_data_setup (uint8_t req, uint8_t req_no, uint16_t value)
 
          chopstx_mutex_lock (&usb_mtx);
          if (connected != connected_saved)
-           chopstx_cond_signal (&cnd_usb_connection);
+           chopstx_cond_signal (&cnd_usb);
          chopstx_mutex_unlock (&usb_mtx);
 
          return USB_SUCCESS;
@@ -414,6 +410,8 @@ usb_cb_setup (uint8_t req, uint8_t req_no,
                return USB_UNSUPPORT;
 
              fsij_device_state = FSIJ_DEVICE_NEUG_EXIT_REQUESTED;
+             chopstx_wakeup_usec_wait (main_thd);
+
              return USB_SUCCESS;
            }
        }
@@ -585,7 +583,7 @@ int usb_cb_interface (uint8_t cmd, uint16_t interface, uint16_t alt)
 }
 
 #define INTR_REQ_USB 20
-#define PRIO_USB 2
+#define PRIO_USB 4
 
 static void *
 usb_intr (void *arg)
@@ -593,12 +591,9 @@ usb_intr (void *arg)
   chopstx_intr_t interrupt;
 
   (void)arg;
-  asm volatile ("cpsid   i" : : : "memory");
-  /* Disable because usb_lld_init assumes interrupt handler.  */
   usb_lld_init (vcom_configuration_desc[7]);
   chopstx_claim_irq (&interrupt, INTR_REQ_USB);
-  /* Enable */
-  asm volatile ("cpsie   i" : : : "memory");
+  usb_interrupt_handler ();
 
   while (1)
     {
@@ -637,7 +632,7 @@ void
 EP1_IN_Callback (void)
 {
   chopstx_mutex_lock (&usb_mtx);
-  chopstx_cond_signal (&cnd_usb_buffer_ready);
+  chopstx_cond_signal (&cnd_usb);
   chopstx_mutex_unlock (&usb_mtx);
 }
 
@@ -779,8 +774,7 @@ int
 main (int argc, char **argv)
 {
   uint32_t entry;
-  chopstx_t led_thread, thd;
-  chopstx_attr_t attr;
+  chopstx_t led_thread, usb_thd;
 
   (void)argc;
   (void)argv;
@@ -790,19 +784,15 @@ main (int argc, char **argv)
   adc_init ();
 
   event_flag_init (&led_event);
-
-  chopstx_attr_init (&attr);
-  chopstx_attr_setschedparam (&attr, PRIO_LED);
-  chopstx_attr_setstack (&attr, __stackaddr_led, __stacksize_led);
-  chopstx_create (&led_thread, &attr, led_blinker, NULL);
+  
+  led_thread = chopstx_create (PRIO_LED, __stackaddr_led, __stacksize_led,
+                              led_blinker, NULL);
 
   chopstx_mutex_init (&usb_mtx);
-  chopstx_cond_init (&cnd_usb_connection);
-  chopstx_cond_init (&cnd_usb_buffer_ready);
+  chopstx_cond_init (&cnd_usb);
 
-  chopstx_attr_setschedparam (&attr, PRIO_USB);
-  chopstx_attr_setstack (&attr, __stackaddr_usb, __stacksize_usb);
-  chopstx_create (&thd, &attr, usb_intr, NULL);
+  usb_thd = chopstx_create (PRIO_USB, __stackaddr_usb, __stacksize_usb,
+                           usb_intr, NULL);
 
   neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t));
 
@@ -885,7 +875,7 @@ main (int argc, char **argv)
          else
            {
              usb_lld_tx_enable (ENDP1, i * 4);
-             chopstx_cond_wait (&cnd_usb_buffer_ready, &usb_mtx);
+             chopstx_cond_wait (&cnd_usb, &usb_mtx);
            }
          chopstx_mutex_unlock (&usb_mtx);
 
@@ -893,10 +883,8 @@ main (int argc, char **argv)
        }
     }
 
-  event_flag_signal (&led_event, LED_ONESHOT_SHORT);
-#if 0
+  chopstx_cancel (led_thread);
   chopstx_join (led_thread, NULL);
-#endif
 
   /*
    * We come here, because of FSIJ_DEVICE_NEUG_EXIT_REQUESTED.
@@ -911,10 +899,11 @@ main (int argc, char **argv)
   flash_unlock ();             /* Flash unlock should be done here */
   set_led (1);
   usb_lld_shutdown ();
-#if 0
-  /* Finish kernel: stop scheduler, timer.  */
-  chx_fini ();
-#endif
+
+  /* Finish application.  */
+  chopstx_cancel (usb_thd);
+  chopstx_join (usb_thd, NULL);
+
   /* Set vector */
   SCB->VTOR = (uint32_t)&_regnual_start;
   entry = calculate_regnual_entry_address (&_regnual_start);