/**************************************************************************//** * @file wm_i2s.h * @author * @version * @date * @brief * * @copyright (c) 2014 Winner Microelectronics Co., Ltd. All rights reserved. *****************************************************************************/ #ifndef __WM_I2S_H #define __WM_I2S_H #ifdef __cplusplus extern "C" { #endif #include "wm_type_def.h" #include "wm_regs.h" #include "wm_osal.h" #include "misc.h" #include "wm_dma.h" #define I2S_CTRL_FORMAT_Pos (24) /*!< CTRL : FORMAT Position */ #define I2S_CTRL_FORMAT_MASK (3UL<CTRL |= I2S_CTRL_EN_MASK) /** * @brief Disable I2S module * */ #define TLS_I2S_DISABLE() (I2S->CTRL &= ~I2S_CTRL_EN_MASK) /** * @brief Enable clock of I2S module * */ #define TLS_I2S_CLK_ENABLE() \ do { \ tls_bitband_write(HR_CLK_BASE_ADDR, HR_CLK_I2S_GATE_Pos , 1); \ } while(0) /** * @brief Disnable clock of I2S module * */ #define TLS_I2S_CLK_DISABLE() \ do { \ tls_bitband_write(HR_CLK_BASE_ADDR, HR_CLK_I2S_GATE_Pos , 0); \ } while(0) /** * @brief Enable transmit of I2S module * */ #define TLS_I2S_TX_ENABLE() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_TXE_Pos, 1); \ } while(0) /** * @brief Disable transmit of I2S module * */ #define TLS_I2S_TX_DISABLE() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_TXE_Pos, 0); \ } while(0) /** * @brief Enable receive of I2S module * */ #define TLS_I2S_RX_ENABLE() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_RXE_Pos, 1); \ } while(0) /** * @brief Disable receive of I2S module * */ #define TLS_I2S_RX_DISABLE() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_RXE_Pos, 0); \ } while(0) /** * @brief Clear receive FIFO * */ #define TLS_I2S_RX_FIFO_CLEAR() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_RX_CLR_Pos, 1); \ } while(0) /** * @brief Clear transmit FIFO * */ #define TLS_I2S_TX_FIFO_CLEAR() \ do { \ tls_bitband_write(HR_I2S_CTRL, I2S_CTRL_TX_CLR_Pos, 1); \ } while(0) /** * @brief Enable transmit DMA request * */ #define TLS_I2S_TXDMA_ENABLE() (I2S->CTRL |= I2S_CTRL_TXDMA_MASK) /** * @brief Disnable transmit DMA request * */ #define TLS_I2S_TXDMA_DISABLE() (I2S->CTRL &= ~I2S_CTRL_TXDMA_MASK) /** * @brief Enable receive DMA request * */ #define TLS_I2S_RXDMA_ENABLE() (I2S->CTRL |= I2S_CTRL_RXDMA_MASK) /** * @brief Disnable receive DMA request * */ #define TLS_I2S_RXDMA_DISABLE() (I2S->CTRL &= ~I2S_CTRL_RXDMA_MASK) /** * @brief Left channel zero-cross detection enable * */ #define TLS_I2S_LZC_ENABLE() (I2S->CTRL |= I2S_CTRL_LZCEN_MASK) /** * @brief Left channel zero-cross detection disable * */ #define TLS_I2S_LZC_DISABLE() (I2S->CTRL &= ~I2S_CTRL_LZCEN_MASK) /** * @brief Right channel zero-cross detection enable * */ #define TLS_I2S_RZC_ENABLE() (I2S->CTRL |= I2S_CTRL_RZCEN_MASK) /** * @brief Right channel zero-cross detection disable * */ #define TLS_I2S_RZC_DISABLE() (I2S->CTRL &= ~I2S_CTRL_RZCEN_MASK) /** @brief Enable transmit mute * */ #define TLS_I2S_TX_MUTE_ENABLE() (I2S->CTRL |= I2S_CTRL_MUTE_MASK) /** * @brief Disable transmit mute * */ #define TLS_I2S_TX_MUTE_DISABLE() (I2S->CTRL &= ~ I2S_CTRL_MUTE_MASK) /** * @brief Set receive FIFO threshold level * @param[in] level The value set to Rx threshold level * */ static __inline__ void tls_i2s_set_rxth(uint8_t level) { if (level > 8) { level = 3; } I2S->CTRL &= ~ I2S_CTRL_RXTH_MASK; I2S->CTRL |= ((level - 1)< 8) level = 4; I2S->CTRL &= ~ I2S_CTRL_TXTH_MASK; I2S->CTRL |= (level<CTRL &= ~ I2S_CTRL_CHSEL_MASK; I2S->CTRL |= channel_sel; } /** * @brief Enables or disables the specified I2S interrupts * @param[in] i2s_int_mask specifies the I2S interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * - \ref I2S_INT_MASK_LZC * - \ref I2S_INT_MASK_RZC * - \ref I2S_INT_MASK_TXDONE * - \ref I2S_INT_MASK_TXTH * - \ref I2S_INT_MASK_TXOV * - \ref I2S_INT_MASK_TXUD * - \ref I2S_INT_MASK_RXDONE * - \ref I2S_INT_MASK_RXTH * - \ref I2S_INT_MASK_RXOV * - \ref I2S_INT_MASK_RXUD * @param[in] enable when set 1 disable interrupt, 0 enable * @retval None */ static __inline__ void tls_i2s_int_config(uint32_t i2s_int_mask, uint8_t enable) { if(enable) { I2S->INT_MASK &= ~i2s_int_mask; } else { I2S->INT_MASK |= i2s_int_mask; } } /** * @brief Enable master clock (MCLK). * @param[in] clock The target MCLK clock rate. * @retval actual MCLK clock rate * @details Set the master clock rate according to u32BusClock parameter and enable master clock output. * The actual master clock rate may be different from the target master clock rate. * The real master clock rate will be returned for reference. */ uint32_t tls_i2s_mclk_enable(uint32_t clock); /** * @brief disable master clock (MCLK). * */ void tls_i2s_mclk_disable(void); /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif /** __WM_I2S_H*/ /*** (C) COPYRIGHT 2014 Winner Microelectronics Co., Ltd. ***/