📄 iisnew.c
字号:
/*======================================================================
Project Name : S3C2450
Copyright 2006 by Samsung Electronics, Inc.
All rights reserved.
Project Description :
This software is only for verifying functions of the S3C2443.
Anybody can use this code without our permission.
File Name : iisnew.c
Description : S3C2450 IIS ip driver
Author : Dongjin Kim
Dept : AP
Created Date : 2007.10.19
Version : 0.0
History
R0.0 (2007.10.19): draft
- S3C2450 IIS codec code is derived from 2443 IIS test code & SA 2450 IIS test code
=======================================================================*/
#include "System.h"
#include "iis.h"
#include "audiolibrary.h"
/////////////////////////////////////////////////////
// Global variable
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Externs SFR & IP & Codec Functions
/////////////////////////////////////////////////////
//console.c
extern unsigned int AUTO_DownloadData(int downaddr);
extern IIS_State g_oI2SState;
/////////////////////////////////////////////////////
// Set configure - Main
/////////////////////////////////////////////////////
void I2S_Select_port(void)
{
int iport, ibdtobd, i;
printf("Select I2S port to test : 0. I2S0 5.1ch[D] 1. I2S1 2ch");
iport= GetIntNum();
if(iport==1) g_oI2SState.Port = I2S_PORT1;
else g_oI2SState.Port = I2S_PORT0;//default
printf("Select b'd to b'd test 0. no-use built in codec[D] 1. Yes-connect to the other b'd");
ibdtobd = GetIntNum();
if(ibdtobd==1) g_oI2SState.CodecID = 0;
else
{
//default
if(iport==1) g_oI2SState.CodecID = WM8753;
else g_oI2SState.CodecID = WM8580;
if(iport==1)
{
printf("Select Record port to test : 0. LINE IN[D] 1.MIC IN");
i= GetIntNum();
if (i==1) g_oI2SState.LineMic = CODEC_MICIN;
else g_oI2SState.LineMic = CODEC_LINEIN;
}
}
}
void I2S_Select_MasterSlave(void)
{
int i;
printf("Select I2S operating mode : \n\
0. I2S controller Master(Codec slave)[D] \n\
1. I2S controller Slave(Codec Master)\n");
i= GetIntNum();
switch(i)
{
case 1:
g_oI2SState.MasterSlave = I2S_SLAVE;
break;
default://0 master
g_oI2SState.MasterSlave = I2S_MASTER;
}
}
//tx,rx
//3. test pattern, 4. test data. 1.2.3.4.5......
void I2S_Select_testsource(void)
{
int i;
printf("Select I2S source : \n\
1. preload trace32 @32c00000 96Khz 24bit file, @32800000 88.2KHz 24bit file[D]\n\
2. @32000000 direct play 5.1ch 16bit to 24bit converting \n\
3. @31000000 5.1ch 32bit to 24bit converting\n\
4. @31000000 2ch recored data\n");
i= GetIntNum();
if(i==2)
I2S_Testdataprepare3();//32000000 16bit 5.1ch -> 31000000 24bit
else if(i==3)
I2S_Testdataprepare4();//31000000 32bit->24bit.
else if(i==4)
I2S_Testdataprepare2();//31000000 recored
else
I2S_Testdataprepare();//32c00000 96Khz 24bit, 32800000 88.2KHz 24bit
}
void I2S_ClockSettingPathsetting()
{
if(g_oI2SState.MasterSlave==I2S_MASTER)
{
I2S_Select_CDclkFS();
I2S_Select_BFS();
Select_IIS_Master_CLK(-1);//masterexternal, master, pclki2sclk,
}
else
{
I2S_Select_CDclkFS();//for codec setting,
//I2S_Select_BFS();//for codec setting. - is set by looking bit per ch.
Select_Slave(g_oI2SState.Port);
}
}
void I2S_setETC()
{
I2S_Select_i2slinkmode();
I2S_Select_dmapolling();
I2S_en_underrunINT();
I2S_en_24bittest();
}
//for record
void I2S_selectsetting()
{
I2S_selectBit();
I2S_selectSyncFreq();
//I2S_Select_Totch();
g_oI2SState.Totch = 2;
//I2S_Select_ChannelMask();
g_oI2SState.maskingch = 0;
I2S_Select_Rec(-1);
}
//for playing at 31000000 totch can be 6ch.
void I2S_Select_Rec(int isec)
{
int i, j;
int fifobyteperch;
printf("Select Rec second \n");
printf("1. 10sec [D], 2. 20 sec 3. 30sec 4. 40sec 5. 50sec 6. 60sec 7. etc\n");
printf("Choose : \n");
if(isec<0)
{
i= GetIntNum();
if(i==7)
{
printf("enter custom sec : ");
j= GetIntNum();
isec = (i>0 && i < 360)? i : 10;
}
else
{
isec = (i>=1 && i<=6)? i*10 :10;
}
}
else i = isec;
printf("sec : %d\n", isec);
g_oI2SState.recordSec = isec;
fifobyteperch = (g_oI2SState.BitperCh == 8)? 16 :
(g_oI2SState.BitperCh == 24)?32 : 16;
g_oI2SState.pcmsize = g_oI2SState.SyncClkFreq*g_oI2SState.Totch*fifobyteperch*g_oI2SState.recordSec/8;
if(g_oI2SState.pcmsize > (0x33000000-0x31000000))
{
g_oI2SState.pcmsize = (0x33000000-0x31000000);
printf("rec size is adjusted\n");
}
}
/////////////////////////////////////////////////////
// Set configure - Sub
/////////////////////////////////////////////////////
void I2S_selectBit(void)
{
int i;
printf("Select Bit per channel \n");
printf("1. 16 bit[D], 2. 24bit 3. 8bit\n");
printf("Choose : \n");
i= GetIntNum();
switch(i)
{
case 2 : g_oI2SState.BitperCh = 24; break;
case 3 : g_oI2SState.BitperCh = 8; break;
default : g_oI2SState.BitperCh = 16; break;
}
}
void I2S_selectSyncFreq(void)
{
int i;
printf("Select Sync Freq \n");
printf("1. 96000Hz[D], 2. 64000Hz, 3. 48000Hz, 4. 32000Hz, 5. 24000Hz 6. 16000Hz, 7. 12000Hz 8. 8000Hz\n");
printf("9. 88200Hz, 10. 44100Hz, 11. 22050Hz, 12. 11025Hz\n");
printf("Choose : \n");
i= GetIntNum();
switch(i)
{
case 2 : g_oI2SState.SyncClkFreq = 64000; break;
case 3 : g_oI2SState.SyncClkFreq = 48000; break;
case 4 : g_oI2SState.SyncClkFreq = 32000; break;
case 5 : g_oI2SState.SyncClkFreq = 24000; break;
case 6 : g_oI2SState.SyncClkFreq = 16000; break;
case 7 : g_oI2SState.SyncClkFreq = 12000; break;
case 8 : g_oI2SState.SyncClkFreq = 8000; break;
case 9 : g_oI2SState.SyncClkFreq = 88200; break;
case 10 : g_oI2SState.SyncClkFreq = 44100; break;
case 11 : g_oI2SState.SyncClkFreq = 22050; break;
case 12 : g_oI2SState.SyncClkFreq = 11025; break;
default : g_oI2SState.SyncClkFreq = 96000; break;
}
}
void I2S_Select_Totch()
{
int i;
if(g_oI2SState.Port == I2S_PORT0)
printf("Select Totch for port0: 0. 2ch[D] 1. 4ch 2.6ch");
else
printf("Select Totch for port1: 0. 2ch[D]");
i= GetIntNum();
if(g_oI2SState.Port == I2S_PORT0)
{
g_oI2SState.Totch = (i==1)? 4 :
(i==2)? 6 : 2;
}
else
g_oI2SState.Totch = 2;
}
void I2S_Select_ChannelMask()
{
int i, mask;
printf("Select channel mask(off) \n");
printf("0. all channels off 1. channel 1 only, 2. channel 2 only, 3. 2 channels only[D] \n");
if(g_oI2SState.Totch >= 4)
printf("4. channel 3 only, 5. channel 4 only, 6. 4 channels only \n");
if(g_oI2SState.Totch >= 6)
printf("7. channel 5 only, 8. channel 6 only, 9. 6 channels \n");
printf("Choose : \n");
i= GetIntNum();
if(i<0) i = 3;
if(g_oI2SState.Totch >= 2)
{
if(i==0) mask=0x3f;//all channels mask for SNR measure base.
else if(i==1) mask=0x3f & ~(0x1<<0); //channel 1 only, 111110, 1: block. 0 : pass
else if(i==2) mask=0x3f & ~(0x1<<1); //channel 2 only, 111101
else if(i==3) mask=0x3f & ~(0x3<<0); //2 channels only,111100
}
if(g_oI2SState.Totch >= 4)
{
if(i==4) mask=0x3f & ~(0x1<<2); //channel 3 only, 111011
else if(i==5) mask=0x3f & ~(0x1<<3); //channel 4 only, 110111
else if(i==6) mask=0x3f & ~(0xf<<0); //4 channels only, 110000
}
if(g_oI2SState.Totch >= 6)
{
if(i==7) mask=0x3f & ~(0x1<<4); //channel 5 only, 101111
else if(i==8) mask=0x3f & ~(0x1<<5); //channel 6 only, 011111
else if(i==9) mask=0x3f & ~(0x3f);//6 channels, 000000
}
g_oI2SState.maskingch = mask;
}
///////////////////////////////////////////////////////////
void I2S_Select_CDclkFS()
{
int i;
printf("Select Codec clock frequency select \n");
printf("1. 384 fs[D], 2. 768fs\n");
if(g_oI2SState.BitperCh != 24 )
{
printf("3. 256 fs, 4. 512 fs\n");
}
printf("Choose : \n");
i= GetIntNum();
if(g_oI2SState.BitperCh == 24)
i= (i>=3)? 1: i;
switch(i)
{
case 2 : g_oI2SState.CDCLKFreqFs = 768; break;
case 3 : g_oI2SState.CDCLKFreqFs = 256; break;
case 4 : g_oI2SState.CDCLKFreqFs = 512; break;
default : g_oI2SState.CDCLKFreqFs = 384; break;
}
g_oI2SState.CDCLKFreq = g_oI2SState.CDCLKFreqFs * g_oI2SState.SyncClkFreq;
printf("%d fs, %d Hz\n",g_oI2SState.CDCLKFreqFs, g_oI2SState.CDCLKFreq);
}
void I2S_Select_BFS()
{
int i;
printf("Select Bit frequency select \n");
if(g_oI2SState.BitperCh == 8 )
{
printf("1. 16 fs, 2. 32 fs[D] \n");
if(g_oI2SState.CDCLKFreqFs % 384 == 0)
printf("3. 48 fs\n");
printf("Choose : \n");
i= GetIntNum();
if(g_oI2SState.CDCLKFreqFs % 384 != 0)
i= (i>=3)? 2: i;
}
else if(g_oI2SState.BitperCh == 16 )
{
printf("2. 32 fs[D] \n");
if(g_oI2SState.CDCLKFreqFs % 384 == 0)
printf("3. 48 fs\n");
printf("Choose : \n");
i= GetIntNum();
if(g_oI2SState.CDCLKFreqFs % 384 != 0)
i= (i>=3 || i<= 1)? 2: i;
}
else if(g_oI2SState.BitperCh == 24 )
{
if(g_oI2SState.CDCLKFreqFs % 384 == 0)
i=3;//printf("3. 48 fs\n");
else return;
}
switch(i)
{
case 1 : g_oI2SState.BitClkFS = 16; break;
case 3 : g_oI2SState.BitClkFS = 48; break;
default : g_oI2SState.BitClkFS = 32; break;
}
}
/////////////////////////////////////////////////////////////
void I2S_Select_i2slinkmode(void)
{
int i;
printf("Select I2S link mode(data format) : 0. i2s format[D] 1. msb 2.lsb 3.nop");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -