blob: 44e17b94f3540be35118e48def16b086aae85a4c [file] [log] [blame]
/*
* Copyright (c) 2015-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 I2SCC32XXDMA.h
*
* @brief I2S driver implementation for a CC32XX I2S controller
*
* The I2S header file should be included in an application as follows:
* @code
* #include <ti/drivers/I2S.h>
* #include <ti/drivers/i2s/I2SCC32XXDMA.h>
* @endcode
*
* Refer to @ref I2S.h for a complete description of APIs & example of use.
*
* ============================================================================
*/
#ifndef ti_drivers_i2s_I2SCC32XXDMA__include
#define ti_drivers_i2s_I2SCC32XXDMA__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include <ti/drivers/I2S.h>
#include <ti/drivers/dpl/HwiP.h>
#include <ti/drivers/dpl/SemaphoreP.h>
#include <ti/drivers/utils/List.h>
#include <ti/drivers/dma/UDMACC32XX.h>
#define I2SCC32XXDMA_PIN_02_McAFSX 0x0d01
#define I2SCC32XXDMA_PIN_03_McACLK 0x0302
#define I2SCC32XXDMA_PIN_15_McAFSX 0x070e
#define I2SCC32XXDMA_PIN_17_McAFSX 0x0610
#define I2SCC32XXDMA_PIN_21_McAFSX 0x0214
#define I2SCC32XXDMA_PIN_45_McAXR0 0x062c
#define I2SCC32XXDMA_PIN_45_McAFSX 0x0c2c
#define I2SCC32XXDMA_PIN_50_McAXR0 0x0431
#define I2SCC32XXDMA_PIN_50_McAXR1 0x0631
#define I2SCC32XXDMA_PIN_52_McACLK 0x0233
#define I2SCC32XXDMA_PIN_52_McAXR0 0x0433
#define I2SCC32XXDMA_PIN_53_McACLK 0x0234
#define I2SCC32XXDMA_PIN_53_McAFSX 0x0334
#define I2SCC32XXDMA_PIN_60_McAXR1 0x063b
#define I2SCC32XXDMA_PIN_62_McACLKX 0x0d3d
#define I2SCC32XXDMA_PIN_63_McAFSX 0x073e
#define I2SCC32XXDMA_PIN_64_McAXR0 0x073f
/**
* @addtogroup I2S_STATUS
* I2SCC32XXDMA_STATUS_* macros are command codes only defined in the
* I2SCC32XXDMA.h driver implementation and need to:
* @code
* #include <ti/drivers/i2s/I2SCC32XXDMA.h>
* @endcode
* @{
*/
/* Add I2SCC32XXDMA_STATUS_* macros here */
/** @}*/
/**
* @addtogroup I2S_CMD
* I2SCC32XXDMA_CMD_* macros are command codes only defined in the
* I2SCC32XXDMA.h driver implementation and need to:
* @code
* #include <ti/drivers/i2s/I2SCC32XXDMA.h>
* @endcode
* @{
*/
#define I2SCC32XXDMA_CMD_SET_ZEROBUF_LEN (I2S_CMD_RESERVED + 0)
#define I2SCC32XXDMA_CMD_SET_EMPTYBUF_LEN (I2S_CMD_RESERVED + 1)
/** @}*/
/* BACKWARDS COMPATIBILITY */
#define I2SCC32XXDMA_SET_ZEROBUF_LEN I2SCC32XXDMA_CMD_SET_ZEROBUF_LEN
#define I2SCC32XXDMA_SET_EMPTYBUF_LEN I2SCC32XXDMA_CMD_SET_EMPTYBUF_LEN
/* END BACKWARDS COMPATIBILITY */
/* Value for Invalid Index */
#define I2SCC32XXDMA_INDEX_INVALID 0xFF
/*Number of Serial data pins supported*/
#define I2SCC32XXDMA_NUM_SERIAL_PINS 2
/*!
* @brief
* I2SCC32XXDMA data size is used to determine how to configure the
* DMA data transfers. This field is to be only used internally.
*
* I2SCC32XXDMA_16bit: txBuf and rxBuf are arrays of uint16_t elements
* I2SCC32XXDMA_32bit: txBuf and rxBuf are arrays of uint32_t elements
*/
typedef enum I2SCC32XXDMA_DataSize {
I2SCC32XXDMA_16bit = 0,
I2SCC32XXDMA_32bit = 1
} I2SCC32XXDMA_DataSize;
/* I2S function table pointer */
extern const I2S_FxnTable I2SCC32XXDMA_fxnTable;
/*!
* @brief I2SCC32XXDMA Hardware attributes
*
* These fields, with the exception of intPriority,
* are used by driverlib APIs and therefore must be populated by
* driverlib macro definitions. For CC32XXWare these definitions are found in:
* - inc/hw_memmap.h
* - inc/hw_ints.h
*
* intPriority is the I2S peripheral's interrupt priority, 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
* const I2SCC32XXDMA_HWAttrsV1 i2sCC32XXHWAttrs[] = {
* {
* .baseAddr = I2S_BASE,
* .intNum = INT_I2S,
* .intPriority = (~0),
* .rxChannelIndex = UDMA_CH4_I2S_RX,
* .txChannelIndex = UDMA_CH5_I2S_TX,
* .xr0Pin = I2SCC32XXDMA_PIN_64_McAXR0,
* .xr1Pin = I2SCC32XXDMA_PIN_50_McAXR1,
* .clkxPin = I2SCC32XXDMA_PIN_62_McACLKX,
* .clkPin = I2SCC32XXDMA_PIN_53_McACLK,
* .fsxPin = I2SCC32XXDMA_PIN_63_McAFSX,
* }
* };
* @endcode
*/
typedef struct I2SCC32XXDMA_HWAttrsV1 {
/*! I2S Peripheral's base address */
uint32_t baseAddr;
/*! I2S Peripheral's interrupt vector */
uint32_t intNum;
/*! I2S Peripheral's interrupt priority */
uint32_t intPriority;
/*! uDMA controlTable receive channel index */
unsigned long rxChannelIndex;
/*! uDMA controlTable transmit channel index */
unsigned long txChannelIndex;
/*! I2S audio port data 0 pin */
uint16_t xr0Pin;
/*! I2S audio port data 1 pin */
uint16_t xr1Pin;
/*! I2S audio port clock O pin */
uint16_t clkxPin;
/*! I2S audio port data pin */
uint16_t clkPin;
/*! I2S audio port frame sync */
uint16_t fsxPin;
} I2SCC32XXDMA_HWAttrsV1;
/*!
* @brief CC32XX Serial Pin Configuration
*/
typedef struct I2SCC32XXDMA_SerialPinConfig {
/*!< Pin number */
unsigned char pinNumber;
/*!< Mode the pin will operate(Rx/Tx) */
I2S_PinMode pinMode;
/*!< Pin configuration in inactive state */
I2S_SerInActiveConfig inActiveConfig;
} I2SCC32XXDMA_SerialPinConfig;
/*!
* @brief CC32XX specific I2S Parameters
*/
typedef struct I2SCC32XXDMA_SerialPinParams {
/*!< CC32XX Serial Pin Configuration */
I2SCC32XXDMA_SerialPinConfig serialPinConfig[I2SCC32XXDMA_NUM_SERIAL_PINS];
} I2SCC32XXDMA_SerialPinParams;
/*!
* @brief I2SCC32XXDMA Serial pin variables
*
* The application must not access any member variables of this structure!
*/
typedef struct I2SCC32XXDMA_SerialPinVars {
I2S_DataMode readWriteMode;
/* Pointer to read/write callback */
I2S_Callback readWriteCallback;
/* Timeout for read/write semaphore */
uint32_t readWriteTimeout;
}I2SCC32XXDMA_SerialPinVars;
/*!
* @brief I2SCC32XXDMA Object
*
* The application must not access any member variables of this structure!
*/
typedef struct I2SCC32XXDMA_Object {
/* I2S control variables */
bool opened; /* Has the obj been opened */
uint32_t operationMode; /* Mode of operation of I2S */
/* I2S serial pin variables */
I2SCC32XXDMA_SerialPinVars serialPinVars[I2SCC32XXDMA_NUM_SERIAL_PINS];
uint16_t readIndex; /* read channel Index */
uint16_t writeIndex; /* write channel Index */
I2SCC32XXDMA_DataSize dmaSize; /* Config DMA word size */
/* I2S OSAL objects */
SemaphoreP_Handle writeSem; /* I2S write semaphore*/
SemaphoreP_Handle readSem; /* I2S read semaphore */
HwiP_Handle hwiHandle;
/*!< Length of zero buffer to write in case of no data */
unsigned long zeroWriteBufLength;
/*!< Length of empty buffer to read in case of no data
requested */
unsigned long emptyReadBufLength;
/* Current Write buffer descriptor pointer */
I2S_BufDesc *currentWriteBufDesc;
/* Previous Write Buffer descriptor pointer */
I2S_BufDesc *prevWriteBufDesc;
/* Current Read buffer descriptor pointer */
I2S_BufDesc *currentReadBufDesc;
/* Previous Read Buffer descriptor pointer */
I2S_BufDesc *prevReadBufDesc;
/* UDMA */
UDMACC32XX_Handle dmaHandle;
/* Lists for issue-reclaim mode */
List_List readActiveQueue;
List_List readDoneQueue;
List_List writeActiveQueue;
List_List writeDoneQueue;
} I2SCC32XXDMA_Object, *I2SCC32XXDMA_Handle;
/*!
* @brief Function to initialize the I2S_Params struct to its defaults
*
* params->serialPinConfig[0].pinNumber = 0;
* params->serialPinConfig[0].pinMode = I2S_PINMODE_RX;
* params->serialPinConfig[0].inActiveConfig = I2S_SERCONFIG_INACT_LOW_LEVEL;
*
* params->serialPinConfig[1].pinNumber = 1;
* params->serialPinConfig[1].pinMode = I2S_PINMODE_TX;
* params->serialPinConfig[1].inActiveConfig = I2S_SERCONFIG_INACT_LOW_LEVEL;
*
* @param params Parameter structure to initialize
*/
extern void I2SCC32XXDMA_Params_init(I2SCC32XXDMA_SerialPinParams *params);
#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_i2s_I2SCC32XXDMA__include */