📄 s2410-i2s.c
字号:
pwh->dwFlags = 0;
return MMSYSERR_NOERROR;
}
MMRESULT waveInUnprepareHeader(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
if((RecStatus.handle!=hwi)||(RecStatus.Status!=DEVICE_REC))
return MMSYSERR_INVALHANDLE;
return MMSYSERR_NOERROR;
}
MMRESULT waveInAddBuffer(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
{
if((RecStatus.handle!=hwi)||(RecStatus.Status!=DEVICE_REC))
return MMSYSERR_INVALHANDLE;
if(!RecTotBlks)
{
lpRecFstBlk = pwh;
lpRecCurBlk = lpRecFstBlk;
}
else
{
lpRecLstBlk->lpNext = pwh;
}
lpRecLstBlk = pwh;
pwh->lpNext = 0;
RecTotBlks++;
return MMSYSERR_NOERROR;
}
MMRESULT waveInReset(HWAVEOUT hwi)
{
return MMSYSERR_NOERROR;
}
/************************* Control Function *********************/
static void IIS_PortSetting(void)
{
//----------------------------------------------------------
// PORT B GROUP
//Ports : GPB4 GPB3 GPB2
//Signal : L3CLOCK L3DATA L3MODE
//Setting: OUTPUT OUTPUT OUTPUT
// [9:8] [7:6} [5:4]
//Binary : 01 , 01 01
//----------------------------------------------------------
rGPBUP = rGPBUP & ~(0x7<<2) | (0x7<<2); //The pull up function is disabled GPB[4:2] 1 1100
rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
//----------------------------------------------------------
// PORT E GROUP
//Ports : GPE4 GPE3 GPE2 GPE1 GPE0
//Signal : I2SSDO I2SSDI CDCLK I2SSCLK I2SLRCK
//Binary : 10 , 10 10 , 10 10
//----------------------------------------------------------
rGPEUP = rGPEUP & ~(0x1f) | 0x1f; //The pull up function is disabled GPE[4:0] 1 1111
rGPECON = rGPECON & ~(0x3ff) | 0x2aa; //GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK
}
//==========================================================
#define L3C (1<<4) //GPB4 = L3CLOCK
#define L3D (1<<3) //GPB3 = L3DATA
#define L3M (1<<2) //GPB2 = L3MODE
static void _WrL3Addr(U8 data)
{
S32 i,j;
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | L3C; //L3D=L, L3M=L(in address mode), L3C=H
for(j=0;j<4;j++); //tsu(L3) > 190ns
//GPB[4:2]=L3C:L3D:L3M
for(i=0;i<8;i++) //LSB first
{
if(data & 0x1) //If data's LSB is 'H'
{
rGPBDAT &= ~L3C; //L3C=L
rGPBDAT |= L3D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 500ns
rGPBDAT |= L3C; //L3C=H
rGPBDAT |= L3D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 500ns
}
else //If data's LSB is 'L'
{
rGPBDAT &= ~L3C; //L3C=L
rGPBDAT &= ~L3D; //L3D=L
for(j=0;j<4;j++); //tcy(L3) > 500ns
rGPBDAT |= L3C; //L3C=H
rGPBDAT &= ~L3D; //L3D=L
for(j=0;j<4;j++); //tcy(L3) > 500ns
}
data >>= 1;
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); //L3M=H,L3C=H
}
//==========================================================
static void _WrL3Data(U8 data,int halt)
{
S32 i,j;
if(halt)
{
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | L3C; //L3C=H(while tstp, L3 interface halt condition)
for(j=0;j<4;j++); //tstp(L3) > 190ns
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); //L3M=H(in data transfer mode)
for(j=0;j<4;j++); //tsu(L3)D > 190ns
//GPB[4:2]=L3C:L3D:L3M
for(i=0;i<8;i++)
{
if(data & 0x1) //if data's LSB is 'H'
{
rGPBDAT &= ~L3C; //L3C=L
rGPBDAT |= L3D; //L3D=H
for(j=0;j<4;j++); //tcy(L3) > 500ns
rGPBDAT |= (L3C | L3D); //L3C=H,L3D=H
for(j=0;j<4;j++); //tcy(L3) > 500ns
}
else //If data's LSB is 'L'
{
rGPBDAT &= ~L3C; //L3C=L
rGPBDAT &= ~L3D; //L3D=L
for(j=0;j<4;j++); //tcy(L3) > 500ns
rGPBDAT |= L3C; //L3C=H
rGPBDAT &= ~L3D; //L3D=L
for(j=0;j<4;j++); //tcy(L3) > 500ns
}
data >>= 1; //For check next bit
}
rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); //L3M=H,L3C=H
}
//==========================================================
static void Init1341(char mode)
{
U16 FsIdx;
//Port Initialize
//----------------------------------------------------------
// PORT B GROUP
//Ports : GPB4 GPB3 GPB2
//Signal : L3CLOCK L3DATA L3MODE
//Setting: OUTPUT OUTPUT OUTPUT
// [9:8] [7:6} [5:4]
//Binary : 01 , 01 01
//----------------------------------------------------------
rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H
rGPBUP = rGPBUP & ~(0x7<<2) |(0x7<<2); //The pull up function is disabled GPB[4:2] 1 1100
rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
//L3 Interface
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
_WrL3Data(0x60,0); //0,1,10, 000,0 : Status 0,Reset,256fs,IIS-bus,no DC-filtering
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
FsIdx = mode?RecStatus.FsIdx:PlayStatus.FsIdx;
if(CodecPara[FsIdx].ofs)
_WrL3Data(0x18,0); //0,0,01, 000,0 : Status 0,No reset,384fs,IIS-bus,no DC-filtering
else
_WrL3Data(0x28,0); //0,0,10, 000,0 : Status 0,No reset,256fs,IIS-bus,no DC-filtering
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
_WrL3Data(0xc1,0); //1,0,0,0, 0,0,01
//Status 1,Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,DAC non-inverting
//,Single speed playback,ADC-Off DAC-On
//Record
if(mode) {
_WrL3Addr(0x14 + 2); //STATUS (000101xx+10)
// _WrL3Data(0xa2,0); //1,0,1,0, 0,0,10
//Status 1,Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
//,Single speed playback,ADC-On DAC-Off
_WrL3Data(0xe3,0); //1,1,1,0, 0,0,11
//Status 1,Gain of DAC 6 dB,Gain of ADC 6dB,ADC non-inverting,DAC non-inverting
//,Single speed playback,ADC-On DAC-On,DAC打开使录音时可从耳机听到声音
// _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
// _WrL3Data(0x3f,0); //00,11 1111 : Volume control (6 bits)
// _WrL3Data(0x00,0); //00,00 0000 : Volume control (6 bits) 0dB
_WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0x7b,0); //01,11 10,11 : Data0, Bass Boost 18~24dB, Treble 6dB
// _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xc4,0); //1100 0,100 : Extended addr(3bits), 100
// _WrL3Data(0x90,0); //100,1 00,00 : DATA0, Enable AGC, 00, input amplifier gain channel 2 (2bits)
_WrL3Data(0xf0,0); //111,1 00,00 : DATA0, Enable AGC, 00, input amplifier gain channel 2 (2bits)
// _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xc0,0); //1100 0,000 : Extended addr(3bits), 000
_WrL3Data(0xe4,0); //111, 00000 : MA = 0dB
_WrL3Data(0xc1,0); //1100 0,001 : Extended addr(3bits), 001
_WrL3Data(0xe4,0); //111, 00000 : MB = 0dB
// _WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xc2,0); //1100 0,010 : Extended addr(3bits), 010
// _WrL3Data(0x59,0); //010,1 10,01 : DATA0, MIC Amplifier Gain 27dB, input channel 1 select(input channel 2 off)
_WrL3Data(0xf9,0); //111,1 10,11 : DATA0, MIC Amplifier Gain 27dB, input 1 X MA + input 2 X MB
}
}
//==========================================================
static void PlayPause(U8 mode)
{
if(mode)
rIISCON &= ~1; //stop iis
else
rIISCON |= 1; //start iis
}
#define MAX_VOLUME 61
static void AdjVolume(U16 volume)
{
rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H
rGPBUP = rGPBUP & ~(0x7<<2) |(0x7<<2); //The pull up function is disabled GPB[4:2] 1 1100
rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
volume = (volume*MAX_VOLUME)/0xffff;
_WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(MAX_VOLUME-volume, 0);
}
/*
static void Muting(void)
{
if(mute) //Mute
{
_WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xa4,0); //10,1,00,1,00 : after, no de-emp, mute, flat
mute = 0;
}
else //No mute
{
_WrL3Addr(0x14 + 0); //DATA0 (000101xx+00)
_WrL3Data(0xa0,0); //10,1,00,0,00 : after, no de-emp, no mute, flat
mute = 1;
}
}
*/
//==========================================================
/****************************************************************************
【文 件 名 称】Test_IIS.c
【功 能 描 述】FS2410XP教学平台实验程序
【程 序 版 本】3.0
【创建及创建日期】优龙公司/2005-XX-XX
【修改及修改日期】2005-5-23
****************************************************************************/
//头文件定义
#include "def.h"
#include "2410addr.h"
#include "AudioDrv.h"
#include "DmaAdmin.h"
#include "board.h"
#include "WindowsXP_Wav.h" //长度为243552个字节
#define BUF_SIZE (16*1024)
extern U32 download_addr;
extern U32 download_len;
static U8 REC_OK = 0;
static U16 fsTable[] = {8000,11025,16000,22050,32000,44100,48000,0};
void PlayMusicTest(void)
{
int size, i, j, err;
WAVEFORMATEX fmt;
WAVEHDR hdr[2048];
HWAVEOUT hwo;
U8 pause = 0;
U8 mute = 0;
U32 volume;
unsigned char *buf;
if( REC_OK == 0 )
{
download_addr = DFT_DOWNLOAD_ADDR;
buf = (unsigned char *)download_addr;
for( i = 0; i < 243552; i++ ) buf[i] = WindowsXP_Wav[i] ;
download_len = 243552 ;
}
size = *(U32 *)(download_addr+0x28);
i = 0;
while(size>0)
{
hdr[i].lpData = (LPSTR)(download_addr+0x2c+i*BUF_SIZE);
hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size;
size -= BUF_SIZE;
i++;
}
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = *(U16 *)(download_addr+0x16);
fmt.nSamplesPerSec = *(U32 *)(download_addr+0x18);
fmt.nAvgBytesPerSec = *(U32 *)(download_addr+0x1c);
fmt.nBlockAlign = *(U16 *)(download_addr+0x20);
fmt.wBitsPerSample = *(U16 *)(download_addr+0x22);
printf("Sample Rate = %d, Channels = %d, %dBitsPerSample, size = %d\n",
fmt.nSamplesPerSec, fmt.nChannels, fmt.wBitsPerSample, *(U32 *)(download_addr+0x28));
hwo = 0;
err = waveOutOpen(&hwo,
0,
&fmt,
0,
0,
0);
printf("\nerr = %x\n", err);
for(j=0;j<i;j++)
waveOutWrite(0, &hdr[j], 0);
puts("Now playing the file\n");
puts("Press Esc to exit, '+' to inc volume, '-' to dec volume, 'y' to mute, Enter to 'pause'\n");
waveOutGetVolume(0, &volume);
while(1)
{
U8 key = getch();
if(key==ESC_KEY)
break;
if(key==ENTER_KEY)
{
pause ^= 1;
if(pause&1)
waveOutPause(0);
else
waveOutRestart(0);
}
if(key=='y'||key=='Y')
{
mute ^= 1;
if(mute&1)
waveOutSetVolume(0, 0);
else
waveOutSetVolume(0, volume);
}
if((key=='+')&&(volume<=64535))
{
volume += 1000;
waveOutSetVolume(0, volume);
}
if((key=='-')&&(volume>=1000))
{
volume -= 1000;
waveOutSetVolume(0, volume);
}
}
waveOutClose(0);
}
void RecordTest(void)
{
int size, i, j, err;
WAVEFORMATEX fmt;
WAVEHDR hdr[2048];
HWAVEIN hwi = 1;
fmt.nSamplesPerSec = fsTable[3];
fmt.wBitsPerSample = 16;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = 2;
fmt.nBlockAlign = fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec = fmt.nSamplesPerSec*fmt.nBlockAlign;
download_addr = 0x30800000;//_NONCACHE_STARTADDRESS;
download_len = size = 2*1024*1024;
for( i = 0; i < download_len; i+=4 ) *(U32 *)(download_addr+i) = 0 ;
i = 0;
while(size>0)
{
hdr[i].lpData = (LPSTR)(download_addr+0x2c+i*BUF_SIZE);
hdr[i].dwBufferLength = (size>BUF_SIZE)?BUF_SIZE:size;
size -= BUF_SIZE;
i++;
}
*(U16 *)(download_addr+0x14) = fmt.wFormatTag;
*(U16 *)(download_addr+0x16) = fmt.nChannels;
*(U32 *)(download_addr+0x18) = fmt.nSamplesPerSec;
*(U32 *)(download_addr+0x1c) = fmt.nAvgBytesPerSec;
*(U16 *)(download_addr+0x20) = fmt.nBlockAlign;
*(U16 *)(download_addr+0x22) = fmt.wBitsPerSample;
*(U32 *)(download_addr+0x28) = download_len;
err = waveInOpen(&hwi,
0,
&fmt,
0,
0,
0);
printf("\nerr = %x\n", err);
for(j=0;j<i;j++)
if(waveInAddBuffer(hwi, &hdr[j], 0))
puts("Add buffer error!");
printf("Added %d buffer for record\n", i);
//puts("Press any to Record\n");
//getch();
puts("Now begin recording, Press Esc to exit\n");
waveInStart(hwi);
while(1)
{
U8 key;
key = getkey();
if(key==ESC_KEY)
break;
}
waveInClose(hwi);
REC_OK = 0xff ;
PlayMusicTest() ;
REC_OK = 0 ;
}
void RecordChannelOnOff(void)
{
static int ChannelOn = 0;
int err;
WAVEFORMATEX fmt;
WAVEHDR hdr;
HWAVEIN hwi = 1;
fmt.nSamplesPerSec = 22050;
fmt.wBitsPerSample = 16;
fmt.wFormatTag = WAVE_FORMAT_PCM;
fmt.nChannels = 2;
fmt.nBlockAlign = fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec = fmt.nSamplesPerSec*fmt.nBlockAlign;
hdr.lpData = (LPSTR)0x30800000;//_NONCACHE_STARTADDRESS;
hdr.dwBufferLength = BUF_SIZE;
if(!ChannelOn) {
err = waveInOpen(&hwi,
0,
&fmt,
0,
0,
0);
printf("\nerr = %x\n", err);
if(!err) {
waveInAddBuffer(hwi, &hdr, 0);
waveInStart(hwi);
puts("Record channel on\n");
ChannelOn = 1;
}
} else {
waveInClose(hwi);
puts("Record channel off\n");
ChannelOn = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -