mirror of
https://github.com/jialexd/sdk-ameba-v4.0c_180328.git
synced 2024-11-28 09:10:28 +00:00
357 lines
12 KiB
C
357 lines
12 KiB
C
|
/**
|
||
|
******************************************************************************
|
||
|
* @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****/
|