⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codec.c

📁 CS42L51 Audio IC driver, been tested under EPSON 32BIT MCU platform
💻 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 + -