/* * Copyright (c) 2017-2019, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * 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. * * * Neither the name of Texas Instruments Incorporated 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 OWNER 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. */ /*!***************************************************************************** * @file CaptureCC32XX.h * @brief Capture driver interface for CC32XX devices * * # Operation # * This driver uses a general purpose timer hardware peripheral to implement * the capture functionality. The capture driver only uses half of a timer * peripheral (16-bit timer). This is not a software limitation but due to the * general purpose timer hardware implementation. For CC32XX devices, the * system clock is 80 MHz. A 16-bit timer peripheral has 24-bits of * resolution when the prescaler register is used as an 8-bit linear extension. * * # Resource Allocation # * Each general purpose timer block contains two timers, Timer A and Timer B, * that can be configured to operate independently. This behavior is managed * through a set of resource allocation APIs. For example, the * TimerCC32XX_allocateTimerResource API will allocate a timer for exclusive * use. Any attempt to re-allocate this resource by the TimerCC32XX, PWMCC32XX, * or CaptureCC32xx drivers will result in a false value being returned from * the allocation API. To free a timer resource, the * TimerCC32XX_freeTimerResource is used. The application is not responsible * for calling these allocation APIs directly. * * # Capture Modes # * This device implementation only works with the following modes for * #Capture_Mode : * - #Capture_RISING_EDGE * - #Capture_FALLING_EDGE * - #Capture_ANY_EDGE * All other modes will fail. ******************************************************************************* */ #ifndef ti_drivers_capture_CaptureCC32XX__include #define ti_drivers_capture_CaptureCC32XX__include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /*! \cond */ /* * Capture port/pin defines for pin configuration. * * The timer id (0, 1, 2, or 3) is stored in bits 31 - 30 * The timer half (1 = A, 2 = B) is stored in bits 29 - 28 * The interrupt number is stored in bits 27 - 20 * The GPIO port (0, 1, 2, or 3) is stored in bits 19 - 16 * The GPIO pad offset is stored in bits 15 - 4 * The pin mode is stored in bits 3 - 0 * * 31 - 30 29 - 28 27 - 20 19 - 16 15 - 4 3 - 0 * -------------------------------------------------------------------------- * | TimerId | Timer half | IntNum | GPIO Port | GPIO Pad Offset | Pin Mode | * -------------------------------------------------------------------------- * * The CC32XX has fixed GPIO assignments and pin modes for a given pin. * A Capture pin mode for a given pin has a fixed timer/timer-half. */ #define CaptureCC32XX_T0A (0x10000000 | (INT_TIMERA0A << 20)) #define CaptureCC32XX_T0B (0x20000000 | (INT_TIMERA0B << 20)) #define CaptureCC32XX_T1A (0x50000000 | (INT_TIMERA1A << 20)) #define CaptureCC32XX_T1B (0x60000000 | (INT_TIMERA1B << 20)) #define CaptureCC32XX_T2A (0x90000000 | (INT_TIMERA2A << 20)) #define CaptureCC32XX_T2B (0xA0000000 | (INT_TIMERA2B << 20)) #define CaptureCC32XX_T3A (0xD0000000 | (INT_TIMERA3A << 20)) #define CaptureCC32XX_T3B (0xE0000000 | (INT_TIMERA3B << 20)) #define CaptureCC32XX_GPIO0 (0x00000000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_0 << 4)) #define CaptureCC32XX_GPIO1 (0x00000000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_1 << 4)) #define CaptureCC32XX_GPIO2 (0x00000000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_2 << 4)) #define CaptureCC32XX_GPIO5 (0x00000000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_5 << 4)) #define CaptureCC32XX_GPIO6 (0x00000000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_6 << 4)) #define CaptureCC32XX_GPIO8 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_8 << 4)) #define CaptureCC32XX_GPIO9 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_9 << 4)) #define CaptureCC32XX_GPIO10 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_10 << 4)) #define CaptureCC32XX_GPIO11 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_11 << 4)) #define CaptureCC32XX_GPIO12 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_12 << 4)) #define CaptureCC32XX_GPIO13 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_13 << 4)) #define CaptureCC32XX_GPIO14 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_14 << 4)) #define CaptureCC32XX_GPIO15 (0x00010000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_15 << 4)) #define CaptureCC32XX_GPIO16 (0x00020000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_16 << 4)) #define CaptureCC32XX_GPIO22 (0x00020000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_22 << 4)) #define CaptureCC32XX_GPIO24 (0x00030000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_24 << 4)) #define CaptureCC32XX_GPIO30 (0x00030000 | (OCP_SHARED_O_GPIO_PAD_CONFIG_30 << 4)) /*! \endcond */ /*! * \defgroup capturePinIdentifiersCC32XX CaptureCC32XX_HWAttrs 'capturePin' * field options. * @{ */ /*! * @name PIN 01, GPIO10, uses Timer0B for Capture. * @{ */ #define CaptureCC32XX_PIN_01 CaptureCC32XX_T0B | CaptureCC32XX_GPIO10 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 02, GPIO11, uses Timer1A for Capture. * @{ */ #define CaptureCC32XX_PIN_02 CaptureCC32XX_T1A | CaptureCC32XX_GPIO11 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 03, GPIO12, uses Timer1B for Capture. * @{ */ #define CaptureCC32XX_PIN_03 CaptureCC32XX_T1B | CaptureCC32XX_GPIO12 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 04, GPIO13, uses Timer2A for Capture. * @{ */ #define CaptureCC32XX_PIN_04 CaptureCC32XX_T2A | CaptureCC32XX_GPIO13 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 05, GPIO14, uses Timer2B for Capture. * @{ */ #define CaptureCC32XX_PIN_05 CaptureCC32XX_T2B | CaptureCC32XX_GPIO14 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 06, GPIO15, uses Timer3A for Capture. * @{ */ #define CaptureCC32XX_PIN_06 CaptureCC32XX_T3A | CaptureCC32XX_GPIO15 | 0xD /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 07, GPIO16, uses Timer3B for Capture. * @{ */ #define CaptureCC32XX_PIN_07 CaptureCC32XX_T3B | CaptureCC32XX_GPIO16 | 0xD /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 15, GPIO22, uses Timer2A for Capture. * @{ */ #define CaptureCC32XX_PIN_15 CaptureCC32XX_T2A | CaptureCC32XX_GPIO22 | 0x5 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 17, GPIO24 (TDO), uses Timer3A for Capture. * @{ */ #define CaptureCC32XX_PIN_17 CaptureCC32XX_T3A | CaptureCC32XX_GPIO24 | 0x4 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 50, GPIO0, uses Timer0A for Capture. * @{ */ #define CaptureCC32XX_PIN_50 CaptureCC32XX_T0A | CaptureCC32XX_GPIO0 | 0x7 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 53, GPIO30, uses Timer2B for Capture. * @{ */ #define CaptureCC32XX_PIN_53 CaptureCC32XX_T2B | CaptureCC32XX_GPIO30 | 0x4 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 55, GPIO1, uses Timer0B for Capture. * @{ */ #define CaptureCC32XX_PIN_55 CaptureCC32XX_T0B | CaptureCC32XX_GPIO1 | 0x7 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 57, GPIO2, uses Timer1A for Capture. * @{ */ #define CaptureCC32XX_PIN_57 CaptureCC32XX_T1A | CaptureCC32XX_GPIO2 | 0x7 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 60, GPIO5, uses Timer2B for Capture. * @{ */ #define CaptureCC32XX_PIN_60 CaptureCC32XX_T2B | CaptureCC32XX_GPIO5 | 0x7 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 61, GPIO6, uses Timer3A for Capture. * @{ */ #define CaptureCC32XX_PIN_61 CaptureCC32XX_T3A | CaptureCC32XX_GPIO6 | 0x7 /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 63, GPIO8, uses Timer3A for Capture. * @{ */ #define CaptureCC32XX_PIN_63 CaptureCC32XX_T3A | CaptureCC32XX_GPIO8 | 0xC /*!< @hideinitializer */ /*! @} */ /*! * @name PIN 64, GPIO9, uses Timer0A for Capture. * @{ */ #define CaptureCC32XX_PIN_64 CaptureCC32XX_T0A | CaptureCC32XX_GPIO9 | 0xC /*!< @hideinitializer */ /*! @} */ /*! @} */ extern const Capture_FxnTable CaptureCC32XX_fxnTable; /*! * @brief CaptureCC32XX Hardware Attributes * * Timer hardware attributes that tell the CaptureCC32XX driver specific hardware * configurations and interrupt/priority settings. * * A sample structure is shown below: * @code * const CaptureCC32XX_HWAttrs captureCC32XXHWAttrs[] = * { * { * .capturePin = CaptureCC32XX_PIN_04, * .intPriority = ~0 * }, * { * .capturePin = CaptureCC32XX_PIN_05, * .intPriority = ~0 * }, * }; * @endcode */ typedef struct { /*! Specifies the input pin for the capture event. There are 17 pins available as inputs for capture functionality. Each available pin must map to a specific general purpose timer hardware instance. By specifying this attribute, a fixed 16-bit timer peripheral is used. */ uint32_t capturePin; /*! The interrupt priority. */ uint32_t intPriority; } CaptureCC32XX_HWAttrs; /*! * @brief CaptureCC32XX_Object * * The application must not access any member variables of this structure! */ typedef struct { HwiP_Handle hwiHandle; Power_NotifyObj notifyObj; Capture_CallBackFxn callBack; Capture_PeriodUnits periodUnits; uint32_t mode; uint32_t timer; uint32_t previousCount; bool isRunning; } CaptureCC32XX_Object; #ifdef __cplusplus } #endif #endif /* ti_drivers_capture_CaptureCC32XX__include */