www.pudn.com > ucosii_core.rar > i2s_codec_tsc2301.c, change:2006-11-08,size:2112b
#include <regs.h>
#include <ops.h>
#include <clock.h>
#define PAGE_NO 2
#define I2S_CONTROL 0
#define I2S_ADC_VOLUE_CONTROL 1
#define I2S_DAC_VOLUE_CONTROL 2
#define I2S_KEYCLICK_CONTROL 4
#define I2S_POWER_CONTROL 5
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
static void i2s_codec_write(u8 reg, u16 data)
{
u16 cmd;
cmd = (reg << 5) | (PAGE_NO << 11);
spi_write(cmd);
spi_write(data);
udelay(100);
}
static u16 i2s_codec_read(u8 reg)
{
u16 cmd;
u8 buf[2];
cmd = (1 << 15) | (reg << 5) | (PAGE_NO << 11);
spi_write(cmd);
return spi_read();
}
static int spi_inited = 0;
void i2s_codec_init(void)
{
if (!spi_inited) {
spi_init();
spi_inited = 1;
}
i2s_codec_write(I2S_DAC_VOLUE_CONTROL, 0xffff);
i2s_codec_write(I2S_ADC_VOLUE_CONTROL, 0xffff);
i2s_codec_write(I2S_POWER_CONTROL, 0xffff);
i2s_codec_write(I2S_POWER_CONTROL, 0x000f);
i2s_codec_write(I2S_DAC_VOLUE_CONTROL, 0x7f7f);
i2s_codec_write(I2S_ADC_VOLUE_CONTROL, 0x7f7f);
}
void i2s_codec_set_volume(u16 v) /* 0 <= v <= 100 */
{
u16 vol;
v = (v * 0x7f) / 100;
vol = (v << 8) | v;
i2s_codec_write(I2S_DAC_VOLUE_CONTROL, vol);
i2s_codec_write(I2S_ADC_VOLUE_CONTROL, vol);
}
u16 i2s_codec_get_volume(void)
{
u16 vol;
vol = i2s_codec_read(I2S_DAC_VOLUE_CONTROL);
vol = ((vol & 0xff) * 100) / 0x7f;
return vol;
}
void i2s_codec_set_channel(u16 ch)
{
i2s_codec_write(I2S_KEYCLICK_CONTROL, 0x4415);
}
void i2s_codec_set_samplerate(u16 rate)
{
u16 speed = 0;
u16 val = 0;
u8 mclk = 0;
switch (rate) {
case 48000:
speed = 0;
mclk = 0;
break;
case 44100:
speed = 1;
mclk = 0;
break;
case 32000:
speed = 2;
mclk = 0;
break;
case 24000:
speed = 3;
mclk = 0;
break;
case 22050:
speed = 4;
mclk = 0;
break;
case 16000:
speed = 5;
mclk = 0;
break;
case 12000:
speed = 6;
mclk = 0;
break;
case 11025:
speed = 7;
mclk = 0;
break;
case 8000:
default:
speed = 8;
mclk = 0;
break;
}
val = (0xc2 << 8) | (mclk << 6) | (speed << 2) | 0x03;
i2s_codec_write(I2S_CONTROL, val);
__i2s_set_sample_rate(__cpm_get_i2sclk(), rate);
}