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

uCOS

开发平台:

C/C++

  1. /*******************************************************************************
  2. File Name: AC97.c
  3. Description: S3C2440A AC97 Controller Function Test Code
  4.     Version: 0.2 
  5.     History:
  6.              0.0: First draft
  7.              0.1: 2003. 12. 22, Following test codes were modified by Yoh-Han Lee           
  8.                    - AC97 PCM Out in DMA mode
  9.                    - AC97 PCM In in DMA mode
  10.              0.2: 2004. 02. 12, Programmed and tested by Yoh-Han Lee
  11.                    - Volume up/down and Mute on/off are available, when codec plays PCM data.
  12.      - AC97 power down mode test is supported.
  13.                    - AC97 reset timing check is added.
  14.                    - Variable ADC/DAC Selection is supported. 
  15.                    - AC97 PCM Out in the interrupt mode is supported. Thanks to Y. M. Lee.
  16.                    - AC97 PCM In using interrupt mode is supported.
  17.                    - AC97 MIC In using interrupt or DMA is added.
  18.                      
  19. ********************************************************************************/
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include "option.h"
  23. #include "2440addr.h"
  24. #include "2440lib.h"
  25. #include "def.h"
  26. #include "ac97.h"
  27. #define AC97_REC_LEN 0xfffff*4
  28. #define DOWN_BUF _NONCACHE_STARTADDRESS
  29. #define PCM_OUT_TRIGGER 8
  30. #define PCM_IN_TRIGGER 8
  31. #define AC97_PCM_OUT_THRESHOLD (1<<18)
  32. #define AC97_PCM_IN_THRESHOLD (1<<17)
  33. #define AC97_MIC_IN_THRESHOLD (1<<16)
  34. U32 save_AC97_rGPECON, save_AC97_rGPEDAT, save_AC97_rGPEUP;
  35. U32 AC97_size, AC97_fs;
  36. U32 Output_Volume,Input_Volume;
  37. U32 *Rec_AC97_BUF, *Play_AC97_BUF, *End_AC97_BUF;
  38. static int delayLoopCount;
  39. S16 PCM_Out_INT_Exit = 0;
  40. S16 PCM_In_INT_Exit =0;
  41. U8 *AC97_BUF,*AC97_temp;
  42. U8 Up_Down_Volume;
  43. char AC97_Rec_Done = 0;
  44. char Codec_Ready_Irq;
  45. char AC97_mute = 1;
  46. char Codec_Ready = 1;
  47. void AC97_Port_Init(void);
  48. void AC97_Port_Return(void);
  49. void AC97_Init(void);
  50. void Download_PCM_File(void);
  51. void AC97_CodecInit_PCMOut(U16 AC97_fs);
  52. void AC97_CodecInit_PCMIn(U16 AC97_fs);
  53. void AC97_CodecInit_MICIn(U16 AC97_fs);
  54. void AC97_CodecInit_PD(void);
  55. void AC97_CodecExit_PCMOut(void);
  56. void AC97_CodecExit_PCMIn(U16 DACs_off);
  57. void AC97_CodecExit_MICIn(U16 DACs_off);
  58. void AC97_PCMout_DMA1(U32 PCM_Size);
  59. void AC97_PCMout_INT(U32 PCM_Size);
  60. void AC97_PCMin_DMA2(U32 PCM_Size);
  61. void AC97_PCMin_INT(U32 PCM_Size);
  62. void AC97_MICin_DMA3(U32 MIC_Size);
  63. void AC97_MICin_INT(U32 PCM_Size);
  64. void Delay_Init(void);
  65. void PCM_In_Volume( U8 Up_Down_Volume);
  66. void PCM_Out_Volume( U8 Up_Down_Volume);
  67. void AC97_Controller_State(void);
  68. void Delay_After_CommandWrite(int time);
  69. U16 AC97_Select_SamplingRate(void);
  70. U16 AC97_Codec_Cmd(U8 CMD_Read, U8 CMD_Offset, U16 CMD_Data);
  71. static void __irq DMA1_Play_Done(void);
  72. static void __irq DMA2_Rec_Done(void);
  73. static void __irq DMA3_Rec_Done(void);
  74. static void __irq RxInt(void);
  75. static void __irq Muting(void);
  76. void __irq AC97_Codec_Ready(void);
  77. void __irq Irq_AC97_PCMout(void);
  78. void __irq Irq_AC97_PCMin(void);
  79. void __irq Irq_AC97_MICin(void);
  80. void * func_ac97_test[][2]=
  81. {
  82. //AC97 Function Test Item
  83.      (void *)PCMout_Test_AC97,    "Play Wave File    ",
  84.      (void *)PCMin_Test_AC97,      "Record Sound via LineIn and Play it  ",   
  85.      (void *)MICin_Test_AC97,       "Record Voice via MIC and Play it      ", 
  86.        (void *)Powerdown_Test_AC97,     "AC97 Power Down   ",      
  87.        (void *)Reset_Test_AC97,       "AC97 Reset Timing Check ",
  88. 0,0
  89. };
  90. void AC97_Test(void)
  91. {
  92. int i;
  93. AC97_Port_Init();
  94. while(1)
  95. {
  96. i=0;
  97. Uart_Printf("nn==================== AC97 Function Test ====================nn");
  98. while(1)
  99. {   //display menu
  100. Uart_Printf("%2d:%s",i,func_ac97_test[i][1]);
  101. i++;
  102. if((int)(func_ac97_test[i][0])==0)
  103. {
  104. Uart_Printf("n");
  105. break;
  106. }
  107. if((i%2)==0)
  108. Uart_Printf("n");
  109. }
  110. Uart_Printf("n============================================================");
  111. Uart_Printf("nSelect #Item or Press enter key to exit:");
  112. i = Uart_GetIntNum();
  113. if(i==-1) break; // return.
  114. if(i>=0 && (i<((sizeof(func_ac97_test)-1)/8)) ) // select and execute...
  115. ( (void (*)(void)) (func_ac97_test[i][0]) )();
  116. }
  117.  rAC_GLBCTRL = 0;
  118. }
  119. void PCMout_Test_AC97(void)
  120. {
  121.      int i;
  122.      //U8 Char;
  123. AC97_Port_Init();
  124. Delay(1000);
  125.        //Uart_Printf("Download PCM Wave File? (y/n)");
  126.        //Char=Uart_Getch();
  127.    
  128.        //if( (Char == 'y') | (Char == 'Y') ) 
  129.        Download_PCM_File();
  130.    
  131.        AC97_Init();
  132. if(Codec_Ready)
  133. {
  134.         Uart_Printf("nSelect PCM Out Operation Moden");
  135. Uart_Printf("0: Interrupt, 1: DMAn");
  136. i = Uart_GetIntNum();
  137. AC97_CodecInit_PCMOut(AC97_fs);
  138.            
  139.         switch(i)
  140.         {
  141.     case 0:
  142. AC97_PCMout_INT(AC97_size);
  143.     break;
  144.    
  145.     case 1:
  146.     AC97_PCMout_DMA1(AC97_size);
  147.     break;
  148.    
  149.     default:
  150.     AC97_PCMout_DMA1(AC97_size);
  151.     break;
  152.         }      
  153.        
  154.       AC97_CodecExit_PCMOut();
  155. }
  156.        AC97_mute = 1;
  157.        Codec_Ready =1;
  158.        PCM_Out_INT_Exit = 0;
  159.        
  160.        AC97_Port_Return();
  161. }
  162. void PCMin_Test_AC97(void)
  163. {
  164. int i;
  165. U32 Sampling_Rate;
  166.        AC97_Rec_Done = 0;
  167.       
  168.        AC97_Port_Init();
  169.    
  170.        Sampling_Rate = AC97_Select_SamplingRate();
  171.           
  172.       AC97_Init();
  173.        if(Codec_Ready)
  174. {
  175. Uart_Printf("nSelect PCM In/Out Operation Moden");
  176. Uart_Printf("0: Interrupt, 1: DMAn");
  177. i = Uart_GetIntNum();
  178.         AC97_CodecInit_PCMIn(Sampling_Rate);
  179. switch(i)
  180.         {
  181.     case 0:
  182.         AC97_PCMin_INT(AC97_REC_LEN);
  183. //Play Recorded Data
  184.      AC97_CodecInit_PCMOut(Sampling_Rate);
  185. AC97_PCMout_INT(AC97_REC_LEN);
  186.         break;
  187. case 1:
  188.           AC97_PCMin_DMA2(AC97_REC_LEN);
  189.           //Play Recorded Data
  190.      AC97_CodecInit_PCMOut(Sampling_Rate);
  191.     AC97_PCMout_DMA1(AC97_REC_LEN);
  192.     break;
  193.   
  194. default:
  195. AC97_PCMin_DMA2(AC97_REC_LEN);
  196.          
  197.      //Play Recorded Data
  198.      AC97_CodecInit_PCMOut(Sampling_Rate);
  199.     AC97_PCMout_DMA1(AC97_REC_LEN);
  200.     break;
  201. }
  202. AC97_CodecExit_PCMIn(1);
  203.        }
  204.     Codec_Ready =1;
  205.        AC97_mute = 1;
  206.        PCM_Out_INT_Exit = 0;
  207.        PCM_In_INT_Exit = 0;
  208.     AC97_Port_Return();
  209. }
  210. void MICin_Test_AC97(void)
  211. {
  212. U16 i, Sampling_Rate;
  213. AC97_Rec_Done = 0;
  214. AC97_Port_Init();
  215.        Delay(1000);
  216.        Sampling_Rate = AC97_Select_SamplingRate();
  217.        
  218. AC97_Init();
  219. if(Codec_Ready)
  220. {
  221. Uart_Printf("nSelect MIC In Operation Moden");
  222. Uart_Printf("0: Interrupt, 1: DMAn");
  223. i = Uart_GetIntNum();
  224.         AC97_CodecInit_MICIn(Sampling_Rate);
  225. switch(i)
  226.         {
  227. case 0:
  228. AC97_MICin_INT(AC97_REC_LEN/2);
  229. //Play Recorded Data
  230.      AC97_CodecInit_PCMOut(Sampling_Rate);
  231.     AC97_PCMout_DMA1(AC97_REC_LEN/2);
  232. break;
  233. case 1:
  234. AC97_MICin_DMA3(AC97_REC_LEN/2);
  235.           //Play Recorded Data
  236.      AC97_CodecInit_PCMOut(Sampling_Rate);
  237.     AC97_PCMout_DMA1(AC97_REC_LEN/2);
  238. break;
  239. default:
  240. AC97_MICin_DMA3(AC97_REC_LEN/2);
  241.           //Play Recorded Data
  242.      AC97_CodecInit_PCMOut(Sampling_Rate);
  243.     AC97_PCMout_DMA1(AC97_REC_LEN/2);
  244. break;
  245.   }
  246.    AC97_CodecExit_MICIn(1);
  247. }
  248. Codec_Ready =1;
  249. AC97_mute = 1;
  250.        PCM_In_INT_Exit = 0;
  251. AC97_Port_Return();
  252. }
  253. void Powerdown_Test_AC97(void)
  254. {
  255. int i;
  256. AC97_Port_Init();
  257. Delay(1000);
  258. AC97_Init();
  259. if(Codec_Ready)
  260. {
  261.    AC97_CodecInit_PD();
  262.  
  263.   //Normal
  264.   Uart_Printf("nNormaln");
  265.   AC97_Controller_State();
  266.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  267.  
  268.   //ADCs off
  269.   Uart_Printf("n=>ADCs off PR0n");
  270.   AC97_Codec_Cmd(0,0x26,(1<<8));
  271.   AC97_Controller_State();
  272.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  273.  
  274.   //DACs off
  275.   Uart_Printf("n=>DACs off PR1n");
  276.   AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
  277.   AC97_Controller_State();
  278.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  279.  
  280.   //Analog off
  281.   Uart_Printf("n=>Analog off PR2n");
  282.   AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
  283.   AC97_Controller_State();
  284.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  285.  
  286.   //Digital I/F off
  287.   Uart_Printf("n=>Digital I/F off PR4n");
  288.   AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  289.   AC97_Controller_State();
  290.   //Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  291.  
  292.   //Shut off AC-Link
  293.   Uart_Printf("n=>Shut off AC-Linkn");
  294.   rAC_GLBCTRL &= ~(1<<2);
  295.   AC97_Controller_State();
  296.   //Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  297.     
  298.   while(1)
  299.   {
  300.   Uart_Printf("nPress enter key for Warm Reset");
  301.   i = Uart_GetIntNum();
  302.   if(i==-1) break;
  303.   }
  304.  
  305.   //Warm Reset
  306.   Uart_Printf("n=>Warm Resetn");
  307.   rAC_GLBCTRL = (1<<1);
  308.   AC97_Controller_State();
  309.   rAC_GLBCTRL &= ~(1<<1);
  310.  
  311.   rAC_GLBCTRL |= (1<<2);
  312.   AC97_Controller_State();
  313.   rAC_GLBCTRL |= (1<<3);
  314.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  315.  
  316.   //Cold Reset
  317.   Uart_Printf("n=>Cold Resetn");
  318.   rAC_GLBCTRL |= (1<<0);
  319.   AC97_Controller_State();
  320.   rAC_GLBCTRL &= ~(1<<0);
  321.  
  322.   rAC_GLBCTRL |= (1<<2);
  323.   AC97_Controller_State();
  324.   rAC_GLBCTRL |= (1<<3);
  325.   AC97_Controller_State();
  326.   Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  327. }
  328. Codec_Ready =1;
  329. AC97_Port_Return();
  330. }
  331. void Reset_Test_AC97(void)
  332. {
  333. int i;
  334. AC97_Port_Init();
  335. Delay(1000);
  336. AC97_Init();
  337. if(Codec_Ready)
  338. {
  339.   AC97_CodecInit_PD();
  340. //Normal
  341. Uart_Printf("nNormaln");
  342. AC97_Controller_State();
  343. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  344. //ADCs off
  345. Uart_Printf("n=>ADCs off PR0n");
  346. AC97_Codec_Cmd(0,0x26,(1<<8));
  347. AC97_Controller_State();
  348. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  349. //DACs off
  350. Uart_Printf("n=>DACs off PR1n");
  351. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
  352. AC97_Controller_State();
  353. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  354. //Analog off
  355. Uart_Printf("n=>Analog off PR2n");
  356. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
  357. AC97_Controller_State();
  358. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  359. //Digital I/F off
  360. Uart_Printf("n=>Digital I/F off PR4n");
  361. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  362. AC97_Controller_State();
  363. //Shut off AC-Link
  364. Uart_Printf("n=>Shut off AC-Linkn");
  365. rAC_GLBCTRL &= ~(1<<2);
  366. //AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  367. AC97_Controller_State();
  368. //Warm Reset Timing Check
  369. Uart_Printf("nWarm Reset Timing Check...");
  370. Uart_Printf("n Probe SYNC and BIT_CLK.");
  371. Uart_Printf("n Trigger SYNC Rising Edge.");
  372. while(1)
  373. {
  374. Uart_Printf("nPress enter key for Warm Reset Timing Check...");
  375. i = Uart_GetIntNum();
  376. if(i==-1) break;
  377. }
  378. Uart_Printf("n=>Warm Resetn");
  379. rAC_GLBCTRL = (1<<1);
  380. AC97_Controller_State();
  381. rAC_GLBCTRL &= ~(1<<1);
  382. rAC_GLBCTRL |= (1<<2);
  383. AC97_Controller_State();
  384. rAC_GLBCTRL |= (1<<3);
  385. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat Reg. Value (at 0x26): 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  386. Uart_Printf("nPress any key.n");
  387. Uart_Getch();
  388. //Cold Reset Timing Check
  389. Uart_Printf("nCold Reset Timing Check...");
  390. Uart_Printf("n Probe RESET#, BIT_CLK and SDATA_IN.");
  391. Uart_Printf("n Trigger RESET# Rising Edge.");
  392. while(1)
  393. {
  394. Uart_Printf("nPress enter key for Cold Reset Timing Check...");
  395. i = Uart_GetIntNum();
  396. if(i==-1) break;
  397. }
  398. rAC_GLBCTRL = 0x1;
  399. Delay(1000);
  400. rAC_GLBCTRL = 0x0;
  401. Delay(1000);
  402. Uart_Printf("nPress any key to exit.n");
  403. Uart_Getch();
  404. }
  405. Codec_Ready =1;
  406. AC97_Port_Return();
  407. }
  408. /* Functional Sub-Routines */
  409. void AC97_Port_Init(void)
  410. {
  411. //Push AC97 GPIO port configuration
  412. save_AC97_rGPEDAT=rGPEDAT;
  413. save_AC97_rGPECON=rGPECON; 
  414. save_AC97_rGPEUP=rGPEUP;
  415. //---------------------------------------------------------------------
  416. //   PORT E GROUP
  417. //Ports  :  GPE4             GPE3                 GPE2            GPE1              GPE0 
  418. //Signal :  AC_SDATA_OUT   AC_SDATA_IN   AC_nRESET   AC_BIT_CLK   AC_SYNC 
  419. //Binary :   11,                     11,                   11,                11,                 11    
  420. //---------------------------------------------------------------------
  421. rGPECON = rGPECON & ~(0x3ff) | 0x3ff;   //GPE[4:0]=AC_SDATA_OUT   AC_SDATA_IN   AC_nRESET   AC_BIT_CLK   AC_SYNC
  422. rGPEUP  = rGPEUP  & ~(0x1f)  | 0x1f;    //The pull up function is disabled GPE[4:0] 1 1111
  423.     
  424. //For EINT0 Push Button 
  425.      rGPFUP   = ((rGPFUP   & ~(1<<0)) | (1<<0));     //GPF0
  426.      rGPFCON  = ((rGPFCON  & ~(3<<0)) | (1<<1));     //GPF0=EINT0    
  427.      rEXTINT0 = ((rEXTINT0 & ~(7<<0)) | (2<<0));     //EINT0=falling edge triggered 
  428. }
  429. void AC97_Port_Return(void)
  430. {
  431. //Pop AC97 GPIO port configuration
  432. rGPECON=save_AC97_rGPECON; 
  433. rGPEDAT=save_AC97_rGPEDAT;
  434. rGPEUP=save_AC97_rGPEUP;
  435. }
  436. void AC97_Init(void)
  437. {
  438. int i=0;
  439. U8 ch;
  440. Uart_Printf("nAC97 Initialization...n");
  441.   //Cold Reset 
  442. rAC_GLBCTRL = 0x1; // controller and codec cold reset
  443. Delay(1000); // delay for controller safety reset
  444. rAC_GLBCTRL = 0x0; // controller and codec normal mode
  445. Delay(1000);
  446. rAC_GLBCTRL = 0x1;
  447. Delay(1000);
  448. rAC_GLBCTRL = 0x0;
  449. Delay(1000);
  450. //AC-link On
  451. rAC_GLBCTRL = (1<<2);
  452. Delay(1000);
  453. AC97_Controller_State();
  454. //Transfer data enable using AC-link
  455. rAC_GLBCTRL |= (1<<3); // AC97 Data transfer active 
  456. Delay(1000);
  457. AC97_Controller_State();
  458. Uart_Printf("nAC97-Link On...n");
  459.        
  460.        //Codec Ready Check using Codec Ready Interrupt
  461.        Codec_Ready_Irq =0;
  462. pISR_WDT_AC97= (unsigned)AC97_Codec_Ready;
  463. ClearPending(BIT_WDT_AC97);
  464. rSUBSRCPND=(BIT_SUB_AC97);
  465.     rINTMSK=~(BIT_WDT_AC97);
  466.     rINTSUBMSK=~(BIT_SUB_AC97);
  467.     rAC_GLBCTRL |= 0x400000;
  468.    
  469. while(!Codec_Ready_Irq)
  470. {
  471.   Uart_Printf(".");
  472.           Delay(3000);
  473.           i++;
  474.          
  475.           if(i==20)
  476. break;
  477.  }
  478. Uart_Printf("n");
  479. if(i==20)
  480. {
  481. Uart_Printf("nAC97 codec is not ready.");
  482. Uart_Printf("nCheck on connection between 2440A and AC97 Codec.n");
  483. //Uart_Printf("nRN1, RN3 and R280 instead of RN2, RN4 and R281 must be used for AC97 link on SMDK2440 Base Board (Rev 0.18).n");
  484. Uart_Printf("nBye. ");
  485. Codec_Ready = 0;
  486. }
  487. }
  488. void AC97_CodecInit_PD(void)
  489. {
  490. Uart_Printf("nAC97 Codec Soft Resetn");
  491. AC97_Codec_Cmd(0,0x00,0x683F); //Codec Soft Reset : 16bit In/Out  (stac9766/67) 
  492. Uart_Printf("AC97 Codec 0x26 Reg.: 0x%xnn", AC97_Codec_Cmd(1,0x26,0x0000));
  493. }
  494. void AC97_CodecInit_PCMIn( U16 AC97_fs)
  495. {
  496. AC97_Codec_Cmd(0,0x00,0x683F); //codec soft reset 
  497. AC97_Codec_Cmd(0,0x2A,0x0001); //variable rate enable
  498. Uart_Printf("VRA Enable(1)/Disable(0): 0x%xn",(0x1&AC97_Codec_Cmd(1,0x2A,0x0001)));
  499. if(AC97_fs==48000){
  500. //ADC Sampling frequency 48kHz
  501. AC97_Codec_Cmd(0,0x32,0xbb80);
  502. }
  503. else if(AC97_fs==44100){
  504. //ADC Sampling frequency 44.1kHz
  505. AC97_Codec_Cmd(0,0x32,0xac44);
  506. }
  507. else if(AC97_fs==22050){
  508. //ADC Sampling frequency 22.05kHz
  509. AC97_Codec_Cmd(0,0x32,0x5622);  
  510. }
  511. AC97_Codec_Cmd(0,0x26,(1<<9)); //all power on except DAC Block
  512. Uart_Printf("nAC97 Codec 0x26 Reg.: 0x%xnn", AC97_Codec_Cmd(1,0x26,0x0000));
  513. AC97_Codec_Cmd(0,0x10,0x1010); //line in volume on
  514. AC97_Codec_Cmd(0,0x6e,0x0000); //All Analog Mode, ADC Input select => left slot3, right slot4
  515. AC97_Codec_Cmd(0,0x1a,0x0505); //record source select => Stereo Mix
  516. AC97_Codec_Cmd(0,0x1c,0x0909); //record gain is initial
  517. AC97_Codec_Cmd(0,0x78,0x0001); //ADC HPF Bypass
  518. AC97_Codec_Cmd(0,0x20,0x0000); //General Reg.
  519. Input_Volume =  AC97_Codec_Cmd(1,0x10,0x0000);       //Line In volume
  520. }
  521. void AC97_CodecInit_PCMOut( U16 AC97_fs)
  522. {
  523. AC97_Codec_Cmd(0,0x00,0x683F); //codec soft reset
  524. AC97_Codec_Cmd(0,0x2A,0x0001); //variable rate enable
  525. //Uart_Printf("nVRA Enable(1)/Disable(0): 0x%xn", (0x1&AC97_Codec_Cmd(1,0x2A,0x0001)));
  526. if(AC97_fs==48000){
  527. //DAC Sampling frequency 48kHz
  528. AC97_Codec_Cmd(0,0x2C,0xbb80);
  529. }
  530. else if(AC97_fs==44100){
  531. //DAC Sampling frequency 44.1kHz
  532. AC97_Codec_Cmd(0,0x2C,0xac44);
  533. }
  534. else if(AC97_fs==22050){
  535. //DAC Sampling frequency 22.05kHz
  536. AC97_Codec_Cmd(0,0x2C,0x5622);
  537. }
  538. AC97_Codec_Cmd(0,0x26, (1<<8)); // all power on except ADC blcok
  539. Uart_Printf("AC97 Codec 0x26 Reg.: 0x%xnn", AC97_Codec_Cmd(1,0x26,0x0000));
  540. AC97_Codec_Cmd(0,0x18,0x0000); // PCM out volume on
  541. AC97_Codec_Cmd(0,0x20,0x0000); // general purpose
  542. AC97_Codec_Cmd(0,0x04,0x1A1A); // Aux out(HP out) volume on
  543. Output_Volume = AC97_Codec_Cmd(1,0x04,0x00000); //HP out volume 
  544. }
  545. void AC97_CodecInit_MICIn(U16 AC97_fs)
  546. {
  547. AC97_Codec_Cmd(0,0x00,0x683F); //codec soft reset 
  548. AC97_Codec_Cmd(0,0x2A,0x0001); //variable rate enable
  549. Uart_Printf("VRA Enable(1)/Disable(0): 0x%xn",(0x1&AC97_Codec_Cmd(1,0x2A,0x0001)));
  550. if(AC97_fs==48000){
  551. //ADC Sampling frequency 48kHz
  552. AC97_Codec_Cmd(0,0x32,0xbb80);
  553. }
  554. else if(AC97_fs==44100){
  555. //ADC Sampling frequency 44.1kHz
  556. AC97_Codec_Cmd(0,0x32,0xac44);
  557. }
  558. else if(AC97_fs==22050){
  559. //ADC Sampling frequency 22.05kHz
  560. AC97_Codec_Cmd(0,0x32,0x5622);  
  561. }
  562. AC97_Codec_Cmd(0,0x26,(1<<9)); //all power on except DAC Block
  563. Uart_Printf("nAC97 Codec 0x26 Reg.: 0x%xnn", AC97_Codec_Cmd(1,0x26,0x0000));
  564. AC97_Codec_Cmd(0,0x20,0x0000); //MIC1 Selected
  565. AC97_Codec_Cmd(0,0x6e,0x0024); //ADC Input Slot => left slot6, right slot9, MIC GAIN VAL =1 
  566. AC97_Codec_Cmd(0,0x0e,0x0040); //BOOSTEN =1
  567. AC97_Codec_Cmd(0,0x1a,0x0000); //Left, Right => MIC
  568. AC97_Codec_Cmd(0,0x1c,0xff);
  569. AC97_Codec_Cmd(0,0x78,0x0001); //ADC HPF Bypass
  570. Input_Volume =  AC97_Codec_Cmd(1,0x1c,0x0000);       //Record Volume
  571. }
  572. U16 AC97_Codec_Cmd(U8 CMD_Read, U8 CMD_Offset, U16 CMD_Data)
  573.  U16 Codec_Stat;
  574.  if(CMD_Read == 0)
  575.  {
  576.   rAC_CODEC_CMD = (0<<23)|(CMD_Offset<<16)|(CMD_Data<<0);
  577. Delay_After_CommandWrite(1); //30us delay. 
  578.  }
  579.         else if (CMD_Read ==1) 
  580.       {
  581. rAC_CODEC_CMD = (1<<23)|(CMD_Offset<<16)|(CMD_Data<<0);
  582. Delay(1000);
  583.      Codec_Stat = (U16)(rAC_CODEC_STAT & 0xFFFF);
  584.      Delay(1000);
  585.      return Codec_Stat;
  586.       }
  587.         else 
  588.       return 0;
  589.         
  590. }
  591. void PCM_In_Volume( U8 Up_Down_Volume)
  592. {
  593. if( ( Up_Down_Volume == 'u') | (Up_Down_Volume == 'U') ) 
  594. {
  595. if (Input_Volume == 0x0000) 
  596. {
  597. Uart_Printf("Limit Volume Range!n");
  598. else 
  599. {
  600. Input_Volume -= 0x0101;
  601. AC97_Codec_Cmd(0,0x10, Input_Volume); // PCM In Volume Up
  602. Uart_Printf("PCM In Volume Level : 0x%xn", Input_Volume);
  603. }
  604. }
  605. if ( ( Up_Down_Volume == 'd') | (Up_Down_Volume == 'D') ) 
  606. {
  607. if (Input_Volume == 0x1F1F) 
  608. {
  609. Uart_Printf("Limit Volume Range!n");
  610. else 
  611. {
  612. Input_Volume += 0x0101;
  613. AC97_Codec_Cmd(0,0x10, Input_Volume); // PCM In Volume Down
  614. Uart_Printf("PCM In Volume Level : 0x%4xn", Input_Volume);
  615. }
  616. }
  617. }
  618. void PCM_Out_Volume(U8 Up_Down_Volume)
  619. {
  620. if( ( Up_Down_Volume == 'u') | (Up_Down_Volume == 'U') )
  621. {
  622. if (Output_Volume == 0x0000) 
  623. {
  624. Uart_Printf("nLimit Volume Range!");
  625. else 
  626. {
  627. Output_Volume -= 0x0101;
  628. AC97_Codec_Cmd(0,0x04, Output_Volume); // PCM out Volume Up
  629. Uart_Printf("nHeadphone Volume Level (In AC97 Codec 04h Reg.): 0x%x", Output_Volume);
  630. }
  631. }
  632. if ( ( Up_Down_Volume == 'd') | (Up_Down_Volume == 'D') ) 
  633. {
  634. if (Output_Volume == 0x1F1F) 
  635. {
  636. Uart_Printf("nLimit Volume Range!");
  637. else 
  638. {
  639. Output_Volume += 0x0101;
  640. AC97_Codec_Cmd(0,0x04, Output_Volume); // PCM out Volume Down
  641. Uart_Printf("nHeadphone Volume Level (In AC97 Codec 04h Reg.): 0x%x", Output_Volume);
  642. }
  643. }
  644. }
  645. void Download_PCM_File(void)
  646. {
  647.        pISR_UART1 = (unsigned)RxInt;
  648.        rINTMSK    = ~( BIT_UART1);
  649.        rINTSUBMSK = ~(BIT_SUB_RXD1);  
  650.        AC97_BUF   = (U8 *)DOWN_BUF;
  651.      AC97_temp = AC97_BUF;
  652.    
  653. Uart_Printf("nDownload the PCM(no ADPCM) file via Serial Port Transmit in DNW (With header & CS)!n");
  654. Uart_Printf("Max of PCM Size: 4M bytesn");
  655. while(((unsigned int)AC97_temp - (unsigned int)AC97_BUF) < 4)
  656.        {
  657.         Led_Display(0);
  658.         Delay(1500);
  659.         Led_Display(15);
  660.         Delay(1500);
  661.      }
  662.      AC97_size = *(AC97_BUF) | *(AC97_BUF + 1)<<8 | *(AC97_BUF + 2)<<16 | *(AC97_BUF + 3)<<24;
  663.      Uart_Printf("nNow, Downloading... [ File Size : %7d(      0)]",AC97_size);
  664.      while(((unsigned int)AC97_temp - (unsigned int)AC97_BUF) < AC97_size)
  665.        Uart_Printf("bbbbbbbb%7d)",(unsigned int)AC97_temp - (unsigned int)AC97_BUF);
  666.      Uart_Printf("bbbbbbbb%7d)]n",(unsigned int)AC97_temp - (unsigned int)AC97_BUF);
  667.      rINTSUBMSK |= BIT_SUB_RXD1;
  668.      AC97_size = *(AC97_BUF + 0x2c) | *(AC97_BUF + 0x2d)<<8 | *(AC97_BUF + 0x2e)<<16 | *(AC97_BUF + 0x2f)<<24;
  669.      AC97_size = (AC97_size>>1)<<1;
  670.     
  671.        AC97_fs   = *(AC97_BUF + 0x1c) | *(AC97_BUF + 0x1d)<<8 | *(AC97_BUF + 0x1e)<<16 | *(AC97_BUF + 0x1f)<<24;
  672.     Play_AC97_BUF = (U32 *)(AC97_BUF + 0x30); //DNW Header + PCM File Header => OffSet: 0x30
  673.   
  674.   Uart_Printf("Sample PCM Data Size = %dn", AC97_size);
  675. Uart_Printf("Sampling Frequency = %d Hzn", AC97_fs);
  676. }
  677. void AC97_PCMout_DMA1(U32 PCM_Size)
  678. {
  679. pISR_EINT0= (unsigned)Muting;
  680. pISR_DMA1= (unsigned)DMA1_Play_Done;
  681. rINTMSK = ~(BIT_DMA1|BIT_EINT0);
  682. Play_AC97_BUF=(U32 *)(DOWN_BUF +0x30);
  683. //DMA Ch1 for PCMInitialize
  684. rDISRC1  = (int)Play_AC97_BUF;                 
  685. rDISRCC1 = (0<<1) + (0<<0); //The source is in the system bus(AHB), Increment      
  686. rDIDST1  = ((U32)0x5b000018);   //PCM Out Data Fifo    
  687. rDIDSTC1 = (1<<1) + (1<<0);           //The destination is in the peripheral bus(APB), Fixed  
  688. rDCON1   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(5<<24)+(1<<23)+(0<<22)+(2<<20)+(PCM_Size/4);
  689. rDMASKTRIG1 = (0<<2) + (1<<1) + (0<<0);          //No-stop[2], DMA1 channel On[1], No-sw trigger[0] 
  690. //AC97  Initialize
  691. Uart_Printf("nConnect Head Phone Line In to CON21 (Head Phone Out) on SMDK2440 and Press Key.n");
  692. Uart_Getch();
  693. Uart_Printf("nNow Play...n");
  694. Uart_Printf("To Volume Up, Press the 'u' key.n");
  695. Uart_Printf("To Volume Down, Press the 'd' key.n");
  696. Uart_Printf("To Mute On/Off, Press EINT0 Button.n");
  697. Uart_Printf("nIf you want to exit, Press the 'x' key.n");
  698. Uart_Printf("Headphone Volume Register = 0x%xn", Output_Volume);
  699. //Transfer data enable  using AC-Link
  700. rAC_GLBCTRL = 0x200C;
  701. //Uart_Printf("nWrite Value to AC_GLBCTRL Reg. =>0x200Cn");
  702. //Uart_Printf("Read Value from AC_GLBCTRL Reg. =>0x%xn", rAC_GLBCTRL);
  703. Delay(1000);    
  704.    while(1)
  705.      {
  706. //Uart_Printf("STAT3: 0x%x CURR_TC: 0x%x DCDST3: 0x%xn", rDSTAT3&0x300000, rDSTAT3&0xfffff, rDCDST3);
  707.      Up_Down_Volume=Uart_Getch();
  708. if( (Up_Down_Volume == 'x') | (Up_Down_Volume == 'X')) 
  709. break;
  710.      PCM_Out_Volume(Up_Down_Volume);
  711.     }
  712. ClearPending(BIT_DMA1); 
  713. rDMASKTRIG1  = (1<<2);       //DMA1 stop
  714. rINTMSK|= (BIT_DMA1 | BIT_EINT0);
  715.  //AC97 PCM In Channel Finish 
  716.  rAC_GLBCTRL &= ~(1<<13); //PCM Out Transfer Mode Off
  717.  Uart_Printf("nEnd of Play!n");
  718. }
  719. void AC97_PCMout_INT(U32 PCM_Size)
  720. {
  721.  //Record AC97_BUF initialize
  722.        Rec_AC97_BUF   = (U32 *)(DOWN_BUF);
  723. Play_AC97_BUF = (Rec_AC97_BUF + 0x30);
  724. End_AC97_BUF = (Rec_AC97_BUF + 0x30 + PCM_Size/4);
  725. //IRQ Initialization
  726. pISR_WDT_AC97= (unsigned)Irq_AC97_PCMout;
  727. Uart_Printf("nConnect Head Phone Line In to CON21 on SMDK2440 and Press any key.n");
  728. Uart_Getch();
  729. Uart_Printf("nNow Play...n");
  730. Uart_Printf("Headphone Volume Register = 0x%xn", Output_Volume);
  731. ClearPending(BIT_WDT_AC97);
  732. rSUBSRCPND=(BIT_SUB_AC97);
  733.     rINTMSK=~(BIT_WDT_AC97);
  734.     rINTSUBMSK=~(BIT_SUB_AC97);
  735. rAC_GLBCTRL = 0x4100C; //PCM Out channel threshold INT enable, PIO Mode On
  736. while(1)
  737. {
  738.        if(PCM_Out_INT_Exit == 1)
  739. break;
  740. }
  741. rAC_GLBCTRL &= ~(1<<12); //PCM Out Transfer PIO Mode Off
  742. rINTSUBMSK|=(BIT_SUB_WDT|BIT_SUB_AC97);
  743. rINTMSK|=(BIT_WDT_AC97);
  744. Uart_Printf("nEnd of Play!n");
  745. }
  746. void AC97_PCMin_DMA2(U32 PCM_Size)
  747. {
  748. Rec_AC97_BUF   = (U32 *)(DOWN_BUF);  
  749. //IRQ Initialize
  750. pISR_DMA2  = (unsigned)DMA2_Rec_Done;
  751. rINTMSK = ~(BIT_DMA2);
  752.       
  753.        //DMA2 Initialize
  754. rDISRC2  = ((U32)0x5B000018);         //PCM Input Data FIFO
  755. rDISRCC2 = (1<<1) + (1<<0);          //APB, Fix  
  756.        rDIDST2  = (int)Rec_AC97_BUF;   //Record AC97_BUF initializ
  757.        rDIDSTC2 = (0<<1) + (0<<0);          //AHB, Increment
  758.        rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(5<<24)+(1<<23)+(1<<22)+(2<<20)+(PCM_Size/4);
  759. Uart_Printf("Connect Sound Line Out to CON25(Line In) on SMDK2440n");
  760.        Uart_Printf("Press any key to start record.n");
  761.      Uart_Getch();
  762.     Uart_Printf("Recording...n");
  763.        rDMASKTRIG2 = (0<<2) + (1<<1) + 0;    //No-stop, DMA2 channel on, No-sw trigger
  764. // Transfer data enable  using AC-Link
  765.        rAC_GLBCTRL = 0x80C; // Transfer data enable  using AC-Link
  766.        //Uart_Printf("nWrite Value to AC_GLBCTRL Reg. =>0x80Cn");
  767. //Uart_Printf("Read Value from AC_GLBCTRL Reg. =>0x%xn", rAC_GLBCTRL);
  768.        while(AC97_Rec_Done ==0)
  769.        {
  770.          Uart_Printf(".");
  771.           Delay(3000);
  772.           //Uart_Printf("STAT2: 0x%x CURR_TC: 0x%x DCDST2: 0x%xn", rDSTAT2&0x300000, rDSTAT2&0xfffff, rDCDST2);
  773.        }
  774.     
  775.        AC97_Rec_Done = 0;
  776.        rDMASKTRIG2 = (1<<2);     //DMA2 stop
  777.      
  778.        rINTMSK |= BIT_DMA2;
  779.        //AC97 PCM In Channel Finish 
  780.        rAC_GLBCTRL &= ~(1<<11); //PCM In Transfer Mode Off
  781.    Delay(1000); 
  782.    Uart_Printf("nEnd of Record!n");
  783. }
  784. void AC97_PCMin_INT(U32 PCM_Size)
  785. {
  786. //Record AC97_BUF initialize
  787.        Rec_AC97_BUF   = (U32 *)(DOWN_BUF);
  788. Play_AC97_BUF = Rec_AC97_BUF + 0x30;
  789. End_AC97_BUF = (Rec_AC97_BUF + 0x30 + PCM_Size/4);
  790. //IRQ Initialization
  791. pISR_WDT_AC97= (unsigned)Irq_AC97_PCMin;
  792. Uart_Printf("Connect Sound Line Out to CON25(Line In) on SMDK2440n");
  793.        Uart_Printf("Press any key to start record.n");
  794.      Uart_Getch();
  795.     Uart_Printf("Recording...n");
  796. ClearPending(BIT_WDT_AC97);
  797. rSUBSRCPND=(BIT_SUB_AC97);
  798.     rINTMSK=~(BIT_WDT_AC97);
  799.     rINTSUBMSK=~(BIT_SUB_AC97);
  800. rAC_GLBCTRL = 0x2040C; //PCM In channel threshold INT enable, PIO Mode On
  801. while(1)
  802. {
  803.        if(PCM_In_INT_Exit == 1)
  804. break;
  805. }
  806. rAC_GLBCTRL &= ~(1<<10); //PCM In Transfer PIO Mode Off
  807. rINTSUBMSK|=(BIT_SUB_AC97);
  808. rINTMSK|=(BIT_WDT_AC97);
  809. Uart_Printf("nEnd of Record!n");
  810. }
  811. void AC97_MICin_DMA3(U32 MIC_Size)
  812. {
  813. Rec_AC97_BUF   = (U32 *)(DOWN_BUF);  
  814. //IRQ Initialize
  815. pISR_DMA3  = (unsigned)DMA3_Rec_Done;
  816. rINTMSK=~(BIT_DMA3);
  817.        //DMA3 Initialize
  818. rDISRC3  = ((U32)0x5B00001C);         //MIC Input Data FIFO
  819. rDISRCC3 = (1<<1) + (1<<0);          //APB, Fix  
  820.        rDIDST3  = (int)Rec_AC97_BUF;   //Record AC97_BUF initializ
  821.        rDIDSTC3 = (0<<1) + (0<<0);          //AHB, Increment
  822.        rDCON3   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(5<<24)+(1<<23)+(1<<22)+(2<<20)+(MIC_Size/4);
  823. Uart_Printf("Are you ready to record voice via MIC on SMDK2440?n");
  824.        Uart_Printf("Press any key to start record.n");
  825.      Uart_Getch();
  826.     Uart_Printf("Recording...n");
  827.        rDMASKTRIG3 = (0<<2) + (1<<1) + 0;    //No-stop, DMA3 channel on, No-sw trigger
  828. // Transfer data enable  using AC-Link
  829.        rAC_GLBCTRL = 0x20C; // Transfer data enable  using AC-Link
  830.        while(AC97_Rec_Done ==0)
  831.        {
  832.          Uart_Printf(".");
  833.          Delay(3000);
  834.          //Uart_Printf("STAT3: 0x%x CURR_TC: 0x%x DCDST3: 0x%xn", rDSTAT3&0x300000, rDSTAT3&0xfffff, rDCDST3);
  835.        }
  836.     
  837.        AC97_Rec_Done = 0;
  838.        rDMASKTRIG3 = (1<<2);     //DMA3 stop
  839.      
  840.        rINTMSK |= BIT_DMA3;
  841.        //AC97 MIC In Channel Finish 
  842.        rAC_GLBCTRL &= ~(1<<9); //MIC In Transfer Mode Off
  843.  
  844.    Uart_Printf("nEnd of Record!n");
  845. }
  846. void AC97_MICin_INT(U32 PCM_Size)
  847. {
  848. //Record AC97_BUF initialize
  849.        Rec_AC97_BUF   = (U32 *)(DOWN_BUF);
  850. Play_AC97_BUF = Rec_AC97_BUF + 0x30;
  851. End_AC97_BUF = (Rec_AC97_BUF + 0x30 + PCM_Size/4);
  852. //IRQ Initialization
  853. pISR_WDT_AC97= (unsigned)Irq_AC97_MICin;
  854. Uart_Printf("Are you ready to record voice via MIC on SMDK2440?n");
  855.        Uart_Printf("Press any key to start record.n");
  856.      Uart_Getch();
  857.     Uart_Printf("Recording...n");
  858. ClearPending(BIT_WDT_AC97);
  859. rSUBSRCPND=(BIT_SUB_AC97);
  860.     rINTMSK=~(BIT_WDT_AC97);
  861.     rINTSUBMSK=~(BIT_SUB_AC97);
  862. rAC_GLBCTRL = 0x1010C; //MIC In channel threshold INT enable, PIO Mode On
  863. while(1)
  864. {
  865.        if(PCM_In_INT_Exit == 1)
  866. break;
  867. }
  868. rAC_GLBCTRL &= ~(1<<8); //MIC In Transfer PIO Mode Off
  869. rINTSUBMSK|=(BIT_SUB_AC97);
  870. rINTMSK|=(BIT_WDT_AC97);
  871. Uart_Printf("nEnd of Record!n");
  872. }
  873. void AC97_CodecExit_PCMOut(void)
  874. {
  875. //DACs off
  876. Uart_Printf("nn=>DACs off PR1n");
  877. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
  878. AC97_Controller_State();
  879. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  880. //Analog off
  881. Uart_Printf("n=>Analog off PR2n");
  882. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
  883. AC97_Controller_State();
  884. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  885. //Digital I/F off
  886. Uart_Printf("n=>Digital I/F off PR4n");
  887. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  888. AC97_Controller_State();
  889. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  890. }
  891. void AC97_CodecExit_PCMIn(U16 DACs_off)
  892. {
  893. //ADCs off
  894. Uart_Printf("nn=>ADCs off PR0n");
  895. AC97_Codec_Cmd(0,0x26,(1<<8));
  896. AC97_Controller_State();
  897. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  898. if(DACs_off == 1)
  899. {
  900. //DACs off
  901. Uart_Printf("nn=>DACs off PR1n");
  902. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
  903. AC97_Controller_State();
  904. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  905. }
  906. //Analog off
  907. Uart_Printf("n=>Analog off PR2n");
  908. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
  909. AC97_Controller_State();
  910. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  911. //Digital I/F off
  912. Uart_Printf("n=>Digital I/F off PR4n");
  913. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  914. AC97_Controller_State();
  915. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  916. }
  917. void AC97_CodecExit_MICIn(U16 DACs_off)
  918. {
  919. //ADCs off
  920. Uart_Printf("nn=>ADCs off PR0n");
  921. AC97_Codec_Cmd(0,0x26,(1<<8));
  922. AC97_Controller_State();
  923. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  924. if(DACs_off == 1)
  925. {
  926. //DACs off
  927. Uart_Printf("nn=>DACs off PR1n");
  928. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9));
  929. AC97_Controller_State();
  930. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  931. }
  932. //Analog off
  933. Uart_Printf("n=>Analog off PR2n");
  934. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10));
  935. AC97_Controller_State();
  936. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  937. //Digital I/F off
  938. Uart_Printf("n=>Digital I/F off PR4n");
  939. AC97_Codec_Cmd(0,0x26,(1<<8)|(1<<9)|(1<<10)|(1<<12));
  940. AC97_Controller_State();
  941. Uart_Printf("AC97 Codec Powerdown Ctrl/Stat 0x26 Reg.: 0x%xn", AC97_Codec_Cmd(1,0x26,0x0000));
  942. }
  943. U16 AC97_Select_SamplingRate(void)
  944. {
  945. int i;
  946. Uart_Printf("nSelect ADC/DAC Raten");
  947. Uart_Printf("0:22.05kHz, 1:44.1kHz, 2:48kHzn");
  948. i = Uart_GetIntNum();
  949.    switch(i)
  950.        {
  951. case 0:
  952.               return 22050;
  953.         break;
  954.        
  955.         case 1:
  956.         return 44100;
  957.         break;
  958.         case 2:
  959.         return 48000;
  960.         break;
  961.        
  962.         default:
  963.         return 48000;
  964.         break;
  965. }      
  966. }
  967. void AC97_Controller_State(void)
  968. {
  969. U8 state;
  970.     
  971.      state=(U8)(rAC_GLBSTAT);
  972.       switch(state)
  973.      {
  974. case 0:
  975. Uart_Printf("AC97 Controller State: Idlen"); 
  976. break;
  977. case 1:
  978. Uart_Printf("AC97 Controller State: Initn"); 
  979. break;
  980. case 2:
  981.        Uart_Printf("AC97 Controller State: Readyn"); 
  982. break;
  983. case 3:
  984. Uart_Printf("AC97 Controller State: Activen"); 
  985. break;
  986. case 4:
  987. Uart_Printf("AC97 Controller State: LPn"); 
  988. break;
  989. case 5:
  990. Uart_Printf("AC97 Controller State: Warmn"); 
  991. break;
  992. default:
  993. break;
  994.       }
  995. }
  996. void Delay_After_CommandWrite(int time)
  997. {
  998.        // time=0: adjust the Delay function by WatchDog timer.
  999.        // time>0: the number of loop time
  1000.        // Delay time resolution has 30us.
  1001.   int i, adjust=0;
  1002.      if(time==0)
  1003.      {
  1004.         time   = 300;
  1005.          adjust = 1;
  1006.          delayLoopCount = 500;
  1007.              //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
  1008.          rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); 
  1009.          rWTDAT = 0xffff;                              //for first update
  1010.          rWTCNT = 0xffff;                              //resolution=64us @any PCLK 
  1011.          rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
  1012.      }
  1013.      for(;time>0;time--)
  1014.         for(i=0;i<delayLoopCount;i++);
  1015.      if(adjust==1)
  1016.      {
  1017.          rWTCON = ((PCLK/1000000-1)<<8)|(2<<3); //Watch-dog timer stop
  1018.          i = 0xffff - rWTCNT;                     //1 count  => 64us,  300*500 cycle runtime = 64*i us
  1019.          delayLoopCount = 4500000/(i*64);         //300*500:64*i=1*x:30 -> x=150000*30/(64*i)   
  1020.      }
  1021.     
  1022. }
  1023. void Delay_Init(void)
  1024. {
  1025. Delay(0); //Delay Time Resolution => 100us Adjust 
  1026. Delay_After_CommandWrite(0); //Delay Time Resolution => 30us Adjust 
  1027. }
  1028. /* ISRs */
  1029. void __irq AC97_Codec_Ready(void)
  1030. {
  1031. Delay_Init();
  1032. if ( (rAC_GLBSTAT& 0x400000))
  1033. {
  1034. Codec_Ready_Irq=1;
  1035. Uart_Printf("Codec Ready!n");
  1036. rAC_GLBCTRL &= ~(0x400000); // codec ready interrupt disable
  1037. }
  1038. rSUBSRCPND=(BIT_SUB_AC97);
  1039. ClearPending(BIT_WDT_AC97);
  1040. rINTSUBMSK &= ~(BIT_SUB_AC97);
  1041. rINTMSK &=~(BIT_WDT_AC97);
  1042. }
  1043. void __irq DMA1_Play_Done(void)
  1044. {
  1045.        ClearPending(BIT_DMA1);               
  1046. Uart_Printf("n~~~");
  1047. }
  1048. void __irq DMA2_Rec_Done(void)
  1049. {
  1050.      ClearPending(BIT_DMA2);               
  1051.      AC97_Rec_Done = 1;
  1052. }
  1053. void __irq DMA3_Rec_Done(void)
  1054. {
  1055. ClearPending(BIT_DMA3);               
  1056.      AC97_Rec_Done = 1;     
  1057. }
  1058. void __irq Irq_AC97_PCMout(void)
  1059. {
  1060. U32 i, AC97_Stat;
  1061. rINTMSK |=(BIT_WDT_AC97);
  1062. rINTSUBMSK|=(BIT_SUB_AC97);
  1063. AC97_Stat = rAC_GLBSTAT;
  1064. if (AC97_Stat & AC97_PCM_OUT_THRESHOLD)
  1065. {
  1066. for(i=0; i<PCM_OUT_TRIGGER; i++)
  1067.        {
  1068.   rAC_PCMDATA = *(Play_AC97_BUF++);
  1069. if(Play_AC97_BUF == End_AC97_BUF)  
  1070. break;
  1071. }
  1072. }
  1073. if(Play_AC97_BUF == End_AC97_BUF)
  1074. {
  1075. rAC_GLBCTRL &= ~(0x40000); //PCM Out channel threshold INT disable
  1076. PCM_Out_INT_Exit =1;
  1077. }
  1078. rSUBSRCPND=(BIT_SUB_AC97);
  1079. ClearPending(BIT_WDT_AC97);
  1080. rINTSUBMSK &= ~(BIT_SUB_AC97);
  1081. rINTMSK &= ~(BIT_WDT_AC97);  
  1082. }
  1083. void __irq Irq_AC97_PCMin(void)
  1084. {
  1085. U32 AC97_Stat, i; 
  1086. rINTMSK |=(BIT_WDT_AC97);
  1087. rINTSUBMSK|=(BIT_SUB_AC97);
  1088. AC97_Stat = rAC_GLBSTAT;
  1089. if (AC97_Stat & AC97_PCM_IN_THRESHOLD)
  1090. {
  1091. for(i=0; i<PCM_IN_TRIGGER; i++)
  1092.        {
  1093.    *(Play_AC97_BUF++) = rAC_PCMDATA;
  1094. if(Play_AC97_BUF == End_AC97_BUF)  
  1095. break;
  1096. }
  1097. }
  1098. if(Play_AC97_BUF == End_AC97_BUF)
  1099. {
  1100. rAC_GLBCTRL &= ~(1<<17); //PCM In channel threshold INT disable
  1101. PCM_In_INT_Exit =1;
  1102. }
  1103. rSUBSRCPND=(BIT_SUB_AC97);
  1104. ClearPending(BIT_WDT_AC97);
  1105. rINTSUBMSK &= ~(BIT_SUB_AC97);
  1106. rINTMSK &= ~(BIT_WDT_AC97);
  1107. }
  1108. void __irq Irq_AC97_MICin(void)
  1109. {
  1110. U32 AC97_Stat, i; 
  1111. rINTMSK |=(BIT_WDT_AC97);
  1112. rINTSUBMSK|=(BIT_SUB_AC97);
  1113. AC97_Stat = rAC_GLBSTAT;
  1114. if (AC97_Stat & AC97_MIC_IN_THRESHOLD)
  1115. {
  1116. for(i=0; i<PCM_IN_TRIGGER; i++)
  1117.        {
  1118.    *(Play_AC97_BUF++) = rAC_MICDATA;
  1119. if(Play_AC97_BUF == End_AC97_BUF)  
  1120. break;
  1121. }
  1122. }
  1123. if(Play_AC97_BUF == End_AC97_BUF)
  1124. {
  1125. rAC_GLBCTRL &= ~(1<<16); //PCM In channel threshold INT disable
  1126. PCM_In_INT_Exit =1;
  1127. }
  1128. rSUBSRCPND=(BIT_SUB_AC97);
  1129. ClearPending(BIT_WDT_AC97);
  1130. rINTSUBMSK &= ~(BIT_SUB_AC97);
  1131. rINTMSK &= ~(BIT_WDT_AC97);
  1132. }
  1133. void __irq RxInt(void)
  1134. {
  1135.      rSUBSRCPND = BIT_SUB_RXD1;         
  1136.      rSUBSRCPND;
  1137.      ClearPending(BIT_UART1);
  1138.      *AC97_temp ++= RdURXH1(); 
  1139. }
  1140. void __irq Muting(void)
  1141. {
  1142. ClearPending(BIT_EINT0);               
  1143.      if(AC97_mute)    //AC97_mute
  1144.      {
  1145.       AC97_mute = 0;
  1146.       AC97_Codec_Cmd(0,0x04, Output_Volume|0x8000);
  1147.          Uart_Printf("nAC97 Mute On...n");
  1148.      }
  1149.      else        //No AC97_mute
  1150.      {
  1151.          AC97_mute = 1;
  1152.          AC97_Codec_Cmd(0,0x04, Output_Volume& ~(0x8000));
  1153.          Uart_Printf("nAC97 Mute Off...n");
  1154.      }
  1155. }