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

📄 iis.c

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

 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    : iis.c
 Description  : S3C2443 IIS module code
 Author       : Junon Jeon
 Dept         : AP
 Created Date : 2006.06.02
 Version      : 0.0
 History
   R0.0 (2006.06.02): Junon draft
		- S3C2443 IIS test code is derived from S3C2413A IIS test code.
		
=======================================================================*/

#include "System.h"
#include "iis.h"	
#include "SfrReadWriten.h"
#include "PLL.h"
#include "codec.h"
#include "codecexterns.h"
#include "6channelid.h"
#include "tada.h"


#define IIS_BUFFER 0x31000000
#define IIS_BUFFER2 0x32000000
#define REC_LEN_IIS 0xfffff*4	//Max value of DMA Transfer Counter (20bit) = 0xfffff, Date Size=Word (4bytes)
 
 /////////////////////////////////////////////////////
// Global variable
/////////////////////////////////////////////////////
IIS_State 		g_oI2SState;
IIS_Statistic	g_oI2Sunderrun[I2S_MAX_UNDERRUN_STATIC];
IIS_Addr		g_oI2Splaybuffer[2];
DMA_info		g_oDmainfo[2];//0: tx rx tx tx rx 
							 //1:       rx tx rx

 
// Global variables
char which_Buf = 1;
volatile char Play_Done = 0;
volatile char Rec_Done = 0;
unsigned int g_underruncnt=0;

unsigned char  *Buf,*_temp;
unsigned char *rec_buf = (unsigned char *)(IIS_BUFFER+0x28);
unsigned char *rec_buf1 = (unsigned char *)(IIS_BUFFER + REC_LEN_IIS); 

unsigned int size, fs; 
unsigned int save_GPE_CON, save_GPB_CON;
unsigned int save_GPE_DAT, save_GPB_DAT;
unsigned int save_GPE_SEL, save_GPB_SEL;
unsigned int save_GPE_UDP, save_GPB_UDP;


unsigned int save_GPL_CON, save_GPJ_CON;
unsigned int save_GPL_DAT, save_GPJ_DAT;
unsigned int save_GPL_SEL, save_GPJ_SEL;
unsigned int save_GPL_UDP, save_GPJ_UDP;

float IIS_Codec_CLK;


//SFR test	
REGINFOn		sRegInfoI2S0[] = 
{ 
    //01234567890123            address               reset        uPrivateBitMask(1:do check)
    //												  value       
	{"rIISCON0 [17]- interrupt status ",	0x55000000, 18-1, RW, 0xC600, DPPB, 0x1007f,0},		
	{"rIISMOD0  			",	0x55000004, 22-1, RW, 0x0  , DPDB, 0,0},	
	{"rIISFIC0  			",	0x55000008, 29-1, RW, 0x0  , DPPB, 0xe0e0e0e0,0},	
	{"rIISPSR0  			",	0x5500000c, 16-1, RW, 0x0  , DPDB, 0,0},	
	{"rIISTXD0  			",	0x55000010, 32-1, WO, 0x0  , DPDB, 0,0},	
	{"rIISRXD0  			",	0x55000014, 32-1, RO, 0x0  , DPDB, 0,0},	
};

REGINFOn		sRegInfoI2S1[] = 
{ 
    //01234567890123                 
	{"rIISCON1 [17]- interrupt status ",	0x55000100, 18-1, RW, 0x600, DPPB, 0x1007f,0},		
	{"rIISMOD1  			",	0x55000104, 16-1, RW, 0x0  , DPDB, 0,0},	
	{"rIISFIC1  			",	0x55000108, 16-1, RW, 0x0  , DPPB, 0xe0e0,0},		
	{"rIISPSR1  			",	0x5500010c, 16-1, RW, 0x0  , DPDB, 0,0},	
	{"rIISTXD1  			",	0x55000110, 32-1, WO, 0x0  , DPDB, 0,0},	
	{"rIISRXD1  			",	0x55000114, 32-1, RO, 0x0  , DPDB, 0,0},	
};



//Externs
extern bool TestSFRn(const REGINFOn* psRegInfo, int count);//sfrreadwriten.c
extern unsigned int DownloadData(void);//console.c

//iinew.c
extern bool PCM_testpatternmemcopy(unsigned int testaddr, unsigned char totch, unsigned char bitperch);


// Functions

void I2S_SFR_test01(void);//1

// GPIO port setting
void IIS_Port_Init(void);
void IIS_Port_Return(void);
void I2S_VariableInit(void);

// IIS library
void Select_PCLK(int port, unsigned int pdf);
void Select_EXTCLK(int port, unsigned int pdf);
bool Select_EPLL(int port, unsigned int pdf);
void Select_EPLL_Ref_CLK(int port, unsigned int pdf);


void I2S_INT_Underrun_init(void);

void down_wav(void);


void __irq Isr_I2S_Interrupt(void);
void __irq DMA1_Rec_Done(void);
void __irq DMA2_Done(void);
void __irq Play_Rec_Simul(void);


void Play_Iis(void);
void Play_Iis_logic(void);
void Play_Iis_logic_underrun(void);
void RecordSound_Playit(void);
void RecordSound_ViaLineIn_Playit_logic(void);
void RecordSound_ViaMICIn_Playit(void);
void RECORD_PLAY_SIMtaneously(void);

void I2S_DMA_Play_init(int port, unsigned char *start_addr, unsigned int pcm_size, int bitperch);
bool I2S_DMA_updateTx();
void I2S_DMA_finishTX();

void I2S_tx_finish();

void I2S_DMA_Rec_init(int port, unsigned char *start_addr, unsigned int pcm_size, int bitperch);
bool I2S_DMA_updateRx();
void I2S_rx_finish();

void IIS_PlayWave_DMA(int port, unsigned char *start_addr);
void IIS_PlayWave_Polling(int port, unsigned char *start_addr, unsigned int play_size, int bitperch);
void IIS_PlayWave_Polling_logic(int port, unsigned char *start_addr, unsigned int play_size, int bitperch);

void IIS_RecSound_DMA(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);
void IIS_RecSound_Polling(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize);

void IIS_Paly_Rec_Simultaneously_DMA();
void IIS_RecSound_DMA1_Repeat(unsigned int uRecBufferAddr, unsigned int uPcmRecByteSize);

void ISS0_sample0();
void ISS0_Demo1();
void ISS0_Demo2();
void I2S_2chDemo(void);

void * func_iis_test[][2]=
{	
	//IIS Function Test Item
	//  									"123456789012345678901"
	(void *)I2S_Select_port, 					   "Select I2S port",
   	(void *)I2S_SFR_test01,	       					"I2S SFR reset & read/write test ",//1
   		
	(void *)I2S_Select_MasterSlave,				   "Select I2S Master/Slave",
	
	(void *)I2S_Select_testsource,			  	   "Select test pcm source select",
	(void *)I2S_ClockSettingPathsetting,		   "Select I2S clock setting",		
	(void *)I2S_setETC,				   			   "Select dataformat/DMAPolling/enable underrun interrupt",
	(void *)I2S_selectsetting,					   "Select setting for record",

   	(void *)Play_Iis,              			       "Play Wave            ", 
   	(void *)Play_Iis_logic,              		   "Play Wave(polling logic)", 
   	(void *)Play_Iis_logic_underrun,               "Play Wave(dma logic under run test)",    	
   	(void *)RecordSound_Playit, 	       "Record & Play",
   	(void *)RecordSound_ViaLineIn_Playit_logic,    "Record(LineIn) & Play(polling logic)",
    (void *)RECORD_PLAY_SIMtaneously,              "Record and Play Simultaneously. \n", 

    (void *)I2S_2chDemo,								"tada 22.050KHz 2ch 16bit 1sec",
    (void *)ISS0_sample0,								"6channel id 11.025khz 5.1ch 16bit 5sec",         
    (void *)ISS0_Demo1,								"Crouching Tiger 48khz 5.1ch 16bit 54sec",
    (void *)ISS0_Demo2,								"Crouching Tiger 48khz 5.1ch 16bit 37sec",    

    0,0
};


void Test_IIS(void)
{
	int i;
	
	I2S_VariableInit();	
	while(1)
	{
		i=0;
		printf("\n\n================== IIS Function Test =====================\n\n");
		
		while(1)
		{   //display menu
			printf("%2d:%s",i,func_iis_test[i][1]);
			i++;
			if((int)(func_iis_test[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%1)==0)
			printf("\n");
		}
		printf("\n==========================================================\n");
		printf("Select #Item or Press Enter key to exit : ");
		i = GetIntNum(); 
		//i = 2;
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_iis_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_iis_test[i][0]) )();
	}
	
}




