📄 audcodec.c
字号:
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 + -