123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /*
- * Copyright (c) 2011-2012, 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.
- */
- //! @addtogroup diag_gpt
- //! @{
- /*!
- * @file gpt.h
- * @brief GPT driver public interface.
- */
- #ifndef __GPT_H__
- #define __GPT_H__
- #include "imx_timer.h"
- #include "sdk.h"
- ////////////////////////////////////////////////////////////////////////////////
- // Definitions
- ////////////////////////////////////////////////////////////////////////////////
- //! @brief Possible events for the GPT.
- //!
- //! These constants are intended to be combined together to form a bitmask. Several
- //! of the GPT driver APIs use such a bitmask. For instance, gpt_counter_enable()
- //! accepts a bitmask that selects the events for which interrupts should be enabled.
- //!
- //! Note that the values of these enums happen to be the bitmasks for the respective
- //! fields in the HW_GPT_SR and HW_GPT_IR registers, so a mask constructed from them
- //! can be used directly with register values.
- enum _gpt_events
- {
- kGPTNoEvent = 0, //!< No events enabled.
- kGPTRollover = 1 << 5, //!< Rollover event.
- kGPTInputCapture1 = 1 << 3, //!< Input capture 1 event.
- kGPTInputCapture2 = 1 << 4, //!< Input capture 2 event.
- kGPTOutputCompare1 = 1 << 0, //!< Output compare 1 event.
- kGPTOutputCompare2 = 1 << 1, //!< Output compare 2 event.
- kGPTOutputCompare3 = 1 << 2, //!< Output compare 3 event.
-
- //! Combined mask of all GPT events.
- kGPTAllEvents = kGPTRollover | kGPTInputCapture1 | kGPTInputCapture2
- | kGPTOutputCompare1 | kGPTOutputCompare2 | kGPTOutputCompare3
- };
- //! @brief GPT counter modes.
- enum _gpt_counter_mode
- {
- RESTART_MODE = 0,
- FREE_RUN_MODE = 1
- };
- //! @brief Supported input capture modes.
- enum _gpt_capture_modes
- {
- INPUT_CAP_DISABLE = 0, //!< input capture event disabled
- INPUT_CAP_RISING_EDGE = 1, //!< input capture event on a rising edge
- INPUT_CAP_FALLING_EDGE = 2, //!< input capture event on a falling edge
- INPUT_CAP_BOTH_EDGE = 3 //!< input capture event on a both edge
- };
- //! @brief Supported output modes.
- enum _gpt_compare_modes
- {
- OUTPUT_CMP_DISABLE = 0, //!< output disconnected from pad
- OUTPUT_CMP_TOGGLE = 1, //!< output toggle mode
- OUTPUT_CMP_CLEAR = 2, //!< output set low mode
- OUTPUT_CMP_SET = 3, //!< output set high mode
- OUTPUT_CMP_LOWPULSE = 4 //!< output set high mode
- };
- ////////////////////////////////////////////////////////////////////////////////
- // API
- ////////////////////////////////////////////////////////////////////////////////
- #if defined(__cplusplus)
- extern "C" {
- #endif
- /*!
- * @brief Initialize the GPT timer.
- *
- * @param clock_src Source clock of the counter: CLKSRC_OFF, CLKSRC_IPG_CLK,
- * CLKSRC_PER_CLK, CLKSRC_CKIL, CLKSRC_CLKIN.
- * @param prescaler Prescaler of the source clock from 1 to 4096.
- * @param counter_mode Counter mode: FREE_RUN_MODE or RESTART_MODE.
- * @param low_power_mode Low power during which the timer is enabled:
- * WAIT_MODE_EN and/or STOP_MODE_EN.
- */
- void gpt_init(uint32_t clock_src, uint32_t prescaler, uint32_t counter_mode, uint32_t low_power_mode);
- /*!
- * @brief Setup GPT interrupt.
- *
- * It enables or disables the related HW module interrupt, and attached the
- * related sub-routine into the vector table.
- *
- * @param irq_subroutine the GPT interrupt interrupt routine.
- * @param enableIt Pass true to enable the interrupt.
- */
- void gpt_setup_interrupt(void (*irq_subroutine)(void), bool enableIt);
- /*!
- * @brief Enable the GPT module.
- *
- * Used typically when the gpt_init is done, and other interrupt related settings are ready.
- *
- * If a value of #kGPTNoEvent is passed for @a irq_mode, then no interrupts will be enabled.
- * This effectively puts the timer into polling mode, where you must call gpt_get_x_event()
- * to check for an event having occurred.
- *
- * @param irq_mode Mask of events to enable interrupts for, such as #kGPTRollover or
- * #kGPTOutputCompare1. See the #_gpt_events enum for the complete list. Pass
- * #kGPTNoEvent to prevent any interrupts from being enabled, which effectively puts
- * the timer into polling mode.
- */
- void gpt_counter_enable(uint32_t irq_mode);
- /*!
- * @brief Disable the counter.
- *
- * It saves power when not used.
- *
- */
- void gpt_counter_disable(void);
- /*!
- * @brief Get rollover event flag and clear it if set.
- *
- * This function can typically be used for polling method, but
- * is also used to clear the status compare flag in IRQ mode.
- *
- * @return Either 0 of kGPTRollover.
- */
- uint32_t gpt_get_rollover_event(void);
- /*!
- * @brief Get a captured value when an event occured, and clear the flag if set.
- *
- * Use this function to check for an input capture event having occurred, either in
- * the event ISR or to check manually in polling mode. Pass the input channel to check
- * in the @a flag parameter. If that channel fired, its captured timer value will be
- * read and placed in @a capture_val (if not NULL). The event that fired will be cleared
- * and its event mask returned as the return value from the function. If no event
- * occurred, the function returns 0.
- *
- * @param flag Which channel to check, either #kGPTInputCapture1 or #kGPTInputCapture2.
- * Only one channel may be specified.
- * @param capture_val The capture register value is returned through this parameter if
- * the specified event occurred. May be NULL if not required.
- * @return Mask of input specified capture event that occurred, or 0 if no event occurred.
- */
- uint32_t gpt_get_capture_event(uint8_t flag, uint32_t * capture_val);
- /*!
- * @brief Set the input capture mode.
- *
- * @param cap_input The input capture channel to configure, either #kGPTInputCapture1
- * or #kGPTInputCapture2.
- * @param cap_input_mode Capture input mode: #INPUT_CAP_DISABLE, #INPUT_CAP_BOTH_EDGE,
- * #INPUT_CAP_FALLING_EDGE, #INPUT_CAP_RISING_EDGE.
- */
- void gpt_set_capture_event(uint8_t cap_input, uint8_t cap_input_mode);
- /*!
- * @brief Get a compare event flag and clear it if set.
- *
- * This function can typically be used for polling method, but
- * is also used to clear the status compare flag in IRQ mode.
- *
- * @param flag Checked compare event flag such GPTSR_OF1, GPTSR_OF2, GPTSR_OF3.
- * @return The value of the compare event flag.
- */
- uint32_t gpt_get_compare_event(uint8_t flag);
- /*!
- * @brief Set a compare event by programming the compare register and
- * compare output mode.
- *
- * @param cmp_output The channel to configure. Must be one of #kGPTOutputCompare1,
- * #kGPTOutputCompare2, or #kGPTOutputCompare3.
- * @param cmp_output_mode Compare output mode: #OUTPUT_CMP_DISABLE, #OUTPUT_CMP_TOGGLE,
- * #OUTPUT_CMP_CLEAR, #OUTPUT_CMP_SET, #OUTPUT_CMP_LOWPULSE.
- * @param cmp_value Compare value for the compare register.
- */
- void gpt_set_compare_event(uint8_t cmp_output, uint8_t cmp_output_mode, uint32_t cmp_value);
- #if defined(__cplusplus)
- }
- #endif
- //! @}
- #endif //__GPT_H__
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|