www.pudn.com > dv981-hd.rar > ADAC.C


/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/ 
/***************                                       ****************/ 
/***************  $Modtime:: 03/10/27 10:19a   $       ****************/ 
/***************  $Revision: 5.0 $       ****************/ 
/***************                                       ****************/ 
/*************** Description : Audio DAC Module        ****************/ 
/***************                                       ****************/ 
/***************     Company : MediaTek Inc.           ****************/ 
/***************  Programmer : Alan Hsu                ****************/ 
/**********************************************************************/ 
 
#define  _C_ADAC_ 
 
#include "general.h" 
#include "common\dsp\dsp_uop.h" 
#include "custom\demo\ev.h" 
//#define adac_232_debug 
#pragma NOAREGS 
 
#ifndef _NPADAC_ 
  BYTE xdata _bAudioSample; // 0->50k, 1->100k, 2->200k 
#endif 
#ifdef HDMI_PROC_IN_8032 
  extern BYTE xdata _bHdmiAudioNeedChange; 
extern BYTE xdata _bI2SChannel; 
extern BYTE xdata _bOldI2SChannel; 
#ifdef USE_MTK_DOWNSAMPLE 
  extern BYTE xdata _bHdmiAudioDownSample1; 
  extern void fgHdmiAudioCheck(void) large; 
#endif 
//  extern BYTE xdata _bHdmiAudioChangeTimeOut; 
#endif 
#ifdef _PCM1723_ 
  extern void vADAC1723Setting(WORD wValue) large; 
#endif 
 
#ifdef _PCM1604_ 
  extern BYTE bDA1604Read(BYTE bIndex) large; 
  extern void vDA1604Write(BYTE bIndex, BYTE bValue) large; 
#endif 
 
#if (defined(_PCM1742_) || defined(_WM8746_) || defined(_AK4357_) || defined(_AK4356_) || defined(_AK4382_)) 
  extern void vADACWrite(BYTE bRegAddr, BYTE bValue) large; 
#endif 
 
#if (defined(_AV2188_) || defined(_AV2388_)) 
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  x        AV2188 Serial Port Control Register Assignment              x 
  x--------------------------------------------------------------------x 
  x        Default Value = 80h for 0 ~ 2. Device Addr : 0x31           x 
  x--------------------------------------------------------------------x 
  x 0   CREG0[7:0]  : Data Inout Format, de-emphasis filter selection  x 
  x 1   CREG1[7:0]  : DAC and ADC power down control                   x 
  x 2   VOLREG[7:0] : Volume Control                                   x 
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ 
 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  BYTE bData; 
  bData = 0x00; //Enable auto-mute function 
  fgI2CByteWrite(0x31, 0x00, bData); // 24-bit, Right-Justified Format 
  bData = 0x00; 
  fgI2CByteWrite(0x31, 0x01, bData); // Power On DAC 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat) large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x38; 
      break; 
 
    case RTJ_18BIT: 
      bData = 0x28; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x18; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x08; 
      break; 
 
    case I2S_16BIT: 
      bData = 0x78; 
      break; 
 
    case I2S_18BIT: 
      bData = 0x68; 
      break; 
 
    case I2S_20BIT: 
      bData = 0x58; 
      break; 
 
    case I2S_24BIT: 
      bData = 0x48; 
      break; 
 
    case LTJ_16BIT: 
      bData = 0xB8; 
      break; 
 
    case LTJ_18BIT: 
      bData = 0xA8; 
      break; 
 
    case LTJ_20BIT: 
      bData = 0x98; 
      break; 
 
    case LTJ_24BIT: 
      bData = 0x88; 
      break; 
 
    default: 
      bData = 0x08; //24-bit, RTJ 
      break; 
  } 
  fgI2CByteWrite(0x31, 0x00, bData); 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if((bReadAUD(AUD_AOUTCFG) & 0x30) == 0x20) // Left-Justified 
  { 
    bData = 0x88; 
  } 
  else if((bReadAUD(AUD_AOUTCFG) & 0x30) == 0x30) // I2S Format 
  { 
    bData = 0x48; 
  } 
  else                                       // Right-Justified 
  { 
    bData = 0x08; 
  } 
 
  if(bReadAUD(AUD_ADACCFG) == 16)  // 16-bit 
  { 
    bData = bData + 0x30; 
  } 
  else if(bReadAUD(AUD_ADACCFG) == 18) // 18-bit 
  { 
    bData = bData + 0x20; 
  } 
  else if(bReadAUD(AUD_ADACCFG) == 20) // 20-bit 
  { 
    bData = bData + 0x10; 
  } 
  else if(bReadAUD(AUD_ADACCFG) == 24) // 24-bit 
  { 
    bData = bData + 0x00; 
  } 
  bData = bData + (BYTE)fgEnable; 
  fgI2CByteWrite(0x31, 0x00, bData); 
 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x00; 
  } 
  else 
  { 
    bData = 0x87; 
  } 
  fgI2CByteWrite(0x31, 0x01, bData); 
} 
#endif  //_AV2188_, _AV2388_ 
 
#ifdef _CS4228_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : Audio DAC initial 
    Parameter : None 
    Return    : None 
************************************************************************/ 
void ADACInit(void) large 
{ 
  BYTE bData; 
  bData = 0x08; 
  fgI2CByteWrite(0x10, 0x01, bData); 
//  bData = 0x80; 
//  fgI2CByteWrite(0x10, 0x02, bData); 
  bData = 0x80; 
  fgI2CByteWrite(0x10, 0x03, bData); 
  bData = 0x00; 
  fgI2CByteWrite(0x10, 0x04, bData); 
  //Enable Mute Control Normal 
#ifdef DAC_EXTPIN_MUTE 
  bData = 0x40; 
  fgI2CByteWrite(0x10, 0x05, bData); 
#endif 
  bData = 0x80; 
  fgI2CByteWrite(0x10, 0x06, bData); 
  //Volume Control, Improve the Hardware-->Modified by hardware setting 
  bData = 0x04; 
  fgI2CByteWrite(0x10, 0x07, bData); 
  fgI2CByteWrite(0x10, 0x08, bData); 
  fgI2CByteWrite(0x10, 0x09, bData); 
  fgI2CByteWrite(0x10, 0x0A, bData); 
  fgI2CByteWrite(0x10, 0x0B, bData); 
  fgI2CByteWrite(0x10, 0x0C, bData); 
  //24-bit, right-justified 
  bData = 0x40; 
  fgI2CByteWrite(0x10, 0x0D, bData); 
} 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat) large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
    case RTJ_18BIT: 
      bData = 0x42; 
      break; 
    case RTJ_20BIT: 
      bData = 0x41; 
      break; 
    case RTJ_24BIT: 
      bData = 0x40; 
      break; 
 
    case I2S_16BIT: 
    case I2S_18BIT: 
    case I2S_20BIT: 
    case I2S_24BIT: 
      bData = 0x44; 
      break; 
 
    case LTJ_16BIT: 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
    case LTJ_24BIT: 
      bData = 0x43; 
      break; 
 
    default: 
      bData = 0x40; //24-bit, RTJ 
      break; 
  } 
  fgI2CByteWrite(0x10, 0x0D, bData); 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0xBF; 
  } 
  else 
  { 
    bData = 0x80; 
  } 
  fgI2CByteWrite(0x10, 0x06, bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x80; 
  } 
  else 
  { 
    bData = 0x00; 
  } 
  fgI2CByteWrite(0x10, 0x02, bData); 
} 
#endif  //_CS4228// 
 
#ifdef  _PCM1604_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  //default auto-mute off 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x03; 
      break; 
 
    case RTJ_18BIT: 
      bData = 0x02; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x01; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x00; 
      break; 
 
    case I2S_16BIT: 
      bData = 0x04; 
      break; 
 
    case I2S_18BIT: 
      bData = 0x04; 
      break; 
 
    case I2S_20BIT: 
      bData = 0x04; 
      break; 
 
    case I2S_24BIT: 
      bData = 0x04; 
      break; 
 
    case LTJ_16BIT: 
      bData = 0x05; 
      break; 
 
    case LTJ_18BIT: 
      bData = 0x05; 
      break; 
 
    case LTJ_20BIT: 
      bData = 0x05; 
      break; 
 
    case LTJ_24BIT: 
      bData = 0x05; 
      break; 
 
    default: 
      bData = 0x00; //24-bit, RTJ 
      break; 
  } 
  vDA1604Write(0x09, bData); 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  if(fgEnable) 
  { 
    vDA1604Write(0x0A, 0x07); 
  } 
  else 
  { 
    vDA1604Write(0x0A, 0x00); 
  } 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x00; 
  } 
  else 
  { 
    bData = 0x7F; 
  } 
  vDA1604Write(0x08, bData); 
} 
#endif //_PCM1604_ 
 
#ifdef _PCM1723_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  vADAC1723Setting(0x0530); // 24-bit data, Stereo output (register 2) 
  vADAC1723Setting(0x0740); //Right-Justified format (register 3) 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      vADAC1723Setting(0x0520); 
      _bSerialBus = 0; 
      break; 
 
    case RTJ_18BIT: //Using I2S Format 
      ;  // No 18-bit setting, no change 
      _bSerialBus = 1; 
      break; 
 
    case RTJ_20BIT: 
      vADAC1723Setting(0x0528); 
      _bSerialBus = 0; 
      break; 
 
    case RTJ_24BIT: 
      vADAC1723Setting(0x0530); 
      _bSerialBus = 0; 
      break; 
 
    case I2S_16BIT: 
      vADAC1723Setting(0x0520); 
      _bSerialBus = 1; 
      break; 
 
    case I2S_18BIT: 
      ;  // No 18-bit setting, no change 
      _bSerialBus = 1; 
      break; 
 
    case I2S_20BIT: 
      vADAC1723Setting(0x0528); 
      _bSerialBus = 1; 
      break; 
 
    case I2S_24BIT: 
      vADAC1723Setting(0x0530); 
      _bSerialBus = 1; 
      break; 
 
    case LTJ_16BIT: 
      vADAC1723Setting(0x0520); 
      _bSerialBus = 1;  //No Left Justified-->Change to I2S 
      break; 
 
    case LTJ_18BIT: 
      ;  // No 18-bit setting, no change 
      _bSerialBus = 1;  //No Left Justified-->Change to I2S 
      break; 
 
    case LTJ_20BIT: 
      vADAC1723Setting(0x0528); 
      _bSerialBus = 1;  //No Left Justified-->Change to I2S 
      break; 
 
    case LTJ_24BIT: 
      vADAC1723Setting(0x0530); 
      _bSerialBus = 1;  //No Left Justified-->Change to I2S 
      break; 
 
    default: 
      vADAC1723Setting(0x0530); //RTJ_24BIT 
      _bSerialBus = 0; 
      break; 
  } 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(bReadAUD(AUD_ADACCFG) == 16)            //the Data to 16bit 
  { 
    bData = 0x0520 + ((BYTE)fgEnable<<1); 
  } 
  else if(bReadAUD(AUD_ADACCFG) == 20)       //the Data to 18bit 
  { 
    bData = 0x0528 + ((BYTE)fgEnable<<1); 
  } 
  else                                       //the Data to 24bit 
  { 
    bData = 0x0530 + ((BYTE)fgEnable<<1); 
  } 
  vADAC1723Setting(bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
} 
 
#endif  // _PCM1723_ 
 
#ifdef  _PCM1742_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  //default auto-mute off 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x03; 
      break; 
 
    case RTJ_18BIT: 
      bData = 0x02; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x01; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x00; 
      break; 
 
    case I2S_16BIT: 
    case I2S_18BIT: 
    case I2S_20BIT: 
    case I2S_24BIT: 
      bData = 0x04; 
      break; 
 
    case LTJ_16BIT: 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
    case LTJ_24BIT: 
    default: 
      bData = 0x05; //24-bit, LTJ 
      break; 
  } 
  vADACWrite(0x14, bData); 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData = 0x00; 
  if(fgEnable) 
  { 
    bData = 0x10; 
  } 
  vADACWrite(0x13, bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData = 0x00; 
  if(fgEnable == 0) 
  { 
    bData = 0x03; 
  } 
  vADACWrite(0x13, bData); 
} 
#endif //_PCM1742_ 
 
#ifdef _WM8746_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  vADACFormat(RTJ_24BIT); 
  vADACPower(TRUE); 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x00; 
      break; 
 
    case RTJ_18BIT: 
    case RTJ_20BIT: 
      bData = 0x10; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x20; 
      break; 
 
    case I2S_16BIT: 
      bData = 0x02; 
      break; 
 
    case I2S_18BIT: //no 18-bit 
    case I2S_20BIT: 
      bData = 0x12; 
      break; 
 
    case I2S_24BIT: 
      bData = 0x22; 
      break; 
 
    case LTJ_16BIT: 
      bData = 0x01; 
      break; 
 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
      bData = 0x11; 
      break; 
 
    case LTJ_24BIT: 
      bData = 0x21; 
      break; 
 
    default: 
      bData = 0x20; //24-bit, RTJ 
      break; 
  } 
  vADACWrite(0x03, bData); 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x22; 
  } 
  else 
  { 
    bData = 0x20; 
  } 
  vADACWrite(0x02, bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x20; 
  } 
  else 
  { 
    bData = 0x24; 
  } 
  vADACWrite(0x02, bData); 
} 
 
#endif  // _WM8746_ 
 
#if (defined(_AK4357_) || defined(_AK4356_)) 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  #ifdef _AK4357_    
    vADACDSDOn(0); 
    vADACWrite(0x00, 0x99); //24-bit, RTJ 
  #endif 
  #ifdef _AK4356_ 
    vADACWrite(0x00, 0x19); //24-bit, RTJ 
    vADACWrite(0x01, 0x0D); //Mode 3, 48K and 96K are 384FS 
  #endif 
   
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  BYTE bData; 
  vADACWrite(0x00, 0x00); //Reset ADAC 
  vADACWrite(0x02, 0x0E); //Reset ADAC 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x00; 
      break; 
 
    case RTJ_18BIT: //Using I2S Format 
      bData = 0x03; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x01; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x04; 
      break; 
 
    case I2S_16BIT: 
    case I2S_18BIT: 
    case I2S_20BIT: 
    case I2S_24BIT: 
      bData = 0x03; 
      break; 
 
    case LTJ_16BIT: //Using I2S Format 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
      bData = 0x03; 
      break; 
 
    case LTJ_24BIT: 
      bData = 0x02; 
      break; 
 
    default: 
      bData = 0x04; //24-bit, RTJ 
      break; 
  } 
  #ifdef _AK4357_ 
    bData = 0x90 + (bData << 1) + 1; 
  #endif 
  #ifdef _AK4356_ 
    bData = 0x10 + (bData << 1) + 1; 
  #endif 
   
  //Decide which sampling rates 
  if(_bAudioSample <= 0x05) //FS384_48K 
  { 
    vADACWrite(0x02, 0x0F); 
  } 
  else if(_bAudioSample <= 0x08)  //FS384_96K 
  { 
    vADACWrite(0x02, 0x1F); 
  } 
  else 
  { 
    vADACWrite(0x02, 0x2F); 
  } 
  vADACWrite(0x00, bData); 
 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x00; 
  } 
  else 
  { 
    bData = 0x01; 
  } 
  vADACWrite(0x03, bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Power UP , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  if(fgEnable) 
  { 
    bData = 0x0F; 
  } 
  else 
  { 
    bData = 0x01; 
  } 
  vADACWrite(0x02, bData); 
} 
#ifdef _AK4357_ 
/************************************************************************ 
     Function : void vADACDSDOn(BOOL fgEnable) 
  Description : DSD data output Control 
    Parameter : fgEnable : 1->DSD , 0-> PCM 
    Return    : NONE 
************************************************************************/ 
void vADACDSDOn(BOOL fgEnable) large 
{ 
  BYTE bData, bData1; 
 
  vADACWrite(0x02, 0x0E); 
  if(fgEnable) 
  { 
#ifndef  AUDIO_256FS 
    bData = 0x30; // DCKS = 1 , D/P = 1 
#else 
    bData = 0x10; // DCKS = 1 , D/P = 1 
#endif 
  } 
  else 
  { 
    bData = 0x00; 
  } 
  vADACWrite(0x0A, bData); 
  //Setting ADSP Register 
  bData1 = bReadAUD(AUD_AOUTCFG); 
  bData1 = bData1 & 0xF7; 
  if(fgEnable) 
  { 
    WriteAUD(AUD_ACLKCFG, 0x66);  
    vAClkSetting(0x0B); //FS768_44K 
    bData1 = bData1 + 0X08; 
  } 
  else 
  { 
#ifndef  AUDIO_256FS 
    WriteAUD(AUD_ACLKCFG, 0x64); //Setting the Audio Clk to Internal Clk 
#else 
    WriteAUD(AUD_ACLKCFG, 0x42); //Setting the Audio Clk to Internal Clk 
#endif 
    vAClkSetting(0x04); //FS384_44K 
  } 
  WriteAUD(AUD_AOUTCFG, bData1);    
  vADACWrite(0x02, 0x0F); 
} 
#endif //_AK4357_ 
#endif //_AK4357_ || _AK4356_ 
#ifdef  _WM8756_ 
/************************************************************************ 
     Function : void vADACWrite(BYTE bRegAddr, BYTE bValue) 
  Description : Write Routine 
                timing : 
    ASTB(CSN)  --|_____________________________________________|-------| 
    VSCK(CCLK) --|_|^|_|^|_|^|_|^|_|^|_|^|_|^|_|^|_|^|__~__|_|^|------- 
    VSDA(CDTI) __| 0 | 0 |R/W| A4| A3| A2| A1| A0| D7|__~__|D0 |XXXXXXXX 
    Parameter : 1. bRegAddr 2. bValue 
    Return    : NONE 
************************************************************************/ 
/* 
void vADACWrite(BYTE bRegAddr, BYTE bValue) large 
{ 
} 
*/ 
 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  vADACDSDOn(0); 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
} 
/************************************************************************ 
     Function : void vADACDSDOn(BOOL fgEnable) 
  Description : DSD data output Control 
    Parameter : fgEnable : 1->DSD , 0-> PCM 
    Return    : NONE 
************************************************************************/ 
void vADACDSDOn(BOOL fgEnable) large 
{ 
#if 0 
  BYTE bData, bData1; 
  if(fgEnable) 
  { 
//    _fgOPcmOn = 0; //DSD Mode 
  } 
  else 
  { 
//    _fgOPcmOn = 1; //PCM Mode 
  } 
 
//  ReFreshMT1336IO07(); 
 
  //Setting ADSP Register 
  bData1 = bReadAUD(AUD_AOUTCFG); 
  bData1 = bData1 & 0xF7; 
  if(fgEnable) 
  { 
    WriteAUD(AUD_ACLKCFG, 0x66);  
    vAClkSetting(0x0B); //FS768_44K 
    bData1 = bData1 + 0X08; 
  } 
  else 
  { 
#ifndef  AUDIO_256FS 
    WriteAUD(AUD_ACLKCFG, 0x64); //Setting the Audio Clk to Internal Clk 
#else 
    WriteAUD(AUD_ACLKCFG, 0x42); //Setting the Audio Clk to Internal Clk 
#endif 
    vAClkSetting(0x04); //FS384_44K 
  } 
  WriteAUD(AUD_AOUTCFG, bData1);    
#endif 
} 
#endif //_WM8756_ 
 
