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