📄 ext_dac_drv.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 + -