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

📄 ext_dac_drv.c

📁 声卡驱动
💻 C
字号:
#if defined(EXT_DAC_SUPPORT)

#include "l1audio_def.h"

const unsigned char  L1SP_EXT_DAC_I2S_BCLK_SCALE = 64; // 64 or 32 only : means BCLK = 64fs or 32fs     
 
void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
void GPIO_InitIO(char direction, char port);
void GPIO_WriteIO(char data,char port);
char GPIO_ReadIO(char port);

/* GPIO definition */
#define MCLK   9        /// GPIO #9:  Master clock: 13 MHZ (for PLL)
#define BCLK   4       /// GPIO #49: DAI clock output
#define DOUT   6       /// GPIO #50: DAI PCM data output (input of WM8976: DIN)
#define LRCLK  5       /// GPIO #53: DAI sync signal input

#define SCLK   0       /// GPIO #5: SPI serial clock
#define SDIN   1       /// GPIO #4: SPI data output 
#define CSB    23      /// GPIO #24: Slave select

#define A_SWITCH 24   // 2006/02/15 


#define MCLK_MODE  2
#define BCLK_MODE  1
#define DOUT_MODE  1
#define LRCLK_MODE 1

#define SCLK_MODE  0
#define SDIN_MODE  0 
#define CSB_MODE   0

#define A_SWITCH_MODE 0

#if defined(USE_A_SWITCH) 
   static uint8 ext_dac_gpt; 
#endif    

#define SPI_DELAY(_i)            \
   {                             \
      uint16 cnt = _i;           \
      for (;cnt != 0; cnt--);    \
   }

void WM8955_GPIO_Init(void)
{
   GPIO_ModeSetup(MCLK, MCLK_MODE);
   GPIO_ModeSetup(BCLK, BCLK_MODE);
   GPIO_ModeSetup(DOUT, DOUT_MODE);
   GPIO_ModeSetup(LRCLK, LRCLK_MODE);
   
   GPIO_ModeSetup(SCLK, SCLK_MODE);
   GPIO_ModeSetup(SDIN, SDIN_MODE);
   GPIO_ModeSetup(CSB, CSB_MODE);   
   
   GPIO_ModeSetup(A_SWITCH, A_SWITCH_MODE);   
   
   GPIO_InitIO(1, SCLK); // 1 : output 
   GPIO_InitIO(1, SDIN);
   GPIO_InitIO(1, CSB);
 
   GPIO_WriteIO(1, CSB);
   GPIO_WriteIO(0, SCLK);
   GPIO_WriteIO(0, SDIN);
      
   GPIO_InitIO(1, A_SWITCH);
}

/// Single register write operation.
void WM8955_SPI_SingleWrite(uint16 addr, uint16 data)
{
   int16 i;
   uint16 command;  
   //ASSERT(addr < 128);
   //ASSERT(data < 512);
   command = ((uint16)addr << 9) | ((uint16)data);
   
   GPIO_WriteIO(0, CSB);
   SPI_DELAY(5);
   for (i=16; --i>=0; ) {      
      GPIO_WriteIO(1, SCLK);
      SPI_DELAY(5);  // Tsch , Tdso   
      GPIO_WriteIO(0, SCLK);
      GPIO_WriteIO((command >> i) & 1, SDIN);
      SPI_DELAY(5);  // Tscl , Tdsu
   }
   GPIO_WriteIO(1, SCLK);  // rising to get LSB 
   SPI_DELAY(35);     // Tscs : 500 ns 
   GPIO_WriteIO(1, CSB);   // rising to get a complete control word : last 16 bits
   GPIO_WriteIO(0, SCLK);
   SPI_DELAY(5);     // Tcss    
   GPIO_WriteIO(1, SCLK);
   SPI_DELAY(5);
   
   GPIO_WriteIO(0, SCLK);
   GPIO_WriteIO(0, SDIN);
}

#ifdef USE_A_SWITCH
static void turnOnAswitch(void *data)
{
   GPIO_WriteIO(1, A_SWITCH);         
}
#endif 



void EXT_DAC_Init(void)
{
#if defined(USE_A_SWITCH)
   GPTI_GetHandle(&ext_dac_gpt);   
#endif    
   WM8955_GPIO_Init();   
   WM8955_SPI_SingleWrite(2, 0x100);
   WM8955_SPI_SingleWrite(3, 0x100); 
}

