sdk-ameba-v4.0c_180328/component/soc/realtek/8711b/fwlib/include/rtl8711b_i2s.h

357 lines
12 KiB
C
Raw Normal View History

2019-04-02 08:34:25 +00:00
/**
******************************************************************************
* @file rtl8711b_i2s.h
* @author
* @version V1.0.0
* @date 2016-05-17
* @brief This file contains all the functions prototypes for the I2S firmware
* library.
******************************************************************************
* @attention
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
******************************************************************************
*/
#ifndef _RTL8710B_I2S_H_
#define _RTL8710B_I2S_H_
/** @addtogroup AmebaZ_Periph_Driver
* @{
*/
/** @defgroup I2S
* @brief I2S driver modules
* @{
*/
/** @addtogroup I2S
* @verbatim
*****************************************************************************************
* Introduction
*****************************************************************************************
* I2S:
* - Base Address: I2S_DEV
* - Source clk: 22.579MHz or 24.576MHz(default)
* - Sample rate: 8K, 16K, 24K, 32K, 48K, 96K, 7.35K, 14.7K, 22.05K, 29.4K, 44.1K, 88.2K
* - Sample bit: 16 bit, 24 bit
* - Page num & page size: Max page_num=4, Max page_size=16K byte
* - IRQ: I2S0_PCM0_IRQ
*
*****************************************************************************************
* PINMUX
*****************************************************************************************
* I2S:
* - S0: _PA_18(mck)/_PA_19(tx)/_PA_20(rx)/_PA_21(clk)/_PA_22(ws).
* - S1: _PB_4(mck)/_PB_5(tx)/_PB_6(ws)/_PA_31(clk)/_PA_24(rx).
*
*****************************************************************************************
* How to use I2S
*****************************************************************************************
* To use I2S peripheral, the following steps are mandatory:
*
* 1. Enable I2S power:
* LXBUS_FCTRL(ON).
*
* 2. Enable the I2S interface clock using
* RCC_PeriphClockCmd(APBPeriph_I2S0, APBPeriph_I2S0_CLOCK, ENABLE);
*
* 3. I2S pinmux:
* Pinmux_Config(Pin_Num, PINMUX_FUNCTION_I2S).
*
* 4. Fill the I2S_InitStruct with the desired parameters.
*
* 5. configure I2S with the corresponding configuration.
* I2S_Init(I2S_DEV, &I2S_Adapter.I2SInitStruct)
*
* 6. Activate the I2S peripheral:
* I2S_Cmd(I2S_DEV, ENABLE).
*
* 7. Configure interrupts:
* I2S_INTConfig()
*
* @note All other functions can be used separately to modify, if needed,
* a specific feature of the I2S
*****************************************************************************************
* @endverbatim
*/
/* Exported types ------------------------------------------------------------*/
/** @defgroup I2S_Exported_Types I2S Exported Types
* @{
*/
/**
* @brief I2S Init structure definition
*/
typedef struct {
u32 I2S_SlaveMode; /*!< Specifies the I2S operating mode
This parameter can be a value of @ref I2S_device_mode */
u32 I2S_WordLen; /*!< Specifies the I2S word length
This parameter can be a value of @ref I2S_word_length */
u32 I2S_Justify; /*!< Specifies the I2S digital interface format
This parameter can be a value of @ref I2S_format */
u32 I2S_EndianSwap; /*!< Specifies the I2S endian mode
This parameter can be a value of @ref I2S_endian_swap */
u32 I2S_ChNum; /*!< Specifies the I2S channel number
This parameter can be a value of @ref I2S_channel_number */
u32 I2S_PageNum; /*!< Specifies the I2S page number
This parameter must be set to a value in the 2~4 range */
u32 I2S_PageSize; /*!< Specifies the I2S page size
This parameter must be set to a value in the 1~4096 Word range */
u32 I2S_Rate; /*!< Specifies the I2S sample rate
This parameter can be a value of @ref I2S_sample_rate */
u32 I2S_TRxAct; /*!< Specifies the I2S transfer direction
This parameter can be a value of @ref I2S_direction */
u32 I2S_InterLoopback;/*!< Specifies the I2S internal/external loopback
This parameter must be set to a value 0(external) or 1(internal) */
} I2S_InitTypeDef;
/**
* @}
*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup I2S_Exported_Constants I2S Exported Constants
* @{
*/
/** @defgroup I2S_device_mode I2S Device Mode
* @{
*/
#define I2S_MASTER_MODE ((u32)0x00000000)
#define I2S_SLAVE_MODE ((u32)0x00000001)
#define IS_I2S_MODE(MODE) (((MODE) == I2S_MASTER_MODE) || \
((MODE) == I2S_SLAVE_MODE))
/**
* @}
*/
/** @defgroup I2S_word_length I2S Word Length
* @{
*/
#define I2S_WL_16 ((u32)0x00000000)
#define I2S_WL_24 ((u32)0x00000001)
#define IS_I2S_WORD_LEN(LEN) (((LEN) == I2S_WL_16) || \
((LEN) == I2S_WL_24))
/**
* @}
*/
/** @defgroup I2S_format I2S Interface Format
* @{
*/
#define I2S_JY_I2S ((u32)0x00000000)
#define I2S_JY_LEFT ((u32)0x00000001)
#define I2S_JY_RIGHT ((u32)0x00000002)
#define IS_I2S_JUSTIFY(FORMAT) (((FORMAT) == I2S_JY_I2S) || \
((FORMAT) == I2S_JY_LEFT) || \
((FORMAT) == I2S_JY_RIGHT))
/**
* @}
*/
/** @defgroup I2S_endian_swap I2S Endian Swap
* @{
*/
#define I2S_ES_LITTLE ((u32)0x00000000)
#define I2S_ES_BIG ((u32)0x00000001)
#define IS_I2S_ENDIAN_SWAP(SWAP) (((SWAP) == I2S_ES_LITTLE) || \
((SWAP) == I2S_ES_BIG))
/**
* @}
*/
/** @defgroup I2S_direction I2S Bus Direction(Transmit/Receive)
* @{
*/
#define I2S_ONLY_RX ((u32)0x00000000)
#define I2S_ONLY_TX ((u32)0x00000001)
#define I2S_TXRX ((u32)0x00000002)
#define IS_I2S_DIR(DIR) (((DIR) == I2S_ONLY_RX) || \
((DIR) == I2S_ONLY_TX) || \
((DIR) == I2S_TXRX))
/**
* @}
*/
/** @defgroup I2S_channel_number I2S Channel Number
* @{
*/
#define I2S_CH_STEREO ((u32)0x00000000)
#define I2S_CH_RSVD ((u32)0x00000001)
#define I2S_CH_MONO ((u32)0x00000002)
#define IS_I2S_CHN_NUM(NUM) (((NUM) == I2S_CH_STEREO) || \
((NUM) == I2S_CH_MONO))
/**
* @}
*/
/** @defgroup I2S_sample_rate I2S Sample Rate
* @{
*/
#define I2S_SR_8KHZ ((u32)0x00000000)
#define I2S_SR_16KHZ ((u32)0x00000001)
#define I2S_SR_24KHZ ((u32)0x00000002)
#define I2S_SR_32KHZ ((u32)0x00000003)
#define I2S_SR_48KHZ ((u32)0x00000005)
#define I2S_SR_96KHZ ((u32)0x00000006)
#define I2S_SR_7p35KHZ ((u32)0x00000010)
#define I2S_SR_14p7KHZ ((u32)0x00000011)
#define I2S_SR_22p05KHZ ((u32)0x00000012)
#define I2S_SR_29p4KHZ ((u32)0x00000013)
#define I2S_SR_44p1KHZ ((u32)0x00000015)
#define I2S_SR_88p2KHZ ((u32)0x00000016)
#define IS_I2S_SAMPLE_RATE(RATE) (((RATE) == I2S_SR_8KHZ) || \
((RATE) == I2S_SR_16KHZ) || \
((RATE) == I2S_SR_24KHZ) || \
((RATE) == I2S_SR_32KHZ) || \
((RATE) == I2S_SR_48KHZ) || \
((RATE) == I2S_SR_96KHZ) || \
((RATE) == I2S_SR_7p35KHZ) || \
((RATE) == I2S_SR_14p7KHZ) || \
((RATE) == I2S_SR_22p05KHZ) || \
((RATE) == I2S_SR_29p4KHZ) || \
((RATE) == I2S_SR_44p1KHZ) || \
((RATE) == I2S_SR_88p2KHZ))
/**
* @}
*/
/**
* @}
*/
/** @defgroup I2S_Exported_Functions I2S Exported Functions
* @{
*/
_LONG_CALL_ void I2S_Init(I2S_TypeDef* I2Sx, I2S_InitTypeDef* I2S_InitStruct);
_LONG_CALL_ void I2S_Cmd(I2S_TypeDef* I2Sx, u8 NewState);
_LONG_CALL_ void I2S_INTConfig(I2S_TypeDef* I2Sx, u32 I2STxIntrMSK, u32 I2SRxIntrMSK);
_LONG_CALL_ void I2S_SetRate(I2S_TypeDef* I2Sx, u32 I2S_Rate);
_LONG_CALL_ void I2S_SetWordLen(I2S_TypeDef* I2Sx, u32 I2S_WordLen);
_LONG_CALL_ void I2S_SetChNum(I2S_TypeDef* I2Sx, u32 I2S_ChNum);
_LONG_CALL_ void I2S_SetPageNum(I2S_TypeDef* I2Sx, u32 I2S_PageNum);
_LONG_CALL_ void I2S_SetPageSize(I2S_TypeDef* I2Sx, u32 I2S_PageSize);
_LONG_CALL_ void I2S_SetDirection(I2S_TypeDef* I2Sx, u32 I2S_TRxAct);
_LONG_CALL_ void I2S_INTClear(I2S_TypeDef* I2Sx, u32 I2STxIntrClr, u32 I2SRxIntrClr);
_LONG_CALL_ void I2S_INTClearAll(I2S_TypeDef* I2Sx);
_LONG_CALL_ void I2S_ISRGet(I2S_TypeDef* I2Sx, u32* I2STxIsr, u32* I2SRxIsr);
_LONG_CALL_ void I2S_SetDMABuf(I2S_TypeDef* I2Sx, u8 *I2STxData, u8 *I2SRxData);
_LONG_CALL_ u32 I2S_GetTxPage(I2S_TypeDef* I2Sx);
_LONG_CALL_ void I2S_TxPageDMA_EN(I2S_TypeDef* I2Sx, u32 I2STxIdx);
_LONG_CALL_ void I2S_RxPageDMA_EN(I2S_TypeDef* I2Sx, u32 I2SRxIdx);
_LONG_CALL_ void I2S_TxDmaCmd(I2S_TypeDef* I2Sx, u32 NewState);
_LONG_CALL_ void I2S_RxDmaCmd(I2S_TypeDef* I2Sx, u32 NewState);
/**
* @}
*/
/* Registers Definitions --------------------------------------------------------*/
/**************************************************************************//**
* @defgroup I2S_Register_Definitions I2S Register Definitions
* @{
*****************************************************************************/
/**************************************************************************//**
* @defgroup I2S_CONTROL
* @{
*****************************************************************************/
#define BIT_CTRL_CTLX_I2S_EN ((u32)0x00000001 << 0)
#define BIT_CTRL_CTLX_I2S_TX_ACT_MASK ((u32)0x00000003 << 1)
#define BIT_CTRL_CTLX_I2S_CHN_NUM_MASK ((u32)0x00000003 << 3)
#define BIT_CTRL_CTLX_I2S_WORD_LEN_MASK ((u32)0x00000001 << 6)
#define BIT_CTRL_CTLX_I2S_INTERNAL ((u32)0x00000001 << 7)
#define BIT_CTRL_CTLX_I2S_ENDIAN_SWAP ((u32)0x00000001 << 12)
#define BIT_CTRL_CTLX_I2S_CLK_SRC ((u32)0x00000001 << 30)
#define BIT_CTRL_CTLX_I2S_SW_RSTN ((u32)0x00000001 << 31)
/** @} */
/**************************************************************************//**
* @defgroup I2S_SETTING
* @{
*****************************************************************************/
#define BIT_SETTING_I2S_PAGE_SIZE_MASK ((u32)0x00000FFF)
#define BIT_SETTING_I2S_PAGE_NUM_MASK ((u32)0x00000003 << 12)
#define BIT_SETTING_I2S_RATE_MASK ((u32)0x00000007 << 14)
/** @} */
/**************************************************************************//**
* @defgroup I2S_TX_INT_MASK or STATUS
* @{
*****************************************************************************/
#define I2S_TX_INT_PAGE0_OK ((u32)0x00000001 << 0)
#define I2S_TX_INT_PAGE1_OK ((u32)0x00000001 << 1)
#define I2S_TX_INT_PAGE2_OK ((u32)0x00000001 << 2)
#define I2S_TX_INT_PAGE3_OK ((u32)0x00000001 << 3)
#define I2S_TX_INT_PAGE0_UNAVA ((u32)0x00000001 << 4)
#define I2S_TX_INT_PAGE1_UNAVA ((u32)0x00000001 << 5)
#define I2S_TX_INT_PAGE2_UNAVA ((u32)0x00000001 << 6)
#define I2S_TX_INT_PAGE3_UNAVA ((u32)0x00000001 << 7)
#define I2S_TX_INT_EMPTY ((u32)0x00000001 << 8)
/** @} */
/**************************************************************************//**
* @defgroup I2S_RX_INT_MASK or STATUS
* @{
*****************************************************************************/
#define I2S_RX_INT_PAGE0_OK ((u32)0x00000001 << 0)
#define I2S_RX_INT_PAGE1_OK ((u32)0x00000001 << 1)
#define I2S_RX_INT_PAGE2_OK ((u32)0x00000001 << 2)
#define I2S_RX_INT_PAGE3_OK ((u32)0x00000001 << 3)
#define I2S_RX_INT_PAGE0_UNAVA ((u32)0x00000001 << 4)
#define I2S_RX_INT_PAGE1_UNAVA ((u32)0x00000001 << 5)
#define I2S_RX_INT_PAGE2_UNAVA ((u32)0x00000001 << 6)
#define I2S_RX_INT_PAGE3_UNAVA ((u32)0x00000001 << 7)
#define I2S_RX_INT_FULL ((u32)0x00000001 << 8)
/** @} */
/**************************************************************************//**
* @defgroup I2S_TX_OWN or RX_PAGE_OWN
* @{
*****************************************************************************/
#define BIT_IS_PAGE_OWN ((u32)0x80000000)
/** @} */
/** @} */
/**
* @}
*/
/**
* @}
*/
#endif /* _RTL8710B_I2S_H_ */
/******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/