📄 codec.c
字号:
//****************************************************************************
//
// Copyright (C) SEIKO EPSON CORP. 2007
//
// File name: codec.c
// This is codec CS42L51 driver calls
//
// Revision history
// 2008.03.06 1st version
//
// Note:
// 1. CS42L51 support SPI write only
//****************************************************************************
#include "codec.h"
#include "i2s.h"
//-------------------------------------------------------
// variable declaration
void (*fnCodecUserCall) (void);
//-------------------------------------------------------
// static function declaration
static void codec_WrReg(unsigned char ucReg, unsigned char ucData);
//---------------------------------------------------------------------------------
// Function name : codec_Init
// Description : init cs42l51 driver
// Parameter : NULL
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_Init(void)
{
#ifdef CODEC_HWMODE
CFP(3, 3) = 0; /* p33 as #RESET */
PD(3, 3) = 0; /* #reset keep low */
IOC(3, 3) = 1;
CODEC_RST_H;
i2s_Init();
#else
spi_Init();
CFP(8, 5) = 0; /* p85 as #CS */
PD(8, 5) = 1;
IOC(8, 5) = 1;
CFP(3, 3) = 0; /* p33 as #RESET */
PD(3, 3) = 0;
IOC(3, 3) = 1;
CODEC_RST_H;
soft_Wait(1);
codec_WrReg(0x02, 0x01); /* set PDN bit */
codec_WrReg(0x03, 0x20);
codec_WrReg(0x04, 0x0C);
codec_WrReg(0x05, 0x60);
codec_WrReg(0x07, 0x30);
codec_WrReg(0x09, 0x06); /* Auto-mute enable */
codec_WrReg(0x0a, 0x08);
codec_WrReg(0x0b, 0x08);
i2s_Init();
i2s_StartOut();
soft_Wait(100);
codec_WrReg(0x02, 0x00); /* set PDN bit */
soft_Wait(100);
#endif
}
//---------------------------------------------------------------------------------
// Function name : codec_SampleRate
// Description : setup codec sampling rate
// Parameter : unsigned int ulRate
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_SampleRate(unsigned int ulRate)
{
T_I2SCLK_CFG tCfg;
tCfg.MclkSrc = 0;
tCfg.SckCycI = 0;
tCfg.SckCycO = 0;
switch (ulRate) {
case SAMPLE_8KHZ:
{
tCfg.MclkDiv = 5;
tCfg.SckDiv = 95; /* mclk=8Mhz, sck=7.8125Khz */
break;
}
case SAMPLE_16KHZ:
{
tCfg.MclkDiv = 5;
tCfg.SckDiv = 47; /* mclk=8Mhz, sck=15.625Khz */
break;
}
case SAMPLE_24KHZ:
{
tCfg.MclkDiv = 3;
tCfg.SckDiv = 31; /* mclk=12Mhz, sck=23.4375Khz */
break;
}
case SAMPLE_32KHZ:
{
tCfg.MclkDiv = 5;
tCfg.SckDiv = 23; /* mclk=8Mhz, sck=31.25Khz */
break;
}
case SAMPLE_44KHZ:
{
tCfg.MclkDiv = 3;
tCfg.SckDiv = 15; /* mclk=12Mhz, sck=46.875Khz */
}
break;
}
i2s_CfgClk(&tCfg);
}
//---------------------------------------------------------------------------------
// Function name : codec_Out
// Description : Output stream data
// Parameter : unsigned int ulSampleRate
// : unsigned short *pucData
// : unsigned int ulLen
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_Out(unsigned int ulSampleRate, unsigned short *pucData, unsigned int ulLen)
{
#ifdef EVENT_ON
Evt evt = { EVT_CODEC, 0L, 0L };
#endif
codec_SampleRate(ulSampleRate);
codec_StartOut(pucData, ulLen);
while (1) {
if (codec_ChkState() == CODEC_ENDOP) {
codec_StopOut();
#ifdef EVENT_ON
evt.EvtPar1 = CODEC_OPEND;
list_Append(sysEvtList, evt);
break;
#endif
}
fnCodecUserCall();
}
}
//---------------------------------------------------------------------------------
// Function name : codec_StartOut
// Description : start output data stream
// Parameter : unsigned short *pucData
// : unsigned int ulLen
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_StartOut(unsigned short *pucData, unsigned int ulLen)
{
int i;
unsigned int *pSrc = (unsigned int *) pucData;
#ifdef CODEC_HWMODE
CODEC_RST_H;
#else
codec_WrReg(0x02, 0x01); /* PDN 1 */
codec_WrReg(0x08, 0x60); /* MUTE */
codec_WrReg(0x02, 0x00); /* PDN 0 */
#endif
i2s_StartOut();
#ifdef CODEC_DMAXFER
i2s_InitDMA(I2S_DMA_WR);
i2s_StartDMA(pSrc, ulLen, I2S_DMA_WR);
#else
for (i = 0; i < ulLen; i += 2) {
i2s_WrFifo_32(*pSrc++);
}
#endif
}
//---------------------------------------------------------------------------------
// Function name : codec_StopOut
// Description : Stop Output data
// Parameter : unsigned short *pucData
// : unsigned int ulLen
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_StopOut(void)
{
#ifdef CODEC_DMAXFER
i2s_StopDMA(0);
#endif
soft_Wait(5);
i2s_StopOut();
#ifdef CODEC_HWMODE
CODEC_RST_L;
#else
codec_WrReg(0x02, 0x61); /* PDN 1 */
soft_Wait(5);
codec_WrReg(0x08, 0x63); /* MUTE */
codec_WrReg(0x02, 0x60); /* PDN 0 */
#endif
}
//---------------------------------------------------------------------------------
// Function name : codec_In
// Description : input stream data
// Parameter : unsigned int ulSampleRate
// : unsigned short *pucData
// : unsigned int ulLen
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_In(unsigned int ulSampleRate, unsigned short *pucData, unsigned int ulLen)
{
#ifdef EVENT_ON
Evt evt = { EVT_CODEC, 0L, 0L };
#endif
codec_SampleRate(ulSampleRate);
codec_StartIn(pucData, ulLen);
while (1) {
if (codec_ChkState() == CODEC_ENDOP) {
codec_StopIn();
#ifdef EVENT_ON
evt.EvtPar1 = CODEC_OPEND;
list_Append(sysEvtList, evt);
#endif
break;
}
fnCodecUserCall();
}
}
//---------------------------------------------------------------------------------
// Function name : codec_StartIn
// Description : start input stream data
// Parameter : unsigned short *pucData
// : unsigned int ulLen
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_StartIn(unsigned short *pucData, unsigned int ulLen)
{
int i;
unsigned int *pSrc = (unsigned int *) pucData;
/* write fifo to trig MCLK out */
#ifdef CODEC_HWMODE
CODEC_RST_H;
#endif
i2s_StartOut();
for (i = 0; i < 4; i++)
i2s_WrFifo_32(0);
i2s_StartIn();
#ifdef CODEC_DMAXFER
i2s_InitDMA(I2S_DMA_RD);
i2s_StartDMA(pSrc, ulLen, I2S_DMA_RD);
#else
for (i = 0; i < ulLen; i += 2) {
*pSrc++ = i2s_RdFifo_32();
}
#endif
}
//---------------------------------------------------------------------------------
// Function name : codec_StopIn
// Description : stop input stream data
// Parameter : NULL
// Return value : NULL
//---------------------------------------------------------------------------------
void codec_StopIn(void)
{
#ifdef CODEC_DMAXFER
i2s_StopDMA(2);
#endif
i2s_StopIn();
i2s_StopOut();
#ifdef CODEC_HWMODE
CODEC_RST_L;
#endif
}
//---------------------------------------------------------------------------------
// Function name : codec_ChkState
// Description : check codec operation state
// Parameter : NULL
// Return value : NULL
//---------------------------------------------------------------------------------
int codec_ChkState(void)
{
if (i2s_ChkDMAState() == I2S_DMA_END) {
return CODEC_ENDOP;
} else
return CODEC_ISRUN;
}
//---------------------------------------------------------------------------------
// Function name : codec_WrReg
// Parameter : unsigned char ucReg
// : unsigned char ucData
// Return value : NULL
//---------------------------------------------------------------------------------
static void codec_WrReg(unsigned char ucReg, unsigned char ucData)
{
CODEC_CS_L;
spi_TranData(CHIP_WR); /* chip addr|wr */
spi_TranData(ucReg); /* reg map addr */
spi_TranData(ucData); /* reg data wr */
CODEC_CS_H;
}
//------- End of file --------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -