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

📄 hw_wm8987.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/*********************************************************************************
*     Copyright (C),2004-2005,  Fuzhou Rockchip Co.,Ltd.
*         All Rights Reserved
*          V1.00
* FileName :  Hw_wm8750.c
* Author :  lzy
* Description:
* History  :
*   <author>  <time>    <version>    <desc>
*    lzy     07/6/29    1.0    ORG
*
$Log: hw_wm8987.c,v $
Revision 1.2  2008/06/19 04:43:30  Administrator
代码整理!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.1.1.1  2008/03/06 13:29:05  Lingzhaojun
no message

Revision 1.4  2007/11/17 06:13:38  Linzhengyuan
最大音量调整为40

Revision 1.3  2007/11/10 04:23:34  Huangxinyu
调试修改

Revision 1.2  2007/10/17 01:50:33  Huangxinyu
修改发现的bug

Revision 1.1  2007/10/15 08:57:16  Huangxinyu
根据RK27提交修改driver


*********************************************************************************/
#include "hw_include.h"

#if  (CODEC_TYPE==WM8987_CODEC)

#include "hw_wm8987.h"

#define  Codec_IICAdress        (0x1a<<1)
#define  Codec_IICSpeed    200


static void CodecCommandSet(UINT32 uCmd, UINT32 uData)
{

    UINT8  Codec_cmd, Codec_data;

    I2C_Init(Codec_IICAdress, Codec_IICSpeed);

    Codec_data = (UINT8)uData;
    Codec_cmd = (UINT8)(((uCmd << 9) | uData) >> 8);

    I2C_Write(Codec_cmd,  &Codec_data,  1, NormalMode);

    I2C_Deinit();
}

/* --------------------------------------------------------------------------
*  FUNCTION:     Codec_DACMute
*  DESCRIPTION:   set codec DAC soft mute
*  INPUT:         NONE
*  RETURN:      NONE
*  NOTES:        this function only used when DAC working
*  -------------------------------------------------------------------------- */
void Codec_DACMute(void)
{
    CodecCommandSet(WM8987_R5,   0x0008);      // DAC soft mute
}

