www.pudn.com > 6027_HD65.rar > ADAC.c


/***************    MTK CONFIDENTIAL & COPYRIGHTED     ****************/ 
/***************                                       ****************/ 
/***************  $Modtime:: 04/08/02 1:37p    $       ****************/ 
/***************  $Revision:: 13               $       ****************/ 
/***************                                       ****************/ 
/*************** Description : Audio DAC Module        ****************/ 
/***************                                       ****************/ 
/***************     Company : MediaTek Inc.           ****************/ 
/***************  Programmer : Alan Hsu                ****************/ 
/**********************************************************************/ 
 
#define  _C_ADAC_ 
 
#include "general.h" 
 
#pragma NOAREGS 
 
#ifndef _NPADAC_ 
  BYTE xdata _bAudioSample; // 0->50k, 1->100k, 2->200k 
#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); 
  BYTE bTmp; 
//open ACLK,ABCK,ALRCK 
  bTmp = bReadBIM(BIM_SIFData);  
  WriteBIM(BIM_SIFSel, 0x14);  
  WriteBIM(BIM_SIFData, 0x01);  
  WriteBIM(BIM_SIFSel, bTmp);  
} 
 
/************************************************************************ 
     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 = 0x01; 
  fgI2CByteWrite(0x10, 0x06, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x07, bData); // Reduce the volume 
  fgI2CByteWrite(0x10, 0x08, 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 
#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 MTK_ADAC 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
  BYTE bTmp; 
   
  ClrBitAUD(ADAC_ATOP1, 0x02); 
  vADACPower(TRUE); 
  bTmp = bReadBIM(BIM_SIFData);  
  WriteBIM(BIM_SIFSel, 0x14);  
  WriteBIM(BIM_SIFData, 0x01);  
  WriteBIM(BIM_SIFSel, bTmp);  
//use internal DAC++   
  SetBitBIM(BIM_PCTL3, AUCLKOFF); 
//use internal DAC--   
//unmute++ 
  ClrBitAUD(ADAC_ATOP1, ADAC_CTRL_SEL); 
  ClrBitAUD(ADAC_CTRL0, ADAC_MUTE); 
  SetBitBIM(BIM_RIODRL, IOL_ABCK);//set output 
  ClrBitBIM(BIM_RIODOL, IOL_ABCK);//set low 
//unmute-- 
// Set 0xFA07 bit0 to 1. Turn on AL,AR, which are turn off by default. 
// this should be no effect with the E1~E3 chip. 
// because there is no such a reg in these chips.  
  WriteSRV(0x07, bReadSRV(0x07) | 0x01);  
 
} 
/************************************************************************ 
     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 
{ 
  if(fgEnable) 
  { 
    ClrBitAUD(ADAC_ATOP0, (ADAC_TMAUPDN | ADAC_AUPDN)); 
  } 
  else 
  { 
    SetBitAUD(ADAC_ATOP0, (ADAC_TMAUPDN | ADAC_AUPDN)); 
  } 
} 
#else 
  #ifdef MT1389_REV_D 
void vADACClkOut(void) large 
{ 
  BYTE bTmp; 
//open ACLK,ABCK,ALRCK, these clock default are closed. 
  bTmp = bReadBIM(BIM_SIFData);  
  WriteBIM(BIM_SIFSel, 0x14);  
  WriteBIM(BIM_SIFData, 0x01);  
  WriteBIM(BIM_SIFSel, bTmp);  
} 
  #endif //MT1389_REV_D 
#endif  // MTK_ADAC 
#ifdef  _NPADAC_ 
/************************************************************************ 
     Function : void ADACInit(void) 
  Description : ADAC Initial Routine 
    Parameter : NONE 
    Return    : NONE 
************************************************************************/ 
void ADACInit(void) large 
{ 
#if 0 
#ifdef MT1389_REV_D 
  BYTE bTmp; 
//open ACLK,ABCK,ALRCK, these clock default are closed. 
  bTmp = bReadBIM(BIM_SIFData);  
  WriteBIM(BIM_SIFSel, 0x14);  
  WriteBIM(BIM_SIFData, 0x01);  
  WriteBIM(BIM_SIFSel, bTmp);  
#endif 
#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 
{ 
} 
 
/************************************************************************ 
     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 MTK_ADAC 
  BYTE bAK1; 
  BYTE bAK2; 
  BYTE bAckFs; 
#endif   
  #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_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) 
  { 
    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 
    #ifdef MTK_ADAC 
      bAK2 = 3; 
    #endif   
  #else 
    WriteBIM(BIM_AN1, 0x00);   // Set AK1 = 2 
    #ifdef MTK_ADAC 
      bAK2 = 2; 
    #endif   
  #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 */ 
  #ifdef MTK_ADAC 
  bAK1 = bReadBIM(BIM_AOCLKC) & 0x3F;  // Read AK1 
 
  bAckFs = (bReadAUD(AUD_ACLKCFG) & 0xE0) >> 5; 
  ClrBitAUD(ADAC_ATOP1, ADAC_CTRL_SEL); 
  ClrBitAUD(ADAC_CTRL0, ADAC_OSR); 
  if(bFs == FS384_32K) 
  { 
    SetBitAUD(ADAC_CTRL0, 1<<7);//set oversampling rate 128X 
    bAckFs = bAK1*bAK2*bAckFs>>3; //Ak1*Ak2*ACK/1024fs, ACK = N*128*fs 
    WriteAUD(ADAC_CLK_SET2, (bAckFs<<5 | 0x11)); 
  } 
  else 
  { 
    SetBitAUD(ADAC_CTRL0, 1<<6);//set oversampling rate 64X 
    bAckFs = bAK1*bAK2*bAckFs>>2; //Ak1*Ak2*ACK/512fs, ACK = N*128*fs 
    WriteAUD(ADAC_CLK_SET2, (bAckFs<<5 | 0x0A)); 
  } 
  if(bAckFs & 0x08) 
  { 
    WriteAUD(ADAC_CLK_SET1, 0x01); 
  } 
  else 
  { 
    WriteAUD(ADAC_CLK_SET1, 0x00); 
  } 
  //WriteAUD(ADAC_CLK_SET2, (bAckFs<<5 | 0x0A)); 
  #endif   
} 
#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 
{ 
#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); 
} 
 
/************************************************************************ 
     Function : void AdacCmdDispatch(void) 
  Description : Dispatch Audio DAC command 
    Parameter : None 
    Return    : None 
************************************************************************/ 
void AdacCmdDispatch(void) large 
{ 
  switch (_pbPeriCmd[0]) 
  { 
#if 0 
    case 8: 
 //     WriteBIM(0x02, 4); 
 //     WriteBIM(0xc0, 0x80); 
      WriteType0Cmd(0x64, 0x66); 
 //     SRVInit(); 
      WriteType0Cmd(0x6b, 0x05); 
      WriteType0Cmd(0x64, 0x66); 
//      WriteDEC(0x4e, 0xb); 
      break; 
#endif 
#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 
#ifdef AUDIO_IN_EN 
      vAinFsSelect(_pbPeriCmd[1] & UPSAMPLE_MASK, _pbPeriCmd[2]); 
#endif 
      break; 
 
    case ADAC_CMD_EMPH: 
      ADACDeEmphasis(_pbPeriCmd[1]); 
      break; 
 
    case ADAC_CMD_DAC_MUTE: 
      vAudioMute(_pbPeriCmd[1]); 
      break; 
 
#ifdef AUDIO_IN_EN 
    case ADAC_CMD_AIN_SEL: 
      vAinChSel(_pbPeriCmd[1]); 
      break; 
#endif /* AUDIO_IN_EN */ 
  } // switch (bCmd) 
}