NuMaker tickless example

Revision:
1:eb1da9d36e12
Child:
10:d2e2c79389e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wakeup_uart.cpp	Tue Sep 12 16:16:43 2017 +0800
@@ -0,0 +1,77 @@
+#include "mbed.h"
+#include "wakeup.h"
+
+#if defined(TARGET_NUMAKER_PFM_NUC472)
+// Serial
+#define SERIAL_RX   PF_0
+#define SERIAL_TX   PD_15
+#define SERIAL_CTS  PD_13
+#define SERIAL_RTS  PD_14
+
+#elif defined(TARGET_NUMAKER_PFM_M453)
+// Serial
+#define SERIAL_RX   A2
+#define SERIAL_TX   A3
+#define SERIAL_CTS  A4
+#define SERIAL_RTS  A5
+
+#elif defined(TARGET_NUMAKER_PFM_M487)
+// Serial
+#define SERIAL_RX   D13
+#define SERIAL_TX   D10
+#define SERIAL_CTS  D12
+#define SERIAL_RTS  D11
+
+#endif
+
+/* This handler is to be called in UART interrupt context (which is extended by Nuvoton's UART HAL implementation 
+ * on mbed OS) to support wake-up by UART CTS state change. */
+extern "C" void nu_uart_cts_wakeup_handler(UART_T *uart_base);
+
+static void poll_serial(void);
+static void serial_tx_callback(Serial *serial_);
+
+/* Support wake-up by UART CTS state change */
+static Semaphore sem_serial(0, 1);
+
+void config_uart_wakeup(void)
+{
+    static Thread thread_serial;
+    
+    Callback<void()> callback(&poll_serial);
+    thread_serial.start(callback);
+}
+
+static void poll_serial(void)
+{
+    static Serial serial(SERIAL_TX, SERIAL_RX);
+
+    /* UART CTS wake-up: clock source is not limited.
+     * UART data wake-up: clock source is required to be LXT/LIRC. */
+    serial.set_flow_control(SerialBase::RTSCTS, SERIAL_RTS, SERIAL_CTS);
+
+    /* We need to register one interrupt handler to enable interrupt. */
+    Callback<void()> callback((void (*)(Serial *)) &serial_tx_callback, (Serial *) &serial);
+    serial.attach(callback, mbed::SerialBase::TxIrq);
+    
+    while (true) {
+        int32_t sem_tokens = sem_serial.wait(osWaitForever);
+        if (sem_tokens < 1) {
+            continue;
+        }
+    
+        wakeup_eventflags.set(EventFlag_Wakeup_UART_CTS);
+    }
+}
+
+static void serial_tx_callback(Serial *serial_)
+{
+    (void) serial_;
+}
+
+void nu_uart_cts_wakeup_handler(UART_T *uart_base)
+{
+    (void) uart_base;
+    
+    sem_serial.release();
+}