Kevin Kadooka / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Wed Jan 04 16:58:05 2017 +0000
Revision:
154:37f96f9d4de2
This updates the lib to the mbed lib v133

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 154:37f96f9d4de2 1 /*
<> 154:37f96f9d4de2 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
<> 154:37f96f9d4de2 3 * All rights reserved.
<> 154:37f96f9d4de2 4 *
<> 154:37f96f9d4de2 5 * Redistribution and use in source and binary forms, with or without modification,
<> 154:37f96f9d4de2 6 * are permitted provided that the following conditions are met:
<> 154:37f96f9d4de2 7 *
<> 154:37f96f9d4de2 8 * o Redistributions of source code must retain the above copyright notice, this list
<> 154:37f96f9d4de2 9 * of conditions and the following disclaimer.
<> 154:37f96f9d4de2 10 *
<> 154:37f96f9d4de2 11 * o Redistributions in binary form must reproduce the above copyright notice, this
<> 154:37f96f9d4de2 12 * list of conditions and the following disclaimer in the documentation and/or
<> 154:37f96f9d4de2 13 * other materials provided with the distribution.
<> 154:37f96f9d4de2 14 *
<> 154:37f96f9d4de2 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
<> 154:37f96f9d4de2 16 * contributors may be used to endorse or promote products derived from this
<> 154:37f96f9d4de2 17 * software without specific prior written permission.
<> 154:37f96f9d4de2 18 *
<> 154:37f96f9d4de2 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
<> 154:37f96f9d4de2 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
<> 154:37f96f9d4de2 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 154:37f96f9d4de2 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
<> 154:37f96f9d4de2 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
<> 154:37f96f9d4de2 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
<> 154:37f96f9d4de2 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
<> 154:37f96f9d4de2 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
<> 154:37f96f9d4de2 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
<> 154:37f96f9d4de2 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 154:37f96f9d4de2 29 */
<> 154:37f96f9d4de2 30
<> 154:37f96f9d4de2 31 #ifndef _FSL_SAI_H_
<> 154:37f96f9d4de2 32 #define _FSL_SAI_H_
<> 154:37f96f9d4de2 33
<> 154:37f96f9d4de2 34 #include "fsl_common.h"
<> 154:37f96f9d4de2 35
<> 154:37f96f9d4de2 36 /*!
<> 154:37f96f9d4de2 37 * @addtogroup sai
<> 154:37f96f9d4de2 38 * @{
<> 154:37f96f9d4de2 39 */
<> 154:37f96f9d4de2 40
<> 154:37f96f9d4de2 41
<> 154:37f96f9d4de2 42 /*******************************************************************************
<> 154:37f96f9d4de2 43 * Definitions
<> 154:37f96f9d4de2 44 ******************************************************************************/
<> 154:37f96f9d4de2 45
<> 154:37f96f9d4de2 46 /*! @name Driver version */
<> 154:37f96f9d4de2 47 /*@{*/
<> 154:37f96f9d4de2 48 #define FSL_SAI_DRIVER_VERSION (MAKE_VERSION(2, 1, 1)) /*!< Version 2.1.1 */
<> 154:37f96f9d4de2 49 /*@}*/
<> 154:37f96f9d4de2 50
<> 154:37f96f9d4de2 51 /*! @brief SAI return status*/
<> 154:37f96f9d4de2 52 enum _sai_status_t
<> 154:37f96f9d4de2 53 {
<> 154:37f96f9d4de2 54 kStatus_SAI_TxBusy = MAKE_STATUS(kStatusGroup_SAI, 0), /*!< SAI Tx is busy. */
<> 154:37f96f9d4de2 55 kStatus_SAI_RxBusy = MAKE_STATUS(kStatusGroup_SAI, 1), /*!< SAI Rx is busy. */
<> 154:37f96f9d4de2 56 kStatus_SAI_TxError = MAKE_STATUS(kStatusGroup_SAI, 2), /*!< SAI Tx FIFO error. */
<> 154:37f96f9d4de2 57 kStatus_SAI_RxError = MAKE_STATUS(kStatusGroup_SAI, 3), /*!< SAI Rx FIFO error. */
<> 154:37f96f9d4de2 58 kStatus_SAI_QueueFull = MAKE_STATUS(kStatusGroup_SAI, 4), /*!< SAI transfer queue is full. */
<> 154:37f96f9d4de2 59 kStatus_SAI_TxIdle = MAKE_STATUS(kStatusGroup_SAI, 5), /*!< SAI Tx is idle */
<> 154:37f96f9d4de2 60 kStatus_SAI_RxIdle = MAKE_STATUS(kStatusGroup_SAI, 6) /*!< SAI Rx is idle */
<> 154:37f96f9d4de2 61 };
<> 154:37f96f9d4de2 62
<> 154:37f96f9d4de2 63 /*! @brief Define the SAI bus type */
<> 154:37f96f9d4de2 64 typedef enum _sai_protocol
<> 154:37f96f9d4de2 65 {
<> 154:37f96f9d4de2 66 kSAI_BusLeftJustified = 0x0U, /*!< Uses left justified format.*/
<> 154:37f96f9d4de2 67 kSAI_BusRightJustified, /*!< Uses right justified format. */
<> 154:37f96f9d4de2 68 kSAI_BusI2S, /*!< Uses I2S format. */
<> 154:37f96f9d4de2 69 kSAI_BusPCMA, /*!< Uses I2S PCM A format.*/
<> 154:37f96f9d4de2 70 kSAI_BusPCMB /*!< Uses I2S PCM B format. */
<> 154:37f96f9d4de2 71 } sai_protocol_t;
<> 154:37f96f9d4de2 72
<> 154:37f96f9d4de2 73 /*! @brief Master or slave mode */
<> 154:37f96f9d4de2 74 typedef enum _sai_master_slave
<> 154:37f96f9d4de2 75 {
<> 154:37f96f9d4de2 76 kSAI_Master = 0x0U, /*!< Master mode */
<> 154:37f96f9d4de2 77 kSAI_Slave = 0x1U /*!< Slave mode */
<> 154:37f96f9d4de2 78 } sai_master_slave_t;
<> 154:37f96f9d4de2 79
<> 154:37f96f9d4de2 80 /*! @brief Mono or stereo audio format */
<> 154:37f96f9d4de2 81 typedef enum _sai_mono_stereo
<> 154:37f96f9d4de2 82 {
<> 154:37f96f9d4de2 83 kSAI_Stereo = 0x0U, /*!< Stereo sound. */
<> 154:37f96f9d4de2 84 kSAI_MonoLeft, /*!< Only left channel have sound. */
<> 154:37f96f9d4de2 85 kSAI_MonoRight /*!< Only Right channel have sound. */
<> 154:37f96f9d4de2 86 } sai_mono_stereo_t;
<> 154:37f96f9d4de2 87
<> 154:37f96f9d4de2 88 /*! @brief Synchronous or asynchronous mode */
<> 154:37f96f9d4de2 89 typedef enum _sai_sync_mode
<> 154:37f96f9d4de2 90 {
<> 154:37f96f9d4de2 91 kSAI_ModeAsync = 0x0U, /*!< Asynchronous mode */
<> 154:37f96f9d4de2 92 kSAI_ModeSync, /*!< Synchronous mode (with receiver or transmit) */
<> 154:37f96f9d4de2 93 kSAI_ModeSyncWithOtherTx, /*!< Synchronous with another SAI transmit */
<> 154:37f96f9d4de2 94 kSAI_ModeSyncWithOtherRx /*!< Synchronous with another SAI receiver */
<> 154:37f96f9d4de2 95 } sai_sync_mode_t;
<> 154:37f96f9d4de2 96
<> 154:37f96f9d4de2 97 /*! @brief Mater clock source */
<> 154:37f96f9d4de2 98 typedef enum _sai_mclk_source
<> 154:37f96f9d4de2 99 {
<> 154:37f96f9d4de2 100 kSAI_MclkSourceSysclk = 0x0U, /*!< Master clock from the system clock */
<> 154:37f96f9d4de2 101 kSAI_MclkSourceSelect1, /*!< Master clock from source 1 */
<> 154:37f96f9d4de2 102 kSAI_MclkSourceSelect2, /*!< Master clock from source 2 */
<> 154:37f96f9d4de2 103 kSAI_MclkSourceSelect3 /*!< Master clock from source 3 */
<> 154:37f96f9d4de2 104 } sai_mclk_source_t;
<> 154:37f96f9d4de2 105
<> 154:37f96f9d4de2 106 /*! @brief Bit clock source */
<> 154:37f96f9d4de2 107 typedef enum _sai_bclk_source
<> 154:37f96f9d4de2 108 {
<> 154:37f96f9d4de2 109 kSAI_BclkSourceBusclk = 0x0U, /*!< Bit clock using bus clock */
<> 154:37f96f9d4de2 110 kSAI_BclkSourceMclkDiv, /*!< Bit clock using master clock divider */
<> 154:37f96f9d4de2 111 kSAI_BclkSourceOtherSai0, /*!< Bit clock from other SAI device */
<> 154:37f96f9d4de2 112 kSAI_BclkSourceOtherSai1 /*!< Bit clock from other SAI device */
<> 154:37f96f9d4de2 113 } sai_bclk_source_t;
<> 154:37f96f9d4de2 114
<> 154:37f96f9d4de2 115 /*! @brief The SAI interrupt enable flag */
<> 154:37f96f9d4de2 116 enum _sai_interrupt_enable_t
<> 154:37f96f9d4de2 117 {
<> 154:37f96f9d4de2 118 kSAI_WordStartInterruptEnable =
<> 154:37f96f9d4de2 119 I2S_TCSR_WSIE_MASK, /*!< Word start flag, means the first word in a frame detected */
<> 154:37f96f9d4de2 120 kSAI_SyncErrorInterruptEnable = I2S_TCSR_SEIE_MASK, /*!< Sync error flag, means the sync error is detected */
<> 154:37f96f9d4de2 121 kSAI_FIFOWarningInterruptEnable = I2S_TCSR_FWIE_MASK, /*!< FIFO warning flag, means the FIFO is empty */
<> 154:37f96f9d4de2 122 kSAI_FIFOErrorInterruptEnable = I2S_TCSR_FEIE_MASK, /*!< FIFO error flag */
<> 154:37f96f9d4de2 123 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 124 kSAI_FIFORequestInterruptEnable = I2S_TCSR_FRIE_MASK, /*!< FIFO request, means reached watermark */
<> 154:37f96f9d4de2 125 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 126 };
<> 154:37f96f9d4de2 127
<> 154:37f96f9d4de2 128 /*! @brief The DMA request sources */
<> 154:37f96f9d4de2 129 enum _sai_dma_enable_t
<> 154:37f96f9d4de2 130 {
<> 154:37f96f9d4de2 131 kSAI_FIFOWarningDMAEnable = I2S_TCSR_FWDE_MASK, /*!< FIFO warning caused by the DMA request */
<> 154:37f96f9d4de2 132 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 133 kSAI_FIFORequestDMAEnable = I2S_TCSR_FRDE_MASK, /*!< FIFO request caused by the DMA request */
<> 154:37f96f9d4de2 134 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 135 };
<> 154:37f96f9d4de2 136
<> 154:37f96f9d4de2 137 /*! @brief The SAI status flag */
<> 154:37f96f9d4de2 138 enum _sai_flags
<> 154:37f96f9d4de2 139 {
<> 154:37f96f9d4de2 140 kSAI_WordStartFlag = I2S_TCSR_WSF_MASK, /*!< Word start flag, means the first word in a frame detected */
<> 154:37f96f9d4de2 141 kSAI_SyncErrorFlag = I2S_TCSR_SEF_MASK, /*!< Sync error flag, means the sync error is detected */
<> 154:37f96f9d4de2 142 kSAI_FIFOErrorFlag = I2S_TCSR_FEF_MASK, /*!< FIFO error flag */
<> 154:37f96f9d4de2 143 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 144 kSAI_FIFORequestFlag = I2S_TCSR_FRF_MASK, /*!< FIFO request flag. */
<> 154:37f96f9d4de2 145 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 146 kSAI_FIFOWarningFlag = I2S_TCSR_FWF_MASK, /*!< FIFO warning flag */
<> 154:37f96f9d4de2 147 };
<> 154:37f96f9d4de2 148
<> 154:37f96f9d4de2 149 /*! @brief The reset type */
<> 154:37f96f9d4de2 150 typedef enum _sai_reset_type
<> 154:37f96f9d4de2 151 {
<> 154:37f96f9d4de2 152 kSAI_ResetTypeSoftware = I2S_TCSR_SR_MASK, /*!< Software reset, reset the logic state */
<> 154:37f96f9d4de2 153 kSAI_ResetTypeFIFO = I2S_TCSR_FR_MASK, /*!< FIFO reset, reset the FIFO read and write pointer */
<> 154:37f96f9d4de2 154 kSAI_ResetAll = I2S_TCSR_SR_MASK | I2S_TCSR_FR_MASK /*!< All reset. */
<> 154:37f96f9d4de2 155 } sai_reset_type_t;
<> 154:37f96f9d4de2 156
<> 154:37f96f9d4de2 157 #if defined(FSL_FEATURE_SAI_HAS_FIFO_PACKING) && FSL_FEATURE_SAI_HAS_FIFO_PACKING
<> 154:37f96f9d4de2 158 /*!
<> 154:37f96f9d4de2 159 * @brief The SAI packing mode
<> 154:37f96f9d4de2 160 * The mode includes 8 bit and 16 bit packing.
<> 154:37f96f9d4de2 161 */
<> 154:37f96f9d4de2 162 typedef enum _sai_fifo_packing
<> 154:37f96f9d4de2 163 {
<> 154:37f96f9d4de2 164 kSAI_FifoPackingDisabled = 0x0U, /*!< Packing disabled */
<> 154:37f96f9d4de2 165 kSAI_FifoPacking8bit = 0x2U, /*!< 8 bit packing enabled */
<> 154:37f96f9d4de2 166 kSAI_FifoPacking16bit = 0x3U /*!< 16bit packing enabled */
<> 154:37f96f9d4de2 167 } sai_fifo_packing_t;
<> 154:37f96f9d4de2 168 #endif /* FSL_FEATURE_SAI_HAS_FIFO_PACKING */
<> 154:37f96f9d4de2 169
<> 154:37f96f9d4de2 170 /*! @brief SAI user configuration structure */
<> 154:37f96f9d4de2 171 typedef struct _sai_config
<> 154:37f96f9d4de2 172 {
<> 154:37f96f9d4de2 173 sai_protocol_t protocol; /*!< Audio bus protocol in SAI */
<> 154:37f96f9d4de2 174 sai_sync_mode_t syncMode; /*!< SAI sync mode, control Tx/Rx clock sync */
<> 154:37f96f9d4de2 175 #if defined(FSL_FEATURE_SAI_HAS_MCR) && (FSL_FEATURE_SAI_HAS_MCR)
<> 154:37f96f9d4de2 176 bool mclkOutputEnable; /*!< Master clock output enable, true means master clock divider enabled */
<> 154:37f96f9d4de2 177 #endif /* FSL_FEATURE_SAI_HAS_MCR */
<> 154:37f96f9d4de2 178 sai_mclk_source_t mclkSource; /*!< Master Clock source */
<> 154:37f96f9d4de2 179 sai_bclk_source_t bclkSource; /*!< Bit Clock source */
<> 154:37f96f9d4de2 180 sai_master_slave_t masterSlave; /*!< Master or slave */
<> 154:37f96f9d4de2 181 } sai_config_t;
<> 154:37f96f9d4de2 182
<> 154:37f96f9d4de2 183 /*!@brief SAI transfer queue size, user can refine it according to use case. */
<> 154:37f96f9d4de2 184 #define SAI_XFER_QUEUE_SIZE (4)
<> 154:37f96f9d4de2 185
<> 154:37f96f9d4de2 186 /*! @brief Audio sample rate */
<> 154:37f96f9d4de2 187 typedef enum _sai_sample_rate
<> 154:37f96f9d4de2 188 {
<> 154:37f96f9d4de2 189 kSAI_SampleRate8KHz = 8000U, /*!< Sample rate 8000Hz */
<> 154:37f96f9d4de2 190 kSAI_SampleRate11025Hz = 11025U, /*!< Sample rate 11025Hz */
<> 154:37f96f9d4de2 191 kSAI_SampleRate12KHz = 12000U, /*!< Sample rate 12000Hz */
<> 154:37f96f9d4de2 192 kSAI_SampleRate16KHz = 16000U, /*!< Sample rate 16000Hz */
<> 154:37f96f9d4de2 193 kSAI_SampleRate22050Hz = 22050U, /*!< Sample rate 22050Hz */
<> 154:37f96f9d4de2 194 kSAI_SampleRate24KHz = 24000U, /*!< Sample rate 24000Hz */
<> 154:37f96f9d4de2 195 kSAI_SampleRate32KHz = 32000U, /*!< Sample rate 32000Hz */
<> 154:37f96f9d4de2 196 kSAI_SampleRate44100Hz = 44100U, /*!< Sample rate 44100Hz */
<> 154:37f96f9d4de2 197 kSAI_SampleRate48KHz = 48000U, /*!< Sample rate 48000Hz */
<> 154:37f96f9d4de2 198 kSAI_SampleRate96KHz = 96000U /*!< Sample rate 96000Hz */
<> 154:37f96f9d4de2 199 } sai_sample_rate_t;
<> 154:37f96f9d4de2 200
<> 154:37f96f9d4de2 201 /*! @brief Audio word width */
<> 154:37f96f9d4de2 202 typedef enum _sai_word_width
<> 154:37f96f9d4de2 203 {
<> 154:37f96f9d4de2 204 kSAI_WordWidth8bits = 8U, /*!< Audio data width 8 bits */
<> 154:37f96f9d4de2 205 kSAI_WordWidth16bits = 16U, /*!< Audio data width 16 bits */
<> 154:37f96f9d4de2 206 kSAI_WordWidth24bits = 24U, /*!< Audio data width 24 bits */
<> 154:37f96f9d4de2 207 kSAI_WordWidth32bits = 32U /*!< Audio data width 32 bits */
<> 154:37f96f9d4de2 208 } sai_word_width_t;
<> 154:37f96f9d4de2 209
<> 154:37f96f9d4de2 210 /*! @brief sai transfer format */
<> 154:37f96f9d4de2 211 typedef struct _sai_transfer_format
<> 154:37f96f9d4de2 212 {
<> 154:37f96f9d4de2 213 uint32_t sampleRate_Hz; /*!< Sample rate of audio data */
<> 154:37f96f9d4de2 214 uint32_t bitWidth; /*!< Data length of audio data, usually 8/16/24/32bits */
<> 154:37f96f9d4de2 215 sai_mono_stereo_t stereo; /*!< Mono or stereo */
<> 154:37f96f9d4de2 216 uint32_t masterClockHz; /*!< Master clock frequency in Hz */
<> 154:37f96f9d4de2 217 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 218 uint8_t watermark; /*!< Watermark value */
<> 154:37f96f9d4de2 219 #endif /* FSL_FEATURE_SAI_FIFO_COUNT */
<> 154:37f96f9d4de2 220 uint8_t channel; /*!< Data channel used in transfer.*/
<> 154:37f96f9d4de2 221 sai_protocol_t protocol; /*!< Which audio protocol used */
<> 154:37f96f9d4de2 222 } sai_transfer_format_t;
<> 154:37f96f9d4de2 223
<> 154:37f96f9d4de2 224 /*! @brief SAI transfer structure */
<> 154:37f96f9d4de2 225 typedef struct _sai_transfer
<> 154:37f96f9d4de2 226 {
<> 154:37f96f9d4de2 227 uint8_t *data; /*!< Data start address to transfer. */
<> 154:37f96f9d4de2 228 size_t dataSize; /*!< Transfer size. */
<> 154:37f96f9d4de2 229 } sai_transfer_t;
<> 154:37f96f9d4de2 230
<> 154:37f96f9d4de2 231 typedef struct _sai_handle sai_handle_t;
<> 154:37f96f9d4de2 232
<> 154:37f96f9d4de2 233 /*! @brief SAI transfer callback prototype */
<> 154:37f96f9d4de2 234 typedef void (*sai_transfer_callback_t)(I2S_Type *base, sai_handle_t *handle, status_t status, void *userData);
<> 154:37f96f9d4de2 235
<> 154:37f96f9d4de2 236 /*! @brief SAI handle structure */
<> 154:37f96f9d4de2 237 struct _sai_handle
<> 154:37f96f9d4de2 238 {
<> 154:37f96f9d4de2 239 uint32_t state; /*!< Transfer status */
<> 154:37f96f9d4de2 240 sai_transfer_callback_t callback; /*!< Callback function called at transfer event*/
<> 154:37f96f9d4de2 241 void *userData; /*!< Callback parameter passed to callback function*/
<> 154:37f96f9d4de2 242 uint8_t bitWidth; /*!< Bit width for transfer, 8/16/24/32bits */
<> 154:37f96f9d4de2 243 uint8_t channel; /*!< Transfer channel */
<> 154:37f96f9d4de2 244 sai_transfer_t saiQueue[SAI_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */
<> 154:37f96f9d4de2 245 size_t transferSize[SAI_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */
<> 154:37f96f9d4de2 246 volatile uint8_t queueUser; /*!< Index for user to queue transfer */
<> 154:37f96f9d4de2 247 volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */
<> 154:37f96f9d4de2 248 #if defined(FSL_FEATURE_SAI_FIFO_COUNT) && (FSL_FEATURE_SAI_FIFO_COUNT > 1)
<> 154:37f96f9d4de2 249 uint8_t watermark; /*!< Watermark value */
<> 154:37f96f9d4de2 250 #endif
<> 154:37f96f9d4de2 251 };
<> 154:37f96f9d4de2 252
<> 154:37f96f9d4de2 253 /*******************************************************************************
<> 154:37f96f9d4de2 254 * API
<> 154:37f96f9d4de2 255 ******************************************************************************/
<> 154:37f96f9d4de2 256
<> 154:37f96f9d4de2 257 #if defined(__cplusplus)
<> 154:37f96f9d4de2 258 extern "C" {
<> 154:37f96f9d4de2 259 #endif /*_cplusplus*/
<> 154:37f96f9d4de2 260
<> 154:37f96f9d4de2 261 /*!
<> 154:37f96f9d4de2 262 * @name Initialization and deinitialization
<> 154:37f96f9d4de2 263 * @{
<> 154:37f96f9d4de2 264 */
<> 154:37f96f9d4de2 265
<> 154:37f96f9d4de2 266 /*!
<> 154:37f96f9d4de2 267 * @brief Initializes the SAI Tx peripheral.
<> 154:37f96f9d4de2 268 *
<> 154:37f96f9d4de2 269 * Ungates the SAI clock, resets the module, and configures SAI Tx with a configuration structure.
<> 154:37f96f9d4de2 270 * The configuration structure can be custom filled or set with default values by
<> 154:37f96f9d4de2 271 * SAI_TxGetDefaultConfig().
<> 154:37f96f9d4de2 272 *
<> 154:37f96f9d4de2 273 * @note This API should be called at the beginning of the application to use
<> 154:37f96f9d4de2 274 * the SAI driver. Otherwise, accessing the SAIM module can cause a hard fault
<> 154:37f96f9d4de2 275 * because the clock is not enabled.
<> 154:37f96f9d4de2 276 *
<> 154:37f96f9d4de2 277 * @param base SAI base pointer
<> 154:37f96f9d4de2 278 * @param config SAI configuration structure.
<> 154:37f96f9d4de2 279 */
<> 154:37f96f9d4de2 280 void SAI_TxInit(I2S_Type *base, const sai_config_t *config);
<> 154:37f96f9d4de2 281
<> 154:37f96f9d4de2 282 /*!
<> 154:37f96f9d4de2 283 * @brief Initializes the the SAI Rx peripheral.
<> 154:37f96f9d4de2 284 *
<> 154:37f96f9d4de2 285 * Ungates the SAI clock, resets the module, and configures the SAI Rx with a configuration structure.
<> 154:37f96f9d4de2 286 * The configuration structure can be custom filled or set with default values by
<> 154:37f96f9d4de2 287 * SAI_RxGetDefaultConfig().
<> 154:37f96f9d4de2 288 *
<> 154:37f96f9d4de2 289 * @note This API should be called at the beginning of the application to use
<> 154:37f96f9d4de2 290 * the SAI driver. Otherwise, accessing the SAI module can cause a hard fault
<> 154:37f96f9d4de2 291 * because the clock is not enabled.
<> 154:37f96f9d4de2 292 *
<> 154:37f96f9d4de2 293 * @param base SAI base pointer
<> 154:37f96f9d4de2 294 * @param config SAI configuration structure.
<> 154:37f96f9d4de2 295 */
<> 154:37f96f9d4de2 296 void SAI_RxInit(I2S_Type *base, const sai_config_t *config);
<> 154:37f96f9d4de2 297
<> 154:37f96f9d4de2 298 /*!
<> 154:37f96f9d4de2 299 * @brief Sets the SAI Tx configuration structure to default values.
<> 154:37f96f9d4de2 300 *
<> 154:37f96f9d4de2 301 * This API initializes the configuration structure for use in SAI_TxConfig().
<> 154:37f96f9d4de2 302 * The initialized structure can remain unchanged in SAI_TxConfig(), or it can be modified
<> 154:37f96f9d4de2 303 * before calling SAI_TxConfig().
<> 154:37f96f9d4de2 304 * Example:
<> 154:37f96f9d4de2 305 @code
<> 154:37f96f9d4de2 306 sai_config_t config;
<> 154:37f96f9d4de2 307 SAI_TxGetDefaultConfig(&config);
<> 154:37f96f9d4de2 308 @endcode
<> 154:37f96f9d4de2 309 *
<> 154:37f96f9d4de2 310 * @param config pointer to master configuration structure
<> 154:37f96f9d4de2 311 */
<> 154:37f96f9d4de2 312 void SAI_TxGetDefaultConfig(sai_config_t *config);
<> 154:37f96f9d4de2 313
<> 154:37f96f9d4de2 314 /*!
<> 154:37f96f9d4de2 315 * @brief Sets the SAI Rx configuration structure to default values.
<> 154:37f96f9d4de2 316 *
<> 154:37f96f9d4de2 317 * This API initializes the configuration structure for use in SAI_RxConfig().
<> 154:37f96f9d4de2 318 * The initialized structure can remain unchanged in SAI_RxConfig() or it can be modified
<> 154:37f96f9d4de2 319 * before calling SAI_RxConfig().
<> 154:37f96f9d4de2 320 * Example:
<> 154:37f96f9d4de2 321 @code
<> 154:37f96f9d4de2 322 sai_config_t config;
<> 154:37f96f9d4de2 323 SAI_RxGetDefaultConfig(&config);
<> 154:37f96f9d4de2 324 @endcode
<> 154:37f96f9d4de2 325 *
<> 154:37f96f9d4de2 326 * @param config pointer to master configuration structure
<> 154:37f96f9d4de2 327 */
<> 154:37f96f9d4de2 328 void SAI_RxGetDefaultConfig(sai_config_t *config);
<> 154:37f96f9d4de2 329
<> 154:37f96f9d4de2 330 /*!
<> 154:37f96f9d4de2 331 * @brief De-initializes the SAI peripheral.
<> 154:37f96f9d4de2 332 *
<> 154:37f96f9d4de2 333 * This API gates the SAI clock. The SAI module can't operate unless SAI_TxInit
<> 154:37f96f9d4de2 334 * or SAI_RxInit is called to enable the clock.
<> 154:37f96f9d4de2 335 *
<> 154:37f96f9d4de2 336 * @param base SAI base pointer
<> 154:37f96f9d4de2 337 */
<> 154:37f96f9d4de2 338 void SAI_Deinit(I2S_Type *base);
<> 154:37f96f9d4de2 339
<> 154:37f96f9d4de2 340 /*!
<> 154:37f96f9d4de2 341 * @brief Resets the SAI Tx.
<> 154:37f96f9d4de2 342 *
<> 154:37f96f9d4de2 343 * This function enables the software reset and FIFO reset of SAI Tx. After reset, clear the reset bit.
<> 154:37f96f9d4de2 344 *
<> 154:37f96f9d4de2 345 * @param base SAI base pointer
<> 154:37f96f9d4de2 346 */
<> 154:37f96f9d4de2 347 void SAI_TxReset(I2S_Type *base);
<> 154:37f96f9d4de2 348
<> 154:37f96f9d4de2 349 /*!
<> 154:37f96f9d4de2 350 * @brief Resets the SAI Rx.
<> 154:37f96f9d4de2 351 *
<> 154:37f96f9d4de2 352 * This function enables the software reset and FIFO reset of SAI Rx. After reset, clear the reset bit.
<> 154:37f96f9d4de2 353 *
<> 154:37f96f9d4de2 354 * @param base SAI base pointer
<> 154:37f96f9d4de2 355 */
<> 154:37f96f9d4de2 356 void SAI_RxReset(I2S_Type *base);
<> 154:37f96f9d4de2 357
<> 154:37f96f9d4de2 358 /*!
<> 154:37f96f9d4de2 359 * @brief Enables/disables SAI Tx.
<> 154:37f96f9d4de2 360 *
<> 154:37f96f9d4de2 361 * @param base SAI base pointer
<> 154:37f96f9d4de2 362 * @param enable True means enable SAI Tx, false means disable.
<> 154:37f96f9d4de2 363 */
<> 154:37f96f9d4de2 364 void SAI_TxEnable(I2S_Type *base, bool enable);
<> 154:37f96f9d4de2 365
<> 154:37f96f9d4de2 366 /*!
<> 154:37f96f9d4de2 367 * @brief Enables/disables SAI Rx.
<> 154:37f96f9d4de2 368 *
<> 154:37f96f9d4de2 369 * @param base SAI base pointer
<> 154:37f96f9d4de2 370 * @param enable True means enable SAI Rx, false means disable.
<> 154:37f96f9d4de2 371 */
<> 154:37f96f9d4de2 372 void SAI_RxEnable(I2S_Type *base, bool enable);
<> 154:37f96f9d4de2 373
<> 154:37f96f9d4de2 374 /*! @} */
<> 154:37f96f9d4de2 375
<> 154:37f96f9d4de2 376 /*!
<> 154:37f96f9d4de2 377 * @name Status
<> 154:37f96f9d4de2 378 * @{
<> 154:37f96f9d4de2 379 */
<> 154:37f96f9d4de2 380
<> 154:37f96f9d4de2 381 /*!
<> 154:37f96f9d4de2 382 * @brief Gets the SAI Tx status flag state.
<> 154:37f96f9d4de2 383 *
<> 154:37f96f9d4de2 384 * @param base SAI base pointer
<> 154:37f96f9d4de2 385 * @return SAI Tx status flag value. Use the Status Mask to get the status value needed.
<> 154:37f96f9d4de2 386 */
<> 154:37f96f9d4de2 387 static inline uint32_t SAI_TxGetStatusFlag(I2S_Type *base)
<> 154:37f96f9d4de2 388 {
<> 154:37f96f9d4de2 389 return base->TCSR;
<> 154:37f96f9d4de2 390 }
<> 154:37f96f9d4de2 391
<> 154:37f96f9d4de2 392 /*!
<> 154:37f96f9d4de2 393 * @brief Clears the SAI Tx status flag state.
<> 154:37f96f9d4de2 394 *
<> 154:37f96f9d4de2 395 * @param base SAI base pointer
<> 154:37f96f9d4de2 396 * @param mask State mask. It can be a combination of the following source if defined:
<> 154:37f96f9d4de2 397 * @arg kSAI_WordStartFlag
<> 154:37f96f9d4de2 398 * @arg kSAI_SyncErrorFlag
<> 154:37f96f9d4de2 399 * @arg kSAI_FIFOErrorFlag
<> 154:37f96f9d4de2 400 */
<> 154:37f96f9d4de2 401 static inline void SAI_TxClearStatusFlags(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 402 {
<> 154:37f96f9d4de2 403 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 404 }
<> 154:37f96f9d4de2 405
<> 154:37f96f9d4de2 406 /*!
<> 154:37f96f9d4de2 407 * @brief Gets the SAI Tx status flag state.
<> 154:37f96f9d4de2 408 *
<> 154:37f96f9d4de2 409 * @param base SAI base pointer
<> 154:37f96f9d4de2 410 * @return SAI Rx status flag value. Use the Status Mask to get the status value needed.
<> 154:37f96f9d4de2 411 */
<> 154:37f96f9d4de2 412 static inline uint32_t SAI_RxGetStatusFlag(I2S_Type *base)
<> 154:37f96f9d4de2 413 {
<> 154:37f96f9d4de2 414 return base->RCSR;
<> 154:37f96f9d4de2 415 }
<> 154:37f96f9d4de2 416
<> 154:37f96f9d4de2 417 /*!
<> 154:37f96f9d4de2 418 * @brief Clears the SAI Rx status flag state.
<> 154:37f96f9d4de2 419 *
<> 154:37f96f9d4de2 420 * @param base SAI base pointer
<> 154:37f96f9d4de2 421 * @param mask State mask. It can be a combination of the following source if defined:
<> 154:37f96f9d4de2 422 * @arg kSAI_WordStartFlag
<> 154:37f96f9d4de2 423 * @arg kSAI_SyncErrorFlag
<> 154:37f96f9d4de2 424 * @arg kSAI_FIFOErrorFlag
<> 154:37f96f9d4de2 425 */
<> 154:37f96f9d4de2 426 static inline void SAI_RxClearStatusFlags(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 427 {
<> 154:37f96f9d4de2 428 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 429 }
<> 154:37f96f9d4de2 430
<> 154:37f96f9d4de2 431 /*! @} */
<> 154:37f96f9d4de2 432
<> 154:37f96f9d4de2 433 /*!
<> 154:37f96f9d4de2 434 * @name Interrupts
<> 154:37f96f9d4de2 435 * @{
<> 154:37f96f9d4de2 436 */
<> 154:37f96f9d4de2 437
<> 154:37f96f9d4de2 438 /*!
<> 154:37f96f9d4de2 439 * @brief Enables SAI Tx interrupt requests.
<> 154:37f96f9d4de2 440 *
<> 154:37f96f9d4de2 441 * @param base SAI base pointer
<> 154:37f96f9d4de2 442 * @param mask interrupt source
<> 154:37f96f9d4de2 443 * The parameter can be a combination of the following source if defined:
<> 154:37f96f9d4de2 444 * @arg kSAI_WordStartInterruptEnable
<> 154:37f96f9d4de2 445 * @arg kSAI_SyncErrorInterruptEnable
<> 154:37f96f9d4de2 446 * @arg kSAI_FIFOWarningInterruptEnable
<> 154:37f96f9d4de2 447 * @arg kSAI_FIFORequestInterruptEnable
<> 154:37f96f9d4de2 448 * @arg kSAI_FIFOErrorInterruptEnable
<> 154:37f96f9d4de2 449 */
<> 154:37f96f9d4de2 450 static inline void SAI_TxEnableInterrupts(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 451 {
<> 154:37f96f9d4de2 452 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 453 }
<> 154:37f96f9d4de2 454
<> 154:37f96f9d4de2 455 /*!
<> 154:37f96f9d4de2 456 * @brief Enables SAI Rx interrupt requests.
<> 154:37f96f9d4de2 457 *
<> 154:37f96f9d4de2 458 * @param base SAI base pointer
<> 154:37f96f9d4de2 459 * @param mask interrupt source
<> 154:37f96f9d4de2 460 * The parameter can be a combination of the following source if defined:
<> 154:37f96f9d4de2 461 * @arg kSAI_WordStartInterruptEnable
<> 154:37f96f9d4de2 462 * @arg kSAI_SyncErrorInterruptEnable
<> 154:37f96f9d4de2 463 * @arg kSAI_FIFOWarningInterruptEnable
<> 154:37f96f9d4de2 464 * @arg kSAI_FIFORequestInterruptEnable
<> 154:37f96f9d4de2 465 * @arg kSAI_FIFOErrorInterruptEnable
<> 154:37f96f9d4de2 466 */
<> 154:37f96f9d4de2 467 static inline void SAI_RxEnableInterrupts(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 468 {
<> 154:37f96f9d4de2 469 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 470 }
<> 154:37f96f9d4de2 471
<> 154:37f96f9d4de2 472 /*!
<> 154:37f96f9d4de2 473 * @brief Disables SAI Tx interrupt requests.
<> 154:37f96f9d4de2 474 *
<> 154:37f96f9d4de2 475 * @param base SAI base pointer
<> 154:37f96f9d4de2 476 * @param mask interrupt source
<> 154:37f96f9d4de2 477 * The parameter can be a combination of the following source if defined:
<> 154:37f96f9d4de2 478 * @arg kSAI_WordStartInterruptEnable
<> 154:37f96f9d4de2 479 * @arg kSAI_SyncErrorInterruptEnable
<> 154:37f96f9d4de2 480 * @arg kSAI_FIFOWarningInterruptEnable
<> 154:37f96f9d4de2 481 * @arg kSAI_FIFORequestInterruptEnable
<> 154:37f96f9d4de2 482 * @arg kSAI_FIFOErrorInterruptEnable
<> 154:37f96f9d4de2 483 */
<> 154:37f96f9d4de2 484 static inline void SAI_TxDisableInterrupts(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 485 {
<> 154:37f96f9d4de2 486 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask));
<> 154:37f96f9d4de2 487 }
<> 154:37f96f9d4de2 488
<> 154:37f96f9d4de2 489 /*!
<> 154:37f96f9d4de2 490 * @brief Disables SAI Rx interrupt requests.
<> 154:37f96f9d4de2 491 *
<> 154:37f96f9d4de2 492 * @param base SAI base pointer
<> 154:37f96f9d4de2 493 * @param mask interrupt source
<> 154:37f96f9d4de2 494 * The parameter can be a combination of the following source if defined:
<> 154:37f96f9d4de2 495 * @arg kSAI_WordStartInterruptEnable
<> 154:37f96f9d4de2 496 * @arg kSAI_SyncErrorInterruptEnable
<> 154:37f96f9d4de2 497 * @arg kSAI_FIFOWarningInterruptEnable
<> 154:37f96f9d4de2 498 * @arg kSAI_FIFORequestInterruptEnable
<> 154:37f96f9d4de2 499 * @arg kSAI_FIFOErrorInterruptEnable
<> 154:37f96f9d4de2 500 */
<> 154:37f96f9d4de2 501 static inline void SAI_RxDisableInterrupts(I2S_Type *base, uint32_t mask)
<> 154:37f96f9d4de2 502 {
<> 154:37f96f9d4de2 503 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask));
<> 154:37f96f9d4de2 504 }
<> 154:37f96f9d4de2 505
<> 154:37f96f9d4de2 506 /*! @} */
<> 154:37f96f9d4de2 507
<> 154:37f96f9d4de2 508 /*!
<> 154:37f96f9d4de2 509 * @name DMA Control
<> 154:37f96f9d4de2 510 * @{
<> 154:37f96f9d4de2 511 */
<> 154:37f96f9d4de2 512
<> 154:37f96f9d4de2 513 /*!
<> 154:37f96f9d4de2 514 * @brief Enables/disables SAI Tx DMA requests.
<> 154:37f96f9d4de2 515 * @param base SAI base pointer
<> 154:37f96f9d4de2 516 * @param mask DMA source
<> 154:37f96f9d4de2 517 * The parameter can be combination of the following source if defined:
<> 154:37f96f9d4de2 518 * @arg kSAI_FIFOWarningDMAEnable
<> 154:37f96f9d4de2 519 * @arg kSAI_FIFORequestDMAEnable
<> 154:37f96f9d4de2 520 * @param enable True means enable DMA, false means disable DMA.
<> 154:37f96f9d4de2 521 */
<> 154:37f96f9d4de2 522 static inline void SAI_TxEnableDMA(I2S_Type *base, uint32_t mask, bool enable)
<> 154:37f96f9d4de2 523 {
<> 154:37f96f9d4de2 524 if (enable)
<> 154:37f96f9d4de2 525 {
<> 154:37f96f9d4de2 526 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 527 }
<> 154:37f96f9d4de2 528 else
<> 154:37f96f9d4de2 529 {
<> 154:37f96f9d4de2 530 base->TCSR = ((base->TCSR & 0xFFE3FFFFU) & (~mask));
<> 154:37f96f9d4de2 531 }
<> 154:37f96f9d4de2 532 }
<> 154:37f96f9d4de2 533
<> 154:37f96f9d4de2 534 /*!
<> 154:37f96f9d4de2 535 * @brief Enables/disables SAI Rx DMA requests.
<> 154:37f96f9d4de2 536 * @param base SAI base pointer
<> 154:37f96f9d4de2 537 * @param mask DMA source
<> 154:37f96f9d4de2 538 * The parameter can be a combination of the following source if defined:
<> 154:37f96f9d4de2 539 * @arg kSAI_FIFOWarningDMAEnable
<> 154:37f96f9d4de2 540 * @arg kSAI_FIFORequestDMAEnable
<> 154:37f96f9d4de2 541 * @param enable True means enable DMA, false means disable DMA.
<> 154:37f96f9d4de2 542 */
<> 154:37f96f9d4de2 543 static inline void SAI_RxEnableDMA(I2S_Type *base, uint32_t mask, bool enable)
<> 154:37f96f9d4de2 544 {
<> 154:37f96f9d4de2 545 if (enable)
<> 154:37f96f9d4de2 546 {
<> 154:37f96f9d4de2 547 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) | mask);
<> 154:37f96f9d4de2 548 }
<> 154:37f96f9d4de2 549 else
<> 154:37f96f9d4de2 550 {
<> 154:37f96f9d4de2 551 base->RCSR = ((base->RCSR & 0xFFE3FFFFU) & (~mask));
<> 154:37f96f9d4de2 552 }
<> 154:37f96f9d4de2 553 }
<> 154:37f96f9d4de2 554
<> 154:37f96f9d4de2 555 /*!
<> 154:37f96f9d4de2 556 * @brief Gets the SAI Tx data register address.
<> 154:37f96f9d4de2 557 *
<> 154:37f96f9d4de2 558 * This API is used to provide a transfer address for SAI DMA transfer configuration.
<> 154:37f96f9d4de2 559 *
<> 154:37f96f9d4de2 560 * @param base SAI base pointer.
<> 154:37f96f9d4de2 561 * @param channel Which data channel used.
<> 154:37f96f9d4de2 562 * @return data register address.
<> 154:37f96f9d4de2 563 */
<> 154:37f96f9d4de2 564 static inline uint32_t SAI_TxGetDataRegisterAddress(I2S_Type *base, uint32_t channel)
<> 154:37f96f9d4de2 565 {
<> 154:37f96f9d4de2 566 return (uint32_t)(&(base->TDR)[channel]);
<> 154:37f96f9d4de2 567 }
<> 154:37f96f9d4de2 568
<> 154:37f96f9d4de2 569 /*!
<> 154:37f96f9d4de2 570 * @brief Gets the SAI Rx data register address.
<> 154:37f96f9d4de2 571 *
<> 154:37f96f9d4de2 572 * This API is used to provide a transfer address for SAI DMA transfer configuration.
<> 154:37f96f9d4de2 573 *
<> 154:37f96f9d4de2 574 * @param base SAI base pointer.
<> 154:37f96f9d4de2 575 * @param channel Which data channel used.
<> 154:37f96f9d4de2 576 * @return data register address.
<> 154:37f96f9d4de2 577 */
<> 154:37f96f9d4de2 578 static inline uint32_t SAI_RxGetDataRegisterAddress(I2S_Type *base, uint32_t channel)
<> 154:37f96f9d4de2 579 {
<> 154:37f96f9d4de2 580 return (uint32_t)(&(base->RDR)[channel]);
<> 154:37f96f9d4de2 581 }
<> 154:37f96f9d4de2 582
<> 154:37f96f9d4de2 583 /*! @} */
<> 154:37f96f9d4de2 584
<> 154:37f96f9d4de2 585 /*!
<> 154:37f96f9d4de2 586 * @name Bus Operations
<> 154:37f96f9d4de2 587 * @{
<> 154:37f96f9d4de2 588 */
<> 154:37f96f9d4de2 589
<> 154:37f96f9d4de2 590 /*!
<> 154:37f96f9d4de2 591 * @brief Configures the SAI Tx audio format.
<> 154:37f96f9d4de2 592 *
<> 154:37f96f9d4de2 593 * The audio format can be changed at run-time. This function configures the sample rate and audio data
<> 154:37f96f9d4de2 594 * format to be transferred.
<> 154:37f96f9d4de2 595 *
<> 154:37f96f9d4de2 596 * @param base SAI base pointer.
<> 154:37f96f9d4de2 597 * @param format Pointer to SAI audio data format structure.
<> 154:37f96f9d4de2 598 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
<> 154:37f96f9d4de2 599 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If bit clock source is master
<> 154:37f96f9d4de2 600 * clock, this value should equals to masterClockHz in format.
<> 154:37f96f9d4de2 601 */
<> 154:37f96f9d4de2 602 void SAI_TxSetFormat(I2S_Type *base,
<> 154:37f96f9d4de2 603 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 604 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 605 uint32_t bclkSourceClockHz);
<> 154:37f96f9d4de2 606
<> 154:37f96f9d4de2 607 /*!
<> 154:37f96f9d4de2 608 * @brief Configures the SAI Rx audio format.
<> 154:37f96f9d4de2 609 *
<> 154:37f96f9d4de2 610 * The audio format can be changed at run-time. This function configures the sample rate and audio data
<> 154:37f96f9d4de2 611 * format to be transferred.
<> 154:37f96f9d4de2 612 *
<> 154:37f96f9d4de2 613 * @param base SAI base pointer.
<> 154:37f96f9d4de2 614 * @param format Pointer to SAI audio data format structure.
<> 154:37f96f9d4de2 615 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
<> 154:37f96f9d4de2 616 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If bit clock source is master
<> 154:37f96f9d4de2 617 * clock, this value should equals to masterClockHz in format.
<> 154:37f96f9d4de2 618 */
<> 154:37f96f9d4de2 619 void SAI_RxSetFormat(I2S_Type *base,
<> 154:37f96f9d4de2 620 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 621 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 622 uint32_t bclkSourceClockHz);
<> 154:37f96f9d4de2 623
<> 154:37f96f9d4de2 624 /*!
<> 154:37f96f9d4de2 625 * @brief Sends data using a blocking method.
<> 154:37f96f9d4de2 626 *
<> 154:37f96f9d4de2 627 * @note This function blocks by polling until data is ready to be sent.
<> 154:37f96f9d4de2 628 *
<> 154:37f96f9d4de2 629 * @param base SAI base pointer.
<> 154:37f96f9d4de2 630 * @param channel Data channel used.
<> 154:37f96f9d4de2 631 * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits.
<> 154:37f96f9d4de2 632 * @param buffer Pointer to the data to be written.
<> 154:37f96f9d4de2 633 * @param size Bytes to be written.
<> 154:37f96f9d4de2 634 */
<> 154:37f96f9d4de2 635 void SAI_WriteBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size);
<> 154:37f96f9d4de2 636
<> 154:37f96f9d4de2 637 /*!
<> 154:37f96f9d4de2 638 * @brief Writes data into SAI FIFO.
<> 154:37f96f9d4de2 639 *
<> 154:37f96f9d4de2 640 * @param base SAI base pointer.
<> 154:37f96f9d4de2 641 * @param channel Data channel used.
<> 154:37f96f9d4de2 642 * @param data Data needs to be written.
<> 154:37f96f9d4de2 643 */
<> 154:37f96f9d4de2 644 static inline void SAI_WriteData(I2S_Type *base, uint32_t channel, uint32_t data)
<> 154:37f96f9d4de2 645 {
<> 154:37f96f9d4de2 646 base->TDR[channel] = data;
<> 154:37f96f9d4de2 647 }
<> 154:37f96f9d4de2 648
<> 154:37f96f9d4de2 649 /*!
<> 154:37f96f9d4de2 650 * @brief Receives data using a blocking method.
<> 154:37f96f9d4de2 651 *
<> 154:37f96f9d4de2 652 * @note This function blocks by polling until data is ready to be sent.
<> 154:37f96f9d4de2 653 *
<> 154:37f96f9d4de2 654 * @param base SAI base pointer.
<> 154:37f96f9d4de2 655 * @param channel Data channel used.
<> 154:37f96f9d4de2 656 * @param bitWidth How many bits in a audio word, usually 8/16/24/32 bits.
<> 154:37f96f9d4de2 657 * @param buffer Pointer to the data to be read.
<> 154:37f96f9d4de2 658 * @param size Bytes to be read.
<> 154:37f96f9d4de2 659 */
<> 154:37f96f9d4de2 660 void SAI_ReadBlocking(I2S_Type *base, uint32_t channel, uint32_t bitWidth, uint8_t *buffer, uint32_t size);
<> 154:37f96f9d4de2 661
<> 154:37f96f9d4de2 662 /*!
<> 154:37f96f9d4de2 663 * @brief Reads data from SAI FIFO.
<> 154:37f96f9d4de2 664 *
<> 154:37f96f9d4de2 665 * @param base SAI base pointer.
<> 154:37f96f9d4de2 666 * @param channel Data channel used.
<> 154:37f96f9d4de2 667 * @return Data in SAI FIFO.
<> 154:37f96f9d4de2 668 */
<> 154:37f96f9d4de2 669 static inline uint32_t SAI_ReadData(I2S_Type *base, uint32_t channel)
<> 154:37f96f9d4de2 670 {
<> 154:37f96f9d4de2 671 return base->RDR[channel];
<> 154:37f96f9d4de2 672 }
<> 154:37f96f9d4de2 673
<> 154:37f96f9d4de2 674 /*! @} */
<> 154:37f96f9d4de2 675
<> 154:37f96f9d4de2 676 /*!
<> 154:37f96f9d4de2 677 * @name Transactional
<> 154:37f96f9d4de2 678 * @{
<> 154:37f96f9d4de2 679 */
<> 154:37f96f9d4de2 680
<> 154:37f96f9d4de2 681 /*!
<> 154:37f96f9d4de2 682 * @brief Initializes the SAI Tx handle.
<> 154:37f96f9d4de2 683 *
<> 154:37f96f9d4de2 684 * This function initializes the Tx handle for SAI Tx transactional APIs. Call
<> 154:37f96f9d4de2 685 * this function one time to get the handle initialized.
<> 154:37f96f9d4de2 686 *
<> 154:37f96f9d4de2 687 * @param base SAI base pointer
<> 154:37f96f9d4de2 688 * @param handle SAI handle pointer.
<> 154:37f96f9d4de2 689 * @param callback pointer to user callback function
<> 154:37f96f9d4de2 690 * @param userData user parameter passed to the callback function
<> 154:37f96f9d4de2 691 */
<> 154:37f96f9d4de2 692 void SAI_TransferTxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData);
<> 154:37f96f9d4de2 693
<> 154:37f96f9d4de2 694 /*!
<> 154:37f96f9d4de2 695 * @brief Initializes the SAI Rx handle.
<> 154:37f96f9d4de2 696 *
<> 154:37f96f9d4de2 697 * This function initializes the Rx handle for SAI Rx transactional APIs. Call
<> 154:37f96f9d4de2 698 * this function one time to get the handle initialized.
<> 154:37f96f9d4de2 699 *
<> 154:37f96f9d4de2 700 * @param base SAI base pointer.
<> 154:37f96f9d4de2 701 * @param handle SAI handle pointer.
<> 154:37f96f9d4de2 702 * @param callback pointer to user callback function
<> 154:37f96f9d4de2 703 * @param userData user parameter passed to the callback function
<> 154:37f96f9d4de2 704 */
<> 154:37f96f9d4de2 705 void SAI_TransferRxCreateHandle(I2S_Type *base, sai_handle_t *handle, sai_transfer_callback_t callback, void *userData);
<> 154:37f96f9d4de2 706
<> 154:37f96f9d4de2 707 /*!
<> 154:37f96f9d4de2 708 * @brief Configures the SAI Tx audio format.
<> 154:37f96f9d4de2 709 *
<> 154:37f96f9d4de2 710 * The audio format can be changed at run-time. This function configures the sample rate and audio data
<> 154:37f96f9d4de2 711 * format to be transferred.
<> 154:37f96f9d4de2 712 *
<> 154:37f96f9d4de2 713 * @param base SAI base pointer.
<> 154:37f96f9d4de2 714 * @param handle SAI handle pointer.
<> 154:37f96f9d4de2 715 * @param format Pointer to SAI audio data format structure.
<> 154:37f96f9d4de2 716 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
<> 154:37f96f9d4de2 717 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If a bit clock source is a master
<> 154:37f96f9d4de2 718 * clock, this value should equal to masterClockHz in format.
<> 154:37f96f9d4de2 719 * @return Status of this function. Return value is one of status_t.
<> 154:37f96f9d4de2 720 */
<> 154:37f96f9d4de2 721 status_t SAI_TransferTxSetFormat(I2S_Type *base,
<> 154:37f96f9d4de2 722 sai_handle_t *handle,
<> 154:37f96f9d4de2 723 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 724 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 725 uint32_t bclkSourceClockHz);
<> 154:37f96f9d4de2 726
<> 154:37f96f9d4de2 727 /*!
<> 154:37f96f9d4de2 728 * @brief Configures the SAI Rx audio format.
<> 154:37f96f9d4de2 729 *
<> 154:37f96f9d4de2 730 * The audio format can be changed at run-time. This function configures the sample rate and audio data
<> 154:37f96f9d4de2 731 * format to be transferred.
<> 154:37f96f9d4de2 732 *
<> 154:37f96f9d4de2 733 * @param base SAI base pointer.
<> 154:37f96f9d4de2 734 * @param handle SAI handle pointer.
<> 154:37f96f9d4de2 735 * @param format Pointer to SAI audio data format structure.
<> 154:37f96f9d4de2 736 * @param mclkSourceClockHz SAI master clock source frequency in Hz.
<> 154:37f96f9d4de2 737 * @param bclkSourceClockHz SAI bit clock source frequency in Hz. If bit clock source is master
<> 154:37f96f9d4de2 738 * clock, this value should equals to masterClockHz in format.
<> 154:37f96f9d4de2 739 * @return Status of this function. Return value is one of status_t.
<> 154:37f96f9d4de2 740 */
<> 154:37f96f9d4de2 741 status_t SAI_TransferRxSetFormat(I2S_Type *base,
<> 154:37f96f9d4de2 742 sai_handle_t *handle,
<> 154:37f96f9d4de2 743 sai_transfer_format_t *format,
<> 154:37f96f9d4de2 744 uint32_t mclkSourceClockHz,
<> 154:37f96f9d4de2 745 uint32_t bclkSourceClockHz);
<> 154:37f96f9d4de2 746
<> 154:37f96f9d4de2 747 /*!
<> 154:37f96f9d4de2 748 * @brief Performs an interrupt non-blocking send transfer on SAI.
<> 154:37f96f9d4de2 749 *
<> 154:37f96f9d4de2 750 * @note This API returns immediately after the transfer initiates.
<> 154:37f96f9d4de2 751 * Call the SAI_TxGetTransferStatusIRQ to poll the transfer status and check whether
<> 154:37f96f9d4de2 752 * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer
<> 154:37f96f9d4de2 753 * is finished.
<> 154:37f96f9d4de2 754 *
<> 154:37f96f9d4de2 755 * @param base SAI base pointer
<> 154:37f96f9d4de2 756 * @param handle pointer to sai_handle_t structure which stores the transfer state
<> 154:37f96f9d4de2 757 * @param xfer pointer to sai_transfer_t structure
<> 154:37f96f9d4de2 758 * @retval kStatus_Success Successfully started the data receive.
<> 154:37f96f9d4de2 759 * @retval kStatus_SAI_TxBusy Previous receive still not finished.
<> 154:37f96f9d4de2 760 * @retval kStatus_InvalidArgument The input parameter is invalid.
<> 154:37f96f9d4de2 761 */
<> 154:37f96f9d4de2 762 status_t SAI_TransferSendNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer);
<> 154:37f96f9d4de2 763
<> 154:37f96f9d4de2 764 /*!
<> 154:37f96f9d4de2 765 * @brief Performs an interrupt non-blocking receive transfer on SAI.
<> 154:37f96f9d4de2 766 *
<> 154:37f96f9d4de2 767 * @note This API returns immediately after the transfer initiates.
<> 154:37f96f9d4de2 768 * Call the SAI_RxGetTransferStatusIRQ to poll the transfer status and check whether
<> 154:37f96f9d4de2 769 * the transfer is finished. If the return status is not kStatus_SAI_Busy, the transfer
<> 154:37f96f9d4de2 770 * is finished.
<> 154:37f96f9d4de2 771 *
<> 154:37f96f9d4de2 772 * @param base SAI base pointer
<> 154:37f96f9d4de2 773 * @param handle pointer to sai_handle_t structure which stores the transfer state
<> 154:37f96f9d4de2 774 * @param xfer pointer to sai_transfer_t structure
<> 154:37f96f9d4de2 775 * @retval kStatus_Success Successfully started the data receive.
<> 154:37f96f9d4de2 776 * @retval kStatus_SAI_RxBusy Previous receive still not finished.
<> 154:37f96f9d4de2 777 * @retval kStatus_InvalidArgument The input parameter is invalid.
<> 154:37f96f9d4de2 778 */
<> 154:37f96f9d4de2 779 status_t SAI_TransferReceiveNonBlocking(I2S_Type *base, sai_handle_t *handle, sai_transfer_t *xfer);
<> 154:37f96f9d4de2 780
<> 154:37f96f9d4de2 781 /*!
<> 154:37f96f9d4de2 782 * @brief Gets a set byte count.
<> 154:37f96f9d4de2 783 *
<> 154:37f96f9d4de2 784 * @param base SAI base pointer.
<> 154:37f96f9d4de2 785 * @param handle pointer to sai_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 786 * @param count Bytes count sent.
<> 154:37f96f9d4de2 787 * @retval kStatus_Success Succeed get the transfer count.
<> 154:37f96f9d4de2 788 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
<> 154:37f96f9d4de2 789 */
<> 154:37f96f9d4de2 790 status_t SAI_TransferGetSendCount(I2S_Type *base, sai_handle_t *handle, size_t *count);
<> 154:37f96f9d4de2 791
<> 154:37f96f9d4de2 792 /*!
<> 154:37f96f9d4de2 793 * @brief Gets a received byte count.
<> 154:37f96f9d4de2 794 *
<> 154:37f96f9d4de2 795 * @param base SAI base pointer.
<> 154:37f96f9d4de2 796 * @param handle pointer to sai_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 797 * @param count Bytes count received.
<> 154:37f96f9d4de2 798 * @retval kStatus_Success Succeed get the transfer count.
<> 154:37f96f9d4de2 799 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
<> 154:37f96f9d4de2 800 */
<> 154:37f96f9d4de2 801 status_t SAI_TransferGetReceiveCount(I2S_Type *base, sai_handle_t *handle, size_t *count);
<> 154:37f96f9d4de2 802
<> 154:37f96f9d4de2 803 /*!
<> 154:37f96f9d4de2 804 * @brief Aborts the current send.
<> 154:37f96f9d4de2 805 *
<> 154:37f96f9d4de2 806 * @note This API can be called any time when an interrupt non-blocking transfer initiates
<> 154:37f96f9d4de2 807 * to abort the transfer early.
<> 154:37f96f9d4de2 808 *
<> 154:37f96f9d4de2 809 * @param base SAI base pointer.
<> 154:37f96f9d4de2 810 * @param handle pointer to sai_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 811 */
<> 154:37f96f9d4de2 812 void SAI_TransferAbortSend(I2S_Type *base, sai_handle_t *handle);
<> 154:37f96f9d4de2 813
<> 154:37f96f9d4de2 814 /*!
<> 154:37f96f9d4de2 815 * @brief Aborts the the current IRQ receive.
<> 154:37f96f9d4de2 816 *
<> 154:37f96f9d4de2 817 * @note This API can be called any time when an interrupt non-blocking transfer initiates
<> 154:37f96f9d4de2 818 * to abort the transfer early.
<> 154:37f96f9d4de2 819 *
<> 154:37f96f9d4de2 820 * @param base SAI base pointer
<> 154:37f96f9d4de2 821 * @param handle pointer to sai_handle_t structure which stores the transfer state.
<> 154:37f96f9d4de2 822 */
<> 154:37f96f9d4de2 823 void SAI_TransferAbortReceive(I2S_Type *base, sai_handle_t *handle);
<> 154:37f96f9d4de2 824
<> 154:37f96f9d4de2 825 /*!
<> 154:37f96f9d4de2 826 * @brief Tx interrupt handler.
<> 154:37f96f9d4de2 827 *
<> 154:37f96f9d4de2 828 * @param base SAI base pointer.
<> 154:37f96f9d4de2 829 * @param handle pointer to sai_handle_t structure.
<> 154:37f96f9d4de2 830 */
<> 154:37f96f9d4de2 831 void SAI_TransferTxHandleIRQ(I2S_Type *base, sai_handle_t *handle);
<> 154:37f96f9d4de2 832
<> 154:37f96f9d4de2 833 /*!
<> 154:37f96f9d4de2 834 * @brief Tx interrupt handler.
<> 154:37f96f9d4de2 835 *
<> 154:37f96f9d4de2 836 * @param base SAI base pointer.
<> 154:37f96f9d4de2 837 * @param handle pointer to sai_handle_t structure.
<> 154:37f96f9d4de2 838 */
<> 154:37f96f9d4de2 839 void SAI_TransferRxHandleIRQ(I2S_Type *base, sai_handle_t *handle);
<> 154:37f96f9d4de2 840
<> 154:37f96f9d4de2 841 /*! @} */
<> 154:37f96f9d4de2 842
<> 154:37f96f9d4de2 843 #if defined(__cplusplus)
<> 154:37f96f9d4de2 844 }
<> 154:37f96f9d4de2 845 #endif /*_cplusplus*/
<> 154:37f96f9d4de2 846
<> 154:37f96f9d4de2 847 /*! @} */
<> 154:37f96f9d4de2 848
<> 154:37f96f9d4de2 849 #endif /* _FSL_SAI_H_ */