/* --------------------------------------------------------------------------
*  FUNCTION:     Codec_SetVolumet
*  DESCRIPTION:  set codec exit soft MUTE
*  INPUT:         NONE
*  RETURN:      NONE
*  NOTES:        this function only used when DAC working
*  -------------------------------------------------------------------------- */
void Codec_DACUnMute(void)
{
    CodecCommandSet(WM8987_R5,   0x0000); // DAC soft unmute
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_PowOnInitial:
*
*  DESCRIPTION: Initial codec when power up
*
*  RETURN:      NONE
*
*  NOTES:
*  -------------------------------------------------------------------------- */
void Codec_PowerOnInitial(void)
{
    IOMUX_SetI2SType(WM8987_CODEC);

    SCU_SetCodecFreq(12000);

    CodecCommandSet(WM8987_R15, 0x012f);      //software reset wm8750

    CodecCommandSet(WM8987_R27, 0x0040);  // set VREF to output 40K

    //2 setup output and DAC mute
    CodecCommandSet(WM8987_R10, WM_VOL_MUTE);      // left DAC mute
    CodecCommandSet(WM8987_R11, WM_VOL_MUTE | WM_UPDATE_VOL);  // right DAC mute
    Codec_DACMute();

    DelayMs_nops(10);

    CodecCommandSet(WM8987_R25, WM_VMID50k | WM_VREF);  // setup Vmid and Vref, Vmid = 50k

    DelayMs_nops(10);
    CodecCommandSet(WM8987_R26, 0x0000);

    //2 setup digital audio  interface
    CodecCommandSet(WM8987_R7,     WM_MASTER_MODE | WM_I2S_MODE);   //Audio inteface Data length and Data formate,16Bit
    CodecCommandSet(WM8987_R8,     FREQ441kHz | WM_USB_MODE);   //ADC and DAC sample frequence 44.118Khz,USB mode

    //2 setup left and right MIXER
    CodecCommandSet(WM8987_R34,    LD2LO | LO0DB);
    CodecCommandSet(WM8987_R37,    RD2RO | RO0DB);

    //1   setup no used register
    CodecCommandSet(WM8987_R35,    0x0070);  // Right DAC to left MIXER: mute
    CodecCommandSet(WM8987_R36,    0x0070);     //
    CodecCommandSet(WM8987_R38,     0x0070);     //Mono out Mix Default: Mono Mixer no input, Lmixsel volume=0
    CodecCommandSet(WM8987_R39,     0x0070);  //Mono out Mix Default: Mono Mixer no input, Rmixsel volume=0

    CodecCommandSet(WM8987_R2, 0x0100);         // set R  output 1 mute

    CodecCommandSet(WM8987_R40,  0x0080);  // set output 2 mute
    CodecCommandSet(WM8987_R41,  0x0180);  // set output 2 mute

    CodecCommandSet(WM8987_R24,  0x0004);  // set output 3 ref

    CodecCommandSet(EQ3D_enhance, EQ3D_disable);


}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_RampUp:
*
*  DESCRIPTION: Initial codec when power up
*
*  RETURN:      NONE
*
*  NOTES:
*  -------------------------------------------------------------------------- */
void Codec_RampUp(void)
{
}


/* --------------------------------------------------------------------------
*  FUNCTION:     Codec_DeIitial:
*  DESCRIPTION:   power off audio codec
*  INPUT:         NONE
*  RETURN:      NONE
*  NOTES:
*  -------------------------------------------------------------------------- */
void Codec_DeIitial(void)
{
    CodecCommandSet(WM8987_R25,    WM_VREF);
    CodecCommandSet(WM8987_R26,    0x00);
}

/* --------------------------------------------------------------------------
*  FUNCTION:    Codec_SetMode:
*
*  DESCRIPTION:  setup codec input/output to application mode
*  INPUT:        CodecMode_en_t Codec_DACout/Codec_FMin/Codec_LineADC/Codec_MICAdc/Codec_Standby
*  RETURN:      NONE
*  NOTES:      if exit from application, like FM or MIC , please set codec to standby mode
*  -------------------------------------------------------------------------- */
void Codec_SetMode(CodecMode_en_t Codecmode)
{

    switch (Codecmode)
    {
        case Codec_DACout:
            {
                CodecCommandSet(WM8987_R7,     WM_MASTER_MODE | WM_I2S_MODE);
                CodecCommandSet(WM8987_R8,     FREQ441kHz | WM_USB_MODE);

                CodecCommandSet(WM8987_R34,    LD2LO | LO0DB);
                CodecCommandSet(WM8987_R37,    RD2RO | RO0DB);

                CodecCommandSet(WM8987_R10,    WM_VOL_0DB);
                CodecCommandSet(WM8987_R11,    WM_VOL_0DB | WM_UPDATE_VOL);

                CodecCommandSet(WM8987_R25,    WM_VMID50k | WM_VREF);
                CodecCommandSet(WM8987_R26,    WM_DACL | WM_DACR | WM_LOUT2 | WM_ROUT2 | WM_OUT3);
            }
            break;

        case Codec_FMin:
            {
                CodecCommandSet(WM8987_R34,    LI2LO | LO0DB);
                CodecCommandSet(WM8987_R37,    RI2RO | RO0DB);

                CodecCommandSet(WM8987_R25,    WM_VMID50k | WM_VREF);
                CodecCommandSet(WM8987_R26,    WM_LOUT2 | WM_ROUT2 | WM_OUT3);
            }
            break;

        case Codec_FMADC:
            {
                CodecCommandSet(WM8987_R0,     0x003f);    //Left channel PGA  0dB
                CodecCommandSet(WM8987_R1,     0x013f);   //Left channel PGA   0dB

                CodecCommandSet(WM8987_R21,   0x00c3);    //Left digital ADC 0dB
                CodecCommandSet(WM8987_R22,   0x01c3);    //Right  digital ADC 0dB

                CodecCommandSet(WM8987_R31,   0x0000);

                CodecCommandSet(WM8987_R32,   0x0000);    //Left ADC select = Linput0 MICBoost = 0dB
                CodecCommandSet(WM8987_R33,   0x0000);    //Left ADC select = Linput3 MICBoost = 0dB

                CodecCommandSet(WM8987_R34,    LI2LO | LO0DB);
                CodecCommandSet(WM8987_R37,    RI2RO | RO0DB);

                CodecCommandSet(WM8987_R25,    WM_VMID50k | WM_VREF | WM_ADCL | WM_ADCR);
                CodecCommandSet(WM8987_R26,    WM_LOUT2 | WM_ROUT2 | WM_OUT3);
            }
            break;

        case Codec_LineADC:
            {
                CodecCommandSet(WM8987_R0,     0x0057);    //Left channel PGA  0dB
                CodecCommandSet(WM8987_R1,     0x0157);   //Left channel PGA   0dB

                CodecCommandSet(WM8987_R21,   0x00c3);    //Left digital ADC 0dB
                CodecCommandSet(WM8987_R22,   0x01c3);    //Right  digital ADC 0dB

                CodecCommandSet(WM8987_R31,   0x0000);

                CodecCommandSet(WM8987_R32,   0x0000);    //Left ADC select = Linput0 MICBoost = 0dB
                CodecCommandSet(WM8987_R33,   0x0000);    //Left ADC select = Linput0 MICBoost = 0dB

                CodecCommandSet(WM8987_R34,    LO0DB);
                CodecCommandSet(WM8987_R37,    RO0DB);

                CodecCommandSet(WM8987_R25,   WM_VMID50k | WM_VREF | WM_ADCL | WM_ADCR);
                CodecCommandSet(WM8987_R26,   0x0000);
            }
            break;

        case Codec_MICAdc:
            {
                CodecCommandSet(WM8987_R0,     0x0117);    //Left channel PGA  0dB
                CodecCommandSet(WM8987_R1,     0x0117);   //Left channel PGA   0dB

                CodecCommandSet(WM8987_R21,   0x01c3);    //Left digital ADC 0dB
                CodecCommandSet(WM8987_R22,   0x01c3);    //Right  digital ADC 0dB

                CodecCommandSet(WM8987_R10,   0x01ff);    //Left digital DAC 0dB
                CodecCommandSet(WM8987_R11,   0x01ff);    //Right  digital DAC 0dB

                CodecCommandSet(WM8987_R31,   0x0040); // adc use mono mix, select left adc

                CodecCommandSet(WM8987_R32,   0x00a0);    //Left ADC select = Linput3 MICBoost = 20dB
                CodecCommandSet(WM8987_R33,   0x0080);    //Left ADC select = Linput3 MICBoost = 00dB

                CodecCommandSet(WM8987_R25,    WM_VMID50k | WM_VREF | WM_AINL | WM_ADCL | WM_MICB);   //Left ADC and Left PGA power on,Right ADC and Right PGA power off
                CodecCommandSet(WM8987_R26,    0x00);
            }
            break;

        case Codec_Standby:
            {
                Codec_DACMute();
                CodecCommandSet(WM8987_R25,    WM_VMID50k | WM_VREF);
                CodecCommandSet(WM8987_R26,    0x00);
            }
            break;

    }

}


/* --------------------------------------------------------------------------
*  FUNCTION:     Codec_SetSampleRate:
*  DESCRIPTION:  setup codec sample rate both for ADC and DAC application
*  INPUT:         CodecFS_en_t  8kHz ~  48KHz
*  RETURN:      NONE
*  NOTES:
*  -------------------------------------------------------------------------- */
void Codec_SetSampleRate(CodecFS_en_t CodecFS)
{
    if (CodecFS < FSSTOP)
    {
        switch (CodecFS)
        {
            case FS_8000Hz:
                CodecCommandSet(WM8987_R8,    FREQ8kHz | WM_USB_MODE);    //12MHZ,8KHZ
                break;
            case FS_11025Hz:
                CodecCommandSet(WM8987_R8,    FREQ11025kHz | WM_USB_MODE);    //12MHZ,11.025K
                break;
            case FS_12KHz:
                CodecCommandSet(WM8987_R8,    FREQ12kHz | WM_USB_MODE);    //12MHZ,12K
                break;
            case FS_16KHz:
                CodecCommandSet(WM8987_R8,    FREQ16kHz | WM_USB_MODE);    //12MHZ,16K
                break;
            case FS_22050Hz:
                CodecCommandSet(WM8987_R8,     FREQ2205kHz | WM_USB_MODE);    //12MHZ,22.05K
                break;
            case FS_24KHz:
                CodecCommandSet(WM8987_R8,     FREQ24kHz | WM_USB_MODE);    //12MHZ,24K
                break;
            case FS_32KHz:
                CodecCommandSet(WM8987_R8,     FREQ32kHz | WM_USB_MODE);    //12MHZ,32K
                break;
            case FS_48KHz:
                CodecCommandSet(WM8987_R8,     FREQ48kHz | WM_USB_MODE);    //12MHZ,48K
                break;
            case FS_44100Hz:
            default:
                CodecCommandSet(WM8987_R8,     FREQ441kHz | WM_USB_MODE);    //12MHZ,44.1KHZ
                break;
        }
    }
}


/* --------------------------------------------------------------------------
*  FUNCTION:     Codec_SetVolumet:
*  DESCRIPTION:  set  codec output volume
*  INPUT:         volume
*  RETURN:      NONE
*  NOTES:        volume = 0 mean mute,
*  -------------------------------------------------------------------------- */
void Codec_SetVolumet(unsigned int Volume)
{

    UINT32 Vol ;

    if (Volume > MAX_VOLUME)
        Volume = MAX_VOLUME;

    Vol = 41 + (Volume << 1);

    if (Volume == 0)
    {
        Vol = 0;
    }
// 最后几个音量步进为1
    if (Volume <= 7)  Vol = 47 + Volume;

    CodecCommandSet(WM8987_R40, Vol | 0x0080);    // set output 1 volume
    CodecCommandSet(WM8987_R41, Vol | 0x0180);

}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -