From a708e083e1cf6f6181bcd02baf9cc580f38b5397 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 17 Oct 2014 07:31:40 +0000 Subject: Improvements to the ICU driver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7409 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/include/icu.h | 29 +++++++++++++++-------------- os/hal/ports/STM32/LLD/TIMv1/icu_lld.c | 8 ++++---- os/hal/ports/STM32/LLD/TIMv1/icu_lld.h | 17 +++++++++++++++-- os/hal/src/icu.c | 10 +++++++++- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/os/hal/include/icu.h b/os/hal/include/icu.h index f07d4a76e..9d7a06220 100644 --- a/os/hal/include/icu.h +++ b/os/hal/include/icu.h @@ -92,18 +92,6 @@ typedef void (*icucallback_t)(ICUDriver *icup); icup->state = ICU_WAITING; \ } while (0) -/** - * @brief Waits for a completed capture. - * - * @param[in] icup pointer to the @p ICUDriver object - * - * @iclass - */ -#define icuWaitCaptureI(icup) do { \ - icu_lld_wait_capture(icup); \ - icup->state = ICU_ACTIVE; \ -} while (0) - /** * @brief Stops the input capture. * @@ -125,7 +113,7 @@ typedef void (*icucallback_t)(ICUDriver *icup); * * @iclass */ -#define icuEnableNotificationsI(icup) icu_enable_notifications(icup) +#define icuEnableNotificationsI(icup) icu_lld_enable_notifications(icup) /** * @brief Disables notifications. @@ -136,7 +124,20 @@ typedef void (*icucallback_t)(ICUDriver *icup); * * @iclass */ -#define icuDisableNotificationsI(icup) icu_disable_notifications(icup) +#define icuDisableNotificationsI(icup) icu_lld_disable_notifications(icup) + +/** + * @brief Check on notifications status. + * + * @param[in] icup pointer to the @p ICUDriver object + * @return The notifications status. + * @retval false if notifications are not enabled. + * @retval true if notifications are enabled. + * + * @notapi + */ +#define icuAreNotificationsEnabledX(icup) \ + icu_lld_are_notifications_enabled(icup) /** * @brief Returns the width of the latest pulse. diff --git a/os/hal/ports/STM32/LLD/TIMv1/icu_lld.c b/os/hal/ports/STM32/LLD/TIMv1/icu_lld.c index a9b949a7f..d5604515e 100644 --- a/os/hal/ports/STM32/LLD/TIMv1/icu_lld.c +++ b/os/hal/ports/STM32/LLD/TIMv1/icu_lld.c @@ -644,8 +644,8 @@ void icu_lld_start_capture(ICUDriver *icup) { /** * @brief Waits for a completed capture. - * @note The wait is performed in polled mode. - * @note The function cannot work if notifications are enabled. + * @note The operation is performed in polled mode. + * @note In order to use this function notifications must be disabled. * * @param[in] icup pointer to the @p ICUDriver object * @@ -687,7 +687,7 @@ void icu_lld_stop_capture(ICUDriver *icup) { * * @api */ -void icu_enable_notifications(ICUDriver *icup) { +void icu_lld_enable_notifications(ICUDriver *icup) { uint32_t dier = icup->tim->DIER; /* If interrupts were already enabled then the operation is skipped. @@ -733,7 +733,7 @@ void icu_enable_notifications(ICUDriver *icup) { * * @api */ -void icu_disable_notifications(ICUDriver *icup) { +void icu_lld_disable_notifications(ICUDriver *icup) { /* All interrupts disabled.*/ icup->tim->DIER &= ~STM32_TIM_DIER_IRQ_MASK; diff --git a/os/hal/ports/STM32/LLD/TIMv1/icu_lld.h b/os/hal/ports/STM32/LLD/TIMv1/icu_lld.h index eb50e69d2..5b8b71d9f 100644 --- a/os/hal/ports/STM32/LLD/TIMv1/icu_lld.h +++ b/os/hal/ports/STM32/LLD/TIMv1/icu_lld.h @@ -361,6 +361,19 @@ struct ICUDriver { */ #define icu_lld_get_period(icup) (*((icup)->pccrp) + 1) +/** + * @brief Check on notifications status. + * + * @param[in] icup pointer to the @p ICUDriver object + * @return The notifications status. + * @retval false if notifications are not enabled. + * @retval true if notifications are enabled. + * + * @notapi + */ +#define icu_lld_are_notifications_enabled(icup) \ + (bool)(((icup)->tim->DIER & STM32_TIM_DIER_IRQ_MASK) != 0) + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ @@ -402,8 +415,8 @@ extern "C" { void icu_lld_start_capture(ICUDriver *icup); void icu_lld_wait_capture(ICUDriver *icup); void icu_lld_stop_capture(ICUDriver *icup); - void icu_enable_notifications(ICUDriver *icup); - void icu_disable_notifications(ICUDriver *icup); + void icu_lld_enable_notifications(ICUDriver *icup); + void icu_lld_disable_notifications(ICUDriver *icup); #ifdef __cplusplus } #endif diff --git a/os/hal/src/icu.c b/os/hal/src/icu.c index 92f8a2f1e..9f7a6b6c6 100644 --- a/os/hal/src/icu.c +++ b/os/hal/src/icu.c @@ -134,6 +134,11 @@ void icuStartCapture(ICUDriver *icup) { /** * @brief Waits for a completed capture. + * @note The operation could be performed in polled mode depending on. + * @note In order to use this function notifications must be disabled. + * @pre The driver must be in @p ICU_WAITING or @p ICU_ACTIVE modes. + * @post After the capture is available the driver is in @p ICU_ACTIVE + * mode. * * @param[in] icup pointer to the @p ICUDriver object * @@ -146,7 +151,10 @@ void icuWaitCapture(ICUDriver *icup) { osalSysLock(); osalDbgAssert((icup->state == ICU_WAITING) || (icup->state == ICU_ACTIVE), "invalid state"); - icuWaitCaptureI(icup); + osalDbgAssert(icuAreNotificationsEnabledX(icup) == false, + "notifications enabled"); + icu_lld_wait_capture(icup); + icup->state = ICU_ACTIVE; osalSysUnlock(); } -- cgit v1.2.3