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

📄 iis.c

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

	I2S_DMA_finishTX();
	
	if(port == I2S_PORT0) rIISFIC = 0x0;	    //For FIFO flush
	else 				  rIISFIC1 = 0x0;	    //For FIFO flush		
 	
	printf("\nEnd of Play!\n");
}


//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
	unsigned int inc=0;
	unsigned int sizeWord = uPcmByteSize/4;
	unsigned int breakpoint = sizeWord/2+1;
	unsigned int* ptemp;
	int i;

	g_oI2Splaybuffer[1].uCurrAddr = (unsigned int *)uBufferAddr;


    printf("Press any key to record.\n");    
    getchar();
	
	printf("\n Recording............\n");
    
	//IIS Rx start
	if(g_oI2SState.Port == I2S_PORT0)	rIISCON |= 0x1;
	else rIISCON1 |= 0x1;	
	

	if(g_oI2SState.Port == I2S_PORT0)
	{
		while(1)
		{
			//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
			//>13
			while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty

			//now fifo is full, read
			*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD;			
			
			inc++;			
			if( inc >= sizeWord) break;
			     
		}		
	}
	else
	{
		while(1)
		{
			//while( (rIISCON1 & 0x80)==0x80 ) ;//wait during fifo is not full
			while( (rIISCON1 & 0x200)==0x200 ) ;//wait during fifo is empty
			
			//now fifo is full, read
			*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD1;
			
			inc++;			
			if( inc >= sizeWord) break;
		}
	}
	
	//IIS Rx stop
	I2S_rx_finish();	
	
	if(g_oI2SState.Port == I2S_PORT0) rIISFIC    = 0x0;			//For FIFO flush
	else rIISFIC1    = 0x0;			//For FIFO flush
	
	printf("\nEnd of Record!\n");	
    	
}