#if (defined(_CS4360_) || defined(_CS4362_)) 
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  x        CS4360 Serial Port Control Register Assignment              x 
  x--------------------------------------------------------------------x 
  x        Device Addr : 0x10                                          x 
  x--------------------------------------------------------------------x 
  x        Audio Format : Left Justified 16~24bit                      x 
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ 
 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  BYTE bData; 
  //Enable I2C Control Port 
#ifdef _CS4362_ 
  bData = 0x81; 
  fgI2CByteWrite(0x18, 0x01, bData); 
#else 
  bData = 0xA8; 
  fgI2CByteWrite(0x10, 0x0C, bData); // Power On DAC 
#ifndef DAC_EXTPIN_MUTE 
  //Disable auto-mute function to use mute pin 
  bData = 0x00; 
  fgI2CByteWrite(0x10, 0x01, bData); // Power On DAC 
#endif 
#endif   
 
  //Reduce the chip volume control to avoid overflow 
  //44kHz, 0dB, 96kHz Fs testing bitstream 
 
#ifdef _CS4362_ 
  bData = 0x80; 
  fgI2CByteWrite(0x18, 0x07, bData); 
  fgI2CByteWrite(0x18, 0x08, bData); 
  fgI2CByteWrite(0x18, 0x0a, bData); 
  fgI2CByteWrite(0x18, 0x0b, bData); 
  fgI2CByteWrite(0x18, 0x0d, bData); 
  fgI2CByteWrite(0x18, 0x0e, bData); 
 
  vI2CDelay2us(250); 
  fgI2CByteWrite(0x18, 0x01, bData); 
#else 
  bData = 0x00;   //0x01->0x00 by tide 
  fgI2CByteWrite(0x10, 0x07, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x09, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x0A, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x0B, bData); // Reduce the volume 
  bData = 0x00; 
  fgI2CByteWrite(0x10, 0x06, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x08, bData); // Reduce the volume 
#endif 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat) large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x20; 
      break; 
 
    case RTJ_18BIT: 
      bData = 0x50; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x40; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x30; 
      break; 
 
    case I2S_16BIT: 
    case I2S_18BIT: 
    case I2S_20BIT: 
    case I2S_24BIT: 
      bData = 0x10; 
      break; 
 
    case LTJ_16BIT: 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
    case LTJ_24BIT: 
    default: 
      bData = 0x00; //24-bit, LTJ 
      break; 
  } 
#ifdef _CS4362_ 
  fgI2CByteWrite(0x18, 0x02, bData); 
 
  //Decide which sampling rates 
  if(_bAudioSample <= 0x05) //FS384_48K 
    bData = 0x24; 
  else if(_bAudioSample <= 0x08)  //FS384_96K 
    bData = 0x25; 
  else 
    bData = 0x26; 
  fgI2CByteWrite(0x18, 0x06, bData); 
  fgI2CByteWrite(0x18, 0x09, bData); 
  fgI2CByteWrite(0x18, 0x0c, bData); 
  fgI2CByteWrite(0x18, 0x0f, bData); 
#else 
  //Decide which sampling rates 
  if(_bAudioSample <= 0x05) //FS384_48K 
  { 
    bData = bData + 0x00; 
  } 
  else if(_bAudioSample <= 0x08)  //FS384_96K 
  { 
    bData = bData + 0x01; 
  } 
  else 
  { 
    bData = bData + 0x02; 
  } 
 
  fgI2CByteRead(0x10, 0x01, &bDataFormat); 
  bData = (bDataFormat&0x8C) + bData; 
  fgI2CByteWrite(0x10, 0x01, bData); 
#endif 
 
