📄 wm8750.c
字号:
/****************************************************************************
* Copyright(C) All rights Reserved. *
* Compiler : TI Code Composer OMAP 2.1 *
* FileName : WM8750.c *
* Description : Device driver for Wolfson 8750 *
* Author : Daniel Lin *
* Revision History: *
* 2004/04/27 : First Coding *
****************************************************************************/
/*--------------------------------------------------------------------------*
* Include Files *
*--------------------------------------------------------------------------*/
#include <demo/gio270.h>
#include <user/Audio.h>
#include <demo/uart270.h>
/*--------------------------------------------------------------------------*
* External Dependancies *
*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*
* Const, Macro, type definition *
*--------------------------------------------------------------------------*/
#define WM8750_CSB 1
/* WM8750 I2C ID */
#if WM8750_CSB
#define WM8750_I2C_SLAVE 0x36
#else
#define WM8750_I2C_SLAVE 0x34
#endif
#define USB_Mode 0
typedef unsigned short USHORT;
#define STATUS Int16
typedef short Int16;
#define E_PASS 0
#define E_INVALID_INPUT (-1)
/*--------------------------------------------------------------------------*
* External Functions *
*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*
* External Variables *
*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*
* Global Functions *
*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*
* Global Variables *
*--------------------------------------------------------------------------*/
unsigned short WM8750Regs[ 43 ];
unsigned char success;
/*--------------------------------------------------------------------------*
* Local Functions declaration *
*--------------------------------------------------------------------------*/
STATUS DEV_Audio_Init( void );
STATUS DEV_Audio_SetClockSampleRate(unsigned long Oscillator_Freq,unsigned int Sampling_Freq);
STATUS DEV_ADEC_WriteCmd( unsigned char Reg, unsigned short Val );
STATUS DEV_ADEC_LeftInputVol_LIVU(BOOL trueorfalse);
STATUS DEV_ADEC_LeftInputVol_LINMUTE(BOOL trueorfalse);
STATUS DEV_ADEC_LeftInputVol_LIZC(BOOL trueorfalse);
STATUS DEV_ADEC_LeftInputVol_LINVOL(unsigned char vol);
STATUS DEV_ADEC_RightInputVol_RIVU(BOOL trueorfalse);
STATUS DEV_ADEC_RightInputVol_RINMUTE(BOOL trueorfalse);
STATUS DEV_ADEC_RightInputVol_RIZC(BOOL trueorfalse);
STATUS DEV_ADEC_RightInputVol_RINVOL(unsigned char vol);
STATUS DEV_ADEC_LOUT1Vol_LO1VU(BOOL trueorfalse);
STATUS DEV_ADEC_LOUT1Vol_LO1ZC(BOOL trueorfalse);
STATUS DEV_ADEC_LOUT1Vol_LOUT1VOL(int vol);
STATUS DEV_ADEC_ROUT1Vol_RO1VU(BOOL trueorfalse);
STATUS DEV_ADEC_ROUT1Vol_RO1ZC(BOOL trueorfalse);
STATUS DEV_ADEC_ROUT1Vol_ROUT1VOL(int vol);
STATUS DEV_ADEC_AdcDacCtrl_ADCDIV2(BOOL trueorfalse);
STATUS DEV_ADEC_AdcDacCtrl_DACDIV2(BOOL trueorfalse);
STATUS DEV_ADEC_AdcDacCtrl_ADCPOL(unsigned char polarity);
STATUS DEV_ADEC_AdcDacCtrl_HPOR(BOOL trueorfalse);
STATUS DEV_ADEC_AdcDacCtrl_DACMUTE(BOOL trueorfalse);
STATUS DEV_ADEC_AdcDacCtrl_DEEMPH(unsigned char sample_rate_select);
STATUS DEV_ADEC_AdcDacCtrl_ADCHPD(BOOL trueorfalse);
STATUS DEV_ADEC_AudioInterface_BCLKINV(BOOL trueorfalse);
STATUS DEV_ADEC_AudioInterface_MS(BOOL trueorfalse);
STATUS DEV_ADEC_AudioInterface_LRSWAP(BOOL trueorfalse);
STATUS DEV_ADEC_AudioInterface_LRP(BOOL trueorfalse);
STATUS DEV_ADEC_AudioInterface_WL(unsigned char bits);
STATUS DEV_ADEC_AudioInterface_FORMAT(unsigned char select);
STATUS DEV_ADEC_SampleRate_CLKDIV2(BOOL trueorfalse);
STATUS DEV_ADEC_SampleRate_SR(unsigned char sample_rate);
STATUS DEV_ADEC_SampleRate_USB(BOOL trueorfalse);
STATUS DEV_ADEC_LeftDacVol_LDVU(BOOL trueorfalse);
STATUS DEV_ADEC_LeftDacVol_LDACVOL(unsigned char vol);
STATUS DEV_ADEC_RightDacVol_RDVU(BOOL trueorfalse);
STATUS DEV_ADEC_RightDacVol_RDACVOL(unsigned char vol);
STATUS DEV_ADEC_BassCtrl_BB(BOOL trueorfalse);
STATUS DEV_ADEC_BassCtrl_BC(BOOL trueorfalse);
STATUS DEV_ADEC_BassCtrl_BASS(unsigned char vol);
STATUS DEV_ADEC_TrebleCtrl_TC(BOOL trueorfalse);
STATUS DEV_ADEC_TrebleCtrl_TRBL(unsigned char vol);
STATUS DEV_ADEC_Reset(void);
STATUS DEV_ADEC_3dCtrl_MODE3D(BOOL trueorfalse);
STATUS DEV_ADEC_3dCtrl_3DUC(BOOL trueorfalse);
STATUS DEV_ADEC_3dCtrl_3DLC(BOOL trueorfalse);
STATUS DEV_ADEC_3dCtrl_3DDEPTH(unsigned char depth);
STATUS DEV_ADEC_3dCtrl_3DEN(BOOL trueorfalse);
STATUS DEV_ADEC_ALC1_ALCSEL(unsigned char select);
STATUS DEV_ADEC_ALC1_MAXGAIN(unsigned char gain);
STATUS DEV_ADEC_ALC1_ALCL(unsigned char level);
STATUS DEV_ADEC_ALC2_ALCZC(BOOL trueorfalse);
STATUS DEV_ADEC_ALC2_HLD(unsigned char time);
STATUS DEV_ADEC_ALC3_DCY(unsigned char time);
STATUS DEV_ADEC_ALC3_ATK(unsigned char time);
STATUS DEV_ADEC_NoiseGate_NGTH(unsigned char level);
STATUS DEV_ADEC_NoiseGate_NGG(unsigned char type);
STATUS DEV_ADEC_NoiseGate_NGAT(BOOL trueorfalse);
STATUS DEV_ADEC_LeftAdcVol_LAVU(BOOL trueorfalse);
STATUS DEV_ADEC_LeftAdcVol_LADCVOL(unsigned char vol);
STATUS DEV_ADEC_RightdcVol_RAVU(BOOL trueorfalse);
STATUS DEV_ADEC_RightdcVol_RADCVOL(unsigned char vol);
STATUS DEV_ADEC_AddiCtrl1_TSDEN(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl1_VSEL(unsigned char avdd);
STATUS DEV_ADEC_AddiCtrl1_DMONOMIX(unsigned char select);
STATUS DEV_ADEC_AddiCtrl1_DATSEL(unsigned char select);
STATUS DEV_ADEC_AddiCtrl1_DACINV(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl1_TOEN(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_OUT3SW(unsigned char select);
STATUS DEV_ADEC_AddiCtrl2_HPSWEN(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_HPSWPOL(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_ROUT2INV(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_TRI(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_LRCM(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_ADCOSR(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl2_DACOSR(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_VMIDSEL(unsigned char select);
STATUS DEV_ADEC_PwrMgmt1_VREF(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_AIN(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_AINL(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_AINR(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_ADC(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_ADCL(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_ADCR(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_MICB(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt1_DIGENB(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_DAC(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_DACL(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_DACR(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_OUT1(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_LOUT1(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_ROUT1(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_OUT2(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_LOUT2(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_ROUT2(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_MONO(BOOL trueorfalse);
STATUS DEV_ADEC_PwrMgmt2_OUT3(BOOL trueorfalse);
STATUS DEV_ADEC_AddiCtrl3_ADCLRM(unsigned char select);
STATUS DEV_ADEC_AddiCtrl3_VROI(BOOL trueorfalse);
STATUS DEV_ADEC_AdcInputMode_DS(BOOL trueorfalse);
STATUS DEV_ADEC_AdcInputMode_MONOMIX(unsigned char select);
STATUS DEV_ADEC_AdcInputMode_RDCM(BOOL trueorfalse);
STATUS DEV_ADEC_AdcInputMode_LDCM(BOOL trueorfalse);
STATUS DEV_ADEC_AdclPath_LINSEL(unsigned char select);
STATUS DEV_ADEC_AdclPath_LMICBOOST(unsigned char boost);
STATUS DEV_ADEC_AdcrPath_RINSEL(unsigned char select);
STATUS DEV_ADEC_AdcrPath_RMICBOOST(unsigned char boost);
STATUS DEV_ADEC_LeftOutMix1_LD2LO(BOOL trueorfalse);
STATUS DEV_ADEC_LeftOutMix1_LI2LO(BOOL trueorfalse);
STATUS DEV_ADEC_LeftOutMix1_LI2LOVOL(unsigned char vol);
STATUS DEV_ADEC_LeftOutMix1_LMIXSEL(unsigned char select);
STATUS DEV_ADEC_LeftOutMix2_RD2LO(BOOL trueorfalse);
STATUS DEV_ADEC_LeftOutMix2_RI2LO(BOOL trueorfalse);
STATUS DEV_ADEC_LeftOutMix2_RI2LOVOL(unsigned char vol);
STATUS DEV_ADEC_RightOutMix1_LD2RO(BOOL trueorfalse);
STATUS DEV_ADEC_RightOutMix1_LI2RO(BOOL trueorfalse);
STATUS DEV_ADEC_RightOutMix1_LI2ROVOL(unsigned char vol);
STATUS DEV_ADEC_RightOutMix1_RMIXSEL(unsigned char select);
STATUS DEV_ADEC_RightOutMix2_RD2RO(BOOL trueorfalse);
STATUS DEV_ADEC_RightOutMix2_RI2RO(BOOL trueorfalse);
STATUS DEV_ADEC_RightOutMix2_RI2ROVOL(unsigned char vol);
STATUS DEV_ADEC_MonoOutMix1_LD2MO(BOOL trueorfalse);
STATUS DEV_ADEC_MonoOutMix1_LI2MO(BOOL trueorfalse);
STATUS DEV_ADEC_MonoOutMix1_LI2MOVOL(unsigned char vol);
STATUS DEV_ADEC_MonoOutMix2_RD2MO(BOOL trueorfalse);
STATUS DEV_ADEC_MonoOutMix2_RI2MO(BOOL trueorfalse);
STATUS DEV_ADEC_MonoOutMix2_RI2MOVOL(unsigned char vol);
STATUS DEV_ADEC_LOUT2Vol_LO2VU(BOOL trueorfalse);
STATUS DEV_ADEC_LOUT2Vol_LO2ZC(BOOL trueorfalse);
STATUS DEV_ADEC_LOUT2Vol_LOUT2VOL(int vol);
STATUS DEV_ADEC_ROUT2Vol_RO2VU(BOOL trueorfalse);
STATUS DEV_ADEC_ROUT2Vol_RO2ZC(BOOL trueorfalse);
STATUS DEV_ADEC_ROUT2Vol_ROUT2VOL(int vol);
STATUS DEV_ADEC_MonoOutVol_MOZC(BOOL trueorfalse);
STATUS DEV_ADEC_MonoOutVol_MOUTVOL(unsigned char vol);
/*--------------------------------------------------------------------------*
* Local Variables Declartaion *
*--------------------------------------------------------------------------*/
static STATUS ret;
/*--------------------------------------------------------------------------*
* Code *
*---------------------------------------------------------------------------*
* For API Function Call *
*---------------------------------------------------------------------------*
* Brief : Initalize Audio codec *
* Return : None *
* Description : Run only when system initilization *
*--------------------------------------------------------------------------*/
STATUS DEV_Audio_Init( void )
{
int i;
for(i=0; i<43; i++)
{
WM8750Regs[i]=0;
}
// Register Default Value Table
WM8750Regs[0]= 0x0097;
WM8750Regs[1]= 0x0097;
WM8750Regs[2]= 0x0079;
WM8750Regs[3]= 0x0079;
WM8750Regs[5]= 0x0008;
WM8750Regs[7]= 0x000A;
// WM8750Regs[8]= 0x0000;
WM8750Regs[10]= 0x00FF;
WM8750Regs[11]= 0x00FF;
WM8750Regs[12]= 0x000F;
WM8750Regs[13]= 0x000F;
// WM8750Regs[16]= 0x0000;
WM8750Regs[17]= 0x007B;
// WM8750Regs[18]= 0x0000;
WM8750Regs[19]= 0x0032;
// WM8750Regs[20]= 0x0000;
WM8750Regs[21]= 0x00C3;
WM8750Regs[22]= 0x00C3;
WM8750Regs[23]= 0x00C0;
// WM8750Regs[24]= 0x0000;
WM8750Regs[25]= 0x00C0;
// WM8750Regs[26]= 0x0000;
// WM8750Regs[27]= 0x0000;
// WM8750Regs[31]= 0x0000;
// WM8750Regs[32]= 0x0000;
// WM8750Regs[33]= 0x0000;
WM8750Regs[34]= 0x0050;
WM8750Regs[35]= 0x0050;
WM8750Regs[36]= 0x0050;
WM8750Regs[37]= 0x0050;
WM8750Regs[38]= 0x0050;
WM8750Regs[39]= 0x0050;
WM8750Regs[40]= 0x0079;
WM8750Regs[41]= 0x0079;
WM8750Regs[42]= 0x0079;
// initial test set default dac mode
ret = DEV_ADEC_LOUT1Vol_LOUT1VOL(0x00);
if( ret != E_PASS ) goto dev_audio_init_end;
/*DEV_ADEC_ROUT1Vol_ROUT1VOL(0x00);
DEV_ADEC_LOUT2Vol_LOUT2VOL(0x00);
DEV_ADEC_ROUT2Vol_ROUT2VOL(0x00);
// R0
DEV_ADEC_LeftInputVol_LINMUTE(FALSE);
DEV_ADEC_LeftInputVol_LIVU(TRUE);
DEV_ADEC_LeftInputVol_LIZC(TRUE);
// R1
DEV_ADEC_RightInputVol_RINMUTE(FALSE);
DEV_ADEC_RightInputVol_RIVU(TRUE);
DEV_ADEC_RightInputVol_RIZC(TRUE);
// R2
DEV_ADEC_LOUT1Vol_LO1VU(TRUE);
DEV_ADEC_LOUT1Vol_LO1ZC(TRUE);
// R3
DEV_ADEC_ROUT1Vol_RO1VU(TRUE);
DEV_ADEC_ROUT1Vol_RO1ZC(TRUE);
DEV_ADEC_AdcDacCtrl_DACMUTE(FALSE);
DEV_ADEC_AdcDacCtrl_DEEMPH( NO_DEEMP );
// R7
DEV_ADEC_AudioInterface_MS(FALSE); //slave mode
DEV_ADEC_AudioInterface_FORMAT(DSP_Mode);
DEV_ADEC_AudioInterface_LRP(TRUE);
DEV_ADEC_AudioInterface_WL( Bits_16 );
// R10
DEV_ADEC_LeftDacVol_LDVU(TRUE);
DEV_ADEC_LeftDacVol_LDACVOL(0xFF);
// R11
DEV_ADEC_RightDacVol_RDVU(TRUE);
DEV_ADEC_RightDacVol_RDACVOL(0xFF);
// R12
DEV_ADEC_BassCtrl_BB(TRUE);
// R20
DEV_ADEC_NoiseGate_NGAT(TRUE);
// R21
DEV_ADEC_LeftAdcVol_LAVU(TRUE);
DEV_ADEC_LeftAdcVol_LADCVOL(0xC7);
// R22
DEV_ADEC_RightdcVol_RAVU(TRUE);
DEV_ADEC_RightdcVol_RADCVOL(0xC7);
// R23
DEV_ADEC_AddiCtrl1_TSDEN(TRUE);
DEV_ADEC_LeftOutMix1_LI2LOVOL(0x00);
// DEV_ADEC_LeftOutMix1_LD2LO( TRUE );
// R35
DEV_ADEC_LeftOutMix2_RI2LOVOL(0x00);
// R36
DEV_ADEC_RightOutMix1_LI2ROVOL(0x00);
// R37
DEV_ADEC_RightOutMix2_RI2ROVOL(0x00);
// DEV_ADEC_RightOutMix2_RD2RO( TRUE );
// R40
DEV_ADEC_LOUT2Vol_LO2VU(TRUE);
DEV_ADEC_LOUT2Vol_LO2ZC(TRUE);
// R41
DEV_ADEC_ROUT2Vol_RO2VU(TRUE);
DEV_ADEC_ROUT2Vol_RO2ZC(TRUE);
*/
dev_audio_init_end:
return ret;
}
/*--------------------------------------------------------------------------*
* Brief : Setting Clock & Sample Rate of Audio codec *
* Return : None *
* Description : Run only when system initilization *
*--------------------------------------------------------------------------*/
STATUS DEV_Audio_SetClockSampleRate(unsigned long Oscillator_Freq,unsigned int Sampling_Freq)
{
if(USB_Mode)
{
ret = DEV_ADEC_SampleRate_USB(TRUE);
if( ret != E_PASS ) goto dev_audio_scsr_usb_end;
if(Oscillator_Freq == 24000000)
{
Oscillator_Freq = 12000000;
DEV_ADEC_SampleRate_CLKDIV2(TRUE);
}
else
{
DEV_ADEC_SampleRate_CLKDIV2(FALSE);
}
switch(Sampling_Freq)
{
case 8000:
DEV_ADEC_SampleRate_SR(0x06);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 8021:
DEV_ADEC_SampleRate_SR(0x17);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 802144118:
DEV_ADEC_SampleRate_SR(0x15);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 11025:
DEV_ADEC_SampleRate_SR(0x19);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 12000:
DEV_ADEC_SampleRate_SR(0x08);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 16000:
DEV_ADEC_SampleRate_SR(0x0A);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 22058:
DEV_ADEC_SampleRate_SR(0x1B);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 24000:
DEV_ADEC_SampleRate_SR(0x1C);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
case 32000:
DEV_ADEC_SampleRate_SR(0x0C);
DEV_ADEC_WriteCmd(R8_Sample_Rate, WM8750Regs[8]);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -