added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Sep 02 15:07:44 2016 +0100
Revision:
144:ef7eb2e8f9f7
This updates the lib to the mbed lib v125

Who changed what in which revision?

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