#ifdef _CS4362_ 
  bData = 0x01; 
  fgI2CByteWrite(0x18, 0x07, bData); 
  fgI2CByteWrite(0x18, 0x08, bData); 
  fgI2CByteWrite(0x18, 0x0a, bData); 
  fgI2CByteWrite(0x18, 0x0b, bData); 
  fgI2CByteWrite(0x18, 0x0d, bData); 
  fgI2CByteWrite(0x18, 0x0e, bData); 
#endif 
 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
#ifdef _CS4362_ 
  fgI2CByteRead(0x18, 0x04, &bData); 
  bData = bData & 0xF9; 
  if(fgEnable) 
  { 
    bData = bData + 0x02; 
  } 
  fgI2CByteWrite(0x18, 0x04, bData); 
#else 
  fgI2CByteRead(0x10, 0x01, &bData); 
  bData = bData & 0xF3; 
  if(fgEnable) 
  { 
    bData = bData + 0x04; 
  } 
  fgI2CByteWrite(0x10, 0x01, bData); 
#endif 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  fgI2CByteRead(0x10, 0x0C, &bData); 
  bData = bData & 0xEF; 
  if(fgEnable == 0) 
  { 
    bData = bData | 0x10; 
  } 
  fgI2CByteWrite(0x10, 0x0C, bData); 
} 
#endif  //_CS4360_ 
 
#ifdef _AK4382_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  vADACWrite(0x00, 0x8B); //24-bit, RTJ 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat)  large 
{ 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      vADACWrite(0x00, 0x83); 
      break; 
 
    case RTJ_18BIT:  
      ;  // No 18-bit RTJ setting, no change 
      break; 
 
    case RTJ_20BIT: 
      vADACWrite(0x00, 0x87); 
      break; 
 
    case RTJ_24BIT: 
      vADACWrite(0x00, 0x93); 
      break; 
 
    case I2S_16BIT: 
      ;  // No 16-bit I2S setting, no change 
      break; 
 
    case I2S_18BIT: 
      ;  // No 18-bit I2S setting, no change 
      break; 
 
    case I2S_20BIT: 
      ;  // No 20-bit I2S setting, no change 
      break; 
 
    case I2S_24BIT: 
      vADACWrite(0x00, 0x8F); 
      break; 
 
    case LTJ_16BIT: 
      ;  // No 16-bit LTJ setting, no change 
      break; 
 
    case LTJ_18BIT: 
      ;  // No 18-bit LTJ setting, no change 
      break; 
 
    case LTJ_20BIT: 
      ;  // No 20-bit LTJ setting, no change 
      break; 
 
    case LTJ_24BIT: 
      vADACWrite(0x00, 0x8B); 
      break; 
 
    default: 
      vADACWrite(0x00, 0x8B); 
      break; 
  } 
} 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  if(fgEnable == 1) 
    { 
      vADACWrite(0x00, 0x89); 
    } 
} 
 
#endif  //_AK4382_ 
 
#ifdef  _CS4391_ 
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
  x        CS4391 Serial Port Control Register Assignment              x 
  x--------------------------------------------------------------------x 
  x        Device Addr : 0x10 or 0x11                                  x 
  x--------------------------------------------------------------------x 
  x        Audio Format : Left Justified 16~24bit                      x 
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ 
 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  BYTE bData; 
  //Enable I2C Control Port 
  bData = 0x20; 
  fgI2CByteWrite(0x10, 0x05, bData); // Power On DAC 
#ifdef DAC_AUTO_MUTE 
  //Eable auto-mute function  
  bData = 0x80; 
  fgI2CByteWrite(0x10, 0x01, bData);  
#endif 
 
  //Reduce the chip volume control to avoid overflow 
  //44kHz, 0dB, 96kHz Fs testing bitstream 
  bData = 0x00; 
  fgI2CByteWrite(0x10, 0x03, bData); // Channel A Volume Control 
  fgI2CByteWrite(0x10, 0x04, bData); // Channel A Volume Control 
 } 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat) large 
{ 
  BYTE bData; 
  switch(bDataFormat) 
  { 
    case RTJ_16BIT: 
      bData = 0x20; 
      break; 
 
    case RTJ_18BIT: 
      bData = 0x50; 
      break; 
 
    case RTJ_20BIT: 
      bData = 0x40; 
      break; 
 
    case RTJ_24BIT: 
      bData = 0x30; 
      break; 
 
    case I2S_16BIT: 
    case I2S_18BIT: 
    case I2S_20BIT: 
    case I2S_24BIT: 
      bData = 0x10; 
      break; 
 
    case LTJ_16BIT: 
    case LTJ_18BIT: 
    case LTJ_20BIT: 
    case LTJ_24BIT: 
    default: 
      bData = 0x00; //24-bit, LTJ 
      break; 
  } 
  //Decide which sampling rates 
  if(_bAudioSample <= 0x05) //FS384_48K 
  { 
    bData = bData + 0x00; 
  } 
  else if(_bAudioSample <= 0x08)  //FS384_96K 
  { 
    bData = bData + 0x01; 
  } 
  else if(_bAudioSample <= 0x0A)  //FS384_192K 
  { 
    bData = bData + 0x02; 
  } 
  else 
  { 
    bData = bData + 0x03; 
  } 
 
  fgI2CByteRead(0x10, 0x01, &bDataFormat); 
  bData = (bDataFormat&0x8C) + bData; 
  fgI2CByteWrite(0x10, 0x01, bData); 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
  BYTE bData; 
  fgI2CByteRead(0x10, 0x01, &bData); 
  bData = bData & 0xF3; 
  if(fgEnable) 
  { 
    bData = bData | 0x04;  
  } 
  fgI2CByteWrite(0x10, 0x01, bData); 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
  BYTE bData; 
  fgI2CByteRead(0x10, 0x05, &bData); 
  bData = bData & 0xEF; 
  if(fgEnable == 0) 
  { 
    bData = bData | 0x10;  
  } 
  fgI2CByteWrite(0x10, 0x05, bData); 
} 
/************************************************************************ 
     Function : void vADACDSDOn(BOOL fgEnable) 
  Description : DSD data output Control 
    Parameter : fgEnable : 1->DSD , 0-> PCM 
    Return    : NONE 
************************************************************************/ 
void vADACDSDOn(BOOL fgEnable) large 
{ 
  BYTE bData, bData1; 
   
  if(fgEnable) 
  { 
    _fgOPcmOn = 0; //DSD Mode 
  } 
  else 
  { 
    _fgOPcmOn = 1; //PCM Mode 
  } 
 
  ReFreshMT1336IO07(); 
 
  //Setting ADSP Register 
  bData1 = bReadAUD(AUD_AOUTCFG); 
  bData1 = bData1 & 0xF7; 
  if(fgEnable) 
  { 
    WriteAUD(AUD_ACLKCFG, 0x66);  
    vAClkSetting(0x0B); //FS768_44K 
    bData1 = bData1 + 0X08; 
  } 
  else 
  { 
#ifndef  AUDIO_256FS 
    WriteAUD(AUD_ACLKCFG, 0x64); //Setting the Audio Clk to Internal Clk 
#else 
    WriteAUD(AUD_ACLKCFG, 0x42); //Setting the Audio Clk to Internal Clk 
#endif 
    vAClkSetting(0x04); //FS384_44K 
  } 
  WriteAUD(AUD_AOUTCFG, bData1);    
} 
#endif  //_CS4391_ 
 
