added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

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_ */