📄 pcm_test.c
字号:
if(g_oPCMState.PCMPort ==0) printf("connect external clock(32.768MHz) to pcm0 external port after codec init, detach before deinit\n" );
else printf("connect external clock(32.768MHz) to TP57\n" );
getchar();
_size = sizeof(sPCMtestInfo_Def1)/sizeof(PCM_State);
for(i=0; i<_size ; i++)
{
{
PCM_State setting;
int ch;
setting=sPCMtestInfo_Def1[i];
setting.PCMPort=g_oPCMState.PCMPort;
setting.CodecID=PCM_CODEC_NAME;
setting.PCMClkSrc = PCM_PCMCDCLK;
setting.EXTCDCLKFreq = EXT_CLOCK_FREQ_A_32_768;
setting.PCMMSBPosition = AFTER_PCMSYNC_HIGH;
PCM_Display(setting);
printf("do you want to skip a test? [s] for skip [x] for exit");
ch=getchar();
if(ch=='s')continue;
else if(ch=='x') break;
PCM_AUTO_set(setting);//ext 32.768, msb after high, 16fs*n
}
PCM_SetPort(g_oPCMState.PCMPort);
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCMOut(1, 1);//dma
}
break;
}
}
static void PCMMSBTest2(void)
{
int i, _size;
printf("msb test(recording/playing pcm)\n");
printf("0.8/16/32/64/96KHz[D] 1. 11/22/44/88KHz\n");
printf("0.Ext 32.768Mhz[D] 1. Ext 16.9344Mhz 2. PCLK\n");
switch(GetIntNum() )
{
case 1:
printf("recording playing External clock msb after sync test\n");
if(g_oPCMState.PCMPort ==0) printf("connect external clock(16.9344MHz) to pcm0 external port after codec init, detach before deinit\n" );
else printf("connect external clock(16.9344MHz) to TP57\n" );
getchar();
_size = sizeof(sPCMtestInfo_Def2)/sizeof(PCM_State);
for(i=0; i<_size ; i++)
{
{
PCM_State setting;
int ch;
setting=sPCMtestInfo_Def2[i];
setting.PCMPort=g_oPCMState.PCMPort;
setting.CodecID=PCM_CODEC_NAME;
setting.PCMClkSrc = PCM_PCMCDCLK;
setting.EXTCDCLKFreq = EXT_CLOCK_FREQ_B_16_9344;
setting.PCMMSBPosition = AFTER_PCMSYNC_HIGH;
PCM_Display(setting);
printf("do you want to skip a test? [s] for skip [x] for exit");
ch=getchar();
if(ch=='s')continue;
else if(ch=='x') break;
PCM_AUTO_set(setting);//ext16.9344, msb after high, 16fs*n
}
PCM_SetPort(g_oPCMState.PCMPort);
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCMInOut(1, 1);//dma
}
break;
case 2:
printf("recording playing PCLK clock msb after sync test\n");
getchar();
_size = sizeof(sPCMtestInfo_MSB2)/sizeof(PCM_State);
for(i=0; i<_size ; i++)
{
{
PCM_State setting;
int ch;
setting=sPCMtestInfo_MSB2[i];
setting.PCMPort=g_oPCMState.PCMPort;
setting.CodecID=PCM_CODEC_NAME;
setting.PCMMSBPosition = AFTER_PCMSYNC_HIGH;
PCM_Display(setting);
printf("do you want to skip a test? [s] for skip [x] for exit");
ch=getchar();
if(ch=='s')continue;
else if(ch=='x') break;
PCM_AUTO_set(setting);//pclk, msb after high, 16fs*n
}
PCM_SetPort(g_oPCMState.PCMPort);
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCMInOut(1, 1);//dma
}
break;
default:
printf("recording playing External clock msb after sync test\n");
if(g_oPCMState.PCMPort ==0) printf("connect external clock(32.768MHz) to pcm0 external port after codec init, detach before deinit\n" );
else printf("connect external clock(32.768MHz) to TP57\n" );
getchar();
_size = sizeof(sPCMtestInfo_Def1)/sizeof(PCM_State);
for(i=0; i<_size ; i++)
{
{
PCM_State setting;
int ch;
setting=sPCMtestInfo_Def1[i];
setting.PCMPort=g_oPCMState.PCMPort;
setting.CodecID=PCM_CODEC_NAME;
setting.PCMClkSrc = PCM_PCMCDCLK;
setting.EXTCDCLKFreq = EXT_CLOCK_FREQ_A_32_768;
setting.PCMMSBPosition = AFTER_PCMSYNC_HIGH;
PCM_Display(setting);
printf("do you want to skip a test? [s] for skip [x] for exit");
ch=getchar();
if(ch=='s')continue;
else if(ch=='x') break;
PCM_AUTO_set(setting);//ext 32.768, msb after high, 16fs*n
}
PCM_SetPort(g_oPCMState.PCMPort);
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCMInOut(1, 1);//dma
}
break;
}
}
static bool PCMDMATxEnableTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("playing DMA PCLK clock, DMA tx enable full Test\n");
//init
PCM_DATA_2chpattern_making( &destsizeByte,
(unsigned int)(PCM_REC_BUF), (unsigned int)6,4400, 16);
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMOut(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc);
PCM_SetPort(g_oPCMState.PCMPort);
//play
g_oPCMState.Playmode = PCM_DMA;
PCM_PCMSetting();
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_TX_DMA_EN);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_PCM_ENABLE_TX);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_FIFOENABLE_TX);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_CTL_SERCLK_EN_TX);//ok
if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
static bool PCMDMATxFULLDetailTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("playing DMA PCLK clock, DMA tx detail full Test\n");
//init
PCM_DATA_2chpattern_making( &destsizeByte,
(unsigned int)(PCM_REC_BUF), (unsigned int)6,4400, 16);
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMOut(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc);
PCM_SetPort(g_oPCMState.PCMPort);
//play
g_oPCMState.Playmode = PCM_DMA;
PCM_PCMSetting();
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXALMOSTFULL);// ok.
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXFULL);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXOVERFLOW);//ok
if(bret==FALSE) failcnt++;
// bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_NOTPENDING_TXFULL);
// if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
static bool PCMDMATxEMPTYDetailTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("playing DMA PCLK clock, DMA tx detail empty Test\n");
//init
PCM_DATA_2chpattern_making( &destsizeByte,
(unsigned int)(PCM_REC_BUF), (unsigned int)6,4400, 16);
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMOut(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc);
PCM_SetPort(g_oPCMState.PCMPort);
//play
g_oPCMState.Playmode = PCM_DMA;
PCM_PCMSetting();
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXALMOSTEMPTY);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXEMPTY);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_TXSTARVE);//ok
if(bret==FALSE) failcnt++;
// bret = PCM_PCMOutDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_NOTPENDING_TXEMPTY);
// if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
static bool PCMDMARxEnableTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("recording DMA PCLK clock, DMA Rx disable Test\n");
//init
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMIn(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc); //set external codec
PCM_SetPort(g_oPCMState.PCMPort);
//record
PCM_PCMSetting();
g_oPCMState.Playmode = PCM_DMA;
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_RX_DMA_EN);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_FIFOENABLE_RX);//ok
if(bret==FALSE) failcnt++;
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_PCM_ENABLE_RX);
// if(bret==FALSE) failcnt++;
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_CTL_SERCLK_EN_RX);
// if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
static bool PCMDMARxFULLDetailTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("recording DMA PCLK clock, DMA rx disable Test\n");
//init
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMIn(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc); //set external codec
PCM_SetPort(g_oPCMState.PCMPort);
//record
g_oPCMState.Playmode = PCM_DMA;
PCM_PCMSetting();
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXALMOSTFULL);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXFULL);//ok
if(bret==FALSE) failcnt++;
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXOVERFLOW);//ok
if(bret==FALSE) failcnt++;
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_NOTPENDING_RXFULL);
// if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
static bool PCMDMARxEMPTYDetailTest(void)
{
unsigned int destsizeByte;
PCM_State setting;
bool bret;
int failcnt=0;
printf("recording DMA PCLK clock, DMA rx disable Test\n");
//init
setting=sPCMtestInfo_Def1[0];
setting.PCMPort=g_oPCMState.PCMPort;
PCM_Display(setting);
PCM_AUTO_set(setting);//pclk, msb during high, 16fs*n
//setting
PCM_SelClkSrc(g_oPCMState.PCMPort, g_oPCMState.PCMClkSrc, 1);
PCM_CodecInitPCMIn(g_oPCMState.PCMSync, g_oPCMState.PCMMSBPosition, g_oPCMState.PCMSClk, g_oPCMState.PCMClkSrc); //set external codec
PCM_SetPort(g_oPCMState.PCMPort);
//record
g_oPCMState.Playmode = PCM_DMA;
PCM_PCMSetting();
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXALMOSTEMPTY);//ok
// if(bret==FALSE) failcnt++;
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXEMPTY);//ok
// if(bret==FALSE) failcnt++;
bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_RXSTARVE);
if(bret==FALSE) failcnt++;
// bret = PCM_PCMInDMA(PCM_REC_BUF, (g_oPCMState.PCMSync*2*20) , PCM_Detail_PCM_IRQ_NOTPENDING_RXEMPTY);
// if(bret==FALSE) failcnt++;
//... fill more.
//exit
PCM_CodecExitPCMOut();
printf("############## Fail count %d ##############\n", failcnt );
if( failcnt != 0 ) return FALSE;
else return TRUE;
}
/////////////////////////////////////////////////////////////////////
// detail test functions
//
//
//
//////////////////////////////////////////////////
// TX
//verify : pcm_tx_dma_en : 0 -disable
//specify how it work : DMA reqeust will not be occur at when fifo is not 'almost full.( >(32-8) , bigger than >= 25)
// when fifo cnt is <=24 , request will not be occur.
//test scenario : in the middle of dma playing set PCM_TX_DMA_EN to 0
bool PCM_Detail_PCM_TX_DMA_EN()
{
int i, j;
int tc1, tc2;
int failnum=0;
int testreg;
unsigned int *rPCM_CTL=(g_oPCMState.PCMPort==0)?(unsigned int *)&rPCM_CTL0:(unsigned int *)&rPCM_CTL1;
unsigned int *rPCM_CLKCTL=(g_oPCMState.PCMPort==0)?(unsigned int *)&rPCM_CLKCTL0:(unsigned int *)&rPCM_CLKCTL1;
unsigned int *rPCM_TXFIFO=(g_oPCMState.PCMPort==0)?(unsigned int *)&rPCM_TXFIFO0:(unsigned int *)&rPCM_TXFIFO1;
PCM_DisableInt();//interrupt will not be occur.
*rPCM_CLKCTL&= ~(PCM_SCLK_EN);
*rPCM_CTL&= ~(PCM_PCM_ENABLE);//pause
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -