The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 161:aa5281ff4a02 1 /*
AnnaBridge 170:e95d10626187 2 * The Clear BSD License
AnnaBridge 161:aa5281ff4a02 3 * Copyright (c) 2016, Freescale Semiconductor, Inc.
AnnaBridge 161:aa5281ff4a02 4 * All rights reserved.
AnnaBridge 161:aa5281ff4a02 5 *
AnnaBridge 170:e95d10626187 6 *
AnnaBridge 161:aa5281ff4a02 7 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 170:e95d10626187 8 * are permitted (subject to the limitations in the disclaimer below) provided
AnnaBridge 170:e95d10626187 9 * that the following conditions are met:
AnnaBridge 161:aa5281ff4a02 10 *
AnnaBridge 161:aa5281ff4a02 11 * o Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 161:aa5281ff4a02 12 * of conditions and the following disclaimer.
AnnaBridge 161:aa5281ff4a02 13 *
AnnaBridge 161:aa5281ff4a02 14 * o Redistributions in binary form must reproduce the above copyright notice, this
AnnaBridge 161:aa5281ff4a02 15 * list of conditions and the following disclaimer in the documentation and/or
AnnaBridge 161:aa5281ff4a02 16 * other materials provided with the distribution.
AnnaBridge 161:aa5281ff4a02 17 *
AnnaBridge 161:aa5281ff4a02 18 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
AnnaBridge 161:aa5281ff4a02 19 * contributors may be used to endorse or promote products derived from this
AnnaBridge 161:aa5281ff4a02 20 * software without specific prior written permission.
AnnaBridge 161:aa5281ff4a02 21 *
AnnaBridge 170:e95d10626187 22 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
AnnaBridge 161:aa5281ff4a02 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 161:aa5281ff4a02 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 161:aa5281ff4a02 25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 161:aa5281ff4a02 26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 161:aa5281ff4a02 27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 161:aa5281ff4a02 28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 161:aa5281ff4a02 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 161:aa5281ff4a02 30 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 161:aa5281ff4a02 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 161:aa5281ff4a02 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 161:aa5281ff4a02 33 */
AnnaBridge 161:aa5281ff4a02 34
AnnaBridge 161:aa5281ff4a02 35 #ifndef _FSL_SPDIF_H_
AnnaBridge 161:aa5281ff4a02 36 #define _FSL_SPDIF_H_
AnnaBridge 161:aa5281ff4a02 37
AnnaBridge 161:aa5281ff4a02 38 #include "fsl_common.h"
AnnaBridge 161:aa5281ff4a02 39
AnnaBridge 161:aa5281ff4a02 40 /*!
AnnaBridge 161:aa5281ff4a02 41 * @addtogroup spdif
AnnaBridge 161:aa5281ff4a02 42 * @{
AnnaBridge 161:aa5281ff4a02 43 */
AnnaBridge 161:aa5281ff4a02 44
AnnaBridge 161:aa5281ff4a02 45 /*******************************************************************************
AnnaBridge 161:aa5281ff4a02 46 * Definitions
AnnaBridge 161:aa5281ff4a02 47 ******************************************************************************/
AnnaBridge 161:aa5281ff4a02 48
AnnaBridge 161:aa5281ff4a02 49 /*! @name Driver version */
AnnaBridge 161:aa5281ff4a02 50 /*@{*/
AnnaBridge 161:aa5281ff4a02 51 #define FSL_SPDIF_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) /*!< Version 2.0.0 */
AnnaBridge 161:aa5281ff4a02 52 /*@}*/
AnnaBridge 161:aa5281ff4a02 53
AnnaBridge 161:aa5281ff4a02 54 /*! @brief SPDIF return status*/
AnnaBridge 161:aa5281ff4a02 55 enum _spdif_status_t
AnnaBridge 161:aa5281ff4a02 56 {
AnnaBridge 161:aa5281ff4a02 57 kStatus_SPDIF_RxDPLLLocked = MAKE_STATUS(kStatusGroup_SPDIF, 0), /*!< SPDIF Rx PLL locked. */
AnnaBridge 161:aa5281ff4a02 58 kStatus_SPDIF_TxFIFOError = MAKE_STATUS(kStatusGroup_SPDIF, 1), /*!< SPDIF Tx FIFO error. */
AnnaBridge 161:aa5281ff4a02 59 kStatus_SPDIF_TxFIFOResync = MAKE_STATUS(kStatusGroup_SPDIF, 2), /*!< SPDIF Tx left and right FIFO resync. */
AnnaBridge 161:aa5281ff4a02 60 kStatus_SPDIF_RxCnew = MAKE_STATUS(kStatusGroup_SPDIF, 3), /*!< SPDIF Rx status channel value updated. */
AnnaBridge 161:aa5281ff4a02 61 kStatus_SPDIF_ValidatyNoGood = MAKE_STATUS(kStatusGroup_SPDIF, 4), /*!< SPDIF validaty flag not good. */
AnnaBridge 161:aa5281ff4a02 62 kStatus_SPDIF_RxIllegalSymbol = MAKE_STATUS(kStatusGroup_SPDIF, 5), /*!< SPDIF Rx receive illegal symbol. */
AnnaBridge 161:aa5281ff4a02 63 kStatus_SPDIF_RxParityBitError = MAKE_STATUS(kStatusGroup_SPDIF, 6), /*!< SPDIF Rx parity bit error. */
AnnaBridge 161:aa5281ff4a02 64 kStatus_SPDIF_UChannelOverrun = MAKE_STATUS(kStatusGroup_SPDIF, 7), /*!< SPDIF receive U channel overrun. */
AnnaBridge 161:aa5281ff4a02 65 kStatus_SPDIF_QChannelOverrun = MAKE_STATUS(kStatusGroup_SPDIF, 8), /*!< SPDIF receive Q channel overrun. */
AnnaBridge 161:aa5281ff4a02 66 kStatus_SPDIF_UQChannelSync = MAKE_STATUS(kStatusGroup_SPDIF, 9), /*!< SPDIF U/Q channel sync found. */
AnnaBridge 161:aa5281ff4a02 67 kStatus_SPDIF_UQChannelFrameError = MAKE_STATUS(kStatusGroup_SPDIF, 10), /*!< SPDIF U/Q channel frame error. */
AnnaBridge 161:aa5281ff4a02 68 kStatus_SPDIF_RxFIFOError = MAKE_STATUS(kStatusGroup_SPDIF, 11), /*!< SPDIF Rx FIFO error. */
AnnaBridge 161:aa5281ff4a02 69 kStatus_SPDIF_RxFIFOResync = MAKE_STATUS(kStatusGroup_SPDIF, 12), /*!< SPDIF Rx left and right FIFO resync. */
AnnaBridge 161:aa5281ff4a02 70 kStatus_SPDIF_LockLoss = MAKE_STATUS(kStatusGroup_SPDIF, 13), /*!< SPDIF Rx PLL clock lock loss. */
AnnaBridge 161:aa5281ff4a02 71 kStatus_SPDIF_TxIdle = MAKE_STATUS(kStatusGroup_SPDIF, 14), /*!< SPDIF Tx is idle */
AnnaBridge 161:aa5281ff4a02 72 kStatus_SPDIF_RxIdle = MAKE_STATUS(kStatusGroup_SPDIF, 15), /*!< SPDIF Rx is idle */
AnnaBridge 161:aa5281ff4a02 73 kStatus_SPDIF_QueueFull = MAKE_STATUS(kStatusGroup_SPDIF, 16) /*!< SPDIF queue full */
AnnaBridge 161:aa5281ff4a02 74 };
AnnaBridge 161:aa5281ff4a02 75
AnnaBridge 161:aa5281ff4a02 76 /*! @brief SPDIF Rx FIFO full falg select, it decides when assert the rx full flag */
AnnaBridge 161:aa5281ff4a02 77 typedef enum _spdif_rxfull_select
AnnaBridge 161:aa5281ff4a02 78 {
AnnaBridge 161:aa5281ff4a02 79 kSPDIF_RxFull1Sample = 0x0u, /*!< Rx full at least 1 sample in left and right FIFO */
AnnaBridge 161:aa5281ff4a02 80 kSPDIF_RxFull4Samples, /*!< Rx full at least 4 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 81 kSPDIF_RxFull8Samples, /*!< Rx full at least 8 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 82 kSPDIF_RxFull16Samples, /*!< Rx full at least 16 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 83 } spdif_rxfull_select_t;
AnnaBridge 161:aa5281ff4a02 84
AnnaBridge 161:aa5281ff4a02 85 /*! @brief SPDIF tx FIFO EMPTY falg select, it decides when assert the tx empty flag */
AnnaBridge 161:aa5281ff4a02 86 typedef enum _spdif_txempty_select
AnnaBridge 161:aa5281ff4a02 87 {
AnnaBridge 161:aa5281ff4a02 88 kSPDIF_TxEmpty0Sample = 0x0u, /*!< Tx empty at most 0 sample in left and right FIFO */
AnnaBridge 161:aa5281ff4a02 89 kSPDIF_TxEmpty4Samples, /*!< Tx empty at most 4 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 90 kSPDIF_TxEmpty8Samples, /*!< Tx empty at most 8 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 91 kSPDIF_TxEmpty12Samples, /*!< Tx empty at most 12 sample in left and right FIFO*/
AnnaBridge 161:aa5281ff4a02 92 } spdif_txempty_select_t;
AnnaBridge 161:aa5281ff4a02 93
AnnaBridge 161:aa5281ff4a02 94 /*! @brief SPDIF U channel source */
AnnaBridge 161:aa5281ff4a02 95 typedef enum _spdif_uchannel_source
AnnaBridge 161:aa5281ff4a02 96 {
AnnaBridge 161:aa5281ff4a02 97 kSPDIF_NoUChannel = 0x0U, /*!< No embedded U channel */
AnnaBridge 161:aa5281ff4a02 98 kSPDIF_UChannelFromRx = 0x1U, /*!< U channel from receiver, it is CD mode */
AnnaBridge 161:aa5281ff4a02 99 kSPDIF_UChannelFromTx = 0x3U, /*!< U channel from on chip tx */
AnnaBridge 161:aa5281ff4a02 100 } spdif_uchannel_source_t;
AnnaBridge 161:aa5281ff4a02 101
AnnaBridge 161:aa5281ff4a02 102 /*! @brief SPDIF clock gain*/
AnnaBridge 161:aa5281ff4a02 103 typedef enum _spdif_gain_select
AnnaBridge 161:aa5281ff4a02 104 {
AnnaBridge 161:aa5281ff4a02 105 kSPDIF_GAIN_24 = 0x0U, /*!< Gain select is 24 */
AnnaBridge 161:aa5281ff4a02 106 kSPDIF_GAIN_16, /*!< Gain select is 16 */
AnnaBridge 161:aa5281ff4a02 107 kSPDIF_GAIN_12, /*!< Gain select is 12 */
AnnaBridge 161:aa5281ff4a02 108 kSPDIF_GAIN_8, /*!< Gain select is 8 */
AnnaBridge 161:aa5281ff4a02 109 kSPDIF_GAIN_6, /*!< Gain select is 6 */
AnnaBridge 161:aa5281ff4a02 110 kSPDIF_GAIN_4, /*!< Gain select is 4 */
AnnaBridge 161:aa5281ff4a02 111 kSPDIF_GAIN_3, /*!< Gain select is 3 */
AnnaBridge 161:aa5281ff4a02 112 } spdif_gain_select_t;
AnnaBridge 161:aa5281ff4a02 113
AnnaBridge 161:aa5281ff4a02 114 /*! @brief SPDIF tx data source */
AnnaBridge 161:aa5281ff4a02 115 typedef enum _spdif_tx_source
AnnaBridge 161:aa5281ff4a02 116 {
AnnaBridge 161:aa5281ff4a02 117 kSPDIF_txFromReceiver = 0x1U, /*!< Tx data directly through SPDIF receiver */
AnnaBridge 161:aa5281ff4a02 118 kSPDIF_txNormal = 0x5U, /*!< Normal operation, data from processor */
AnnaBridge 161:aa5281ff4a02 119 } spdif_tx_source_t;
AnnaBridge 161:aa5281ff4a02 120
AnnaBridge 161:aa5281ff4a02 121 /*! @brief SPDIF tx data source */
AnnaBridge 161:aa5281ff4a02 122 typedef enum _spdif_validity_config
AnnaBridge 161:aa5281ff4a02 123 {
AnnaBridge 161:aa5281ff4a02 124 kSPDIF_validityFlagAlwaysSet = 0x0U, /*!< Outgoing validity flags always set */
AnnaBridge 161:aa5281ff4a02 125 kSPDIF_validityFlagAlwaysClear, /*!< Outgoing validity flags always clear */
AnnaBridge 161:aa5281ff4a02 126 } spdif_validity_config_t;
AnnaBridge 161:aa5281ff4a02 127
AnnaBridge 161:aa5281ff4a02 128 /*! @brief The SPDIF interrupt enable flag */
AnnaBridge 161:aa5281ff4a02 129 enum _spdif_interrupt_enable_t
AnnaBridge 161:aa5281ff4a02 130 {
AnnaBridge 161:aa5281ff4a02 131 kSPDIF_RxDPLLLocked = SPDIF_SIE_LOCK_MASK, /*!< SPDIF DPLL locked */
AnnaBridge 161:aa5281ff4a02 132 kSPDIF_TxFIFOError = SPDIF_SIE_TXUNOV_MASK, /*!< Tx FIFO underrun or overrun */
AnnaBridge 161:aa5281ff4a02 133 kSPDIF_TxFIFOResync = SPDIF_SIE_TXRESYN_MASK, /*!< Tx FIFO left and right channel resync */
AnnaBridge 161:aa5281ff4a02 134 kSPDIF_RxControlChannelChange = SPDIF_SIE_CNEW_MASK, /*!< SPDIF Rx control channel value changed */
AnnaBridge 161:aa5281ff4a02 135 kSPDIF_ValidityFlagNoGood = SPDIF_SIE_VALNOGOOD_MASK, /*!< SPDIF validity flag no good */
AnnaBridge 161:aa5281ff4a02 136 kSPDIF_RxIllegalSymbol = SPDIF_SIE_SYMERR_MASK, /*!< SPDIF receiver found illegal symbol */
AnnaBridge 161:aa5281ff4a02 137 kSPDIF_RxParityBitError = SPDIF_SIE_BITERR_MASK, /*!< SPDIF receiver found parity bit error */
AnnaBridge 161:aa5281ff4a02 138 kSPDIF_UChannelReceiveRegisterFull = SPDIF_SIE_URXFUL_MASK, /*!< SPDIF U channel revceive register full */
AnnaBridge 161:aa5281ff4a02 139 kSPDIF_UChannelReceiveRegisterOverrun = SPDIF_SIE_URXOV_MASK, /*!< SPDIF U channel receive register overrun */
AnnaBridge 161:aa5281ff4a02 140 kSPDIF_QChannelReceiveRegisterFull = SPDIF_SIE_QRXFUL_MASK, /*!< SPDIF Q channel receive reigster full */
AnnaBridge 161:aa5281ff4a02 141 kSPDIF_QChannelReceiveRegisterOverrun = SPDIF_SIE_QRXOV_MASK, /*!< SPDIF Q channel receive register overrun */
AnnaBridge 161:aa5281ff4a02 142 kSPDIF_UQChannelSync = SPDIF_SIE_UQSYNC_MASK, /*!< SPDIF U/Q channel sync found */
AnnaBridge 161:aa5281ff4a02 143 kSPDIF_UQChannelFrameError = SPDIF_SIE_UQERR_MASK, /*!< SPDIF U/Q channel frame error */
AnnaBridge 161:aa5281ff4a02 144 kSPDIF_RxFIFOError = SPDIF_SIE_RXFIFOUNOV_MASK, /*!< SPDIF Rx FIFO underrun/overrun */
AnnaBridge 161:aa5281ff4a02 145 kSPDIF_RxFIFOResync = SPDIF_SIE_RXFIFORESYN_MASK, /*!< SPDIF Rx left and right FIFO resync */
AnnaBridge 161:aa5281ff4a02 146 kSPDIF_LockLoss = SPDIF_SIE_LOCKLOSS_MASK, /*!< SPDIF receiver loss of lock */
AnnaBridge 161:aa5281ff4a02 147 kSPDIF_TxFIFOEmpty = SPDIF_SIE_TXEM_MASK, /*!< SPDIF Tx FIFO empty */
AnnaBridge 161:aa5281ff4a02 148 kSPDIF_RxFIFOFull = SPDIF_SIE_RXFIFOFUL_MASK /*!< SPDIF Rx FIFO full */
AnnaBridge 161:aa5281ff4a02 149 };
AnnaBridge 161:aa5281ff4a02 150
AnnaBridge 161:aa5281ff4a02 151 /*! @brief The DMA request sources */
AnnaBridge 161:aa5281ff4a02 152 enum _spdif_dma_enable_t
AnnaBridge 161:aa5281ff4a02 153 {
AnnaBridge 161:aa5281ff4a02 154 kSPDIF_RxDMAEnable = SPDIF_SCR_DMA_RX_EN_MASK, /*!< Rx FIFO full */
AnnaBridge 161:aa5281ff4a02 155 kSPDIF_TxDMAEnable = SPDIF_SCR_DMA_TX_EN_MASK, /*!< Tx FIFO empty */
AnnaBridge 161:aa5281ff4a02 156 };
AnnaBridge 161:aa5281ff4a02 157
AnnaBridge 161:aa5281ff4a02 158 /*! @brief SPDIF user configuration structure */
AnnaBridge 161:aa5281ff4a02 159 typedef struct _spdif_config
AnnaBridge 161:aa5281ff4a02 160 {
AnnaBridge 161:aa5281ff4a02 161 bool isTxAutoSync; /*!< If auto sync mechanism open */
AnnaBridge 161:aa5281ff4a02 162 bool isRxAutoSync; /*!< If auto sync mechanism open */
AnnaBridge 161:aa5281ff4a02 163 uint8_t DPLLClkSource; /*!< SPDIF DPLL clock source, range from 0~15, meaning is chip-specific */
AnnaBridge 161:aa5281ff4a02 164 uint8_t txClkSource; /*!< SPDIF tx clock source, range from 0~7, meaning is chip-specific */
AnnaBridge 161:aa5281ff4a02 165 spdif_rxfull_select_t rxFullSelect; /*!< SPDIF rx buffer full select */
AnnaBridge 161:aa5281ff4a02 166 spdif_txempty_select_t txFullSelect; /*!< SPDIF tx buffer empty select */
AnnaBridge 161:aa5281ff4a02 167 spdif_uchannel_source_t uChannelSrc; /*!< U channel source */
AnnaBridge 161:aa5281ff4a02 168 spdif_tx_source_t txSource; /*!< SPDIF tx data source */
AnnaBridge 161:aa5281ff4a02 169 spdif_validity_config_t validityConfig; /*!< Validity flag config */
AnnaBridge 161:aa5281ff4a02 170 spdif_gain_select_t gain; /*!< Rx receive clock measure gain parameter. */
AnnaBridge 161:aa5281ff4a02 171 } spdif_config_t;
AnnaBridge 161:aa5281ff4a02 172
AnnaBridge 161:aa5281ff4a02 173 /*!@brief SPDIF transfer queue size, user can refine it according to use case. */
AnnaBridge 161:aa5281ff4a02 174 #define SPDIF_XFER_QUEUE_SIZE (4)
AnnaBridge 161:aa5281ff4a02 175
AnnaBridge 161:aa5281ff4a02 176 /*! @brief SPDIF transfer structure */
AnnaBridge 161:aa5281ff4a02 177 typedef struct _spdif_transfer
AnnaBridge 161:aa5281ff4a02 178 {
AnnaBridge 161:aa5281ff4a02 179 uint8_t *data; /*!< Data start address to transfer. */
AnnaBridge 161:aa5281ff4a02 180 uint8_t *qdata; /*!< Data buffer for Q channel */
AnnaBridge 161:aa5281ff4a02 181 uint8_t *udata; /*!< Data buffer for C channel */
AnnaBridge 161:aa5281ff4a02 182 size_t dataSize; /*!< Transfer size. */
AnnaBridge 161:aa5281ff4a02 183 } spdif_transfer_t;
AnnaBridge 161:aa5281ff4a02 184
AnnaBridge 161:aa5281ff4a02 185 typedef struct _spdif_handle spdif_handle_t;
AnnaBridge 161:aa5281ff4a02 186
AnnaBridge 161:aa5281ff4a02 187 /*! @brief SPDIF transfer callback prototype */
AnnaBridge 161:aa5281ff4a02 188 typedef void (*spdif_transfer_callback_t)(SPDIF_Type *base, spdif_handle_t *handle, status_t status, void *userData);
AnnaBridge 161:aa5281ff4a02 189
AnnaBridge 161:aa5281ff4a02 190 /*! @brief SPDIF handle structure */
AnnaBridge 161:aa5281ff4a02 191 struct _spdif_handle
AnnaBridge 161:aa5281ff4a02 192 {
AnnaBridge 161:aa5281ff4a02 193 uint32_t state; /*!< Transfer status */
AnnaBridge 161:aa5281ff4a02 194 spdif_transfer_callback_t callback; /*!< Callback function called at transfer event*/
AnnaBridge 161:aa5281ff4a02 195 void *userData; /*!< Callback parameter passed to callback function*/
AnnaBridge 161:aa5281ff4a02 196 spdif_transfer_t spdifQueue[SPDIF_XFER_QUEUE_SIZE]; /*!< Transfer queue storing queued transfer */
AnnaBridge 161:aa5281ff4a02 197 size_t transferSize[SPDIF_XFER_QUEUE_SIZE]; /*!< Data bytes need to transfer */
AnnaBridge 161:aa5281ff4a02 198 volatile uint8_t queueUser; /*!< Index for user to queue transfer */
AnnaBridge 161:aa5281ff4a02 199 volatile uint8_t queueDriver; /*!< Index for driver to get the transfer data and size */
AnnaBridge 161:aa5281ff4a02 200 uint8_t watermark; /*!< Watermark value */
AnnaBridge 161:aa5281ff4a02 201 };
AnnaBridge 161:aa5281ff4a02 202
AnnaBridge 161:aa5281ff4a02 203 /*******************************************************************************
AnnaBridge 161:aa5281ff4a02 204 * API
AnnaBridge 161:aa5281ff4a02 205 ******************************************************************************/
AnnaBridge 161:aa5281ff4a02 206
AnnaBridge 161:aa5281ff4a02 207 #if defined(__cplusplus)
AnnaBridge 161:aa5281ff4a02 208 extern "C" {
AnnaBridge 161:aa5281ff4a02 209 #endif /*_cplusplus*/
AnnaBridge 161:aa5281ff4a02 210
AnnaBridge 161:aa5281ff4a02 211 /*!
AnnaBridge 161:aa5281ff4a02 212 * @name Initialization and deinitialization
AnnaBridge 161:aa5281ff4a02 213 * @{
AnnaBridge 161:aa5281ff4a02 214 */
AnnaBridge 161:aa5281ff4a02 215
AnnaBridge 161:aa5281ff4a02 216 /*!
AnnaBridge 161:aa5281ff4a02 217 * @brief Initializes the SPDIF peripheral.
AnnaBridge 161:aa5281ff4a02 218 *
AnnaBridge 161:aa5281ff4a02 219 * Ungates the SPDIF clock, resets the module, and configures SPDIF with a configuration structure.
AnnaBridge 161:aa5281ff4a02 220 * The configuration structure can be custom filled or set with default values by
AnnaBridge 161:aa5281ff4a02 221 * SPDIF_GetDefaultConfig().
AnnaBridge 161:aa5281ff4a02 222 *
AnnaBridge 161:aa5281ff4a02 223 * @note This API should be called at the beginning of the application to use
AnnaBridge 161:aa5281ff4a02 224 * the SPDIF driver. Otherwise, accessing the SPDIF module can cause a hard fault
AnnaBridge 161:aa5281ff4a02 225 * because the clock is not enabled.
AnnaBridge 161:aa5281ff4a02 226 *
AnnaBridge 161:aa5281ff4a02 227 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 228 * @param config SPDIF configuration structure.
AnnaBridge 161:aa5281ff4a02 229 */
AnnaBridge 161:aa5281ff4a02 230 void SPDIF_Init(SPDIF_Type *base, const spdif_config_t *config);
AnnaBridge 161:aa5281ff4a02 231
AnnaBridge 161:aa5281ff4a02 232 /*!
AnnaBridge 161:aa5281ff4a02 233 * @brief Sets the SPDIF configuration structure to default values.
AnnaBridge 161:aa5281ff4a02 234 *
AnnaBridge 161:aa5281ff4a02 235 * This API initializes the configuration structure for use in SPDIF_Init.
AnnaBridge 161:aa5281ff4a02 236 * The initialized structure can remain unchanged in SPDIF_Init, or it can be modified
AnnaBridge 161:aa5281ff4a02 237 * before calling SPDIF_Init.
AnnaBridge 161:aa5281ff4a02 238 * This is an example.
AnnaBridge 161:aa5281ff4a02 239 @code
AnnaBridge 161:aa5281ff4a02 240 spdif_config_t config;
AnnaBridge 161:aa5281ff4a02 241 SPDIF_GetDefaultConfig(&config);
AnnaBridge 161:aa5281ff4a02 242 @endcode
AnnaBridge 161:aa5281ff4a02 243 *
AnnaBridge 161:aa5281ff4a02 244 * @param config pointer to master configuration structure
AnnaBridge 161:aa5281ff4a02 245 */
AnnaBridge 161:aa5281ff4a02 246 void SPDIF_GetDefaultConfig(spdif_config_t *config);
AnnaBridge 161:aa5281ff4a02 247
AnnaBridge 161:aa5281ff4a02 248 /*!
AnnaBridge 161:aa5281ff4a02 249 * @brief De-initializes the SPDIF peripheral.
AnnaBridge 161:aa5281ff4a02 250 *
AnnaBridge 161:aa5281ff4a02 251 * This API gates the SPDIF clock. The SPDIF module can't operate unless SPDIF_Init is called to enable the clock.
AnnaBridge 161:aa5281ff4a02 252 *
AnnaBridge 161:aa5281ff4a02 253 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 254 */
AnnaBridge 161:aa5281ff4a02 255 void SPDIF_Deinit(SPDIF_Type *base);
AnnaBridge 161:aa5281ff4a02 256
AnnaBridge 161:aa5281ff4a02 257 /*!
AnnaBridge 161:aa5281ff4a02 258 * @brief Resets the SPDIF Tx.
AnnaBridge 161:aa5281ff4a02 259 *
AnnaBridge 161:aa5281ff4a02 260 * This function makes Tx FIFO in reset mode.
AnnaBridge 161:aa5281ff4a02 261 *
AnnaBridge 161:aa5281ff4a02 262 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 263 */
AnnaBridge 161:aa5281ff4a02 264 static inline void SPDIF_TxFIFOReset(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 265 {
AnnaBridge 161:aa5281ff4a02 266 base->SCR |= SPDIF_SCR_RXFIFO_RST_MASK;
AnnaBridge 161:aa5281ff4a02 267 }
AnnaBridge 161:aa5281ff4a02 268
AnnaBridge 161:aa5281ff4a02 269 /*!
AnnaBridge 161:aa5281ff4a02 270 * @brief Resets the SPDIF Rx.
AnnaBridge 161:aa5281ff4a02 271 *
AnnaBridge 161:aa5281ff4a02 272 * This function enables the software reset and FIFO reset of SPDIF Rx. After reset, clear the reset bit.
AnnaBridge 161:aa5281ff4a02 273 *
AnnaBridge 161:aa5281ff4a02 274 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 275 */
AnnaBridge 161:aa5281ff4a02 276 static inline void SPDIF_RxFIFOReset(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 277 {
AnnaBridge 161:aa5281ff4a02 278 base->SCR |= SPDIF_SCR_RXFIFO_RST_MASK;
AnnaBridge 161:aa5281ff4a02 279 }
AnnaBridge 161:aa5281ff4a02 280
AnnaBridge 161:aa5281ff4a02 281 /*!
AnnaBridge 161:aa5281ff4a02 282 * @brief Enables/disables the SPDIF Tx.
AnnaBridge 161:aa5281ff4a02 283 *
AnnaBridge 161:aa5281ff4a02 284 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 285 * @param enable True means enable SPDIF Tx, false means disable.
AnnaBridge 161:aa5281ff4a02 286 */
AnnaBridge 161:aa5281ff4a02 287 void SPDIF_TxEnable(SPDIF_Type *base, bool enable);
AnnaBridge 161:aa5281ff4a02 288
AnnaBridge 161:aa5281ff4a02 289 /*!
AnnaBridge 161:aa5281ff4a02 290 * @brief Enables/disables the SPDIF Rx.
AnnaBridge 161:aa5281ff4a02 291 *
AnnaBridge 161:aa5281ff4a02 292 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 293 * @param enable True means enable SPDIF Rx, false means disable.
AnnaBridge 161:aa5281ff4a02 294 */
AnnaBridge 161:aa5281ff4a02 295 static inline void SPDIF_RxEnable(SPDIF_Type *base, bool enable)
AnnaBridge 161:aa5281ff4a02 296 {
AnnaBridge 161:aa5281ff4a02 297 if (enable)
AnnaBridge 161:aa5281ff4a02 298 {
AnnaBridge 161:aa5281ff4a02 299 /* Open Rx FIFO */
AnnaBridge 161:aa5281ff4a02 300 base->SCR &= ~(SPDIF_SCR_RXFIFO_CTRL_MASK | SPDIF_SCR_RXFIFO_OFF_ON_MASK);
AnnaBridge 161:aa5281ff4a02 301 }
AnnaBridge 161:aa5281ff4a02 302 else
AnnaBridge 161:aa5281ff4a02 303 {
AnnaBridge 161:aa5281ff4a02 304 base->SCR |= SPDIF_SCR_RXFIFO_OFF_ON_MASK;
AnnaBridge 161:aa5281ff4a02 305 }
AnnaBridge 161:aa5281ff4a02 306 }
AnnaBridge 161:aa5281ff4a02 307
AnnaBridge 161:aa5281ff4a02 308 /*! @} */
AnnaBridge 161:aa5281ff4a02 309
AnnaBridge 161:aa5281ff4a02 310 /*!
AnnaBridge 161:aa5281ff4a02 311 * @name Status
AnnaBridge 161:aa5281ff4a02 312 * @{
AnnaBridge 161:aa5281ff4a02 313 */
AnnaBridge 161:aa5281ff4a02 314
AnnaBridge 161:aa5281ff4a02 315 /*!
AnnaBridge 161:aa5281ff4a02 316 * @brief Gets the SPDIF status flag state.
AnnaBridge 161:aa5281ff4a02 317 *
AnnaBridge 161:aa5281ff4a02 318 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 319 * @return SPDIF status flag value. Use the _spdif_interrupt_enable_t to get the status value needed.
AnnaBridge 161:aa5281ff4a02 320 */
AnnaBridge 161:aa5281ff4a02 321 static inline uint32_t SPDIF_GetStatusFlag(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 322 {
AnnaBridge 161:aa5281ff4a02 323 return base->SIS;
AnnaBridge 161:aa5281ff4a02 324 }
AnnaBridge 161:aa5281ff4a02 325
AnnaBridge 161:aa5281ff4a02 326 /*!
AnnaBridge 161:aa5281ff4a02 327 * @brief Clears the SPDIF status flag state.
AnnaBridge 161:aa5281ff4a02 328 *
AnnaBridge 161:aa5281ff4a02 329 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 330 * @param mask State mask. It can be a combination of the _spdif_interrupt_enable_t member. Notice these members
AnnaBridge 161:aa5281ff4a02 331 * cannot be included, as these flags cannot be cleared by writing 1 to these bits:
AnnaBridge 161:aa5281ff4a02 332 * @arg kSPDIF_UChannelReceiveRegisterFull
AnnaBridge 161:aa5281ff4a02 333 * @arg kSPDIF_QChannelReceiveRegisterFull
AnnaBridge 161:aa5281ff4a02 334 * @arg kSPDIF_TxFIFOEmpty
AnnaBridge 161:aa5281ff4a02 335 * @arg kSPDIF_RxFIFOFull
AnnaBridge 161:aa5281ff4a02 336 */
AnnaBridge 161:aa5281ff4a02 337 static inline void SPDIF_ClearStatusFlags(SPDIF_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 338 {
AnnaBridge 161:aa5281ff4a02 339 base->SIC = mask;
AnnaBridge 161:aa5281ff4a02 340 }
AnnaBridge 161:aa5281ff4a02 341
AnnaBridge 161:aa5281ff4a02 342 /*! @} */
AnnaBridge 161:aa5281ff4a02 343
AnnaBridge 161:aa5281ff4a02 344 /*!
AnnaBridge 161:aa5281ff4a02 345 * @name Interrupts
AnnaBridge 161:aa5281ff4a02 346 * @{
AnnaBridge 161:aa5281ff4a02 347 */
AnnaBridge 161:aa5281ff4a02 348
AnnaBridge 161:aa5281ff4a02 349 /*!
AnnaBridge 161:aa5281ff4a02 350 * @brief Enables the SPDIF Tx interrupt requests.
AnnaBridge 161:aa5281ff4a02 351 *
AnnaBridge 161:aa5281ff4a02 352 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 353 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 354 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 355 * @arg kSPDIF_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 356 * @arg kSPDIF_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 357 * @arg kSPDIF_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 358 * @arg kSPDIF_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 359 * @arg kSPDIF_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 360 */
AnnaBridge 161:aa5281ff4a02 361 static inline void SPDIF_EnableInterrupts(SPDIF_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 362 {
AnnaBridge 161:aa5281ff4a02 363 base->SIE |= mask;
AnnaBridge 161:aa5281ff4a02 364 }
AnnaBridge 161:aa5281ff4a02 365
AnnaBridge 161:aa5281ff4a02 366 /*!
AnnaBridge 161:aa5281ff4a02 367 * @brief Disables the SPDIF Tx interrupt requests.
AnnaBridge 161:aa5281ff4a02 368 *
AnnaBridge 161:aa5281ff4a02 369 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 370 * @param mask interrupt source
AnnaBridge 161:aa5281ff4a02 371 * The parameter can be a combination of the following sources if defined.
AnnaBridge 161:aa5281ff4a02 372 * @arg kSPDIF_WordStartInterruptEnable
AnnaBridge 161:aa5281ff4a02 373 * @arg kSPDIF_SyncErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 374 * @arg kSPDIF_FIFOWarningInterruptEnable
AnnaBridge 161:aa5281ff4a02 375 * @arg kSPDIF_FIFORequestInterruptEnable
AnnaBridge 161:aa5281ff4a02 376 * @arg kSPDIF_FIFOErrorInterruptEnable
AnnaBridge 161:aa5281ff4a02 377 */
AnnaBridge 161:aa5281ff4a02 378 static inline void SPDIF_DisableInterrupts(SPDIF_Type *base, uint32_t mask)
AnnaBridge 161:aa5281ff4a02 379 {
AnnaBridge 161:aa5281ff4a02 380 base->SIE &= ~mask;
AnnaBridge 161:aa5281ff4a02 381 }
AnnaBridge 161:aa5281ff4a02 382
AnnaBridge 161:aa5281ff4a02 383 /*! @} */
AnnaBridge 161:aa5281ff4a02 384
AnnaBridge 161:aa5281ff4a02 385 /*!
AnnaBridge 161:aa5281ff4a02 386 * @name DMA Control
AnnaBridge 161:aa5281ff4a02 387 * @{
AnnaBridge 161:aa5281ff4a02 388 */
AnnaBridge 161:aa5281ff4a02 389
AnnaBridge 161:aa5281ff4a02 390 /*!
AnnaBridge 161:aa5281ff4a02 391 * @brief Enables/disables the SPDIF DMA requests.
AnnaBridge 161:aa5281ff4a02 392 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 393 * @param mask SPDIF DMA enable mask, The parameter can be a combination of the following sources if defined
AnnaBridge 161:aa5281ff4a02 394 * @arg kSPDIF_RxDMAEnable
AnnaBridge 161:aa5281ff4a02 395 * @arg kSPDIF_TxDMAEnable
AnnaBridge 161:aa5281ff4a02 396 * @param enable True means enable DMA, false means disable DMA.
AnnaBridge 161:aa5281ff4a02 397 */
AnnaBridge 161:aa5281ff4a02 398 static inline void SPDIF_EnableDMA(SPDIF_Type *base, uint32_t mask, bool enable)
AnnaBridge 161:aa5281ff4a02 399 {
AnnaBridge 161:aa5281ff4a02 400 if (enable)
AnnaBridge 161:aa5281ff4a02 401 {
AnnaBridge 161:aa5281ff4a02 402 base->SCR |= mask;
AnnaBridge 161:aa5281ff4a02 403 }
AnnaBridge 161:aa5281ff4a02 404 else
AnnaBridge 161:aa5281ff4a02 405 {
AnnaBridge 161:aa5281ff4a02 406 base->SCR &= ~mask;
AnnaBridge 161:aa5281ff4a02 407 }
AnnaBridge 161:aa5281ff4a02 408 }
AnnaBridge 161:aa5281ff4a02 409
AnnaBridge 161:aa5281ff4a02 410 /*!
AnnaBridge 161:aa5281ff4a02 411 * @brief Gets the SPDIF Tx left data register address.
AnnaBridge 161:aa5281ff4a02 412 *
AnnaBridge 161:aa5281ff4a02 413 * This API is used to provide a transfer address for the SPDIF DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 414 *
AnnaBridge 161:aa5281ff4a02 415 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 416 * @return data register address.
AnnaBridge 161:aa5281ff4a02 417 */
AnnaBridge 161:aa5281ff4a02 418 static inline uint32_t SPDIF_TxGetLeftDataRegisterAddress(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 419 {
AnnaBridge 161:aa5281ff4a02 420 return (uint32_t)(&(base->STL));
AnnaBridge 161:aa5281ff4a02 421 }
AnnaBridge 161:aa5281ff4a02 422
AnnaBridge 161:aa5281ff4a02 423 /*!
AnnaBridge 161:aa5281ff4a02 424 * @brief Gets the SPDIF Tx right data register address.
AnnaBridge 161:aa5281ff4a02 425 *
AnnaBridge 161:aa5281ff4a02 426 * This API is used to provide a transfer address for the SPDIF DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 427 *
AnnaBridge 161:aa5281ff4a02 428 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 429 * @return data register address.
AnnaBridge 161:aa5281ff4a02 430 */
AnnaBridge 161:aa5281ff4a02 431 static inline uint32_t SPDIF_TxGetRightDataRegisterAddress(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 432 {
AnnaBridge 161:aa5281ff4a02 433 return (uint32_t)(&(base->STR));
AnnaBridge 161:aa5281ff4a02 434 }
AnnaBridge 161:aa5281ff4a02 435
AnnaBridge 161:aa5281ff4a02 436 /*!
AnnaBridge 161:aa5281ff4a02 437 * @brief Gets the SPDIF Rx left data register address.
AnnaBridge 161:aa5281ff4a02 438 *
AnnaBridge 161:aa5281ff4a02 439 * This API is used to provide a transfer address for the SPDIF DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 440 *
AnnaBridge 161:aa5281ff4a02 441 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 442 * @return data register address.
AnnaBridge 161:aa5281ff4a02 443 */
AnnaBridge 161:aa5281ff4a02 444 static inline uint32_t SPDIF_RxGetLeftDataRegisterAddress(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 445 {
AnnaBridge 161:aa5281ff4a02 446 return (uint32_t)(&(base->SRL));
AnnaBridge 161:aa5281ff4a02 447 }
AnnaBridge 161:aa5281ff4a02 448
AnnaBridge 161:aa5281ff4a02 449 /*!
AnnaBridge 161:aa5281ff4a02 450 * @brief Gets the SPDIF Rx right data register address.
AnnaBridge 161:aa5281ff4a02 451 *
AnnaBridge 161:aa5281ff4a02 452 * This API is used to provide a transfer address for the SPDIF DMA transfer configuration.
AnnaBridge 161:aa5281ff4a02 453 *
AnnaBridge 161:aa5281ff4a02 454 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 455 * @return data register address.
AnnaBridge 161:aa5281ff4a02 456 */
AnnaBridge 161:aa5281ff4a02 457 static inline uint32_t SPDIF_RxGetRightDataRegisterAddress(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 458 {
AnnaBridge 161:aa5281ff4a02 459 return (uint32_t)(&(base->SRR));
AnnaBridge 161:aa5281ff4a02 460 }
AnnaBridge 161:aa5281ff4a02 461
AnnaBridge 161:aa5281ff4a02 462 /*! @} */
AnnaBridge 161:aa5281ff4a02 463
AnnaBridge 161:aa5281ff4a02 464 /*!
AnnaBridge 161:aa5281ff4a02 465 * @name Bus Operations
AnnaBridge 161:aa5281ff4a02 466 * @{
AnnaBridge 161:aa5281ff4a02 467 */
AnnaBridge 161:aa5281ff4a02 468
AnnaBridge 161:aa5281ff4a02 469 /*!
AnnaBridge 161:aa5281ff4a02 470 * @brief Configures the SPDIF Tx sample rate.
AnnaBridge 161:aa5281ff4a02 471 *
AnnaBridge 161:aa5281ff4a02 472 * The audio format can be changed at run-time. This function configures the sample rate.
AnnaBridge 161:aa5281ff4a02 473 *
AnnaBridge 161:aa5281ff4a02 474 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 475 * @param sampleRate_Hz SPDIF sample rate frequency in Hz.
AnnaBridge 161:aa5281ff4a02 476 * @param sourceClockFreq_Hz SPDIF tx clock source frequency in Hz.
AnnaBridge 161:aa5281ff4a02 477 */
AnnaBridge 161:aa5281ff4a02 478 void SPDIF_TxSetSampleRate(SPDIF_Type *base, uint32_t sampleRate_Hz, uint32_t sourceClockFreq_Hz);
AnnaBridge 161:aa5281ff4a02 479
AnnaBridge 161:aa5281ff4a02 480 /*!
AnnaBridge 161:aa5281ff4a02 481 * @brief Configures the SPDIF Rx audio format.
AnnaBridge 161:aa5281ff4a02 482 *
AnnaBridge 161:aa5281ff4a02 483 * The audio format can be changed at run-time. This function configures the sample rate and audio data
AnnaBridge 161:aa5281ff4a02 484 * format to be transferred.
AnnaBridge 161:aa5281ff4a02 485 *
AnnaBridge 161:aa5281ff4a02 486 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 487 * @param clockSourceFreq_Hz SPDIF system clock frequency in hz.
AnnaBridge 161:aa5281ff4a02 488 */
AnnaBridge 161:aa5281ff4a02 489 uint32_t SPDIF_GetRxSampleRate(SPDIF_Type *base, uint32_t clockSourceFreq_Hz);
AnnaBridge 161:aa5281ff4a02 490
AnnaBridge 161:aa5281ff4a02 491 /*!
AnnaBridge 161:aa5281ff4a02 492 * @brief Sends data using a blocking method.
AnnaBridge 161:aa5281ff4a02 493 *
AnnaBridge 161:aa5281ff4a02 494 * @note This function blocks by polling until data is ready to be sent.
AnnaBridge 161:aa5281ff4a02 495 *
AnnaBridge 161:aa5281ff4a02 496 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 497 * @param buffer Pointer to the data to be written.
AnnaBridge 161:aa5281ff4a02 498 * @param size Bytes to be written.
AnnaBridge 161:aa5281ff4a02 499 */
AnnaBridge 161:aa5281ff4a02 500 void SPDIF_WriteBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size);
AnnaBridge 161:aa5281ff4a02 501
AnnaBridge 161:aa5281ff4a02 502 /*!
AnnaBridge 161:aa5281ff4a02 503 * @brief Writes data into SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 504 *
AnnaBridge 161:aa5281ff4a02 505 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 506 * @param data Data needs to be written.
AnnaBridge 161:aa5281ff4a02 507 */
AnnaBridge 161:aa5281ff4a02 508 static inline void SPDIF_WriteLeftData(SPDIF_Type *base, uint32_t data)
AnnaBridge 161:aa5281ff4a02 509 {
AnnaBridge 161:aa5281ff4a02 510 base->STL = data;
AnnaBridge 161:aa5281ff4a02 511 }
AnnaBridge 161:aa5281ff4a02 512
AnnaBridge 161:aa5281ff4a02 513 /*!
AnnaBridge 161:aa5281ff4a02 514 * @brief Writes data into SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 515 *
AnnaBridge 161:aa5281ff4a02 516 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 517 * @param data Data needs to be written.
AnnaBridge 161:aa5281ff4a02 518 */
AnnaBridge 161:aa5281ff4a02 519 static inline void SPDIF_WriteRightData(SPDIF_Type *base, uint32_t data)
AnnaBridge 161:aa5281ff4a02 520 {
AnnaBridge 161:aa5281ff4a02 521 base->STR = data;
AnnaBridge 161:aa5281ff4a02 522 }
AnnaBridge 161:aa5281ff4a02 523
AnnaBridge 161:aa5281ff4a02 524 /*!
AnnaBridge 161:aa5281ff4a02 525 * @brief Writes data into SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 526 *
AnnaBridge 161:aa5281ff4a02 527 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 528 * @param data Data needs to be written.
AnnaBridge 161:aa5281ff4a02 529 */
AnnaBridge 161:aa5281ff4a02 530 static inline void SPDIF_WriteChannelStatusHigh(SPDIF_Type *base, uint32_t data)
AnnaBridge 161:aa5281ff4a02 531 {
AnnaBridge 161:aa5281ff4a02 532 base->STCSCH = data;
AnnaBridge 161:aa5281ff4a02 533 }
AnnaBridge 161:aa5281ff4a02 534
AnnaBridge 161:aa5281ff4a02 535 /*!
AnnaBridge 161:aa5281ff4a02 536 * @brief Writes data into SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 537 *
AnnaBridge 161:aa5281ff4a02 538 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 539 * @param data Data needs to be written.
AnnaBridge 161:aa5281ff4a02 540 */
AnnaBridge 161:aa5281ff4a02 541 static inline void SPDIF_WriteChannelStatusLow(SPDIF_Type *base, uint32_t data)
AnnaBridge 161:aa5281ff4a02 542 {
AnnaBridge 161:aa5281ff4a02 543 base->STCSCL = data;
AnnaBridge 161:aa5281ff4a02 544 }
AnnaBridge 161:aa5281ff4a02 545
AnnaBridge 161:aa5281ff4a02 546 /*!
AnnaBridge 161:aa5281ff4a02 547 * @brief Receives data using a blocking method.
AnnaBridge 161:aa5281ff4a02 548 *
AnnaBridge 161:aa5281ff4a02 549 * @note This function blocks by polling until data is ready to be sent.
AnnaBridge 161:aa5281ff4a02 550 *
AnnaBridge 161:aa5281ff4a02 551 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 552 * @param buffer Pointer to the data to be read.
AnnaBridge 161:aa5281ff4a02 553 * @param size Bytes to be read.
AnnaBridge 161:aa5281ff4a02 554 */
AnnaBridge 161:aa5281ff4a02 555 void SPDIF_ReadBlocking(SPDIF_Type *base, uint8_t *buffer, uint32_t size);
AnnaBridge 161:aa5281ff4a02 556
AnnaBridge 161:aa5281ff4a02 557 /*!
AnnaBridge 161:aa5281ff4a02 558 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 559 *
AnnaBridge 161:aa5281ff4a02 560 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 561 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 562 */
AnnaBridge 161:aa5281ff4a02 563 static inline uint32_t SPDIF_ReadLeftData(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 564 {
AnnaBridge 161:aa5281ff4a02 565 return base->SRL;
AnnaBridge 161:aa5281ff4a02 566 }
AnnaBridge 161:aa5281ff4a02 567
AnnaBridge 161:aa5281ff4a02 568 /*!
AnnaBridge 161:aa5281ff4a02 569 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 570 *.
AnnaBridge 161:aa5281ff4a02 571
AnnaBridge 161:aa5281ff4a02 572 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 573 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 574 */
AnnaBridge 161:aa5281ff4a02 575 static inline uint32_t SPDIF_ReadRightData(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 576 {
AnnaBridge 161:aa5281ff4a02 577 return base->SRR;
AnnaBridge 161:aa5281ff4a02 578 }
AnnaBridge 161:aa5281ff4a02 579
AnnaBridge 161:aa5281ff4a02 580 /*!
AnnaBridge 161:aa5281ff4a02 581 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 582 *
AnnaBridge 161:aa5281ff4a02 583 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 584 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 585 */
AnnaBridge 161:aa5281ff4a02 586 static inline uint32_t SPDIF_ReadChannelStatusHigh(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 587 {
AnnaBridge 161:aa5281ff4a02 588 return base->SRCSH;
AnnaBridge 161:aa5281ff4a02 589 }
AnnaBridge 161:aa5281ff4a02 590
AnnaBridge 161:aa5281ff4a02 591 /*!
AnnaBridge 161:aa5281ff4a02 592 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 593 *.
AnnaBridge 161:aa5281ff4a02 594
AnnaBridge 161:aa5281ff4a02 595 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 596 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 597 */
AnnaBridge 161:aa5281ff4a02 598 static inline uint32_t SPDIF_ReadChannelStatusLow(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 599 {
AnnaBridge 161:aa5281ff4a02 600 return base->SRCSL;
AnnaBridge 161:aa5281ff4a02 601 }
AnnaBridge 161:aa5281ff4a02 602
AnnaBridge 161:aa5281ff4a02 603 /*!
AnnaBridge 161:aa5281ff4a02 604 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 605 *
AnnaBridge 161:aa5281ff4a02 606 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 607 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 608 */
AnnaBridge 161:aa5281ff4a02 609 static inline uint32_t SPDIF_ReadQChannel(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 610 {
AnnaBridge 161:aa5281ff4a02 611 return base->SRQ;
AnnaBridge 161:aa5281ff4a02 612 }
AnnaBridge 161:aa5281ff4a02 613
AnnaBridge 161:aa5281ff4a02 614 /*!
AnnaBridge 161:aa5281ff4a02 615 * @brief Reads data from the SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 616 *.
AnnaBridge 161:aa5281ff4a02 617
AnnaBridge 161:aa5281ff4a02 618 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 619 * @return Data in SPDIF FIFO.
AnnaBridge 161:aa5281ff4a02 620 */
AnnaBridge 161:aa5281ff4a02 621 static inline uint32_t SPDIF_ReadUChannel(SPDIF_Type *base)
AnnaBridge 161:aa5281ff4a02 622 {
AnnaBridge 161:aa5281ff4a02 623 return base->SRU;
AnnaBridge 161:aa5281ff4a02 624 }
AnnaBridge 161:aa5281ff4a02 625
AnnaBridge 161:aa5281ff4a02 626 /*! @} */
AnnaBridge 161:aa5281ff4a02 627
AnnaBridge 161:aa5281ff4a02 628 /*!
AnnaBridge 161:aa5281ff4a02 629 * @name Transactional
AnnaBridge 161:aa5281ff4a02 630 * @{
AnnaBridge 161:aa5281ff4a02 631 */
AnnaBridge 161:aa5281ff4a02 632
AnnaBridge 161:aa5281ff4a02 633 /*!
AnnaBridge 161:aa5281ff4a02 634 * @brief Initializes the SPDIF Tx handle.
AnnaBridge 161:aa5281ff4a02 635 *
AnnaBridge 161:aa5281ff4a02 636 * This function initializes the Tx handle for the SPDIF Tx transactional APIs. Call
AnnaBridge 161:aa5281ff4a02 637 * this function once to get the handle initialized.
AnnaBridge 161:aa5281ff4a02 638 *
AnnaBridge 161:aa5281ff4a02 639 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 640 * @param handle SPDIF handle pointer.
AnnaBridge 161:aa5281ff4a02 641 * @param callback Pointer to the user callback function.
AnnaBridge 161:aa5281ff4a02 642 * @param userData User parameter passed to the callback function
AnnaBridge 161:aa5281ff4a02 643 */
AnnaBridge 161:aa5281ff4a02 644 void SPDIF_TransferTxCreateHandle(SPDIF_Type *base,
AnnaBridge 161:aa5281ff4a02 645 spdif_handle_t *handle,
AnnaBridge 161:aa5281ff4a02 646 spdif_transfer_callback_t callback,
AnnaBridge 161:aa5281ff4a02 647 void *userData);
AnnaBridge 161:aa5281ff4a02 648
AnnaBridge 161:aa5281ff4a02 649 /*!
AnnaBridge 161:aa5281ff4a02 650 * @brief Initializes the SPDIF Rx handle.
AnnaBridge 161:aa5281ff4a02 651 *
AnnaBridge 161:aa5281ff4a02 652 * This function initializes the Rx handle for the SPDIF Rx transactional APIs. Call
AnnaBridge 161:aa5281ff4a02 653 * this function once to get the handle initialized.
AnnaBridge 161:aa5281ff4a02 654 *
AnnaBridge 161:aa5281ff4a02 655 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 656 * @param handle SPDIF handle pointer.
AnnaBridge 161:aa5281ff4a02 657 * @param callback Pointer to the user callback function.
AnnaBridge 161:aa5281ff4a02 658 * @param userData User parameter passed to the callback function.
AnnaBridge 161:aa5281ff4a02 659 */
AnnaBridge 161:aa5281ff4a02 660 void SPDIF_TransferRxCreateHandle(SPDIF_Type *base,
AnnaBridge 161:aa5281ff4a02 661 spdif_handle_t *handle,
AnnaBridge 161:aa5281ff4a02 662 spdif_transfer_callback_t callback,
AnnaBridge 161:aa5281ff4a02 663 void *userData);
AnnaBridge 161:aa5281ff4a02 664
AnnaBridge 161:aa5281ff4a02 665 /*!
AnnaBridge 161:aa5281ff4a02 666 * @brief Performs an interrupt non-blocking send transfer on SPDIF.
AnnaBridge 161:aa5281ff4a02 667 *
AnnaBridge 161:aa5281ff4a02 668 * @note This API returns immediately after the transfer initiates.
AnnaBridge 161:aa5281ff4a02 669 * Call the SPDIF_TxGetTransferStatusIRQ to poll the transfer status and check whether
AnnaBridge 161:aa5281ff4a02 670 * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer
AnnaBridge 161:aa5281ff4a02 671 * is finished.
AnnaBridge 161:aa5281ff4a02 672 *
AnnaBridge 161:aa5281ff4a02 673 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 674 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 675 * @param xfer Pointer to the spdif_transfer_t structure.
AnnaBridge 161:aa5281ff4a02 676 * @retval kStatus_Success Successfully started the data receive.
AnnaBridge 161:aa5281ff4a02 677 * @retval kStatus_SPDIF_TxBusy Previous receive still not finished.
AnnaBridge 161:aa5281ff4a02 678 * @retval kStatus_InvalidArgument The input parameter is invalid.
AnnaBridge 161:aa5281ff4a02 679 */
AnnaBridge 161:aa5281ff4a02 680 status_t SPDIF_TransferSendNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer);
AnnaBridge 161:aa5281ff4a02 681
AnnaBridge 161:aa5281ff4a02 682 /*!
AnnaBridge 161:aa5281ff4a02 683 * @brief Performs an interrupt non-blocking receive transfer on SPDIF.
AnnaBridge 161:aa5281ff4a02 684 *
AnnaBridge 161:aa5281ff4a02 685 * @note This API returns immediately after the transfer initiates.
AnnaBridge 161:aa5281ff4a02 686 * Call the SPDIF_RxGetTransferStatusIRQ to poll the transfer status and check whether
AnnaBridge 161:aa5281ff4a02 687 * the transfer is finished. If the return status is not kStatus_SPDIF_Busy, the transfer
AnnaBridge 161:aa5281ff4a02 688 * is finished.
AnnaBridge 161:aa5281ff4a02 689 *
AnnaBridge 161:aa5281ff4a02 690 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 691 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 692 * @param xfer Pointer to the spdif_transfer_t structure.
AnnaBridge 161:aa5281ff4a02 693 * @retval kStatus_Success Successfully started the data receive.
AnnaBridge 161:aa5281ff4a02 694 * @retval kStatus_SPDIF_RxBusy Previous receive still not finished.
AnnaBridge 161:aa5281ff4a02 695 * @retval kStatus_InvalidArgument The input parameter is invalid.
AnnaBridge 161:aa5281ff4a02 696 */
AnnaBridge 161:aa5281ff4a02 697 status_t SPDIF_TransferReceiveNonBlocking(SPDIF_Type *base, spdif_handle_t *handle, spdif_transfer_t *xfer);
AnnaBridge 161:aa5281ff4a02 698
AnnaBridge 161:aa5281ff4a02 699 /*!
AnnaBridge 161:aa5281ff4a02 700 * @brief Gets a set byte count.
AnnaBridge 161:aa5281ff4a02 701 *
AnnaBridge 161:aa5281ff4a02 702 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 703 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 704 * @param count Bytes count sent.
AnnaBridge 161:aa5281ff4a02 705 * @retval kStatus_Success Succeed get the transfer count.
AnnaBridge 161:aa5281ff4a02 706 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
AnnaBridge 161:aa5281ff4a02 707 */
AnnaBridge 161:aa5281ff4a02 708 status_t SPDIF_TransferGetSendCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count);
AnnaBridge 161:aa5281ff4a02 709
AnnaBridge 161:aa5281ff4a02 710 /*!
AnnaBridge 161:aa5281ff4a02 711 * @brief Gets a received byte count.
AnnaBridge 161:aa5281ff4a02 712 *
AnnaBridge 161:aa5281ff4a02 713 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 714 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 715 * @param count Bytes count received.
AnnaBridge 161:aa5281ff4a02 716 * @retval kStatus_Success Succeed get the transfer count.
AnnaBridge 161:aa5281ff4a02 717 * @retval kStatus_NoTransferInProgress There is not a non-blocking transaction currently in progress.
AnnaBridge 161:aa5281ff4a02 718 */
AnnaBridge 161:aa5281ff4a02 719 status_t SPDIF_TransferGetReceiveCount(SPDIF_Type *base, spdif_handle_t *handle, size_t *count);
AnnaBridge 161:aa5281ff4a02 720
AnnaBridge 161:aa5281ff4a02 721 /*!
AnnaBridge 161:aa5281ff4a02 722 * @brief Aborts the current send.
AnnaBridge 161:aa5281ff4a02 723 *
AnnaBridge 161:aa5281ff4a02 724 * @note This API can be called any time when an interrupt non-blocking transfer initiates
AnnaBridge 161:aa5281ff4a02 725 * to abort the transfer early.
AnnaBridge 161:aa5281ff4a02 726 *
AnnaBridge 161:aa5281ff4a02 727 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 728 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 729 */
AnnaBridge 161:aa5281ff4a02 730 void SPDIF_TransferAbortSend(SPDIF_Type *base, spdif_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 731
AnnaBridge 161:aa5281ff4a02 732 /*!
AnnaBridge 170:e95d10626187 733 * @brief Aborts the current IRQ receive.
AnnaBridge 161:aa5281ff4a02 734 *
AnnaBridge 161:aa5281ff4a02 735 * @note This API can be called when an interrupt non-blocking transfer initiates
AnnaBridge 161:aa5281ff4a02 736 * to abort the transfer early.
AnnaBridge 161:aa5281ff4a02 737 *
AnnaBridge 161:aa5281ff4a02 738 * @param base SPDIF base pointer
AnnaBridge 161:aa5281ff4a02 739 * @param handle Pointer to the spdif_handle_t structure which stores the transfer state.
AnnaBridge 161:aa5281ff4a02 740 */
AnnaBridge 161:aa5281ff4a02 741 void SPDIF_TransferAbortReceive(SPDIF_Type *base, spdif_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 742
AnnaBridge 161:aa5281ff4a02 743 /*!
AnnaBridge 161:aa5281ff4a02 744 * @brief Tx interrupt handler.
AnnaBridge 161:aa5281ff4a02 745 *
AnnaBridge 161:aa5281ff4a02 746 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 747 * @param handle Pointer to the spdif_handle_t structure.
AnnaBridge 161:aa5281ff4a02 748 */
AnnaBridge 161:aa5281ff4a02 749 void SPDIF_TransferTxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 750
AnnaBridge 161:aa5281ff4a02 751 /*!
AnnaBridge 161:aa5281ff4a02 752 * @brief Tx interrupt handler.
AnnaBridge 161:aa5281ff4a02 753 *
AnnaBridge 161:aa5281ff4a02 754 * @param base SPDIF base pointer.
AnnaBridge 161:aa5281ff4a02 755 * @param handle Pointer to the spdif_handle_t structure.
AnnaBridge 161:aa5281ff4a02 756 */
AnnaBridge 161:aa5281ff4a02 757 void SPDIF_TransferRxHandleIRQ(SPDIF_Type *base, spdif_handle_t *handle);
AnnaBridge 161:aa5281ff4a02 758
AnnaBridge 161:aa5281ff4a02 759 /*! @} */
AnnaBridge 161:aa5281ff4a02 760
AnnaBridge 161:aa5281ff4a02 761 #if defined(__cplusplus)
AnnaBridge 161:aa5281ff4a02 762 }
AnnaBridge 161:aa5281ff4a02 763 #endif /*_cplusplus*/
AnnaBridge 161:aa5281ff4a02 764
AnnaBridge 161:aa5281ff4a02 765 /*! @} */
AnnaBridge 161:aa5281ff4a02 766
AnnaBridge 161:aa5281ff4a02 767 #endif /* _FSL_SPDIF_H_ */