#ifdef  _NPADAC_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
} 
 
/************************************************************************ 
     Function : void vADACFormat(BYTE bDataFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384) 
    Return    : NONE 
************************************************************************/ 
void vADACFormat(BYTE bDataFormat) large 
{ 
} 
 
/************************************************************************ 
     Function : void ADACDeEmphasis(BOOL fgEnable) large 
  Description : Audio DAC de-emphasis Turn on/off 
                If use this function, disable the mute function. 
    Parameter : fgDeEmphasisOn : 1->On, 0->Off 
    Return    : None 
************************************************************************/ 
void ADACDeEmphasis(BOOL fgEnable) large 
{ 
} 
/************************************************************************ 
     Function : void vADACPower(BOOL fgEnable) 
  Description : ADAC Power Control 
    Parameter : fgEnable : 1->Enable , 0-> Power Down 
    Return    : NONE 
************************************************************************/ 
void vADACPower(BOOL fgEnable) large 
{ 
} 
#endif  //_NPADAC_ 
 
#ifdef _INTACLK_ 
/************************************************************************ 
     Function : void vAClkSetting(void) 
  Description : Support the internal Audio MClk 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void vAClkSetting(BYTE bFs) large 
{ 
  BYTE ACK_FS; 
  BYTE AOUT_CFG; 
  #ifdef ADSP_USE_APLL 
  BYTE bACLKC = bReadBIM(BIM_ACLKC); 
  BYTE bTmp; 
 
  if ((bACLKC & AC_CLK_MASK) == ADSP_APLL_RATIO) 
  { 
    bTmp = (bACLKC & (~AC_CLK_MASK)) | AC_DPLD4; 
    WriteBIM(BIM_ACLKC, bTmp); 
  } 
  #endif /* ADSP_USE_APLL */ 
   
  #ifdef AUDIO_256FS 
    ACK_FS = 0x42; 
  #else 
      ACK_FS = 0x63; 
  #endif 
   
  AOUT_CFG = bReadAUD(AUD_AOUTCFG) & (~DSD_MASK); 
     
  if (bFs==FS384_16K || bFs==FS384_24K || bFs==FS384_32K || bFs==FS384_48K || 
      bFs==FS384_64K || bFs==FS384_96K || bFs==FS384_192K) 
  { 
    WriteBIM(BIM_APLLC1, 0x80+(_bAPllBank[1]<<1)); // Setting APLL Bank 
    WriteBIM(BIM_AMH, 0x01);     // AM: 375 
    WriteBIM(BIM_AML, 0x77); 
    WriteBIM(BIM_AN2H, 0x02);    // AN2: 512 
    WriteBIM(BIM_AN2L, 0x00); 
  } 
  else if (bFs==FS384_22K || bFs==FS384_44K || bFs==FS384_88K || 
           bFs==FS384_176K || bFs==FS768_44K) 
  { 
    WriteBIM(BIM_APLLC1, 0x80+(_bAPllBank[0]<<1));  // Setting APLL Bank 
    WriteBIM(BIM_AMH, 0x02);     // AM: 625 
    WriteBIM(BIM_AML, 0x71); 
    WriteBIM(BIM_AN2H, 0x03);    // AN2: 784 
    WriteBIM(BIM_AN2L, 0x10);   
  } 
  switch(bFs)  //384Fs APLL N1 Setting 
  {    
    case FS384_16K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x18);  // Set AK2 divided by 24 
      break; 
    case FS384_22K: //384fs or 256fs 
    case FS384_24K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x10);  // Set AK2 divided by 16 
      break; 
    case FS384_32K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x0C);  // Set AK2 divided by 12 
      break; 
    case FS384_44K: //384fs or 256fs 
    case FS384_48K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x08);  // Set AK2 divided by 8 
      break; 
    case FS768_44K: //DSD mode 
      WriteBIM(BIM_AOCLKC, 0x08);  // Set AK2 divided by 8 
      AOUT_CFG |= DSD_MASK; 
      break; 
    case FS384_64K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x06);  // Set AK2 divided by 6 
      break; 
    case FS384_88K: //384fs or 256fs 
    case FS384_96K: //384fs or 256fs 
      WriteBIM(BIM_AOCLKC, 0x04);  // Set AK2 divided by 4 
      break; 
    case FS384_176K:  //384fs or 256ds -->128fs 
    case FS384_192K:  //384fs or 256fs -->128fs   
      #ifdef AUDIO_256FS 
        WriteBIM(BIM_AOCLKC, 0x04);  // Set AK2 divided by 4 
      #else 
        WriteBIM(BIM_AOCLKC, 0x06);  // Set AK2 divided by 6 
      #endif 
      ACK_FS = 0x21; //switch to 128fs 
      break; 
  }   
   
  if (bReadAUD(AUD_ACLKCFG) != ACK_FS) 
  { 
    WriteAUD(AUD_ACLKCFG, ACK_FS); 
  } 
   
  if (bReadAUD(AUD_AOUTCFG) != AOUT_CFG) 
  { 
    WriteAUD(AUD_AOUTCFG, AOUT_CFG); 
  } 
 
  #ifdef AUDIO_256FS 
    WriteBIM(BIM_AN1, 0x01);   // Set AK1 = 3 
  #else 
    WriteBIM(BIM_AN1, 0x00);   // Set AK1 = 2 
  #endif 
   
  #ifdef ADSP_USE_APLL 
  if (bACLKC != bReadBIM(BIM_ACLKC)) 
  { 
    // delay 200us 
    for (bTmp = 0; bTmp < 100; bTmp++) 
    { 
      _nop_(); _nop_(); _nop_(); _nop_(); 
    } 
    WriteBIM(BIM_ACLKC, bACLKC); 
  } 
  #endif /* ADSP_USE_APLL */ 
} 
#else  //external clock 
/************************************************************************ 
     Function : void vAClkSetting(void) 
  Description : Support the External Audio MClk 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void vAClkSetting(BYTE bFs) large 
{ 
} 
#endif  /* _INTACLK_ */ 
 
