/**************************************************************************//** * @file N9H20_I2S.h * @version V3.00 * @brief N9H20 series I2S driver header file * * SPDX-License-Identifier: Apache-2.0 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. *****************************************************************************/ #ifndef __DRVI2S_H__ #define __DRVI2S_H__ /* Constant Definition */ #define DRVI2S_MAJOR_NUM 2 #define DRVI2S_MINOR_NUM 0 #define DRVI2S_BUILD_NUM 1 #ifdef __GNUC__ // _SYSINFRA_int_DEF (DRVI2S, PIN_UNAVAILABLE, TRUE, MODULE_ID_DRVI2S, 0); // _SYSINFRA_int_DEF (DRVI2S, DISABLED, TRUE, MODULE_ID_DRVI2S, 0); // _SYSINFRA_int_DEF (DRVI2S, PIN_UNAVAILABLE, 1, MODULE_ID_DRVI2S, 0); // _SYSINFRA_int_DEF (DRVI2S, DISABLED, 1, MODULE_ID_DRVI2S, 0); #endif /* Play & Record Settings */ #define DRVI2S_PLAY 0 #define DRVI2S_RECORD 1 /* FIFO level */ #define DRVI2S_4_Level 0x1 #define DRVI2S_8_Level 0x0 /* I2S Function Flags */ #define DRVI2S_PRESCALE_1 0x0 #define DRVI2S_PRESCALE_2 0x1 #define DRVI2S_PRESCALE_3 0x2 #define DRVI2S_PRESCALE_4 0x3 #define DRVI2S_PRESCALE_5 0x4 #define DRVI2S_PRESCALE_6 0x5 #define DRVI2S_PRESCALE_7 0x6 #define DRVI2S_PRESCALE_8 0x7 #define DRVI2S_PRESCALE_10 0x9 #define DRVI2S_PRESCALE_12 0xB #define DRVI2S_PRESCALE_14 0xD #define DRVI2S_PRESCALE_16 0xF #define DRVI2S_CLK_DIV8 0x0 #define DRVI2S_CLK_DIV12 0x1 #define DRVI2S_FREQ_SEL32 ~FS_SEL #define DRVI2S_FREQ_SEL48 FS_SEL #define DRVI2S_MCLK_PRS ~MCLK_SEL #define DRVI2S_MCLK_PLL MCLK_SEL #define DRVI2S_IRQ_DMA_COUNTER IRQ_DMA_CNTER_EN #define DRVI2S_IRQ_DMA_DATA_ZERO IRQ_DMA_DATA_ZERO_EN #define DRVI2S_IRQ_RECORD R_DMA_IRQ_EN #define DRVI2S_IRQ_PLAYBACK P_DMA_IRQ_EN #define DRVI2S_PLAY_DMA_COUNTER DMA_CNTER_IRQ #define DRVI2S_PLAY_DMA_DATA_ZERO DMA_DATA_ZERO_IRQ #define DRVI2S_PLAY_FIFO_EMPTY P_FIFO_EMPTY #define DRVI2S_PLAY_DMA_END P_DMA_END_IRQ #define DRVI2S_PLAY_DMA_MIDDLE P_DMA_MIDDLE_IRQ #define DRVI2S_REC_FIFO_FULL R_FIFO_FULL #define DRVI2S_REC_DMA_END R_DMA_END_IRQ #define DRVI2S_REC_DMA_MIDDLE R_DMA_MIDDLE_IRQ typedef int (PFN_DRVI2S_CB_FUNC)(UINT8 *, UINT32); typedef enum { eDRVI2S_FREQ_96000 = 96000, eDRVI2S_FREQ_88200 = 88200, eDRVI2S_FREQ_64000 = 64000, eDRVI2S_FREQ_48000 = 48000, eDRVI2S_FREQ_44100 = 44100, eDRVI2S_FREQ_32000 = 32000, eDRVI2S_FREQ_24000 = 24000, eDRVI2S_FREQ_22050 = 22050, eDRVI2S_FREQ_16000 = 16000, eDRVI2S_FREQ_12000 = 12000, eDRVI2S_FREQ_11025 = 11025, eDRVI2S_FREQ_8000 = 8000 } E_DRVI2S_SAMPLING; typedef enum { eDRVI2S_I2S = 0, eDRVI2S_MSB_JUSTIFIED } E_DRVI2S_FORMAT; typedef enum { eDRVI2S_256FS = 0, // MCLK = 256*FS is selected eDRVI2S_384FS, // MCLK = 384*FS is selected eDRVI2S_512FS } DRVI2S_SYS_CLOCK_E; typedef enum { eDRVI2S_PLAY_STEREO = (3 << 12), eDRVI2S_PLAY_MONO = (2 << 12), eDRVI2S_RECORD_STEREO = (3 << 14), eDRVI2S_RECORD_LEFT = (1 << 14), eDRVI2S_RECORD_RIGHT = (2 << 14) } E_DRVI2S_CHANNEL; typedef struct { UINT32 u32BufferAddr; UINT32 u32BufferLength; E_DRVI2S_SAMPLING eSampleRate; E_DRVI2S_CHANNEL eChannel; E_DRVI2S_FORMAT eFormat;} S_DRVI2S_PLAY; typedef struct { UINT32 u32BufferAddr; UINT32 u32BufferLength; E_DRVI2S_SAMPLING eSampleRate; E_DRVI2S_CHANNEL eChannel; E_DRVI2S_FORMAT eFormat;} S_DRVI2S_RECORD; VOID DrvI2S_Open(VOID); VOID DrvI2S_Close(VOID); VOID DrvI2S_EnableInt(UINT32 u32InterruptFlag, PFN_DRVI2S_CB_FUNC* pfnCallBack); VOID DrvI2S_DisableInt(UINT32 u32InterruptFlag); VOID DrvI2S_ClearInt(UINT32 u32InterruptFlag); UINT32 DrvI2S_PollInt(UINT32 u32InterruptFlag); VOID DrvI2S_StartPlay (S_DRVI2S_PLAY* psPlayStruct); VOID DrvI2S_StopPlay (VOID); VOID DrvI2S_StartRecord (S_DRVI2S_RECORD* psRecord); VOID DrvI2S_StopRecord (VOID); INT DrvI2S_SetSampleRate(E_DRVI2S_SAMPLING eSampleRate); #endif // __DRVI2S_H__