void EXT_DAC_SetPlaybackFreq(kal_uint16 frequency)
{
   uint16 R44, R45, R46;
      
   switch (frequency) {      
      case 32000:
         R44 = 0xA0;
         R45 = 0x151;
         R46 = 0x186; 
         break;                     
      case 44100:
         R44 = 0xCF;
         R45 = 0x51;
         R46 = 0xF4;  
         break;  
      case 48000:        
         R44 = 0xE8;
         R45 = 0x1FA;
         R46 = 0x148;         
         break;        
      default:
         ASSERT(0);
   }
   WM8955_SPI_SingleWrite(59, 0x080);   
   WM8955_SPI_SingleWrite(44, R44);
   WM8955_SPI_SingleWrite(45, R45);
   WM8955_SPI_SingleWrite(46, R46);   
   WM8955_SPI_SingleWrite(43, 0x1F8);   
}

void EXT_DAC_TurnOnSpeaker(kal_uint8 src, kal_uint8 spk)
{  
   uint16 R26 = 0;       
       
   WM8955_SPI_SingleWrite(25, 0xC0); // open Vref  
     
  
   if(src == EXT_DAC_I2S) 
   {
      R26 |= 0x180;
      WM8955_SPI_SingleWrite(26, R26); // power on DAC L/R       
   }
     
   if(spk & L1SP_EXT_DAC_BUF0)
      R26 |= 0x60;
   if(spk & L1SP_EXT_DAC_BUF1)
      R26 |= 0x18;   
   WM8955_SPI_SingleWrite(26, R26);	
         
   if(src == EXT_DAC_I2S) 
   {
      WM8955_SPI_SingleWrite(5, 0x0); // Set DAC mute off 
      // Select DAC input 
      WM8955_SPI_SingleWrite(34, 0x150);         
      WM8955_SPI_SingleWrite(37, 0x150);        
   }
   else if(src == EXT_DAC_LINEIN) 
   {
      WM8955_SPI_SingleWrite(34, 0xA0);  // 0xA0 : 0dB , 0x80 : 6dB  
      WM8955_SPI_SingleWrite(37, 0xA0);  // 0xA0 : 0dB , 0x80 : 6dB             
   }   

#ifdef USE_A_SWITCH      
   GPTI_StartItem(ext_dac_gpt, 6, turnOnAswitch, (void*)0);    
#endif    
}

void EXT_DAC_TurnOffSpeaker(kal_uint8 spk)
{ 
#ifdef USE_A_SWITCH     
   GPTI_StopItem(ext_dac_gpt);
   GPIO_WriteIO(0, A_SWITCH);  
#endif    

   WM8955_SPI_SingleWrite(15, 0x00);  // reset
}


void EXT_DAC_FixedLineInGain(kal_uint8 spk)
{
   if(spk & L1SP_EXT_DAC_BUF0)
   {
      WM8955_SPI_SingleWrite(2, 0x179); // 0dB  
      WM8955_SPI_SingleWrite(3, 0x179); // 0dB    
   }
   if(spk & L1SP_EXT_DAC_BUF1)
   {
      WM8955_SPI_SingleWrite(40, 0x179);// 0dB 
      WM8955_SPI_SingleWrite(41, 0x179);// 0dB               
   }         
}

void EXT_DAC_SetVolume(kal_uint8 spk, kal_uint8 vol )  // +6dB(255) ~ -121.5dB(0)
{
   kal_uint16 a_vol, d_vol;
   if(vol > 231)
   {
      vol = 255 - vol;   
      a_vol = 127 - (vol >> 1) + 256  // +6dB ~ -5dB 
      d_vol = 255 - (vol & 1) + 256;  // 0dB or -0.5dB    
   }   
   else 
   {
      a_vol = 115 + 256;  // fixed to -6 dB                 
      d_vol = vol + 24 + 256;  // 0dB ~ -115.5dB   
   }         
   
   if(spk & L1SP_EXT_DAC_BUF0)
   {
      WM8955_SPI_SingleWrite(2, a_vol);  
      WM8955_SPI_SingleWrite(3, a_vol);     
   }
   if(spk & L1SP_EXT_DAC_BUF1)
   {
      WM8955_SPI_SingleWrite(40, a_vol); 
      WM8955_SPI_SingleWrite(41, a_vol);               
   }   
   
   WM8955_SPI_SingleWrite(10, d_vol);
   WM8955_SPI_SingleWrite(11, d_vol);     
}

#endif 

⌨️ 快捷键说明

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