/************************************************************************ 
     Function : void ADACDataFormat(BYTE bDataFormat, BYTE bClockFormat) 
  Description : Setting ADAC Data Format 
    Parameter : 16 ~ 24bits, Rt/I2S/Lt (Data bit + Data Format), 
                Sampling Point(256/384), Sampling Frequency. 
    Return    : NONE 
************************************************************************/ 
void ADACDataFormat(BYTE bDataFormat, BYTE bClockFormat) large 
{ 
  BYTE bCh;// = bSharedInfo(SI_DSP_CH_CFG); 
  BYTE bDownmix;// = fgI2CByteRead(SPEAKER_POSITION); 
  BYTE bFnt;// = bEepromReadByte(FNT_SPK_POSITION); 
  BYTE bSub;// = bEepromReadByte(SUB_SPK_POSITION); 
  BYTE bCnt;// = bEepromReadByte(CNTR_SPK_POSITION); 
  BYTE bRear;// = bEepromReadByte(REAR_SPK_POSITION); 
  BYTE bPL2;// = bEepromReadByte(PROLOG_SW_POS); 
 
#ifndef _NPADAC_ 
  _bAudioSample = bClockFormat; 
  #if(defined(_CS4360_) || defined(_AK4382_) || defined(_CS4362_) || \ 
      defined(_CS4391_)) 
    vADACFormat(LTJ_24BIT); 
  #else 
    vADACFormat(RTJ_24BIT);   
  #endif 
#endif /* _NPADAC */ 
//  vADACFormat(bDataFormat); Change this in the ADAC Init function 
  vAClkSetting(bClockFormat); 
/* 
   if(_bAudioSample > 0x05) 
   { 
      #ifdef adac_232_debug 
	    DBGLogB(bSharedInfo(SI_A_CH_CFG), _bI2SChannel, 0, 0); 
	  #endif 
//   	vSetSharedInfo(SI_DSP_DOWNSAMPLE, 0x00); 
//       vNotifyDspSharedInfo(UOP_DSP_DOWNSAMPLE); 
   } 
*/ 
  #ifdef USE_MTK_DOWNSAMPLE 
  fgI2CByteRead(EEPROM_ADDR, SPEAKER_POSITION, &bDownmix); 
  fgI2CByteRead(EEPROM_ADDR, FNT_SPK_POSITION, &bFnt); 
  fgI2CByteRead(EEPROM_ADDR, SUB_SPK_POSITION, &bSub); 
  fgI2CByteRead(EEPROM_ADDR, CNTR_SPK_POSITION, &bCnt); 
  fgI2CByteRead(EEPROM_ADDR, REAR_SPK_POSITION, &bRear); 
  fgI2CByteRead(EEPROM_ADDR, PROLOG_SW_POS, &bPL2); 
  bCh = bSharedInfo(SI_A_CH_CFG); 
        if(bDownmix != EV_DOWN_OFF) 
        { 
              if((bDownmix == EV_DOWN_LORO || bDownmix == EV_DOWN_LTRT) && bCh && bSub == EV_ON && (bFnt == EV_SMALL || fgExistSubW(bCh))) 
              { 
                  _bI2SChannel = 3; 
              } 
		else if( bDownmix == EV_DOWN_VSURR && bCh && bCnt == EV_SMALL && bSub == EV_ON) 
		{ 
                  _bI2SChannel = 3; 
		} 
	       else 
		{ 
                  _bI2SChannel = 2; 
		} 
        } 
	 else if(bDownmix == EV_DOWN_OFF && bPL2== EV_PL2_OFF) 
	 { 
              if ((fgExtOSubW(bCh)||bCh == SV_A_CH_20_0) 
               || (bCnt == EV_SPK_OFF && fgExtOCenter(bCh)) 
               || (bRear == EV_SPK_OFF && fgExtORear(bCh)) 
               || (bCnt == EV_SPK_OFF && fgExtCS(bCh)) 
               || (bRear == EV_SPK_OFF && fgExtRS(bCh)) 
               || (bRear == EV_SPK_OFF && bCnt == EV_SPK_OFF && fgExtCR(bCh)) 
               || (bRear == EV_SPK_OFF && bCnt == EV_SPK_OFF && fgExtCRS(bCh)) 
                ) 
              { 
                 if(fgExistSubW(bCh) || bFnt == EV_SMALL) 
                 { 
		      if(bSub == EV_ON) 
                         _bI2SChannel = 3; 
		      else	  	 
                         _bI2SChannel = 2; 
                 } 
		   else 
                         _bI2SChannel = 2; 
              } 
		else  
		{ 
                  _bI2SChannel = 6; 
		} 
  	            
	 } 
	 else 
	 { 
              if(bCnt == EV_SPK_OFF && bRear == EV_SPK_OFF && (bSub == EV_OFF ||( bSub == EV_ON && bFnt == EV_LARGE && !fgExistSubW(bCh))))  
              { 
                   _bI2SChannel = 2; 
              } 
              else if(bCnt == EV_SPK_OFF && bRear == EV_SPK_OFF && bSub == EV_ON && (fgExistSubW(bCh) || bFnt == EV_SMALL)) 
              { 
                   _bI2SChannel = 3; 
              } 
	       else 
	       { 
                   _bI2SChannel = 6; 
	       } 
	 } 
	 _bOldI2SChannel = _bI2SChannel; 
      //_fgNeedCheck = FALSE; 
  // ReFindi2sChannel(); 
  #ifdef adac_232_debug 
      DBGLogB(bSharedInfo(SI_A_CH_CFG), _bI2SChannel, _bAudioSample, _bHdmiAudioDownSample1); 
  #endif 
    fgHdmiAudioCheck(); 
