blob: c8b584cd389e2cb71460db23bc228536b6d84686 [file] [log] [blame]
/*
* Copyright (c) 2016, 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 UDMACC32XX.h
*
* @brief uDMA driver implementation for CC32XX.
*
* This driver is intended for use only by TI-RTOS drivers that use the uDMA
* peripheral (e.g., SPI and I2S). This driver is mainly used for Power
* management of the UDMA peripheral.
*
* The application should only define the memory for the control table and
* set up the UDMACC32XX_HWAttrs and UDMACC32XX_Config structures.
*
* The UDMACC32XX header file should be included in an application as follows:
* @code
* #include <ti/drivers/dma/UDMACC32XX.h>
* @endcode
*
* ============================================================================
*/
#ifndef ti_drivers_dma_UDMACC32XX__include
#define ti_drivers_dma_UDMACC32XX__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include <ti/drivers/dpl/HwiP.h>
/*!
* @brief UDMA error function pointer
*/
typedef void (*UDMACC32XX_ErrorFxn)(uintptr_t arg);
/*!
* @brief UDMACC32XX Hardware attributes
*
* This structure contains the base address of the uDMA control
* table, and uDMA error interrupt attributes.
*
* The control table is used by the uDMA controller to store channel
* control structures. The control table can be located anywhere in
* system memory, but must be contiguous and aligned on a 1024-byte boundary.
*
* dmaErrorFxn is the uDMA peripheral's error interrupt handler.
*
* intPriority is priority of the uDMA peripheral's error interrupt, as
* defined by the underlying OS. It is passed unmodified to the
* underlying OS's interrupt handler creation code, so you need to
* refer to the OS documentation for usage. For example, for
* SYS/BIOS applications, refer to the ti.sysbios.family.arm.m3.Hwi
* documentation for SYS/BIOS usage of interrupt priorities. If the
* driver uses the ti.dpl interface instead of making OS
* calls directly, then the HwiP port handles the interrupt priority
* in an OS specific way. In the case of the SYS/BIOS port,
* intPriority is passed unmodified to Hwi_create().
*
* A sample structure is shown below:
* @code
*
* #include <ti/devices/cc32xx/driverlib/udma.h>
*
* #if defined(__TI_COMPILER_VERSION__)
* #pragma DATA_ALIGN(dmaControlTable, 1024)
* #elif defined(__IAR_SYSTEMS_ICC__)
* #pragma data_alignment=1024
* #elif defined(__GNUC__)
* __attribute__ ((aligned (1024)))
* #endif
*
* static tDMAControlTable dmaControlTable[64];
*
* #include <ti/drivers/dma/UDMACC32XX.h>
*
* UDMACC32XX_Object udmaCC32XXObject;
*
* const UDMACC32XX_HWAttrs udmaCC32XXHWAttrs = {
* .controlBaseAddr = (void *)dmaControlTable,
* .dmaErrorFxn = UDMACC32XX_errorFxn,
* .intNum = INT_UDMAERR,
* .intPriority = (~0)
* };
* @endcode
*
*/
typedef struct UDMACC32XX_HWAttrs {
void *controlBaseAddr; /*!< uDMA control registers base address */
UDMACC32XX_ErrorFxn dmaErrorFxn; /*!< uDMA error interrupt handler */
uint8_t intNum; /*!< uDMA error interrupt number */
uint8_t intPriority; /*!< uDMA error interrupt priority. */
} UDMACC32XX_HWAttrs;
/*!
* @brief UDMACC32XX Global configuration
*
* The UDMACC32XX_Config structure contains pointers used by the UDMACC32XX
* driver.
*
* This structure needs to be defined before calling UDMACC32XX_init() and
* it must not be changed thereafter.
*/
typedef struct UDMACC32XX_Config {
void *object; /*!< Pointer to UDMACC32XX object */
void const *hwAttrs; /*!< Pointer to hardware attributes */
} UDMACC32XX_Config;
/*!
* @brief A handle that is returned from a UDMACC32XX_open() call.
*/
typedef struct UDMACC32XX_Config *UDMACC32XX_Handle;
/*!
* @brief UDMACC32XX object
*
* The application must not access any member variables of this structure!
*/
typedef struct UDMACC32XX_Object {
bool isOpen; /* Flag for open/close status */
HwiP_Handle hwiHandle; /* DMA error Hwi */
} UDMACC32XX_Object;
/*!
* @brief Function to close the DMA driver.
*
* This function releases Power dependency on UDMA that was previously
* set with a call to UDMACC32XX_open(). If there is only one outstanding
* UDMACC32XX_open() call (i.e. all but one UDMACC32XX_open() calls have
* been matched by a corresponding call to UDMACC32XX_close()), this
* function will disable the UDMA.
*
* @pre UDMACC32XX_open() has to be called first.
* Calling context: Task
*
* @param handle A UDMACC32XX_Handle returned from UDMACC32XX_open()
*
* @return none
*
* @sa UDMACC32XX_open
*/
extern void UDMACC32XX_close(UDMACC32XX_Handle handle);
/*!
* @brief Function to initialize the CC32XX DMA driver
*
* The function will set the isOpen flag to false, and should be called prior
* to opening the DMA driver.
*
* @return none
*
* @sa UDMACC32XX_open()
*/
extern void UDMACC32XX_init();
/*!
* @brief Function to initialize the CC32XX DMA peripheral
*
* UDMACC32XX_open() can be called multiple times. Each time the
* function is called, it will set a dependency on the peripheral and
* enable the clock. The Power dependency count on the UDMA will be
* equal to the number of outstanding calls to UDMACC32XX_open().
* Calling UDMACC32XX_close() will decrement the Power dependency count,
* and the last call to UDMACC32XX_close() will disable the UDMA.
*
* @pre UDMACC32XX_init() has to be called first.
* Calling context: Task
*
* @return UDMACC32XX_Handle on success or NULL if an error has occurred.
*
* @sa UDMACC32XX_close()
*/
extern UDMACC32XX_Handle UDMACC32XX_open();
#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_dma_UDMACC32XX__include */