Rizky Ardi Maulana / mbed-os
Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

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