diff options
Diffstat (limited to 'platform/drivers/inc/gpt.h')
-rw-r--r-- | platform/drivers/inc/gpt.h | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/platform/drivers/inc/gpt.h b/platform/drivers/inc/gpt.h new file mode 100644 index 0000000..14c3b9e --- /dev/null +++ b/platform/drivers/inc/gpt.h @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GPT_H__ +#define __GPT_H__ + +#include <stdint.h> +#include <stdbool.h> +#include <assert.h> +#include "device_imx.h" + +/*! + * @addtogroup gpt_driver + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! + * @brief Clock source + */ +enum _gpt_clock_source { + gptClockSourceNone = 0U, /*!< No source selected.*/ + gptClockSourcePeriph = 1U, /*!< Use peripheral module clock.*/ + gptClockSourceLowFreq = 4U, /*!< Use 32K clock.*/ + gptClockSourceOsc = 5U /*!< Use 24M OSC clock.*/ +}; + +/*! + * @brief Input capture channel number + */ +enum _gpt_input_capture_channel { + gptInputCaptureChannel1 = 0U, + gptInputCaptureChannel2 = 1U +}; + +/*! + * @brief Input capture operation mode + */ +enum _gpt_input_operation_mode { + gptInputOperationDisabled = 0U, /*!< Don't capture.*/ + gptInputOperationRiseEdge = 1U, /*!< Capture on rising edge of input pin.*/ + gptInputOperationFallEdge = 2U, /*!< Capture on falling edge of input pin.*/ + gptInputOperationBothEdge = 3U /*!< Capture on both edges of input pin.*/ +}; + +/*! + * @brief Output compare channel number + */ +enum _gpt_output_compare_channel { + gptOutputCompareChannel1 = 0U, + gptOutputCompareChannel2 = 1U, + gptOutputCompareChannel3 = 2U +}; + +/*! + * @brief Output compare operation mode + */ +enum _gpt_output_operation_mode { + gptOutputOperationDisconnected = 0U, /*!< Don't change output pin.*/ + gptOutputOperationToggle = 1U, /*!< Toggle output pin.*/ + gptOutputOperationClear = 2U, /*!< Set output pin low.*/ + gptOutputOperationSet = 3U, /*!< Set output pin high.*/ + gptOutputOperationActivelow = 4U /*!< Generate a active low pulse on output pin.*/ +}; + +/*! + * @brief Status flag + */ +enum _gpt_status_flag { + gptStatusFlagOutputCompare1 = 1U << 0, /*!< Output compare channel 1 evevnt.*/ + gptStatusFlagOutputCompare2 = 1U << 1, /*!< Output compare channel 2 evevnt.*/ + gptStatusFlagOutputCompare3 = 1U << 2, /*!< Output compare channel 3 evevnt.*/ + gptStatusFlagInputCapture1 = 1U << 3, /*!< Capture channel 1 evevnt.*/ + gptStatusFlagInputCapture2 = 1U << 4, /*!< Capture channel 2 evevnt.*/ + gptStatusFlagRollOver = 1U << 5 /*!< Counter reaches maximum value and rolled over to 0 evevnt.*/ +}; + +/*! + * @brief Structure to configure the running mode. + */ +typedef struct GptModeConfig +{ + bool freeRun; /*!< true: FreeRun mode, false: Restart mode */ + bool waitEnable; /*!< GPT enabled in wait mode */ + bool stopEnable; /*!< GPT enabled in stop mode */ + bool dozeEnable; /*!< GPT enabled in doze mode */ + bool dbgEnable; /*!< GPT enabled in debug mode */ + bool enableMode; /*!< true: counter reset to 0 when enabled, false: counter retain its value when enabled */ +} gpt_mode_config_t; + +/******************************************************************************* + * API + ******************************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*! + * @name GPT State Control + * @{ + */ + +/*! + * @brief Initialize GPT to reset state and initialize running mode + * + * @param base GPT base pointer. + * @param config GPT mode setting configuration. + */ +void GPT_Init(GPT_Type * base, gpt_mode_config_t *config); + +/*! + * @brief Software reset of GPT module + * + * @param base GPT base pointer. + */ +static inline void GPT_SoftReset(GPT_Type * base) +{ + base->CR |= GPT_CR_SWR_MASK; + /* Wait reset finished */ + while (base->CR & GPT_CR_SWR_MASK) { } +} + +/*! + * @brief Set clock source of GPT + * + * @param base GPT base pointer. + * @param source clock source (see _gpt_clock_source) + */ +void GPT_SetClockSource(GPT_Type * base, uint32_t source); + +/*! + * @brief Get clock source of GPT + * + * @param base GPT base pointer. + * @return clock source (see _gpt_clock_source) + */ +static inline uint32_t GPT_GetClockSource(GPT_Type * base) +{ + return (base->CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT; +} + +/*! + * @brief Set pre scaler of GPT + * + * @param base GPT base pointer. + * @param prescaler pre scaler of GPT (0-4095, divider=prescaler+1) + */ +static inline void GPT_SetPrescaler(GPT_Type * base, uint32_t prescaler) +{ + assert(prescaler <= GPT_PR_PRESCALER_MASK); + base->PR = (base->PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(prescaler); +} + +/*! + * @brief Get pre scaler of GPT + * + * @param base GPT base pointer. + * @return pre scaler of GPT (0-4095) + */ +static inline uint32_t GPT_GetPrescaler(GPT_Type * base) +{ + return (base->PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT; +} + +/*! + * @brief OSC 24M pre scaler before selected by clock source + * + * @param base GPT base pointer. + * @param prescaler OSC pre scaler(0-15, divider=prescaler+1) + */ +static inline void GPT_SetOscPrescaler(GPT_Type * base, uint32_t prescaler) +{ + assert(prescaler <= (GPT_PR_PRESCALER24M_MASK >> GPT_PR_PRESCALER24M_SHIFT)); + base->PR = (base->PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(prescaler); +} + +/*! + * @brief Get pre scaler of GPT + * + * @param base GPT base pointer. + * @return OSC pre scaler of GPT (0-15) + */ +static inline uint32_t GPT_GetOscPrescaler(GPT_Type * base) +{ + return (base->PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT; +} + +/*! + * @brief Enable GPT module + * + * @param base GPT base pointer. + */ +static inline void GPT_Enable(GPT_Type * base) +{ + base->CR |= GPT_CR_EN_MASK; +} + +/*! + * @brief Disable GPT module + * + * @param base GPT base pointer. + */ +static inline void GPT_Disable(GPT_Type * base) +{ + base->CR &= ~GPT_CR_EN_MASK; +} + +/*! + * @brief Get GPT counter value + * + * @param base GPT base pointer. + * @return GPT counter value + */ +static inline uint32_t GPT_ReadCounter(GPT_Type * base) +{ + return base->CNT; +} + +/*@}*/ + +/*! + * @name GPT Input/Output Signal Control + * @{ + */ + +/*! + * @brief Set GPT operation mode of input capture channel + * + * @param base GPT base pointer. + * @param channel GPT capture channel (see _gpt_input_capture_channel). + * @param mode GPT input capture operation mode (see _gpt_input_operation_mode). + */ +static inline void GPT_SetInputOperationMode(GPT_Type * base, uint32_t channel, uint32_t mode) +{ + assert (channel <= gptInputCaptureChannel2); + base->CR = (base->CR & ~(GPT_CR_IM1_MASK << (channel * 2))) | (GPT_CR_IM1(mode) << (channel * 2)); +} + +/*! + * @brief Get GPT operation mode of input capture channel + * + * @param base GPT base pointer. + * @param channel GPT capture channel (see _gpt_input_capture_channel). + * @return GPT input capture operation mode (see _gpt_input_operation_mode). + */ +static inline uint32_t GPT_GetInputOperationMode(GPT_Type * base, uint32_t channel) +{ + assert (channel <= gptInputCaptureChannel2); + return (base->CR >> (GPT_CR_IM1_SHIFT + channel * 2)) & (GPT_CR_IM1_MASK >> GPT_CR_IM1_SHIFT); +} + +/*! + * @brief Get GPT input capture value of certain channel + * + * @param base GPT base pointer. + * @param channel GPT capture channel (see _gpt_input_capture_channel). + * @return GPT input capture value + */ +static inline uint32_t GPT_GetInputCaptureValue(GPT_Type * base, uint32_t channel) +{ + assert (channel <= gptInputCaptureChannel2); + return *(&base->ICR1 + channel); +} + +/*! + * @brief Set GPT operation mode of output compare channel + * + * @param base GPT base pointer. + * @param channel GPT output compare channel (see _gpt_output_compare_channel). + * @param mode GPT output operation mode (see _gpt_output_operation_mode). + */ +static inline void GPT_SetOutputOperationMode(GPT_Type * base, uint32_t channel, uint32_t mode) +{ + assert (channel <= gptOutputCompareChannel3); + base->CR = (base->CR & ~(GPT_CR_OM1_MASK << (channel * 3))) | (GPT_CR_OM1(mode) << (channel * 3)); +} + +/*! + * @brief Get GPT operation mode of output compare channel + * + * @param base GPT base pointer. + * @param channel GPT output compare channel (see _gpt_output_compare_channel). + * @return GPT output operation mode (see _gpt_output_operation_mode). + */ +static inline uint32_t GPT_GetOutputOperationMode(GPT_Type * base, uint32_t channel) +{ + assert (channel <= gptOutputCompareChannel3); + return (base->CR >> (GPT_CR_OM1_SHIFT + channel * 3)) & (GPT_CR_OM1_MASK >> GPT_CR_OM1_SHIFT); +} + +/*! + * @brief Set GPT output compare value of output compare channel + * + * @param base GPT base pointer. + * @param channel GPT output compare channel (see _gpt_output_compare_channel). + * @param value GPT output compare value + */ +static inline void GPT_SetOutputCompareValue(GPT_Type * base, uint32_t channel, uint32_t value) +{ + assert (channel <= gptOutputCompareChannel3); + *(&base->OCR1 + channel) = value; +} + +/*! + * @brief Get GPT output compare value of output compare channel + * + * @param base GPT base pointer. + * @param channel GPT output compare channel (see _gpt_output_compare_channel). + * @return GPT output compare value + */ +static inline uint32_t GPT_GetOutputCompareValue(GPT_Type * base, uint32_t channel) +{ + assert (channel <= gptOutputCompareChannel3); + return *(&base->OCR1 + channel); +} + +/*! + * @brief Force GPT output action on output compare channel, ignoring comparator. + * + * @param base GPT base pointer. + * @param channel GPT output compare channel (see _gpt_output_compare_channel). + */ +static inline void GPT_ForceOutput(GPT_Type * base, uint32_t channel) +{ + assert (channel <= gptOutputCompareChannel3); + base->CR |= (GPT_CR_FO1_MASK << channel); +} + +/*@}*/ + +/*! + * @name GPT Interupt and Status Control + * @{ + */ + +/*! + * @brief Get GPT status flag. + * + * @param base GPT base pointer. + * @param flags GPT status flag mask (see _gpt_status_flag for bit definition). + * @return GPT status, each bit represents one status flag + */ +static inline uint32_t GPT_GetStatusFlag(GPT_Type * base, uint32_t flags) +{ + return base->SR & flags; +} + +/*! + * @brief Clear one or more GPT status flag. + * + * @param base GPT base pointer. + * @param flags GPT status flag mask (see _gpt_status_flag for bit definition). + */ +static inline void GPT_ClearStatusFlag(GPT_Type * base, uint32_t flags) +{ + base->SR = flags; +} + +/*! + * @brief Enable or disable GPT interrupts. + * + * @param base GPT base pointer. + * @param flags GPT status flag mask (see _gpt_status_flag for bit definition). + * @param enable Interrupt enable (true: enable, false: disable). + */ +void GPT_SetIntCmd(GPT_Type * base, uint32_t flags, bool enable); + +/*@}*/ + +#if defined(__cplusplus) +} +#endif + +/*! @}*/ + +#endif /* __GPT_H__ */ +/******************************************************************************* + * EOF + ******************************************************************************/ |