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

📄 audcodec.c

📁 M3355的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        fs_out = C_22K;
        break;
#elif C_44K_YES

        fs_out = C_44K;
        break;
#elif C_88K_YES

        fs_out = C_88K;
        break;
#elif C_176K_YES

        fs_out = C_176K;
        break;
#else

        fs_out = C_11K;
        break;
#endif

    case C_22K:
#if C_22K_YES

        fs_out = C_22K;
        break;
#elif C_44K_YES

        fs_out = C_44K;
        break;
#elif C_88K_YES

        fs_out = C_88K;
        break;
#elif C_176K_YES

        fs_out = C_176K;
        break;
#else

        fs_out = C_22K;
        break;
#endif

    case C_44K:
#if C_44K_YES

        fs_out = C_44K;
        break;
#elif C_88K_YES

        fs_out = C_88K;
        break;
#elif C_176K_YES

        fs_out = C_176K;
        break;
#else

        fs_out = C_44K;
        break;
#endif

    case C_88K:
#if C_88K_YES

        fs_out = C_88K;
        break;
#elif C_176K_YES

        fs_out = C_176K;
        break;
#else

        fs_out = C_88K;
        break;
#endif

    case C_176K:
        fs_out = C_176K;
        break;
    default:
        fs_out = C_48K;
        break;
    }

    return (fs_out);
#ifdef _DEBUG_PRINTF_

    //PRINTF("AUDIO: GetAudioFsOut() End.\n");
#endif
}


//=============================================================================
// CS4391 2CH DAC Device Driver
// Low level device driver
// CS4391 Programming Guide
// [1] Set CS4391 entering software programming interface mode
//		Step 1: Hold chip select ping as high
//		Step 2: Hold reset ping as low
//		Step 3: Rise reset ping to high
//		Step 4: Pull chip select ping to low within 10ms after reset pull high
//		Step 5: Wrtie 0x11 into DAC register 5 (mode control register)
//				within 10ms after reset pull high
//
// [2] CS4391 timing diagram
//     CS   __                              __
//            \____________________________/
//     CLK  __   _   _   _   _   _   _   _
//            \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_
//     CDIN _____~__    ___~__ ____~________
//          __\__~__\___\__~__\___~__\_____
//            |-----|---|-----|------|
//              (1)  (2)  (3)   (4)
//     (1) Chip address: 7 bits MSB first, always = 0010000
//     (2) Read/Write bit: 0 = read; 1 = write
//     (3) MAP: 8 bits MSB first, it's control register number
//     (4) Data: 8 bits MSB first, data value which read/write register
//
//
#include <iic.h>
#define CS4391ChipAddress	0x20
#define CS4360ChipAddress	0x20
extern BOOL I2CIsBusy;

void DAC_SPIDelay(WORD w)
{
    DWORD dw;
    DWORD dwCountSize;
    dwCountSize=w*COUNTS_PER_MICROSECOND;
    for(dw=0;dw<dwCountSize;dw++)
        ;
}

void DAC_SPISetBit(BYTE b)
{
    XSET_GPIO_W(ADAC_SCK); //31124_01Baron, fixed 192k no sound(96K have noise) when remove 244 for FP
    XSET_GPIO_LOW(ADAC_SCK);/* pull IIC-CL low */
    //DAC_SPIDelay(2);/* delay 1us *///20031104 tom yang
    XSET_GPIO_W(ADAC_TXD);/* make sure IIC-DA is output */
    if(b)
        XSET_GPIO_HI(ADAC_TXD);/* pull IIC-DA high */
    else
        XSET_GPIO_LOW(ADAC_TXD);/* pull IIC-DA low */
    DAC_SPIDelay(3);/* delay 2us */
    XSET_GPIO_HI(ADAC_SCK);/* pull IIC-CL high */
    DAC_SPIDelay(3);/* delay 2us */
}
#if 0
BYTE DAC_SPIGetBit()
{
    BYTE ret;
    XSET_GPIO_W(ADAC_SCK); //31124_01Baron, fixed 192k no sound(96K have noise) when remove 244 for FP
    XSET_GPIO_LOW(ADAC_SCK);/* pull IIC-CL low */
    XSET_GPIO_R(ADAC_TXD);/* make sure IIC-DA is input */
    DAC_SPIDelay(3);/* delay 3us */
    XSET_GPIO_HI(ADAC_SCK);/* pull IIC-CL high */
    DAC_SPIDelay(1);/* delay 1us */
    if(XGET_GPIO_DATA(ADAC_TXD))
        ret=1;
    else
        ret=0;
    DAC_SPIDelay(1);/* delay 1us */
    XSET_GPIO_LOW(ADAC_SCK);/* pull IIC-CL low */
    return ret;
}
#endif