//should execute at first
bool I2S_SFR_test(int Port)
{
	bool bret;
	if(Port == 0)
		bret=TestSFRn(sRegInfoI2S0, sizeof(sRegInfoI2S0)/sizeof(REGINFOn));
	else if(Port == 1)
		bret=TestSFRn(sRegInfoI2S1, sizeof(sRegInfoI2S1)/sizeof(REGINFOn));
	
	return bret;
}




//============================== [ IIS Drivers ] ===============================

//set default setting
void I2S_VariableInit(void)
{
	g_oI2SState.CodecID = WM8580;
	g_oI2SState.Port = I2S_PORT0;
	g_oI2SState.MasterSlave = I2S_MASTER;
	g_oI2SState.Txrmode = I2S_MODE_TX;
	g_oI2SState.LineMic = CODEC_LINEIN;

	g_oI2SState.recordSec = 10;

	g_oI2SState.BitperCh = 16;	
	g_oI2SState.SyncClkFreq = 48000;
	g_oI2SState.Totch = 2;
	g_oI2SState.maskingch = 0x3f & ~(0x3<<0);

	g_oI2SState.ClkSrc = I2S_EPLL;
	g_oI2SState.CDCLKFreqFs = 384;
	g_oI2SState.CDCLKFreq = g_oI2SState.SyncClkFreq *  g_oI2SState.CDCLKFreqFs;
	g_oI2SState.BitClkFS = 32;
	
	g_oI2SState.Dataformat = I2S_FORMAT_I2S;	
	g_oI2SState.DmaPolling = I2S_DMA;	
	g_oI2SState.benUnderInt = 1;
	
	g_oI2SState.ben24bittest = 0;//polling underrun, overrun test
}

// Setting Port related to IIS  

//port num
void IIS_Port_Init()
{
/*
	save_GPG_CON = rGPGCON;	// L3 	
   	//----------------------------------------------------------
	//PORT G GROUP
	//Ports  :   GPG0       GPG1        GPG2  
	//Signal :  L3MODE     L3DATA      L3CLK
	//Setting:  OUTPUT     OUTPUT      OUTPUT 
	//	        [1:0]      [3:2]       [5:4]
	//Binary :  01          01           01 
	//----------------------------------------------------------    
    rGPGCON = rGPGCON & ~(0x3f) | (1<<4)|(1<<2)|(1); // output setting
*/   

	if(g_oI2SState.Port == I2S_PORT0)
	{
		save_GPE_CON = rGPECON;	// IIC, IIS
		save_GPE_SEL = rGPESEL;	// IIC, IIS
		save_GPE_UDP = rGPEUDP;	// IIC, IIS
		
		save_GPB_SEL = rGPBSEL;	// IIS
		save_GPB_UDP = rGPBUDP;	// IIS	
		

	   	//IIS0
	   	//-------------------------------------------------------------------------------
		//PORT E GROUP
		//Ports  :   GPE4  			GPE3           GPE2         GPE1           GPE0 
		//Signal :   I2S DO         I2S DI         CDCLK        I2S SCLK        I2S LRCLK
		//con    :   10,            10,            10,          10,            10  
		//pullup :   0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPESEL = 0;//GPE select
		rGPECON = rGPECON & ~(0x3ff) | 0x2aa; // IIS function setting
		rGPEUDP = rGPEUDP & ~((U32)(0x3ff)) | ((U32)(0x0));//pull_up_down disable
	   	//-------------------------------------------------------------------------------
		//PORT B GROUP
		//Ports  :   GPB10  		GPB9
		//Signal :   I2S DO_2       I2S DO_1
		//con 	 :   xx,            xx,
		//pullup :   0,            0,
		//Sel    :   1              1 
		//-------------------------------------------------------------------------------
		rGPBSEL = rGPBSEL & ~((U32)(0x3<<3)) | ((U32)(0x3<<3)); // IIS function setting
		rGPBUDP = rGPBUDP & ~((U32)(0xf<<18)) | ((U32)(0x0<<18));//pull_up_down disable
		
	}
	else
	{
		save_GPL_CON = rGPLCON;	// IIS1
		save_GPL_SEL = rGPLSEL;	// IIS1
		save_GPL_UDP = rGPLUDP;	// IIS1
		
		save_GPJ_CON = rGPJCON;	// IIS1
		save_GPJ_SEL = rGPJSEL;	// IIS1
		save_GPJ_UDP = rGPJUDP;	// IIS1	
	   	//IIS1
	   	//-------------------------------------------------------------------------------
		//PORT L GROUP
		//Ports  :   GPL7           GPL6         GPL5           GPL4 
		//Signal :   I2S SDO        SDI          CDCLK          SCLK
		//con    :   11,            11,          11,            11  
		//pullup :   0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPLSEL = 0;//GPL
		rGPLCON = rGPLCON & ~((U32)(0xff<<8)) | ((U32)(0xff<<8)); // IIS function setting
		rGPLUDP = rGPLUDP & ~((U32)(0xff<<8)) | ((U32)(0x0<<8)); // pull_up_down disable
	   	//-------------------------------------------------------------------------------
		//PORT J GROUP
		//Ports  :   GPJ13
		//Signal :   I2S1 LRCK
		//con    :   11
		//pullup :  0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPJSEL = 0;//GPJ
		rGPJCON = rGPJCON & ~((U32)(0x3<<26)) | ((U32)(0x3<<26)); // IIS function setting	
		rGPJUDP = rGPJUDP & ~((U32)(0x3<<26)) | ((U32)(0x0<<26));//pull_up_down disable		
	}	
}


