iis_dual.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:15k
源码类别:

uCOS

开发平台:

C/C++

  1. /*************************************************
  2.   NAME: iis_dual.c
  3.   DESC: S3C2440 IIS (UDA1341) simultaneous record & play test 
  4.   HISTORY:
  5.   OCT.17.2002:purnnamu: first release
  6.   NOV.05.2002:purnnamu: Rec start/stop randomly.
  7.   APR.01.2003:ky.shim: minor modification.
  8.  *************************************************/
  9. #include <math.h>
  10. #include <stdlib.h>
  11.  
  12. #include "2440addr.h"
  13. #include "2440lib.h"
  14. #include "def.h"
  15. #include "iis.h"
  16. //declarations of some functions in 2440iis.c
  17. void IIS_PortSetting(void);
  18. void _WrL3Addr(U8 data);
  19. void _WrL3Data(U8 data,int halt);
  20. void Init1341RecPlay(void);
  21. void AudioInit(void);
  22. void AudioBufCopy(void);
  23. void AudioInStart(void);
  24. void AudioInStop(void);
  25. void AudioOutStart(void);
  26. void AudioOutStop(void);
  27. void AudioOutRandom(void);
  28. void __irq IsrAudioIn(void);
  29. void __irq IsrAudioOut(void);
  30. void __irq IsrAudioMute(void);
  31. void InterruptLatencyStart(void);
  32. void InterruptLatencyStop(void);
  33. void __irq IsrTimer0_InterruptLatency(void);
  34. #define MAX_INDEX_AUDIO_BUF (200)    
  35. #define AUDIO_BUF_SIZE (1000)  //500 stereo samples
  36. U16 (*playBuf)[AUDIO_BUF_SIZE];
  37. U16 (*recBuf) [AUDIO_BUF_SIZE];
  38. volatile int indexPlayBuf,indexRecBuf;
  39. volatile int stopPlay,stopRec;
  40. volatile int audioOutActive,audioInActive;
  41. //------------------------------------------------------------------------------
  42. //      SMDK2440 IIS Configuration
  43. // GPB4 = L3CLOCK, GPB3 = L3DATA, GPB2 = L3MODE
  44. // GPE4 = I2SSDO,  GPE3 = I2SSDI, GPE2 = CDCLK, GPE1 = I2SSCLK, GPE0 = I2SLRCK  
  45. //------------------------------------------------------------------------------
  46. //**************************************************
  47. //                     IIS test
  48. //**************************************************
  49. void Test_IisRecPlay(void)
  50. {
  51.     int i;
  52.     int ranPlay=FALSE;
  53.     char key;
  54.     
  55. #if ADS10==TRUE
  56. srand(0);
  57. #endif
  58.     Uart_Printf("[ IIS (Master Mode,Rec&Play) Test(UDA1341) ]n");
  59.     Uart_TxEmpty(1);
  60. ChangeClockDivider(14,12); // 1:4:8    
  61. ChangeMPllValue(233,6,0); // 361.2672MHz
  62. Uart_Init(45158400,115200);    
  63.         
  64.     IIS_PortSetting();
  65.     Init1341RecPlay();
  66.     
  67.     playBuf=(U16 (*)[AUDIO_BUF_SIZE])0x31000000;
  68.     recBuf=(U16 (*)[AUDIO_BUF_SIZE])(0x31000000+sizeof(U16)*AUDIO_BUF_SIZE*MAX_INDEX_AUDIO_BUF);
  69.     
  70.     indexPlayBuf=indexRecBuf=0;
  71.     audioOutActive=audioInActive=FALSE;
  72.     stopPlay=stopRec=FALSE;
  73.     
  74.     //for(i=0x31000000;i<0x31100000;i+=4)*((U32 *)i)=0;
  75.     
  76.     AudioInit();
  77.     pISR_DMA1  = (U32)IsrAudioIn;
  78.     pISR_DMA2  = (U32)IsrAudioOut;
  79.     pISR_EINT0 = (U32)IsrAudioMute;
  80.     
  81.     
  82.     rSRCPND    = (BIT_EINT0 | BIT_DMA1 | BIT_DMA2);
  83.     rINTPND    = rINTPND;
  84.     rINTMSK    = ~(BIT_EINT0 | BIT_DMA1 | BIT_DMA2);   
  85.     
  86.     Uart_Printf("If you want to mute or no mute push the 'EIN0' key repeatedlyn");
  87.     Uart_Printf("Sampling Frequency = %d Hzn",44100);
  88.     
  89.     while(1)
  90.     {
  91.      Uart_Printf("n[Select Menu] (Rec Play Begin End Toggle Random)n"
  92.                  "1:R_B 2:R_E 3:PR_T 4:P_B 5:P_E 6:Copy:R->P 7:IL_B 8:IL_E 9:Exitn");
  93.                  
  94.      while((key=Uart_GetKey())==0)
  95.      {
  96.          if(ranPlay==TRUE)
  97.           AudioOutRandom();
  98.      }
  99.      switch(key)
  100.      {
  101.      case '1':
  102.          AudioInStart();
  103.          break;
  104.      case '2':
  105.          AudioInStop();
  106.          break;
  107.      case '3':
  108. /*
  109.          if(ranPlay==FALSE)
  110.          {
  111.           ranPlay=TRUE;
  112.           Uart_Printf("Random Play Stop/Start begins.n");
  113.          }
  114.          else
  115.          {
  116.           ranPlay=FALSE;
  117.           Uart_Printf("Random Play Stop/Start ends.n");
  118.          }
  119. */
  120.     break;
  121.      case '4':
  122.          AudioOutStart();
  123.          break;
  124.      case '5':
  125.          AudioOutStop();
  126.          break;
  127.      case '6':
  128.          AudioBufCopy();
  129.             break;
  130.         case '7':
  131.             InterruptLatencyStart();
  132.     break;
  133.         case '8':
  134.             InterruptLatencyStop();
  135.         break;
  136.      case '9':
  137.          return;
  138.      default:
  139.          break;    
  140.      }
  141.     }
  142. ChangeClockDivider(14,12); // 1:2:4    
  143. ChangeMPllValue(92,1,0); // 400MHz
  144. Uart_Init(FCLK/8,115200); 
  145. }
  146. void AudioBufCopy(void)
  147. {
  148.     int i,j;
  149.     Uart_Printf("[Audio Buffer Copy recBuf -> playBuf]n");    
  150.     
  151.     if(audioInActive==TRUE)
  152.     {
  153.      Uart_Printf("Rec is ongoing. Please Stop Recording.n");
  154.      return;
  155.     }
  156.     
  157.     for(i=0;i<MAX_INDEX_AUDIO_BUF;i++)
  158.         for(j=0;j<AUDIO_BUF_SIZE;j++)
  159.             playBuf[i][j]=recBuf[i][j];
  160. }
  161. void InterruptLatencyStart(void)
  162. {
  163.     Uart_Printf("[Random Interrupt Latency Start]n");
  164.     pISR_TIMER0 = (U32)IsrTimer0_InterruptLatency;  //to make a worst condition
  165.     rTCFG0=(3<<0);  //Timer0&1Prescaler=(3+1)
  166.     rTCFG1=(3<<0);  //Timer0=PCLK/4/16
  167.     rTCNTB0=1;
  168.     rTCON=(1<<1); //T0ManualUpdate
  169.     rTCON=(1<<0); //T0Start
  170.     
  171.     rINTMSK&=~(BIT_TIMER0);
  172. }
  173. void InterruptLatencyStop(void)
  174. {
  175.     rINTMSK|=BIT_TIMER0;
  176.      
  177.     Uart_Printf("[Random Interrupt Latency Stop]n");
  178. }
  179. void AudioInit(void)
  180. {
  181.     //DMA1 for AudioIn
  182.     rDMASKTRIG1 = (1<<2);   //Dma1Stop
  183.     //DMA2 for AudioOut
  184.     rDMASKTRIG2 = (1<<2); //Dma2Stop 
  185.     //IIS
  186.     rIISCON=(1<<5)|(1<<4)|(1<<1);
  187.         //TxDMAReqEn,RxDMAReqEn,IISPrescalerEn    
  188.     rIISMOD=(0<<8)|(3<<6)|(0<<4)|(1<<3)|(0<<2)|(1<<0);
  189.         //Master,Tx&Rx,IisFormat,16bit,256fs,32fs
  190.     rIISPSR=(3<<5)|(3<<0);   
  191.      //PreScalerA=45Mhz/4,PreScalerB=45Mhz/4
  192.     rIISFCON=(1<<15)|(1<<14)|(1<<13)|(0<<12);
  193.      //TxFifo=DMA,RxFifo=DMA,TxFifoEn,RxFifoDis
  194.     rIISCON|=(1<<0);
  195.         //IIS Enable;
  196.         //IIS will not start because DMA is not ready.
  197. }
  198. //**************************************************
  199. //                     AudioOut
  200. //**************************************************
  201. void AudioOutStart(void)
  202. {
  203.     if(audioOutActive!=FALSE)
  204.     {
  205.      Uart_Printf("[N/A]");
  206.      return;
  207.     }
  208.     
  209.     Uart_Printf("[AudioOut Start]n");    
  210.     stopPlay=FALSE;
  211.     audioOutActive=TRUE;
  212.     indexPlayBuf=0;
  213.     
  214.     //Init DMA Ch 2
  215.     rDISRC2 = (U32)(playBuf[indexPlayBuf++]);
  216.     
  217.     rDISRCC2 = (0<<1)|(0<<0); //Src=AHB,Increment
  218.     rDIDST2 = (U32)IISFIFO;  // Tx FIFO address
  219.     rDIDSTC2 = (1<<1)|(1<<0); //Dst=APB,Fixed;
  220.     rDCON2 = (1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(1<<20)|(AUDIO_BUF_SIZE);
  221.         //handshake,Sync=APB,IntEn,unit,single,dst=I2SSDO,HwReqMode,NoAutoReload,Halfword,
  222.     rDMASKTRIG2 = (1<<1);  //DMA2En
  223.  
  224.     //IIS will start to work.
  225. }
  226. #define DMA_OFF_TIMEOUT (1000)
  227. void AudioOutStop(void)
  228. {
  229.     Uart_Printf("n[AudioOut Stop]n");    
  230.     stopPlay=TRUE;
  231. }
  232. void AudioOutRandom(void)
  233. {
  234.     static state=0, cnt=0;
  235. #if ADS10==TRUE
  236.     if( (rand()/(RAND_MAX/2000000)) < 1 )
  237. #else
  238.     if(cnt++%2)
  239. #endif
  240.     {
  241.     switch(state++)
  242.     {
  243.     case 0:
  244.         AudioOutStart();
  245.         state=1;
  246.         break;
  247.     case 1:
  248.         state=2;
  249.         break;
  250.     case 2:
  251.         AudioOutStop();
  252.         state=0;
  253.         break;
  254.     default:
  255.     break;
  256. }
  257.     } 
  258. }
  259. void __irq IsrAudioOut(void)  //DMA2 done interrupt
  260. {
  261.     int timeOut=0;
  262.     
  263.     //NMI doesn't using auto-reload.
  264.     ClearPending(BIT_DMA2);
  265.     if(stopPlay==TRUE)
  266.     {     
  267.     #if 1
  268.      rDMASKTRIG2|= (1<<2);  //NMI 
  269.     #else 
  270.      rDMASKTRIG2= (1<<2);   //StopDMA2  //recommended
  271.     #endif
  272.      while (rDMASKTRIG2&(1<<1) && (timeOut++ < DMA_OFF_TIMEOUT));
  273.      if(timeOut >= DMA_OFF_TIMEOUT)
  274.            Uart_Printf("ERROR: DMA2 Stop timed outn");
  275. rDMASKTRIG2 &= ~(1<<2); //not needed.... remove!!!
  276. audioOutActive=FALSE;
  277. Uart_Printf("<PE>");
  278.     }  
  279.     else
  280.     {
  281. rDISRC2 = (U32)(playBuf[indexPlayBuf++]);
  282.      if(indexPlayBuf==MAX_INDEX_AUDIO_BUF)
  283.      {
  284.          indexPlayBuf=0;
  285.       }
  286.      rDMASKTRIG2 |= (1<<1);   //enable DMA2  
  287.  
  288.       if((indexPlayBuf%10)==0)
  289.      {
  290.          if(indexPlayBuf==0)WrUTXH0(';');
  291.          else WrUTXH0(',');
  292.      }
  293.      }
  294. }
  295. //**************************************************
  296. //                     AudioIn
  297. //**************************************************
  298. void AudioInStart(void)
  299. {
  300.     if(audioInActive!=FALSE)
  301.     {
  302.      Uart_Printf("[N/A]");
  303.      return;
  304.     }
  305.         
  306.     Uart_Printf("[AudioIn Start]n");    
  307.     stopRec=FALSE;
  308.     audioInActive=TRUE;
  309.     indexRecBuf=0;    
  310.     
  311.     //Init DMA Ch 1
  312.     rDISRC1 = (U32)IISFIFO;  // Rx FIFO address
  313.     rDISRCC1 = (1<<1)|(1<<0); //Src=APB,Fixed;
  314.     rDIDST1 = (U32)(recBuf[indexRecBuf++]);
  315.     rDIDSTC1 = (0<<1)|(0<<0); //DSt=AHB,Increment
  316.     rDCON1 = (1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(2<<24)|(1<<23)|(0<<22)|(1<<20)|(AUDIO_BUF_SIZE);
  317.         //handshake,Sync=APB,IntEn,unit,single,dst=I2SSDI,HwReqMode,AutoReload,Halfword,
  318.     rDMASKTRIG1 = (1<<1); //DMA1En
  319.   
  320.     rIISFCON|=(1<<12);  //RxFifoEn
  321.     rIISCON|=(1<<4);    //RxDmaServiceRequestEn
  322.     
  323.     while((rDSTAT1&0xFFFFF) == 0);   
  324.     
  325.     rDIDST1 = (U32)(recBuf[indexRecBuf++]);
  326.     
  327.     //IIS will start to work.
  328. }
  329. void AudioInStop(void)
  330. {
  331.     Uart_Printf("n[AudioIn Stop]n");    
  332.     stopRec=TRUE;
  333. }
  334. void __irq IsrAudioIn(void) //DMA1 done interrupt
  335. {
  336.     int timeOut=0;
  337.     
  338.     ClearPending(BIT_DMA1);                 //Clear pending bit
  339.     while((rDSTAT1 & 0xFFFFF) == 0);  //wait until the current autoreload is completed
  340.     if(stopRec==TRUE)
  341.     {
  342.      rIISCON&=~(1<<4);    //RxDmaServiceRequestDis
  343.         rIISFCON&=~(1<<12);   //RxFifoDis
  344.     #if 1
  345.      rDMASKTRIG1|= (1<<2);  //NMI
  346.     #else 
  347.      rDMASKTRIG1= (1<<2);   //recommended
  348.     #endif
  349.      while (rDMASKTRIG1&(1<<1) && (timeOut++ < DMA_OFF_TIMEOUT));
  350.     
  351.      if(timeOut >= DMA_OFF_TIMEOUT)
  352.            Uart_Printf("ERROR: DMA1 Stop timed outn");
  353.      rDMASKTRIG1 &= ~(1<<2); //not needed.... remove!!!
  354.      audioInActive=FALSE;
  355.      Uart_Printf("[RE]");
  356.     }
  357.     else
  358.     {
  359.      rDIDST1 = (U32)(recBuf[indexRecBuf++]);
  360.      if(indexRecBuf==MAX_INDEX_AUDIO_BUF)
  361.      {
  362.          indexRecBuf=0;
  363.      }
  364.      if((indexRecBuf%10)==0)
  365.      {
  366.          if(indexRecBuf==0)WrUTXH0(':');
  367.          else WrUTXH0('.');
  368.      }
  369.     }
  370.     
  371. }
  372. void __irq IsrAudioMute(void)
  373. {
  374.     static int mute=0;
  375.     
  376.     ClearPending(BIT_EINT0);
  377.     if(mute)    //Mute
  378.     {
  379.         _WrL3Addr(0x14 + 0);            //DATA0 (000101xx+00)
  380.         _WrL3Data(0xa4,0);              //10,1,00,1,00 : after, no de-emp, mute, flat 
  381.         mute = 0;
  382.         Uart_Printf("n[Mute]n");
  383.     }
  384.     else        //No mute
  385.     {
  386.         _WrL3Addr(0x14 + 0);            //DATA0 (000101xx+00)
  387.         _WrL3Data(0xa0,0);              //10,1,00,0,00 : after, no de-emp, no mute, flat 
  388.         mute = 1;
  389.         Uart_Printf("n[No Mute]n");
  390.     }
  391. }
  392. //The following ISR makes an interrupt latency random time for audioIn and audioOut
  393. void __irq IsrTimer0_InterruptLatency(void)
  394. {
  395.     static U16 count=0;
  396.     ClearPending(BIT_TIMER0);
  397.     count++;
  398.     if(count==0x0)count=1;
  399.     Delay(count&0x7f);
  400.     Led_Display(count);
  401.     rTCNTB0=count;
  402.     rTCON=(1<<1); //T0ManualUpdate
  403.     rTCON=(1<<0);  //T0Start  
  404.     
  405. }
  406. //**************************************************
  407. //                     UDA1341
  408. //**************************************************
  409. #define L3C (1<<4)            //GPB4 = L3CLOCK
  410. #define L3D (1<<3)            //GPB3 = L3DATA
  411. #define L3M (1<<2)            //GPB2 = L3MODE
  412. void Init1341RecPlay(void)
  413. {
  414.     //Port Initialize
  415.     //----------------------------------------------------------
  416.     //   PORT B GROUP
  417.     //Ports  :   GPB4    GPB3   GPB2  
  418.     //Signal :  L3CLOCK L3DATA L3MODE
  419.     //Setting:   OUTPUT OUTPUT OUTPUT 
  420.     //           [9:8]   [7:6}  [5:4]
  421.     //Binary :     01  ,   01    01 
  422.     //----------------------------------------------------------    
  423.     rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //Start condition : L3M=H, L3C=H
  424.     rGPBUP  = rGPBUP  & ~(0x7<<2) |(0x7<<2);       //The pull up function is disabled GPB[4:2] 1 1100    
  425.     rGPBCON = rGPBCON & ~(0x3f<<4) |(0x15<<4);     //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
  426.     //L3 Interface
  427.     _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
  428.     _WrL3Data(0x60,0);       //0,1,10,000,0 : Reset,256fs,no DCfilter,iis
  429.     _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
  430.     _WrL3Data(0x20,0);       //0,0,10,000,0 : No reset,256fs,no DCfilter,iis
  431.     
  432. /*    
  433.     //play
  434.     _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
  435.     _WrL3Data(0x81,0);       //1,0,0,0,0,0,01 : OGS=0,IGS=0,ADC_NI,DAC_NI,sngl speed,AoffDon
  436.         
  437.     //record
  438.     if(mode)
  439.     {
  440.         _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
  441.         _WrL3Data(0xa2,0);       //1,0,1,0,0,0,10 : OGS=0,IGS=1,ADC_NI,DAC_NI,sngl speed,AonDoff
  442.         _WrL3Addr(0x14 + 0);     //DATA0 (000101xx+00)
  443.         _WrL3Data(0xc2,0);       //11000,010  : DATA0, Extended addr(010) 
  444.         _WrL3Data(0x4d,0);       //010,011,01 : DATA0, MS=9dB, Ch1=on Ch2=off, 
  445.     }
  446. */
  447.     _WrL3Addr(0x14 + 2);     //STATUS (000101xx+10)
  448.     _WrL3Data(0xa3,0);       //1,0,1,0,0,0,11 : OGS=0,IGS=1,ADC_NI,DAC_NI,sngl speed,AonDon
  449.     _WrL3Addr(0x14 + 0);     //DATA0 (000101xx+00)
  450.     _WrL3Data(0xc2,0);       //11000,010  : DATA0, Extended addr(010) 
  451.     _WrL3Data(0x4d,0);       //010,011,01 : DATA0, MS=9dB, Ch1=on Ch2=off, 
  452. }
  453. void IIS_PortSetting(void)
  454. {
  455. //----------------------------------------------------------
  456. //   PORT B GROUP
  457. //Ports  :   GPB4    GPB3   GPB2  
  458. //Signal :  L3CLOCK L3DATA L3MODE
  459. //Setting:   OUTPUT OUTPUT OUTPUT 
  460. //      [9:8]   [7:6}  [5:4]
  461. //Binary :     01  ,   01    01 
  462. //----------------------------------------------------------    
  463.      rGPBUP  = rGPBUP  & ~(0x7<<2) | (0x7<<2);   //The pull up function is disabled GPB[4:2] 1 1100    
  464.      rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
  465. //----------------------------------------------------------
  466. //   PORT E GROUP
  467. //Ports  :  GPE4    GPE3   GPE2  GPE1    GPE0 
  468. //Signal : I2SSDO  I2SSDI CDCLK I2SSCLK I2SLRCK 
  469. //Binary :   10  ,   10     10 ,  10 10    
  470. //----------------------------------------------------------
  471.      rGPEUP  = rGPEUP  & ~(0x1f)  | 0x1f;    //The pull up function is disabled GPE[4:0] 1 1111
  472.      rGPECON = rGPECON & ~(0x3ff) | 0x2aa;   //GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK
  473.      rGPFUP   = ((rGPFUP   & ~(1<<0)) | (1<<0));     //GPF0
  474.      rGPFCON  = ((rGPFCON  & ~(3<<0)) | (1<<1));     //GPF0=EINT0    
  475.      rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0));     //EINT0=falling edge triggered  
  476. }