BYTE DAC_SPISetByte(BYTE bData)
{
    BYTE i;
    for(i=0;i<8;i++)
    {
        if(bData&0x80)
            DAC_SPISetBit(1);
        else
            DAC_SPISetBit(0);
        bData<<=1;
    }
}

#if 0	//mark 40323
BYTE DAC_SPIGetByte(BYTE bACK)
{
    BYTE ret=0,i;
    for(i=0;i<8;i++)
    {
        ret<<=1;
        ret|=DAC_SPIGetBit();
    }
    return ret;
}
#endif


void AudioDACReset(int high)
{
    if (high == 0)
    {
        XEGPIO_LOW(ADAC_RST);
    }
    else
    {
        XEGPIO_HI(ADAC_RST);
    }
}

void AudioDAC_2CH_ChipSelect(int high)
{
    if (high == 0)
    {
        XSET_GPIO_LOW(DAC_ML0);
    }
    else
    {
        XSET_GPIO_HI(DAC_ML0);
    }
}

void AudioDAC_6CH_ChipSelect(int high)
{
    if (high == 0)
    {
        XSET_GPIO_LOW(DAC_ML1);
    }
    else
    {
        XSET_GPIO_HI(DAC_ML1);
    }
}

BYTE DAC_Set4391Register(BYTE index, BYTE value)
{
    AudioDAC_2CH_ChipSelect(0);
    //DAC_SPIDelay(1); // delay 1us//20031104 tom yang
    DAC_SPISetByte(CS4391ChipAddress);
    //DAC_SPIDelay(1); // delay 1us//20031104 tom yang
    DAC_SPISetByte(index);
    //DAC_SPIDelay(1); // delay 1us//20031104 tom yang
    DAC_SPISetByte(value);
    //DAC_SPIDelay(1); // delay 1us//20031104 tom yang
    AudioDAC_2CH_ChipSelect(1);
    //DAC_SPIDelay(2); // delay 2us//20031104 tom yang
}

BYTE DAC_Set4360Register(BYTE index, BYTE value)
{
    AudioDAC_6CH_ChipSelect(0);
    DAC_SPISetByte(CS4360ChipAddress);
    DAC_SPISetByte(index);
    DAC_SPISetByte(value);
    AudioDAC_6CH_ChipSelect(1);
}

//31204-hope :: Add DAC Auto-Mute feature
#if (_AudioDAC_Protocol == AudioDAC_Right_Justified)
#define DAC_DIF	0xB0
#elif (_AudioDAC_Protocol == AudioDAC_Left_Justified)
#define DAC_DIF	0x80
#elif (_AudioDAC_Protocol == AudioDAC_I2S)
#define DAC_DIF	0x90
#else
#define DAC_DIF	0x80
#endif


void CS4391Init()
{
    //DAC_Set4391Register(5, 0x11);   //40106_Baron, Jeff YC, for power on only L ch have audio
    DAC_Set4391Register(2, 0x09);//20031104 tom yang
    DAC_Set4391Register(5, 0x20);
    //delay(10);//20031104 tom yang
    //DAC_Set4391Register(2, 0x09);//20031104 tom yang
}

void SetCS4391SingleSpeedMode(tSampFreq fs)
{
    BYTE control_word;

    if (CDDADeemphasis)
    {
        switch (fs)
        {
        case C_44K:
            control_word = 0x04;
            break;
        case C_48K:
            control_word = 0x08;
            break;
        case C_32K:
            control_word = 0x0C;
            break;
        default:
            control_word = 0x00;
            break;
        }
        CDDADeemphasis = 0;
    }
    else
    {
        control_word = 0x00;
    }

    Enter_GPIOSection();

    I2CBusBusy();

    delay(10);
    DAC_Set4391Register(1, control_word|DAC_DIF);
    delay(10);
    DAC_Set4391Register(2, 0x09);

    I2CBusRelease();

    Leave_GPIOSection();

    EDPRINTF("SetCS4391SingleSpeedMode()::control_word=0x%X\n", control_word|DAC_DIF);
}

