aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/include/hal_uart.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/include/hal_uart.h')
-rw-r--r--os/hal/include/hal_uart.h21
1 files changed, 20 insertions, 1 deletions
diff --git a/os/hal/include/hal_uart.h b/os/hal/include/hal_uart.h
index 01a505c9a..677224541 100644
--- a/os/hal/include/hal_uart.h
+++ b/os/hal/include/hal_uart.h
@@ -185,6 +185,23 @@ typedef enum {
#define _uart_wakeup_rx_error_isr(uartp)
#endif /* !UART_USE_WAIT */
+#if (UART_USE_WAIT == TRUE) || defined(__DOXYGEN__)
+/**
+ * @brief Wakes up the waiting thread in case of RX timeout.
+ *
+ * @param[in] uartp pointer to the @p UARTDriver object
+ *
+ * @notapi
+ */
+#define _uart_wakeup_rx_timeout_isr(uartp) { \
+ osalSysLockFromISR(); \
+ osalThreadResumeI(&(uartp)->threadrx, MSG_TIMEOUT); \
+ osalSysUnlockFromISR(); \
+}
+#else /* !UART_USE_WAIT */
+#define _uart_wakeup_rx_timeout_isr(uartp)
+#endif /* !UART_USE_WAIT */
+
/**
* @brief Common ISR code for early TX.
* @details This code handles the portable part of the ISR code:
@@ -314,8 +331,10 @@ typedef enum {
* @notapi
*/
#define _uart_timeout_isr_code(uartp) { \
- if ((uartp)->config->timeout_cb != NULL) \
+ if ((uartp)->config->timeout_cb != NULL) { \
(uartp)->config->timeout_cb(uartp); \
+ } \
+ _uart_wakeup_rx_timeout_isr(uartp); \
}
/** @} */