From 97f803c392a91e48b9b6df1d3048cd8db0a6c7c1 Mon Sep 17 00:00:00 2001 From: Uladzimir Pylinski Date: Wed, 20 Jul 2016 18:41:06 +0000 Subject: [STM32. USARTv2] Added synchronous API support for timeout feature. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9714 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/include/hal_uart.h | 21 ++++++++++++++++++++- os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h | 4 +++- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'os') 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); \ } /** @} */ diff --git a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h index 84afee0e1..6fb71c255 100644 --- a/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h +++ b/os/hal/ports/STM32/LLD/USARTv2/hal_uart_lld.h @@ -587,11 +587,13 @@ typedef struct { /* End of the mandatory fields.*/ /** * @brief Receiver timeout callback. + * @details Handles both idle and timeout interrupts depending on configured + * flags in CR registers and supported hardware features. */ uartcb_t timeout_cb; /** * @brief Receiver timeout value in terms of number of bit duration. - * @details Set it to 0 when you want to handle IDLE interrupt instead of + * @details Set it to 0 when you want to handle idle interrupt instead of * hardware timeout. */ uint32_t timeout; -- cgit v1.2.3