void SetCS4391DoubleSpeedMode()
{
    Enter_GPIOSection();
    I2CBusBusy();

    delay(10);
    DAC_Set4391Register(1, 0x01|DAC_DIF);
    delay(10);
    DAC_Set4391Register(2, 0x09);

    I2CBusRelease();
    Leave_GPIOSection();

    EDPRINTF("SetCS4391DoubleSpeedMode()::control_word=0x%X\n", 0x01);
}

void SetCS4391QuadSpeedMode()
{
    Enter_GPIOSection();
    I2CBusBusy();

    delay(10);
    DAC_Set4391Register(1, 0x02|DAC_DIF);
    delay(10);
    DAC_Set4391Register(2, 0x09);

    I2CBusRelease();
    Leave_GPIOSection();

    EDPRINTF("SetCS4391QuadSpeedMode()::control_word=0x%X\n", 0x02);
}

void SetCDDADeemphasis(BYTE deemphasis)
{
    CDDADeemphasis = deemphasis;
}

void CS4360Init()
{
	
    DAC_Set4360Register(0x0C,0x30);//20031104 tom yang
    DAC_Set4360Register(0x0C,0x20);//20031104 tom yang

}


void SetCS4360SingleSpeedMode(tSampFreq fs)
{
    BYTE control_word;

    if (CDDADeemphasis)
    {
        switch (fs)
        {
        case C_44K:
            control_word = 0x04;
            break;
        case C_48K:
            control_word = 0x08;
            break;
        case C_32K:
            control_word = 0x0C;
            break;
        default:
            control_word = 0x00;
            break;
        }
    }
    else
    {
        control_word = 0x00;
    }

    Enter_GPIOSection();
    I2CBusBusy();

    delay(10);
    DAC_Set4360Register(1, control_word|DAC_DIF);
    delay(10);

    I2CBusRelease();
    Leave_GPIOSection();

    EDPRINTF("SetCS4360SingleSpeedMode()::control_word=0x%X\n", control_word|DAC_DIF);
}

void SetCS4360DoubleSpeedMode()
{
    Enter_GPIOSection();
    I2CBusBusy();

    delay(10);
    DAC_Set4360Register(1, 0x01|DAC_DIF);
    delay(10);

    I2CBusRelease();
    Leave_GPIOSection();

    EDPRINTF("SetCS4360DoubleSpeedMode()::control_word=0x%X\n", 0x01|DAC_DIF);
}

void SetCS4360QuadSpeedMode()
{
    Enter_GPIOSection();
    I2CBusBusy();

    delay(10);
    DAC_Set4360Register(1, 0x02|DAC_DIF);
    delay(10);

    I2CBusRelease();
    Leave_GPIOSection();

    EDPRINTF("SetCS4360QuadSpeedMode()::control_word=0x%X\n", 0x02|DAC_DIF);
}


void InitAudioDAC()
{
    Enter_GPIOSection();
    I2CBusBusy();

    XSET_GPIO_HI(ADAC_SCK);/* pull IIC-CL low *///20031104 tom yang
    AudioDAC_2CH_ChipSelect(1);
    AudioDAC_6CH_ChipSelect(1);
    AudioDACReset(0);//20031104 tom yang
    delay(10);//20031104 tom yang
    AudioDACReset(1);//20031104 tom yang

    //DAC_SPIDelay(1); // delay 1us//20031104 tom yang
    DAC_Set4391Register(5, 0x11);  //40106_Baron, Jeff YC, for power on only L ch have audio
    CS4360Init();//20031104 tom yang
    CS4391Init();
    //delay(10);//20031104 tom yang

#if (CS4360_DAC_ENABLE == 1)

    //CS4360Init();//20031104 tom yang
#endif

    //delay(10);//20031104 tom yang

    //DAC_Set4391Register(1, 0x00);//20031104 tom yang
    //DAC_Set4360Register(1, 0x00);//20031104 tom yang

    I2CBusRelease();
    Leave_GPIOSection();

}

⌨️ 快捷键说明

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