//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
	unsigned int inc=0;
	unsigned int sizeWord = uPcmByteSize/4;
	unsigned int breakpoint = sizeWord/2+1;
	unsigned int* ptemp;
	int i;

	//init
	rGPHCON = (rGPHCON & ~(3<<28) ) | (1<<28);//out(clockout1 tp 5)
	rGPHUDP = rGPHUDP  & ~(0x3<<28)|(0x0<<28);//pullup/down disable
	rGPHDAT = (rGPHDAT & ~(1<<14) ) | (0<<14);//init-low
	

	g_oI2Splaybuffer[1].uCurrAddr = (unsigned int *)uBufferAddr;



    printf("Press any key to record.\n");    
    getchar();
	
	printf("\n Recording............\n");
    
	//IIS Rx start
	if(g_oI2SState.Port == I2S_PORT0)	rIISCON |= 0x1;
	else rIISCON1 |= 0x1;	
	
	rGPHDAT = 0x755f;

	if(g_oI2SState.Port == I2S_PORT0)
	{
		while(1)
		{
			//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
			if(inc!=breakpoint)
			while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty

			//now fifo is full, read
			*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD;
			
			if(inc==breakpoint) rGPHDAT = 0x755f;
			
				//if(inc==breakpoint+16) rGPHDAT = 0x755f;	//0x355f + (inc%2)*0x4000;	
			inc++;
			if( inc >= sizeWord) break;
			
				//to make overrun.
				//problem : how possibly know this happens?,
				// once happens, then it's over.
				//===> interrupt routine is needed, hw changes is needed.
				if( inc == breakpoint) 
				{
					rGPHDAT = 0x355f;
					printf("Stoped by manual, press to continue, monitor tp5 at low to high triggering..\n");
					getchar();
					
					//continue
					rGPHDAT = 0x755f;	
					
					while( (rIISCON & 0x800)==0x100 ) ;//wait during right
					for(i=0;i<200;i++);	//(to avoid trasition error)
					while( (rIISCON & 0x800)==0x000 ) ;//wait during left 

					//                   L          R           L
					//            0         5.2us      10.4us   15.6us
					//            \___________/--------\_________/
					//right width 5.2us                    <---------> critical path at before rtl fix
					//after rtl fix.					
//port0
//400:133:66
// i<650     -                                                              | 15.41us     - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<600     -                                                         | 13.27us     - read when sync clk is left. data is read at next left sync signal.(ok) V
//no delay  -                                           | 5.67us     - read when sync clk is right. data is read at next left sync signal.(ok)  V
					for(i=0;i<650;i++);	
										
					rGPHDAT = 0x355f;

				}
			     
		}		
	}
	else
	{
		while(1)
		{
			if(inc!=breakpoint)
			while( (rIISCON1 & 0x200)==0x200 ) ;//wait during fifo is empty

			//now fifo is full, read
			*(g_oI2Splaybuffer[1].uCurrAddr++) = rIISRXD1;
			
			if(inc==breakpoint) rGPHDAT = 0x755f;
			
			inc++;
			if( inc >= sizeWord) break;
			
				//to make overrun.
				//problem : how possibly know this happens?,
				// once happens, then it's over.
				//===> interrupt routine is needed, hw changes is needed.
				if( inc == breakpoint) 
				{
					rGPHDAT = 0x355f;
					printf("Stoped by manual, press to continue, monitor tp5 at low to high triggering..\n");
					getchar();
					
					//continue
					rGPHDAT = 0x755f;	
					
					while( (rIISCON1 & 0x800)==0x100 ) ;//wait during right
					for(i=0;i<20;i++);	//(to avoid trasition error)
					while( (rIISCON1 & 0x800)==0x000 ) ;//wait during left 
					
					//                   L          R           L
					//            0         5.2us      10.4us   15.6us
					//            \___________/--------\_________
					//right width 5.2us
					//after rtl fix.					
//port1
//400:133:66
// i<600     -                                                            | 14.13us     - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<300     -                                                  | 9.36us     - read when sync clk is left. data is read at next left sync signal.(ok) V
// i<300     -                                                          | 12.69us     - read when sync clk is left. data is read at next left sync signal.(ok) V 
// i<100     -                                                       | 11.09us     - read when sync clk is left. data is read at sams left sync signal.(ok) V
// i<100     -                                             | 6.91s     - read when sync clk is right. data is read at next left sync signal.(ok) V
//no delay  -                                           | 5.85us     - read when sync clk is right. data is read at next left sync signal.(ok) V
					for(i=0;i<600;i++);	
					
					rGPHDAT = 0x355f;

				}
			     
		}	
	}
	
	//IIS Rx stop
	I2S_rx_finish();	
	
	if(g_oI2SState.Port == I2S_PORT0) rIISFIC    = 0x0;			//For FIFO flush
	else rIISFIC1    = 0x0;			//For FIFO flush
	
	ptemp = (unsigned int *)(uBufferAddr+breakpoint*4);
	printf("content at the breakpoint @0x%x\n",ptemp);
	printf("breakpoint : 0x%x\n", *ptemp);
	
	printf("fifo 1 : breakpoint+4 : 0x%x (from the point continuing)\n", *(ptemp+1) );	
	for(i=2; i<24; i++)
	{
		if( i ==17 ) printf("fifo 17 is the data when continued from overrun\n");
		printf("fifo %d, breakpoint+%d : 0x%x\n",i, 4*i, *(ptemp+i) );		
	}

	printf("\nEnd of Record!\n");	
    	
}

				/*	
					//fifo is full : read content from before the momoent stop., and at the moment of stop
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x755f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x355f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x755f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x355f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x755f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					rGPHDAT = 0x355f;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;

					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
					*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;										
					
					inc=inc+16;*/