void I2S_SetToGPIO(int port)
{
	if(port == I2S_PORT0)
	{
	   	//IIS0
	   	//-------------------------------------------------------------------------------
		//PORT E GROUP
		//Ports  :   GPE4  			GPE3           GPE2         GPE1           GPE0 
		//Signal :   I2S DO         I2S DI         CDCLK        I2S SCLK        I2S LRCLK
		//con    :   10,            10,            10,          00,            00  
		//pullup :   0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPESEL = 0;//GPE select
		rGPECON = rGPECON & ~(0x3ff) | 0x2a0; // input
		rGPEUDP = rGPEUDP & ~((U32)(0x3ff)) | ((U32)(0x0));//pull_up_down disable
		
	}
	else
	{
	   	//IIS1
	   	//-------------------------------------------------------------------------------
		//PORT L GROUP
		//Ports  :   GPL7           GPL6         GPL5           GPL4 
		//Signal :   I2S SDO        SDI          CDCLK          SCLK
		//con    :   11,            11,          11,            0  
		//pullup :   0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPLSEL = 0;//GPL
		rGPLCON = rGPLCON & ~((U32)(0xff<<8)) | ((U32)(0xfc<<8)); // input
		rGPLUDP = rGPLUDP & ~((U32)(0xff<<8)) | ((U32)(0x0<<8)); // pull_up_down disable
	   	//-------------------------------------------------------------------------------
		//PORT J GROUP
		//Ports  :   GPJ13
		//Signal :   I2S1 LRCK
		//con    :  0
		//pullup :  0
		//Sel    :   0
		//-------------------------------------------------------------------------------
		rGPJSEL = 0;//GPJ
		rGPJCON = rGPJCON & ~((U32)(0x3<<26)) | ((U32)(0x0<<26)); // input	
		rGPJUDP = rGPJUDP & ~((U32)(0x3<<26)) | ((U32)(0x0<<26));//pull_up_down disable		
	}		
}


//gpe0 : i2s0 lrck , gpe1: i2s0 sclk
//gpj13 : i2s1 lrck , gpl4: i2s1 sclk
bool I2S_ClockTEST(int port)
{
	bool bLRCLK, bSCLK;
	bool bLRCLKold=0, bSCLKold=0;
	int   cntLRtoggle=0, cntSCLKtoggle=0;
	int i=0;
	bool bret = 0;
	
	while(1)
	{
		bSCLK =  (port==I2S_PORT0)? (rGPEDAT>>1)&0x1 : (rGPLDAT>>4)&0x1;
		bLRCLK = (port==I2S_PORT0)? rGPEDAT&0x1 : (rGPJDAT>>13)&0x1;
		
		if(bSCLK != bSCLKold) cntSCLKtoggle ++;
		if(bLRCLK != bLRCLKold) cntLRtoggle ++;
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -