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

📄 pcm.c

📁 三星 s3c6400测试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		PCM_CODEC_IICWrite(0x34, 0x7a, 0x00);	//Bias Control
		PCM_CODEC_IICWrite(0x34, 0x7e, 0x00);	//Additional Control
		
	#endif
}

void PCM_CodecExitPCMIn(void)
{
	#if (PCM_CODEC_NAME== AK2430)
		PCM_CODEC_IICWrite(0x9e, 0x05, 0x30);	//MIC Amp1, MIC Bias1 Off	
		Delay(1300);
		PCM_CODEC_IICWrite(0x9e, 0x0B, 0x00);	//sw_COI, sw_TX1 Open	
		PCM_CODEC_IICWrite(0x9e, 0x05, 0x00);	//TX SUM, PCM Codec Off
	#elif (PCM_CODEC_NAME== WM9713)
		AC97_CodecCmd(WRITE,0x3E, 0xffff);		//Disable LINE L/R output PGA's
		AC97_CodecCmd(WRITE,0x26, 0xff00);		//Disable I/P PGA's nad Mixers	
	#endif
}

void PCM_PCMInDMA(u32 uRecBufferAddr, u32 uPcmSize, PCM_CLKSRC ePcmClkSrc)
{
	u32 uSclkDiv, uSyncDiv, uSclkSel;
	u32 uTxMsbPos, uRxMsbPos;
	
	uPcmRecDone = 0;
	
	if(PCM_MODULE == PCM_MODULE0)
	{
		oPcm.m_uNumDma = NUM_DMA0;
		oPcm.m_eDmaId = eSEL_PCM0_RX;
		oPcm.m_eDmaUnit = DMA0;
		oPcm.m_eDmaCh = DMA_A;
		oPcm.m_uPcmRxFifoAddr = PCM0_BASE+rPCMRXFIFO;
		oPcm.m_eDreqSrc = DMA0_PCM0_RX;
	}
	else if(PCM_MODULE == PCM_MODULE1)
	{
		oPcm.m_uNumDma = NUM_DMA1;
		oPcm.m_eDmaId = eSEL_PCM1_RX;
		oPcm.m_eDmaUnit = DMA1;
		oPcm.m_eDmaCh = DMA_A;
		oPcm.m_uPcmRxFifoAddr = PCM1_BASE+rPCMRXFIFO;
		oPcm.m_eDreqSrc = DMA1_PCM1_RX;
	}

	if(PCM_MSB_POS == AFTER_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS1;
		uRxMsbPos = RX_MSB_POS1;	
	}
	else if(PCM_MSB_POS == DURING_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS0;
		uRxMsbPos = RX_MSB_POS0	;
	}
		
	//IRQ Setting
	INTC_SetVectAddr(oPcm.m_uNumDma, Isr_PCM_PCMIn_DMADone);
	INTC_Enable(oPcm.m_uNumDma);

	//DMA Setting
    SYSC_SelectDMA(oPcm.m_eDmaId, 1);
    DMAC_InitCh(oPcm.m_eDmaUnit , oPcm.m_eDmaCh, &oPcmDma);

    DMACH_ClearIntPending(&oPcmDma);
	DMACH_ClearErrIntPending(&oPcmDma);
	DMACH_Setup(oPcm.m_eDmaCh, 0x0, oPcm.m_uPcmRxFifoAddr, true, (u32)uRecBufferAddr, false, HWORD, uPcmSize/2, HANDSHAKE, oPcm.m_eDreqSrc, MEM, SINGLE, &oPcmDma);
      	
   	Disp("Supply Sound to PCM CODEC via MIC In Connector.\n");
    Disp("Press any key to record.\n");
    
    UART_Getc();
   	Disp("Recording...\n");

   	PCM_GetClkValAndClkDir(&uSclkDiv, &uSyncDiv, ePcmClkSrc);

   	if(ePcmClkSrc == PCM_PCLK)
		uSclkSel = 1<<18; 	
	else
		uSclkSel = 0<<18; 

   	Disp("uSclkDiv: 0x%x\n", uSclkDiv);
   	Disp("uSyncDiv: 0x%x\n", uSyncDiv);

    DMACH_Start(&oPcmDma);
      
	//Transfer data enable  
	PCMOutp32(rPCMCLKCTL, PCM_SCLK_EN | uSclkSel | (uSclkDiv<<9) | (uSyncDiv<<0)); 
	PCMOutp32(rPCMCTRL,  RXFIFO_DIPSTICK(0x20)|PCM_RX_DMA_EN |uTxMsbPos |uRxMsbPos|PCM_RXFIFO_EN |PCM_PCM_ENABLE);

	while(uPcmRecDone ==0)
    {
        Disp(".");
        Delay(3000);
    }

    uPcmRecDone = 0;
 
    DMACH_Stop(&oPcmDma);		// DMA stop
    INTC_Disable(oPcm.m_uNumDma);

    PCMOutp32(rPCMCTRL, 0);		
    PCMOutp32(rPCMCLKCTL , 0);	
   	
  	Delay(1000); 

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


void PCM_PCMOutDMA(u32 uRecBufferAddr, u32 uPcmSize, PCM_CLKSRC ePcmClkSrc)
{
	u8 uChar;
	u32 uSclkDiv, uSyncDiv, uSclkSel;
	u32 uTxMsbPos, uRxMsbPos;

	if(PCM_MODULE == PCM_MODULE0)
	{
		oPcm.m_uNumDma = NUM_DMA0;
		oPcm.m_eDmaId = eSEL_PCM0_TX;
		oPcm.m_eDmaUnit = DMA0;
		oPcm.m_eDmaCh = DMA_B;
		oPcm.m_uPcmRxFifoAddr = PCM0_BASE+rPCMTXFIFO;
		oPcm.m_eDreqSrc = DMA0_PCM0_TX;
	}
	else if(PCM_MODULE == PCM_MODULE1)
	{
		oPcm.m_uNumDma = NUM_DMA1;
		oPcm.m_eDmaId = eSEL_PCM1_TX;
		oPcm.m_eDmaUnit = DMA1;
		oPcm.m_eDmaCh = DMA_B;
		oPcm.m_uPcmRxFifoAddr = PCM1_BASE+rPCMTXFIFO;
		oPcm.m_eDreqSrc = DMA1_PCM1_TX;
	}

	if(PCM_MSB_POS == AFTER_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS1;
		uRxMsbPos = RX_MSB_POS1;	
	}
	else if(PCM_MSB_POS == DURING_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS0;
		uRxMsbPos = RX_MSB_POS0	;
	}

	//IRQ Setting
	INTC_SetVectAddr(oPcm.m_uNumDma, Isr_PCM_PCMOut_DMADone);
	INTC_Enable(oPcm.m_uNumDma);
	      
    //DMA Setting
    SYSC_SelectDMA(oPcm.m_eDmaId, 1);
    DMAC_InitCh(oPcm.m_eDmaUnit, oPcm.m_eDmaCh, &oPcmDma);

    DMACH_ClearIntPending(&oPcmDma);
	DMACH_ClearErrIntPending(&oPcmDma);
	DMACH_Setup(oPcm.m_eDmaCh, 0x0, (u32)uRecBufferAddr, false, oPcm.m_uPcmRxFifoAddr, true, HWORD, uPcmSize/2, HANDSHAKE, MEM, oPcm.m_eDreqSrc , SINGLE, &oPcmDma);
								
	Disp("\nListen to Sound via Speak Out Connector.\n");
	Disp("Press any key to play.\n");
    UART_Getc();
    Disp("\nIf you want to exit, Press the 'x' key.\n");

  	PCM_GetClkValAndClkDir(&uSclkDiv, &uSyncDiv, ePcmClkSrc);

  	if(ePcmClkSrc == PCM_PCLK)
		uSclkSel = 1<<18; 	
	else
		uSclkSel = 0<<18; 
  	
  	DMACH_Start(&oPcmDma);

	//PCM Clock Setting 
	PCMOutp32(rPCMCLKCTL, PCM_SCLK_EN|uSclkSel | (uSclkDiv<<9) | (uSyncDiv<<0));
	//Transfer data enable  
	PCMOutp32(rPCMCTRL, TXFIFO_DIPSTICK(0x8) |PCM_TX_DMA_EN |uTxMsbPos |uRxMsbPos |PCM_TXFIFO_EN |PCM_PCM_ENABLE);
 
    while(1)
    {
    	uChar = UART_Getc();

		if( (uChar == 'x') | (uChar == 'X')) 
		break;
    }        
    		
    DMACH_Stop(&oPcmDma);		// DMA stop
     
    INTC_Disable(oPcm.m_uNumDma);

    PCMOutp32(rPCMCTRL, 0);	
    PCMOutp32(rPCMCLKCTL , 0);	
 
  	Disp("\nEnd of Play!\n");

}


void PCM_PCMInInt(u32 uRecBufferAddr, u32 uPcmSize, PCM_CLKSRC ePcmClkSrc)
{
	u32 uSclkDiv, uSyncDiv, uSclkSel;
	u32 uTxMsbPos, uRxMsbPos;
		
	if(PCM_MODULE == PCM_MODULE0)
	{
		oPcm.m_uNumInt = NUM_PCM0;
	}
	else if(PCM_MODULE == PCM_MODULE1)
	{
		oPcm.m_uNumInt = NUM_PCM1;
	}

	if(PCM_MSB_POS == AFTER_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS1;
		uRxMsbPos = RX_MSB_POS1;	
	}
	else if(PCM_MSB_POS == DURING_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS0;
		uRxMsbPos = RX_MSB_POS0	;
	}
		
	uPcmRecDone =0;

	uPcmRecBuffer = (u16 *) uRecBufferAddr;
	uPcmEndRecBuffer = uPcmRecBuffer + uPcmSize;
    
	//IRQ Initialization
	INTC_ClearVectAddr();
	INTC_SetVectAddr(oPcm.m_uNumInt, Isr_PCM_PCMIn);
	INTC_Enable(oPcm.m_uNumInt);

	Disp("Supply Sound to PCM CODEC via MIC In Connector.\n");
    Disp("Press any key to record.\n");
    UART_Getc();
   	Disp("Recording...\n");

	PCM_ClearInt();
	PCM_EnableInt(RX_FIFO_ALMOST_FULL);

	PCM_GetClkValAndClkDir(&uSclkDiv, &uSyncDiv, ePcmClkSrc);

	if(ePcmClkSrc == PCM_PCLK)
		uSclkSel = 1<<18; 	
	else
		uSclkSel = 0<<18; 	

	//PCM Clock Setting 
	PCMOutp32(rPCMCLKCTL, PCM_SCLK_EN | uSclkSel | (uSclkDiv<<9) | (uSyncDiv<<0));
	//Transfer data enable  
	PCMOutp32(rPCMCTRL,  RXFIFO_DIPSTICK(0x20)| uTxMsbPos | uRxMsbPos | PCM_RXFIFO_EN  |PCM_PCM_ENABLE);

	while(1)
	{
	    if(uPcmRecDone)
		break;	
	}
   	
    PCMOutp32(rPCMCTRL, 0);		
	PCMOutp32(rPCMCLKCTL , 0);	
	
	INTC_Disable(oPcm.m_uNumInt);
	PCM_DisableInt();

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


void PCM_PCMOutInt(u32 uRecBufferAddr, u32 uPcmSize, PCM_CLKSRC ePcmClkSrc)
{
	u32 uSclkDiv, uSyncDiv, uSclkSel;
	u32 uTxMsbPos, uRxMsbPos;
	
	if(PCM_MODULE == PCM_MODULE0)
	{
		oPcm.m_uNumInt = NUM_PCM0;
	}
	else if(PCM_MODULE == PCM_MODULE1)
	{
		oPcm.m_uNumInt = NUM_PCM1;
	}

	if(PCM_MSB_POS == AFTER_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS1;
		uRxMsbPos = RX_MSB_POS1;	
	}
	else if(PCM_MSB_POS == DURING_PCMSYNC_HIGH)
	{
		uTxMsbPos = TX_MSB_POS0;
		uRxMsbPos = RX_MSB_POS0	;
	}
	
	uPcmPlayDone =0;

	uPcmRecBuffer = (u16 *) uRecBufferAddr;
	uPcmEndRecBuffer = uPcmRecBuffer + uPcmSize;
    
	//IRQ Initialization
	INTC_ClearVectAddr();
	INTC_SetVectAddr(oPcm.m_uNumInt, Isr_PCM_PCMOut);
	INTC_Enable(oPcm.m_uNumInt);

	Disp("\nListen to Sound via Speak Out Connector.\n");
	Disp("Press any key to play.\n");
    UART_Getc();
  
	PCM_ClearInt();
	PCM_EnableInt(TXFIFO_ALMOST_EMPTY);

	PCM_GetClkValAndClkDir(&uSclkDiv, &uSyncDiv, ePcmClkSrc);

	if(ePcmClkSrc == PCM_PCLK)
		uSclkSel = 1<<18; 	
	else
		uSclkSel = 0<<18; 	

	//PCM Clock Setting 
	PCMOutp32(rPCMCLKCTL, PCM_SCLK_EN |uSclkSel |(uSclkDiv<<9) |(uSyncDiv<<0));
	//Transfer data enable  
	PCMOutp32(rPCMCTRL,  TXFIFO_DIPSTICK(0x8) |uTxMsbPos |uRxMsbPos |PCM_TXFIFO_EN|PCM_PCM_ENABLE);

	while(1)
	{
	    if(uPcmPlayDone)
		break;	
	}
   	
    PCMOutp32(rPCMCTRL, 0);		
	PCMOutp32(rPCMCLKCTL , 0);	
	
	INTC_Disable(oPcm.m_uNumInt);
	PCM_DisableInt();

	Disp("\nEnd of Play!\n");
}


void PCM_ClearInt(void)
{
	u32 uPcmClrInt;

	uPcmClrInt = 0x1;
		
	PCMOutp32(rPCMCLRINT, uPcmClrInt);
}

void PCM_EnableInt(PCM_INT ePcmInt)
{
	u32 uInt;
    
    if(ePcmInt == TRANSFER_DONE)				uInt = 1<<12;
	else if (ePcmInt == TXFIFO_EMPTY)			uInt = 1<<11;
	else if (ePcmInt == TXFIFO_ALMOST_EMPTY)	uInt = 1<<10;
	else if (ePcmInt == TXFIFO_FULL)			uInt = 1<< 9;
	else if (ePcmInt == TXFIFO_ALMOST_FULL)		uInt = 1<< 8;
	else if (ePcmInt == TXFIFO_ERROR_STARVE)	uInt = 1<< 7;
	else if (ePcmInt == TXFIFO_ERROR_OVERFLOW)    uInt = 1<< 6;
		
	else if (ePcmInt == RXFIFO_EMPTY)			uInt = 1<< 5;
	else if (ePcmInt == RXFIFO_ALMOST_EMPTY)	uInt = 1<< 4;
	else if (ePcmInt == RX_FIFO_FULL)			uInt = 1<< 3;
	else if (ePcmInt == RX_FIFO_ALMOST_FULL)	uInt = 1<< 2;
	else if (ePcmInt == RXFIFO_ERROR_STARVE)	uInt = 1<< 1;
	else if (ePcmInt == RXFIFO_ERROR_OVERFLOW)	uInt = 1<< 0;
		
	PCMOutp32(rPCMIRQCTL, uInt|1<<14);
}

void PCM_DisableInt(void)
{		
	PCMOutp32(rPCMIRQCTL, 0x0);
}


////////////////////////////////////////////////////////////////
void PCM_CODEC_IICWrite(u32 uSlaveAddr, u32 uAddr, u8 uData)
{

⌨️ 快捷键说明

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