diff options
Diffstat (limited to 'os/hal')
-rw-r--r-- | os/hal/include/icu.h | 29 | ||||
-rw-r--r-- | os/hal/ports/STM32/LLD/TIMv1/icu_lld.c | 8 | ||||
-rw-r--r-- | os/hal/ports/STM32/LLD/TIMv1/icu_lld.h | 17 | ||||
-rw-r--r-- | 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 @@ -93,18 +93,6 @@ typedef void (*icucallback_t)(ICUDriver *icup); } 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.
*
* @param[in] icup pointer to the @p ICUDriver object
@@ -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();
}
|