/*

//mode 1 : mic rec
//mode 2 : line rec
void IIS_RecSound_Polling_logic(int mode, unsigned int uBufferAddr, unsigned int uPcmByteSize)
{
	unsigned int inc=0;
	unsigned int sizeWord = uPcmByteSize/4;
	unsigned int breakpoint = sizeWord/2+1;
	unsigned int* ptemp;
	int i;

	//init
	rGPHCON = (rGPHCON & ~(3<<28) ) | (1<<28);//out(tp 32)
	rGPHUDP = rGPHUDP  & ~(0x3<<28)|(0x0<<28);//pullup/down disable
	rGPHDAT = (rGPHDAT & ~(1<<14) ) | (0<<14);//init-low
	

	g_oI2Splaybuffer.uCurrAddr = (unsigned int *)uBufferAddr;



    printf("Press any key to record.\n");    
    getchar();
	
	printf("\n Recording............\n");
    
	//IIS Rx start
	if(g_oI2SState.Port == I2S_PORT0)	rIISCON |= 0x1;
	else rIISCON1 |= 0x1;	
	
	rGPHDAT = 0x755f;

	if(g_oI2SState.Port == I2S_PORT0)
	{
		while(1)
		{
			//while( (rIISCON & 0x80)==0x80 ) ;//wait during fifo is not full
			while( (rIISCON & 0x200)==0x200 ) ;//wait during fifo is empty

			//now fifo is full, read
			*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD;
			
				if(inc>=breakpoint) rGPHDAT = 0x355f + (inc%2)*0x4000;	
			inc++;			
			if( inc >= sizeWord) break;
			
				//to make overrun.
				//problem : how possibly know this happens?,
				// once happens, then it's over.
				//===> interrupt routine is needed, hw changes is needed.
				if( inc == breakpoint) 
				{
					rGPHDAT = 0x355f;
					printf("Stoped by manual, press to continue, monitor tp32 at low to high triggering..\n");
					getchar();
					
					//continue
					rGPHDAT = 0x755f;	
					
					//fifo flush
					
					//wait during left-work.
				//	while( (rIISCON & 0x800)==0x000 ) ;				
					//wait during right-flip occur..
					while( (rIISCON & 0x800)==0x100 ) ;									
				}
			     
		}		
	}
	else
	{
		while(1)
		{
			while( (rIISCON1 & 0x80)==0x80 ) ;//wait during fifo is not full
			
			//now fifo is full, read
			*(g_oI2Splaybuffer.uCurrAddr++) = rIISRXD1;
			
			if( ( (unsigned int)(g_oI2Splaybuffer.uCurrAddr) )
			     >= (uBufferAddr+ uPcmByteSize) 
			     ) break;
		}
	}
	
	//IIS Rx stop
	I2S_rx_finish();	
	
	if(g_oI2SState.Port == I2S_PORT0) rIISFIC    = 0x0;			//For FIFO flush
	else rIISFIC1    = 0x0;			//For FIFO flush
	
	ptemp = (unsigned int *)(uBufferAddr+breakpoint*4);
	printf("content at the breakpoint\n");
	printf("breakpoint : 0x%x\n", *ptemp);
	
	printf("fifo 0 : breakpoint+4 : 0x%x (from the point continuing)\n", *(ptemp+1) );	
	for(i=2; i<20; i++)
		printf("breakpoint+%d : 0x%x\n",i-1, *(ptemp+i) );
	printf("\nEnd of Record!\n");	
    	
}
*/
//be careful. interrupt enable setting should be prior to the test, and after that, enabled setting should be kept.
void IIS_PlayWave_Polling(int port, unsigned char *start_addr, unsigned int play_size, int bitperch)
{
	unsigned char Exit_Key;

	unsigned char Burst, Datasize;
	unsigned char rBurst, rDatasize;
	unsigned int estInitialTC;//
	unsigned int realInitialTC, backup, inc;	
	

	unsigned int i, uFifoStat0, uFifoStat1, uFifoStat2;
	//unsigned int* uPcmBuffer;
	

	//size estimate,
	Burst = 1;//1: single, 4 : 4burst - doesn't work?	
	Datasize = 4;//1:byte, 2:half word 4:word [transfer unit]
	
	rBurst = (Burst == 1)? 0 : 1;//0:single, 1:4 burst
	rDatasize = (Datasize==1)?0:
				(Datasize==2)?1:2;//0:byte, 1:half word, 2: word.		
	estInitialTC = play_size/ (  Burst*Datasize  );// playsize(byte) / (  single or burst * transfer unit ) = tc
		
	realInitialTC = estInitialTC;	
	backup=realInitialTC/2+3;//front center/
	inc=0;
	
	printf("Word unit @0:%d, overrun point:%d\n", realInitialTC, backup);
		
	printf("\nConnect head-phone plug into speaker-out socket on SMDK2450 and Press any key.\n");
	getchar();
	
	printf("If you want to exit, Press the 'x' key.\n");
	printf("Now Play...\n");
	
	g_underruncnt=0;
	g_oI2Splaybuffer[0].uStartAddr = (unsigned int *)start_addr;
	g_oI2Splaybuffer[0].uCurrAddr = g_oI2Splaybuffer[0].uStartAddr;
	
	
	//IIS Tx Start
	//fill fifo before starting.
	
	if(port == I2S_PORT0) 	rIISCON = rIISCON & ~(0x7e) | 0x1;//IIS Interface start, dma all off
	else 					rIISCON1 = rIISCON1 & ~(0x7e) | 0x1;//IIS Interface start, dma all off
	//printf("trace 32 must detached, due to it read fifo,\n");

	while(1)
	{
		if(port == I2S_PORT0)
		{
			while( (rIISCON & 0x100)==0x100 ) ;//wait during full	
		}
		else
		{
			while( (rIISCON1 & 0x100)==0x100 ) ;//wait during full	
		}

		// following makes delay.
		//	uFifoStat0 = (rIISFIC & 0x1f00)>>8 ;	
		//	printf("fifo count %d ", uFifoStat0);

		
		if(port == I2S_PORT0)
			

⌨️ 快捷键说明

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