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

📄 iisnew.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 3 页
字号:
/*======================================================================

 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 + -