📄 pcm.c
字号:
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 + -