//    if(_bHdmiAudioDownSample1 != 0xff) 
//	    _bHdmiAudioDownSample1 = 1; 
//    else 
	    _bHdmiAudioNeedChange = 1; 
//    _bHdmiAudioChangeTimeOut = 0; 
  #endif 
  
} 
 
 
/************************************************************************ 
     Function : void vAudioDataSetFormat(BYTE bFormat) 
  Description : Audio Data Format Setting(Endian Setting) 
    Parameter : bFormat : 0->Big Endian(DSP + RAW), 1-Little Endian(DSP) 
                          2->Little Endian(RAW), 3->Little Endian(DSP+RAW) 
    Return    : None 
************************************************************************/ 
void vAudioDataSetFormat(BYTE bFormat) large 
{ 
  WriteAUD(AUD_BSCFG, bFormat); 
} 
#ifdef SUPPORT_SACD 
xdata BYTE _bSACD_APLL = 0xff;  // we should change the APLL when SACD playing 
#endif 
/************************************************************************ 
     Function : void AdacCmdDispatch(void) 
  Description : Dispatch Audio DAC command 
    Parameter : None 
    Return    : None 
************************************************************************/ 
void AdacCmdDispatch(void) large 
{ 
  switch (_pbPeriCmd[0]) 
  { 
    case 8: 
 //     WriteBIM(0x02, 4); 
 //     WriteBIM(0xc0, 0x80); 
      WriteType0Cmd(0x64, 0x66); 
 //     SRVInit(); 
      WriteType0Cmd(0x6b, 0x05); 
      WriteType0Cmd(0x64, 0x66); 
//      WriteDEC(0x4e, 0xb); 
      break; 
#ifdef DSP_LOAD_FORCE_SYNC         
    case ADAC_SET_DSP_SPEED_DMPLL: 
      WriteBIM(BIM_ACLKC, 0x6); 
      break; 
    case ADAC_SET_DSP_SEEED_APLL: 
      WriteBIM(BIM_ACLKC, 0x2);     
      break; 
#endif     
    case ADAC_CMD_FMT: 
#ifndef MLP_CERTIFICATION 
      ADACDataFormat(_pbPeriCmd[1] & (~UPSAMPLE_MASK), _pbPeriCmd[2]); 
#else 
      if(bReadDRAML(0x08, 0x8954) == 0) 
      { 
        ADACDataFormat(_pbPeriCmd[1] & (~UPSAMPLE_MASK), _pbPeriCmd[2]); 
      } 
#endif 
      if (bReadAUD(AUD_IECCFG) & IEC_CH78) 
      { 
        // enable IEC output 
        ClrBitAUD(AUD_IECCFG, IEC_CH78); 
      } 
#ifdef AUDIO_IN_EN 
      vAinFsSelect(_pbPeriCmd[1] & UPSAMPLE_MASK, _pbPeriCmd[2]); 
#endif 
      break; 
 
    case ADAC_CMD_EMPH: 
      ADACDeEmphasis(_pbPeriCmd[1]); 
      break; 
 
    case ADAC_CMD_DATA_FMT: 
      vAudioDataSetFormat(_pbPeriCmd[1]); 
      break; 
 
    case ADAC_CMD_DAC_MUTE: 
      vAudioMute(_pbPeriCmd[1]); 
      break; 
    case ADAC_CMD_DSD_MODE: 
#if (defined(_AK4357_) || defined(_WM8756_) || defined(_CS4391_)) 
      vADACDSDOn(_pbPeriCmd[1]); 
#endif 
      break; 
#ifdef SUPPORT_SACD       
    /* 
     Patch ACKLC to use APLL clock in SACD mode. 
            2004/11/12     Alfonso Cheng. 
    */ 
    case ADAC_SET_DSP_SEEED_APLL: 
      if (_pbPeriCmd[1] == 1)  
      { 
        _bSACD_APLL = bReadBIM(BIM_ACLKC); // must not be 0xff 
      WriteBIM(BIM_ACLKC, AC_APLD2); 
      }else if(_bSACD_APLL != 0xff) 
      {  
        WriteBIM(BIM_ACLKC, _bSACD_APLL); 
        _bSACD_APLL = 0xff; 
      }   
      break; 
    /* End this patch.*/  
#endif     
 
#ifdef AUDIO_IN_EN 
    case ADAC_CMD_AIN_SEL: 
      vAinChSel(_pbPeriCmd[1]); 
      break; 
#endif /* AUDIO_IN_EN */ 
  } // switch (bCmd) 
}