/* * 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 #include #include #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 ******************************************************************************/