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

📄 iis.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
		rIISFIC = 0+(1<<15);
	    rIISFIC = 0+(0<<15); 	
	
	
    rIISCON |= (1<<2)|(1<<0);
	
  	printf("\nTX DMA Done ~~~");
*/
	if( !I2S_DMA_updateTx() )
	{
		//to continue, mask off(get dma request)
		rINTMSK &= ~(BIT_DMA);
		rINTSUBMSK &= ~BIT_SUB_DMA2; 		
	}
	else
		I2S_tx_finish();

}

#if 0
void __irq DMA1_Rec_Done(void)
{
	rINTSUBMSK |= BIT_SUB_DMA1; 	
	rINTMSK |= (BIT_DMA);
	rSUBSRCPND = BIT_SUB_DMA1;
	ClearPending(BIT_DMA);	
	
	if(g_oI2SState.Port == I2S_PORT0) rIISCON	&= ~(1<<1)|(0<<0);
	else rIISCON1	&= ~(1<<1)|(0<<0);
	printf("Record DMA Done!\n");

	rINTMSK &= ~(BIT_DMA);
	rINTSUBMSK &= ~BIT_SUB_DMA1;

    Rec_Done = 1;
    
} 

#else
void __irq DMA1_Rec_Done(void)
{
	rINTSUBMSK |= BIT_SUB_DMA1; 	
	rINTMSK |= (BIT_DMA);
	rSUBSRCPND = BIT_SUB_DMA1;
	ClearPending(BIT_DMA);	
	
	if( !I2S_DMA_updateRx() )
	{
		//to continue, mask off(get dma request)
		rINTMSK &= ~(BIT_DMA);
		rINTSUBMSK &= ~BIT_SUB_DMA1;
	}
	else
		I2S_rx_finish();
} 
#endif


void __irq Play_Rec_Simul(void)
{
	rINTSUBMSK |= BIT_SUB_DMA1; 	
	rINTMSK |= (BIT_DMA);
	rSUBSRCPND = BIT_SUB_DMA1;
	ClearPending(BIT_DMA);	


	if(g_oI2SState.Port == I2S_PORT0) 
	{
	    rIISCON	&= ~(1<<0);
		rIISCON |= 0x1;	
	}
	else
	{
	    rIISCON1	&= ~(1<<0);
		rIISCON1 |= 0x1;			
	}
      
	printf("\nR~~~");	

	rINTMSK &= ~(BIT_DMA);
	rINTSUBMSK &= ~BIT_SUB_DMA1; 	
}

void I2S_ClearInt(void)
{
	unsigned int uUrIntStatus = 0x1<<17;		
	if(g_oI2SState.Port== I2S_PORT0) 	rIISCON = (rIISCON & ~(1<<17)) | uUrIntStatus;
	else 						rIISCON1 = (rIISCON1 & ~(1<<17)) | uUrIntStatus;
}

void I2S_DisableInt(void)
{		
	unsigned int uUrIntEn = 0<<16;		
	if(g_oI2SState.Port== I2S_PORT0) 	rIISCON = rIISCON & ~(1<<16) | uUrIntEn;
	else 						rIISCON1 = rIISCON1 & ~(1<<16) | uUrIntEn;
}

//TX_underrun interrupt
void __irq Isr_I2S_Interrupt(void)
{
	if(g_oI2SState.Port == I2S_PORT0)	
	{
		rINTMSK2|=(BIT_I2S0);			
		
		if(rGPHDAT & 0x4000 == 0x4000) 	rGPHDAT = 0x355f;
		else 					rGPHDAT = 0x755f;
		
	
		if(g_underruncnt<I2S_MAX_UNDERRUN_STATIC)
		{
			//g_oI2Sunderrun[g_underruncnt].rIiscon = (unsigned int)rIISCON;
			//g_oI2Sunderrun[g_underruncnt].rIisfic = (unsigned int)rIISFIC;		
			//g_oI2Sunderrun[g_underruncnt].iOffset = (unsigned int)g_oI2Splaybuffer.uCurrAddr;//polling
			g_oI2Sunderrun[g_underruncnt].iOffset = 
			(unsigned int)( (rDSTAT0 & 0xfffff) + g_oDmainfo[0].uIndex*g_oDmainfo[0].uUnitsizeTC);//dma
			
			printf("#d : %d\n",g_underruncnt);
			g_underruncnt++;
		}
		else if(g_underruncnt<100)
		{
			g_underruncnt++;
		}
		else
		{
			printf("underrun interrupt disabled, due to it has so much budden to process\n");
			I2S_DisableInt();
			//I2S_ClearInt();		
			//ClearPending2(BIT_I2S0);
		}

		if(g_oI2SState.DmaPolling== I2S_DMA)
		{
		//while( (rIISCON & 0x2000)==0x0000 ) ;//wait during not full(wait until the point of full) for 6ch dma - never.
		//while( (rIISCON & 0x8000)==0x8000 ) ;//wait during tx2 empty(wait until the point of not empty) for 6ch dma

			//while( (rIISCON & 0x400)==0x400 ) ;//wait during tx0 empty(wait until the point of not empty) for 2ch dma			
		}

		I2S_ClearInt();
		ClearPending2(BIT_I2S0);
		rINTMSK2&=~(BIT_I2S0);
	}
	else
	{
		rINTMSK2|=(BIT_I2S1);
		I2S_ClearInt();
		ClearPending2(BIT_I2S1);

		if(g_underruncnt<I2S_MAX_UNDERRUN_STATIC)
		{
			g_oI2Sunderrun[g_underruncnt].rIiscon = (unsigned int)rIISCON1;
			g_oI2Sunderrun[g_underruncnt].rIisfic = (unsigned int)rIISFIC1;		
			//riiscon=rIISCON1;
			//printf("I2S1 Tx underrun occurs Tx0[%d]\n",
			//		( (riiscon & 1<<10)==(1<<10) )?1:0);
			g_underruncnt++;
		}
		/*else
		{
			printf("underrun interrupt disabled, due to it has so much budden to process\n");
			I2S_DisableInt();
			I2S_ClearInt();	
			ClearPending2(BIT_I2S1);	
		}*/
		
		rINTMSK2&=~(BIT_I2S1);
	}
}
 

void I2S_EnableInt()
{
	unsigned int uUrIntEn = 1<<16;		
	if(g_oI2SState.Port== I2S_PORT0) 	rIISCON = rIISCON & ~(1<<16) | uUrIntEn;
	else 						rIISCON1 = rIISCON1 & ~(1<<16) | uUrIntEn;
} 
 

void I2S_INT_Underrun_init()
{
	if(g_oI2SState.Port == I2S_PORT0)
	{
		pISR_I2S0 = (unsigned)Isr_I2S_Interrupt;		
		ClearPending2(BIT_I2S0);
		rINTMSK2=~(BIT_I2S0);
	}
	else
	{
		pISR_I2S1 = (unsigned)Isr_I2S_Interrupt;		
		ClearPending2(BIT_I2S1);
		rINTMSK2=~(BIT_I2S1);
	}
	I2S_ClearInt();
	I2S_EnableInt();
}


void I2S_INT_Underrun_deinit()
{
	if(g_oI2SState.Port == I2S_PORT0)
	{
		rINTMSK2|=(BIT_I2S0);
		I2S_ClearInt();
		ClearPending2(BIT_I2S0);		
	}
	else
	{
		rINTMSK2|=(BIT_I2S1);
		I2S_ClearInt();
		ClearPending2(BIT_I2S1);		
	}
	I2S_DisableInt();
}


//if underrun enabled, then print underrun log.
void I2S_Print_underrun()
{
	int i, j;
	unsigned int rIiscon, rIisfic, iOffset;
	
	if(g_oI2SState.benUnderInt==0) return;
	
	j = (g_underruncnt>I2S_MAX_UNDERRUN_STATIC)? I2S_MAX_UNDERRUN_STATIC : g_underruncnt;
	
	for(i=0; i<j; i++)
	{
		rIiscon = g_oI2Sunderrun[i].rIiscon;
		rIisfic = g_oI2Sunderrun[i].rIisfic;
		iOffset = g_oI2Sunderrun[i].iOffset;
		
		printf("#%d : I2S0 Tx fifo empty Tx0[%d], Tx1[%d], Tx2[%d]\n",
					i,
					( (rIiscon & 1<<10)==(1<<10) )?1:0,
					( (rIiscon & 1<<10)==(1<<14) )?1:0,
					( (rIiscon & 1<<10)==(1<<15) )?1:0);
		printf("#%d : I2S0 Tx fifo count Tx0[%d], Tx1[%d], Tx2[%d]\n",
					i,
					(rIisfic>>8 & 0x1f ),
					(rIisfic>>16 & 0x1f),
					(rIisfic>>24 & 0x1f) );
		printf("#%d : offset:%d (0x%x)\n\n", 
					i,iOffset, iOffset);
 		
	}
	
	printf("Total underrun count : %d\n", g_underruncnt);

	
}






//input : starting address of pcm
//	     byte size of pcm
// ex ; I2S_play_main( (void *)IIS_BUFFER, g_oI2SState.pcmsize)
void I2S_play_main(void * PlayAddress, unsigned int bytesize)
{
	bool ret;

	if(g_oI2SState.benUnderInt==1) I2S_INT_Underrun_init();//before tst please set

	if(g_oI2SState.DmaPolling== I2S_DMA) I2S_DMA_Play_init(g_oI2SState.Port,  (unsigned char *)(PlayAddress), bytesize, g_oI2SState.BitperCh);
		
	//Init1341(PLAY_IIS);//2443
	ret=I2S_InitCodec( g_oI2SState.CodecID, g_oI2SState.MasterSlave,I2S_MODE_TX, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.SyncClkFreq, g_oI2SState.BitperCh, CODEC_NOIN);//2450 - OpMode, txr, dataformat, CodecClkFs(codec master), BitperCh)	
	if(!ret) return;	
	
	I2S_Slave_ClockinTest(g_oI2SState.Port, g_oI2SState.MasterSlave);
	
	I2S_Setting(g_oI2SState.Port, g_oI2SState.MasterSlave,I2S_MODE_TX, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.BitClkFS, g_oI2SState.Totch, g_oI2SState.BitperCh, g_oI2SState.DmaPolling);//Port, trx, i2sformat, rootfs, ch, bit);
	
	if(g_oI2SState.DmaPolling == I2S_DMA) IIS_PlayWave_DMA(g_oI2SState.Port, (unsigned char *)(PlayAddress) );
	else							IIS_PlayWave_Polling(g_oI2SState.Port,  (unsigned char *)(PlayAddress), bytesize, g_oI2SState.BitperCh);	
	
	if(g_oI2SState.benUnderInt==1) I2S_INT_Underrun_deinit();
	
	I2S_Print_underrun();
	// need to add mute function
}


//input : starting address of pcm
//	     byte size of pcm
// ex ; I2S_record_main( (void *)IIS_BUFFER, g_oI2SState.pcmsize)
void I2S_record_main(void * RecordAddress, unsigned int bytesize, int LineMic)
{
	bool ret;	
	if(g_oI2SState.DmaPolling== I2S_DMA) I2S_DMA_Rec_init(g_oI2SState.Port,  (unsigned char *)(RecordAddress), bytesize, g_oI2SState.BitperCh);
	
	//Init1341(RECORD_LINE_IN);
	ret=I2S_InitCodec( g_oI2SState.CodecID, g_oI2SState.MasterSlave,	I2S_MODE_RX, g_oI2SState.Dataformat,g_oI2SState.CDCLKFreqFs, g_oI2SState.SyncClkFreq, g_oI2SState.BitperCh, LineMic);//2450 -OpMode, txr, dataformat, CodecClkFs(slave), BitperCh
	if(!ret) return;
	
	I2S_Slave_ClockinTest(g_oI2SState.Port, g_oI2SState.MasterSlave);	
	
	I2S_Setting(g_oI2SState.Port, g_oI2SState.MasterSlave, I2S_MODE_RX, g_oI2SState.Dataformat,g_oI2SState.CDCLKFreqFs, g_oI2SState.BitClkFS , g_oI2SState.Totch, g_oI2SState.BitperCh, g_oI2SState.DmaPolling);//Port, trx, i2sformat, rootfs, ch, bit);
	
	if(g_oI2SState.DmaPolling == I2S_DMA) IIS_RecSound_DMA	(RECORD_LINE_IN, (unsigned int)RecordAddress, bytesize);//org update
	else 							   IIS_RecSound_Polling(RECORD_LINE_IN, (unsigned int)RecordAddress, bytesize);
}


void I2S_playrecord_main(void * PlayAddress, unsigned int bytesize1, void * RecordAddress, unsigned int bytesize2, int LineMic)
{
	bool ret;
	I2S_DMA_Play_init(g_oI2SState.Port,  (unsigned char *)(PlayAddress), bytesize1, g_oI2SState.BitperCh);
	I2S_DMA_Rec_init(g_oI2SState.Port,  (unsigned char *)(RecordAddress), bytesize2, g_oI2SState.BitperCh);

	ret=I2S_InitCodec( g_oI2SState.CodecID, g_oI2SState.MasterSlave,	I2S_MODE_TXR, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.SyncClkFreq, g_oI2SState.BitperCh, LineMic);//2450 -OpMode, txr, dataformat, CodecClkFs(slave), BitperCh
	if(!ret) return;

	I2S_Slave_ClockinTest(g_oI2SState.Port, g_oI2SState.MasterSlave);	
	
	I2S_Setting(g_oI2SState.Port, g_oI2SState.MasterSlave, I2S_MODE_TXR, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.BitClkFS , g_oI2SState.Totch, g_oI2SState.BitperCh, g_oI2SState.DmaPolling);
	IIS_Paly_Rec_Simultaneously_DMA();	
}


void Play_Iis(void)
{	
	printf("\n just only Play it.\n");

//init        
	IIS_Port_Init(); 
	
	MMU_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
	
	
	//I2S_ClockSettingPathsetting();//masterexternal, master, pclki2sclk, ;//before test please set
	
//play	
	//I2S_Testdataprepare(); before test please downlaod.
	I2S_play_main( (void *)IIS_BUFFER, g_oI2SState.pcmsize);

//deinit
	
	IIS_Port_Return();
}


void Play_Iis_logic(void)
{	
//setting
	g_oI2SState.BitperCh = 24;
	g_oI2SState.SyncClkFreq = 96000;
	//g_oI2SState.Totch =2;
	g_oI2SState.Totch =2;
	
	g_oI2SState.CDCLKFreqFs = 384;
	g_oI2SState.CDCLKFreq = g_oI2SState.CDCLKFreqFs * g_oI2SState.SyncClkFreq;
	g_oI2SState.BitClkFS = 48;
	Select_EPLL(g_oI2SState.Port, 0);
	
	g_oI2SState.DmaPolling = I2S_POLLING;

//init        
	IIS_Port_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_oI2SState.pcmsize = 4*2*16;
	PCM_Data_making(IIS_BUFFER, g_oI2SState.pcmsize);	
	

//play	
	if( !I2S_InitCodec( g_oI2SState.CodecID, g_oI2SState.MasterSlave,I2S_MODE_TX, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.SyncClkFreq, g_oI2SState.BitperCh, CODEC_NOIN) ) return;//2450 - OpMode, txr, dataformat, CodecClkFs(codec master), BitperCh)		
	I2S_Setting(g_oI2SState.Port, g_oI2SState.MasterSlave,I2S_MODE_TX, g_oI2SState.Dataformat, g_oI2SState.CDCLKFreqFs, g_oI2SState.BitClkFS, g_oI2SState.Totch, g_oI2SState.BitperCh, g_oI2SState.DmaPolling);//Port, trx, i2sformat, rootfs, ch, bit);	
	IIS_PlayWave_Polling_logic(g_oI2SState.Port,  (unsigned char *)(IIS_BUFFER), g_oI2SState.pcmsize, g_oI2SState.BitperCh);	

//deinit
//	I2S_DisableInt();
	IIS_Port_Return();
}


//for test 256byte
void Play_Iis_logic_underrun(void)
{	
//setting
	g_oI2SState.BitperCh = 24;
	g_oI2SState.SyncClkFreq = 96000;
	g_oI2SState.Totch =6;
	
	g_oI2SState.CDCLKFreqFs = 384;
	g_oI2SState.CDCLKFreq = g_oI2SState.CDCLKFreqFs * g_oI2SState.SyncClkFreq;
	g_oI2SState.BitClkFS = 48;
	Select_EPLL(g_oI2SState.Port, 0);
	
	g_oI2SState.DmaPolling = I2S_DMA;

//pre 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_oI2SState.pcmsize = 4*2*252;// (4byte/1word) * (2word/[24bit LR] ) * 256[24bit LR] (byte)
	//where 252 = 6*42
	PCM_Data_making(IIS_BUFFER, g_oI2SState.pcmsize);	
	
//init	
	IIS_Port_Init();
	I2S_INT_Underrun_init();

//play	
	I2S_play_main( (void *)IIS_BUFFER, g_oI2SState.pcmsize);

//deinit
	I2S_DisableInt();
	IIS_Port_Return();
}

//Record Sound
void RecordSound_Playit(void)
{	
	//g_oI2SState.pcmsize = g_oI2SState.SyncClkFreq*g_oI2SState.Totch*g_oI2SState.BitperCh/8*g_oI2SState.recordSec;//10sec;	
	if(g_oI2SState.LineMic == CODEC_LINEIN) printf("\nRecord Sound via Line-In and Play it.\n");
	else printf("\nRecord Sound via Mic-In and Play it.\n");
	
//init	
	IIS_Port_Init();
//	I2S_ClockSettingPathsetting();//masterexternal, master, pclki2sclk,
	
//record 

⌨️ 快捷键说明

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