Improvements to the ICU driver.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7409 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
b1586a7e3a
commit
a708e083e1
|
@ -92,18 +92,6 @@ typedef void (*icucallback_t)(ICUDriver *icup);
|
||||||
icup->state = ICU_WAITING; \
|
icup->state = ICU_WAITING; \
|
||||||
} while (0)
|
} 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.
|
* @brief Stops the input capture.
|
||||||
*
|
*
|
||||||
|
@ -125,7 +113,7 @@ typedef void (*icucallback_t)(ICUDriver *icup);
|
||||||
*
|
*
|
||||||
* @iclass
|
* @iclass
|
||||||
*/
|
*/
|
||||||
#define icuEnableNotificationsI(icup) icu_enable_notifications(icup)
|
#define icuEnableNotificationsI(icup) icu_lld_enable_notifications(icup)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Disables notifications.
|
* @brief Disables notifications.
|
||||||
|
@ -136,7 +124,20 @@ typedef void (*icucallback_t)(ICUDriver *icup);
|
||||||
*
|
*
|
||||||
* @iclass
|
* @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.
|
* @brief Returns the width of the latest pulse.
|
||||||
|
|
|
@ -644,8 +644,8 @@ void icu_lld_start_capture(ICUDriver *icup) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Waits for a completed capture.
|
* @brief Waits for a completed capture.
|
||||||
* @note The wait is performed in polled mode.
|
* @note The operation is performed in polled mode.
|
||||||
* @note The function cannot work if notifications are enabled.
|
* @note In order to use this function notifications must be disabled.
|
||||||
*
|
*
|
||||||
* @param[in] icup pointer to the @p ICUDriver object
|
* @param[in] icup pointer to the @p ICUDriver object
|
||||||
*
|
*
|
||||||
|
@ -687,7 +687,7 @@ void icu_lld_stop_capture(ICUDriver *icup) {
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
void icu_enable_notifications(ICUDriver *icup) {
|
void icu_lld_enable_notifications(ICUDriver *icup) {
|
||||||
uint32_t dier = icup->tim->DIER;
|
uint32_t dier = icup->tim->DIER;
|
||||||
|
|
||||||
/* If interrupts were already enabled then the operation is skipped.
|
/* If interrupts were already enabled then the operation is skipped.
|
||||||
|
@ -733,7 +733,7 @@ void icu_enable_notifications(ICUDriver *icup) {
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
void icu_disable_notifications(ICUDriver *icup) {
|
void icu_lld_disable_notifications(ICUDriver *icup) {
|
||||||
|
|
||||||
/* All interrupts disabled.*/
|
/* All interrupts disabled.*/
|
||||||
icup->tim->DIER &= ~STM32_TIM_DIER_IRQ_MASK;
|
icup->tim->DIER &= ~STM32_TIM_DIER_IRQ_MASK;
|
||||||
|
|
|
@ -361,6 +361,19 @@ struct ICUDriver {
|
||||||
*/
|
*/
|
||||||
#define icu_lld_get_period(icup) (*((icup)->pccrp) + 1)
|
#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. */
|
/* External declarations. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -402,8 +415,8 @@ extern "C" {
|
||||||
void icu_lld_start_capture(ICUDriver *icup);
|
void icu_lld_start_capture(ICUDriver *icup);
|
||||||
void icu_lld_wait_capture(ICUDriver *icup);
|
void icu_lld_wait_capture(ICUDriver *icup);
|
||||||
void icu_lld_stop_capture(ICUDriver *icup);
|
void icu_lld_stop_capture(ICUDriver *icup);
|
||||||
void icu_enable_notifications(ICUDriver *icup);
|
void icu_lld_enable_notifications(ICUDriver *icup);
|
||||||
void icu_disable_notifications(ICUDriver *icup);
|
void icu_lld_disable_notifications(ICUDriver *icup);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -134,6 +134,11 @@ void icuStartCapture(ICUDriver *icup) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Waits for a completed capture.
|
* @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
|
* @param[in] icup pointer to the @p ICUDriver object
|
||||||
*
|
*
|
||||||
|
@ -146,7 +151,10 @@ void icuWaitCapture(ICUDriver *icup) {
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
osalDbgAssert((icup->state == ICU_WAITING) || (icup->state == ICU_ACTIVE),
|
osalDbgAssert((icup->state == ICU_WAITING) || (icup->state == ICU_ACTIVE),
|
||||||
"invalid state");
|
"invalid state");
|
||||||
icuWaitCaptureI(icup);
|
osalDbgAssert(icuAreNotificationsEnabledX(icup) == false,
|
||||||
|
"notifications enabled");
|
||||||
|
icu_lld_wait_capture(icup);
|
||||||
|
icup->state = ICU_ACTIVE;
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue