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

uCOS

开发平台:

C/C++

  1. //====================================================================
  2. // File Name : uart0.c
  3. // Function  : S3C2440 UART-0 test code
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : May 30, 2002
  6. // Version   : 0.0
  7. // History
  8. // -2410
  9. //   0.0 : Programming start (February 20,2002) -> SOP
  10. //   1.0 (20020530) : First release for customer
  11. //   1.1 (20020801) : Strata NOR Flash Added and etc. -> SOP
  12. // -2440
  13. //   R0.0 (20030421): Modified for 2440. -> Junon
  14. //====================================================================
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include "def.h"
  18. #include "2440addr.h"
  19. #include "2440lib.h"
  20. #include "uart0.h"
  21. void Uart_Port_Set(void);
  22. void Uart_Port_Return(void);
  23. void __irq Uart0_TxInt(void);
  24. void __irq Uart0_RxIntOrErr(void);
  25. void __irq Uart0_TxDmaDone(void);
  26. void __irq Uart0_RxDmaDone(void);
  27. void __irq Uart0_RxDmaOrErr(void);
  28. void __irq Uart0_TxFifo(void);
  29. void __irq Uart0_RxFifoOrErr(void);
  30. void __irq Uart0_AfcTx(void);
  31. void __irq Uart0_AfcRxOrErr(void);
  32. void __irq Uart0_RxOverrunErr(void);
  33. void __sub_Uart0_RxInt(void);
  34. void __sub_Uart0_RxFifo(void);
  35. void __sub_Uart0_RxAfc(void);
  36. void __sub_Uart0_RxErrInt(void);
  37. void Uart_Fclkn_Dis(void); // for 2440A
  38. volatile U16 rx_dncs;
  39. volatile U32 rx_point,rx_isdone,rx_filesize,rx_checksum;
  40. volatile U32 isDone,isTxInt,isRxInt,tx_cnt,tx_end,rx_cnt,rx_end,afc_err;
  41. volatile U8 *txdataPt;
  42. volatile U8 *txdataFl;
  43. volatile U8 *rxdataPt;
  44. volatile U8 *rxdataCk;
  45. volatile U32 *dbg_data;
  46. U8 temp_exit;
  47. volatile U32 save_rGPHCON,save_rGPHDAT,save_rGPHUP;
  48. volatile U32 save_ULCON0,save_UCON0,save_UFCON0,save_UMCON0,save_UBRDIV0;
  49. volatile U32 save_ULCON1,save_UCON1,save_UFCON1,save_UMCON1,save_UBRDIV1;
  50. volatile U32 save_ULCON2,save_UCON2,save_UFCON2,save_UMCON2,save_UBRDIV2;
  51. volatile static char *uart0TxStr;
  52. volatile static char *uart0RxStr;
  53. volatile static char *uart2TxStr;
  54. volatile static char *uart2RxStr;
  55. extern U32 Fclk, Pclk;
  56. void Uart_Port_Set(void)
  57. {
  58.     //Push UART GPIO port configuration
  59.     save_rGPHCON=rGPHCON; 
  60.     save_rGPHDAT=rGPHDAT;
  61.     save_rGPHUP=rGPHUP;
  62.     //Configure UART port
  63.     rGPHCON&=0x3c0000;
  64.     rGPHCON|=0x2aaaa; // enable all uart channel
  65.     rGPHUP|=0x1ff; //Uart port pull-up disable
  66. rGPGCON|=(0xf<<18); // nRTS1, nCTS1
  67. rGPGUP|=(0x3<<9);
  68.     //rINTSUBMSK=0x7ff;   //SUBINT ALL MASK
  69.     //Push Uart control registers 
  70.     save_ULCON0=rULCON0;   
  71.     save_UCON0=rUCON0;    
  72.     save_UFCON0=rUFCON0;   
  73.     save_UMCON0=rUMCON0;   
  74.     save_ULCON1=rULCON1;
  75.     save_UCON1 =rUCON1;
  76.     save_UFCON1=rUFCON1;
  77.     save_UMCON1=rUMCON1;
  78.     save_ULCON2=rULCON2;
  79.     save_UCON2 =rUCON2;
  80.     save_UFCON2=rUFCON2;
  81.     save_UMCON2=rUMCON2;
  82. save_UBRDIV0=rUBRDIV0;
  83. save_UBRDIV1=rUBRDIV1;
  84. save_UBRDIV2=rUBRDIV2;
  85.     //Initialize UART1,2 port
  86. }       
  87.         
  88. void Uart_Port_Return(void)
  89. {       
  90.     //Pop UART GPIO port configuration
  91.     rGPHCON=save_rGPHCON;
  92.     rGPHDAT=save_rGPHDAT;
  93.     rGPHUP=save_rGPHUP;
  94.     //Pop Uart control registers 
  95.     rULCON0=save_ULCON0;   
  96.     rUCON0 =save_UCON0;   
  97.     rUFCON0=save_UFCON0;   
  98.     rUMCON0=save_UMCON0;   
  99.     rULCON1=save_ULCON1;
  100.     rUCON1 =save_UCON1;
  101.     rUFCON1=save_UFCON1;
  102.     rUMCON1=save_UMCON1;
  103.     rULCON2=save_ULCON2;
  104.     rUCON2 =save_UCON2;
  105.     rUFCON2=save_UFCON2;
  106.     rUMCON2=save_UMCON2;
  107. rUBRDIV0=save_UBRDIV0;
  108. rUBRDIV1=save_UBRDIV1;
  109. rUBRDIV2=save_UBRDIV2;
  110. Uart_Fclkn_Dis();
  111. }
  112. // 2440X usage enable
  113. void Uart_Uextclk_En(int ch,int baud, int clock)
  114. {
  115.     if(ch == 0) {
  116.     rUCON0  = rUCON0 & ~(1<<11) |(1<<10); // Select UEXTCLK
  117.       rUBRDIV0=( (int)(clock/16./baud) -1 ); //Baud rate divisior register
  118.     }
  119.     else if(ch==1){
  120.     rUCON1  = rUCON1 & ~(1<<11) |(1<<10); // Select UEXTCLK
  121.      rUBRDIV1=( (int)(clock/16./baud) -1 ); //Baud rate divisior register
  122.     }
  123.     else {
  124.     rUCON2  = rUCON2 & ~(1<<11) |(1<<10); // Select UEXTCLK
  125.        rUBRDIV2=( (int)(clock/16./baud) -1 ); //Baud rate divisior register
  126.     }
  127. }
  128. //2440X usage enable
  129. void Uart_Pclk_En(int ch, int baud)
  130. {
  131.     if(ch == 0) {
  132.      rUCON0 &= ~(3<<10); // Select PCLK
  133. rUBRDIV0=( (int)(Pclk/16./baud+0.5) -1 ); //Baud rate divisior register
  134.    }
  135.     else if(ch==1){
  136.      rUCON1 &= ~(3<<10); // Select PCLK
  137. rUBRDIV1=( (int)(Pclk/16./baud+0.5) -1 ); //Baud rate divisior register
  138.    }
  139.     else {
  140.      rUCON2 &= ~(3<<10); // Select PCLK
  141.     rUBRDIV2=( (int)(Pclk/16./baud+0.5) -1 ); //Baud rate divisior register
  142.    }
  143. }
  144. void Uart_Fclkn_En(int ch, int baud) // for 2440A
  145. {
  146. int clock = PCLK;//Pclk;
  147. Uart_Printf("Current FCLK is %dn", Fclk);
  148. #if 1
  149. // input clock divider setting.
  150. if ( (Fclk>290000000) && (Fclk<300000000) ) // for 296MHz
  151. {
  152. rUCON0 = (rUCON0 & ~(0xf<<12)) | (0xe<<12);  // FCLK divider 14(n=20), for max 921.6kbps
  153. rUCON1 &= ~(0xf<<12); // 0 setting
  154. rUCON2 &= ~(0xf<<12); // 0 setting
  155. clock = Fclk / 20;
  156. Uart_Printf("1 : %dn", clock);
  157. }
  158. else if ( (Fclk>395000000) && (Fclk<405000000) ) // for 399MHz
  159. {
  160. rUCON1 = (rUCON1 & ~(0xf<<12)) | (0x6<<12);  // FCLK divider 6(n=27), for max 921.6kbps
  161. rUCON0 &= ~(0xf<<12); // 0 setting
  162. rUCON2 &= ~(0xf<<12); // 0 setting
  163. clock = Fclk / 27;
  164. Uart_Printf("2 : %dn", clock);
  165. }
  166. else if ( (Fclk>525000000) && (Fclk<535000000) ) // for 530MHz
  167. {
  168. rUCON1 |= (0xf<<12);  // FCLK divider 15(n=36), for max. 921.6kbps
  169. rUCON0 &= ~(0xf<<12); // 0 setting
  170. rUCON2 &= ~(0xf<<12); // 0 setting
  171. clock = Fclk / 36;
  172. Uart_Printf("3 : %dn", clock);
  173. }
  174. rUCON2 |= (1<<15); // enable FCLK/n
  175. #else
  176. // In 921.6kbps case of following code, Fclk must be 296352000
  177. rUCON0 = rUCON0 & ~(0xf<<12) | (0xe<<12);  // FCLK divider 14(n=20), for max 921.6kbps
  178. rUCON1 &= ~(0xf<<12); // 0 setting
  179. rUCON2 &= ~(0xf<<12); // 0 setting
  180. clock = Fclk / 20;
  181. rUCON2 |= (1<<15); // enable FCLK/n
  182. #endif 
  183. // select buadrate.
  184.     if(ch == 0) {
  185.      rUCON0 |= (3<<10); // Select FCLK/n
  186. rUBRDIV0=( (int)(clock/16./baud+0.5) -1 ); //Baud rate divisior register
  187.    }
  188.     else if(ch==1){
  189.      rUCON1 |= (3<<10); // Select FCLK/n
  190. rUBRDIV1=( (int)(clock/16./baud+0.5) -1 ); //Baud rate divisior register
  191.    }
  192.     else {
  193.      rUCON2 |= (3<<10); // Select FCLK/n
  194.     rUBRDIV2=( (int)(clock/16./baud+0.5) -1 ); //Baud rate divisior register
  195.    }
  196. // S/W work-around for using FCLK/n
  197. rGPHCON = rGPHCON & ~(3<<16); //GPH8(UEXTCLK) input 
  198. Delay(1);
  199. rGPHCON = rGPHCON & ~(3<<16) | (1<<17); //GPH8(UEXTCLK) UEXTCLK
  200. }
  201. void Uart_Fclkn_Dis(void) // for 2440A
  202. {
  203. // S/W work-around for using FCLK/n
  204. rGPHCON = rGPHCON & ~(3<<16); //GPH8(UEXTCLK) input 
  205. Delay(1);
  206. rGPHCON = rGPHCON & ~(3<<16) | (1<<17); //GPH8(UEXTCLK) UEXTCLK
  207. }
  208. //---------------------------------------UART0 test function-------------------------------------
  209. void __irq Uart0_TxInt(void)
  210. {
  211.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); // Just for the safety
  212.     if(*uart0TxStr != '') 
  213.     {
  214.         WrUTXH0(*uart0TxStr++);
  215.     ClearPending(BIT_UART0); // Clear master pending
  216.     rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
  217.     rINTSUBMSK&=~(BIT_SUB_TXD0); // Unmask sub int
  218.     }
  219.     else
  220.     {
  221.      isTxInt=0;
  222.      ClearPending(BIT_UART0); // Clear master pending
  223.         rSUBSRCPND=(BIT_SUB_TXD0); // Clear Sub int pending
  224.         rINTMSK|=(BIT_UART0);
  225.     }
  226. }
  227. void __irq Uart0_RxIntOrErr(void)
  228. {
  229.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  230.     if(rSUBSRCPND&BIT_SUB_RXD0) __sub_Uart0_RxInt();
  231.     else __sub_Uart0_RxErrInt();
  232.     ClearPending(BIT_UART0); 
  233.     rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); // Clear Sub int pending    
  234.     rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);    
  235. }
  236. void __sub_Uart0_RxInt(void)
  237. {
  238.     if(RdURXH0()!='r') 
  239.     {
  240.      Uart_Printf("%c",RdURXH0());
  241.      *uart0RxStr++ =(char)RdURXH0();
  242.     }
  243.     else
  244.     {
  245.      isRxInt=0;
  246.      *uart0RxStr='';
  247.      Uart_Printf("n");
  248.     }
  249. }
  250. void __sub_Uart0_RxErrInt(void)
  251. {
  252. U32 iStatus;
  253. iStatus = rUERSTAT0;
  254.     switch(iStatus)//to clear and check the status of register bits
  255.     {
  256. case 1:
  257.     Uart_Printf("Overrun error!n");
  258.     break;
  259. case 2:
  260.     Uart_Printf("Parity error!n");
  261.     break;
  262. case 4:
  263.     Uart_Printf("Frame error!n");
  264.     break;
  265. case 6:
  266.     Uart_Printf("Parity, Frame error!n");
  267.     break;
  268. case 8:
  269. Uart_Printf("Breake detectn");
  270. break;
  271. case 0xa:
  272. Uart_Printf("Parity error & Break detect!n");
  273. break;
  274. case 0xc:
  275. Uart_Printf("Frame error & Breake detectn");
  276. break;
  277. case 0xe:
  278. Uart_Printf("Parity, Frame error & Break detect!n");
  279. break;
  280. default :
  281. Uart_Printf("Unknown error : 0x%xn", iStatus);
  282.     break;
  283.     }
  284.     isRxInt=0;
  285. }
  286. void Test_Uart0_Int(void)
  287. {
  288. U8 ch;
  289. int iBaud;
  290.     Uart_Port_Set(); 
  291.     Uart_Select(1);    
  292.     Uart_Printf("nConnect PC[COM1 or COM2] and UART0 of SMDK2440 with a serial cable!!! n");
  293.     Uart_Printf("Then, press any key........n");
  294.     Uart_Select(0);
  295.     Uart_Getch();
  296. /******** For operating clock test *********/
  297. Uart_Printf("[Uart channel 0 Interrupt test]n");
  298. Uart_Printf("Select operating clock 1. PCLK(D)    2. UCLK     3. FCLK/n  nChoose : ");
  299. ch = Uart_Getch();
  300. switch (ch)
  301. {
  302. case '2' :
  303. rMISCCR = rMISCCR & ~(7<<8) | (1<<10); // CLKOUT1 = PCLK
  304. Uart_Uextclk_En(0, 115200, Pclk);
  305. break;
  306. case '3' :
  307. Uart_Printf("Type the baudrate and then change the same baudrate of host, too.n");
  308.  Uart_Printf("Baudrate (ex 9600, 115200[D], 921600) : ");
  309. iBaud = Uart_GetIntNum();
  310. if (iBaud == -1) iBaud = 115200;
  311. Uart_Fclkn_En(0, iBaud);
  312. Uart_Getch();
  313. break;
  314. default :
  315. Uart_Pclk_En(0, 115200);
  316. }
  317. #if 0       
  318. /******** Select UART or IrDA *********/
  319. Uart_Printf("Select 1. UART(D) or  2. IrDA modenChoose : ");
  320. if (Uart_Getch() == '2')
  321. rULCON0 |= (1<<6); // IrDA mode
  322. else
  323. rULCON0 &= ~(1<<6); // UART mode
  324. #endif
  325. /*********** UART0 Tx test with interrupt ***********/  
  326.     isTxInt=1;
  327.     uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0 Tx interrupt test is good!!!!rn";
  328.     Uart_Printf("[Uart channel 0 Tx Interrupt Test]n");
  329.     pISR_UART0=(unsigned)Uart0_TxInt;
  330.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  331.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  332.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  333.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  334.     rINTMSK=~(BIT_UART0);
  335.     rINTSUBMSK=~(BIT_SUB_TXD0);
  336.     while(isTxInt);
  337.     
  338.     /*********** UART0 Rx test with interrupt ***********/
  339.     isRxInt=1;
  340.     uart0RxStr=(char *)UARTBUFFER;
  341.     Uart_Printf("n[Uart channel 0 Rx Interrupt Test]:n");
  342.     Uart_Printf("After typing characters and ENTER key  you will see the characters which was typed by you.");
  343.     Uart_Printf("nTo quit, press ENTER key.!!!n");
  344.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  345.     pISR_UART0 =(unsigned)Uart0_RxIntOrErr;
  346.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  347.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  348.     //Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  349.     // Clear Int Pending and Unmask    
  350.     ClearPending(BIT_UART0);
  351.     rINTMSK=~(BIT_UART0);
  352.     rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);    
  353.     rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
  354.     
  355.     while(isRxInt);
  356.     
  357.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0);
  358.     rINTMSK|=(BIT_UART0);
  359.  
  360.     Uart_Printf("%sn",(char *)UARTBUFFER);
  361.      Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  362.     Uart_Printf("Then, press any key........n");
  363.    
  364.     Uart_Select(1);
  365.     Uart_Getch();
  366.     Uart_Port_Return();
  367. }
  368. void __irq Uart0_TxDmaDone(void)
  369. {
  370.     rDMASKTRIG0=0x0; // Stop Dma0
  371.     isDone=0;
  372.     rINTMSK |= BIT_DMA0;
  373.     ClearPending(BIT_DMA0);
  374. }
  375. void __irq Uart0_RxDmaOrErr(void)
  376. {
  377.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  378.     if(rSUBSRCPND&BIT_SUB_ERR0)  __sub_Uart0_RxErrInt();
  379.     
  380.     ClearPending(BIT_UART0);
  381.     rSUBSRCPND=(BIT_SUB_ERR0); // Clear Sub int pending    
  382.     rINTSUBMSK&=~(BIT_SUB_ERR0);    
  383. }
  384. void __irq Uart0_RxDmaDone(void)
  385. {
  386.     rDMASKTRIG0=0x0; //DMA0 Channel Off
  387.     isDone=0;
  388.     *(uart0RxStr+5)='';
  389.     rINTMSK|=(BIT_DMA0);
  390.     ClearPending(BIT_DMA0);
  391. }
  392. void Test_Uart0_Dma(void)
  393. {
  394.     Uart_Port_Set(); 
  395.     Uart_Select(1);    
  396.     /*********** UART0 Tx test with DMA0 ***********/ 
  397.     isDone=1;
  398.     uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0 Tx Test by DMA0 is good!!!!rn";
  399.     Uart_Printf("n[Uart channel 0 DMA0 Tx Test]n");
  400.     Uart_TxEmpty(1);
  401.     Uart_Printf("nConnect PC[COM1 or COM2] and UART0 of SMDK2440 with a serial cable!!! n");
  402.     Uart_Printf("Then, press any key........n");
  403.    
  404.     Uart_Select(0);
  405.     Uart_Getch();
  406.    
  407.     pISR_DMA0  =(unsigned)Uart0_TxDmaDone;
  408.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  409.     rUCON0 = (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(2<<2)|(0);
  410.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:dma0,Rx:x
  411.     /***DMA0 init***/
  412.     rDISRC0=(U32)uart0TxStr; // Start address
  413.     rDISRCC0=(0<<1)|(0); // AHB,Increment
  414.     rDIDST0=(U32)UTXH0; // Memory buffer Address
  415.     rDIDSTC0=(1<<1)|(1); // APB,Fixed
  416.     rDCON0=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|strlen((char*)uart0TxStr);
  417.     //handshake, sync PCLK, TC int, single tx, single service, Uart0, H/W request,auto-reload off, Byte size Tx, Tx count value
  418.     rINTMSK=~(BIT_DMA0);
  419.     rDMASKTRIG0=(0<<2)|(1<<1)|(0);    //no-stop, DMA0 channel on, no-SW trigger 
  420.     while(isDone);
  421.     /*********** UART0 Rx test with DMA0 ***********/ 
  422.     isDone=1;
  423.     uart0RxStr=(char *)UARTBUFFER;
  424.    
  425.     Uart_Printf("n[Uart channel 0 DMA0 Rx Test]n");
  426.     Uart_Printf("Type any five keys!!!n");    
  427.     Uart_Printf("Then you will see what you typed.n");
  428.     pISR_DMA0=(unsigned)Uart0_RxDmaDone;
  429.     pISR_UART0=(unsigned)Uart0_RxDmaOrErr;
  430.     
  431.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  432.     rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction  
  433.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(2);
  434.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:dma0
  435.     
  436.     /***DMA0 init***/
  437.     rDISRC0=(U32)URXH0; // Start address
  438.     rDISRCC0=(1<<1)|(1); // APB,Fixed
  439.     rDIDST0=(U32)uart0RxStr;         // Memory buffer Address
  440.     rDIDSTC0= (0<<1)|(0); // AHB,Increment
  441.     rDCON0=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(5);
  442.     //handshake, sync PCLK, TC int, single tx, single service, Uart0, H/W request,auto-reload off, Byte size Tx, Tx count value
  443.     // Clear Int Pending and Unmask    
  444.     ClearPending(BIT_UART0);
  445.     rINTMSK=~(BIT_DMA0|BIT_UART0);
  446.     rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);        
  447.     rINTSUBMSK=~(BIT_SUB_ERR0);
  448.     rDMASKTRIG0=(0<<2)|(1<<1)|(0);    //no-stop, DMA0 channel on, no-SW trigger 
  449.     while(isDone);
  450.     Uart_Printf("%sn",uart0RxStr);
  451.      Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  452.     Uart_Printf("Then, press any key........n");
  453.    
  454.     Uart_Select(1);
  455.     Uart_Getch();
  456.     Uart_Port_Return();
  457. }
  458. volatile U32 *fifo_cnt; //temporary for fifo count test
  459. volatile U32 fcnt = 0;
  460. void __irq Uart0_TxFifo(void)
  461. {
  462.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0); // Just for the safety
  463. rINTMSK|=BIT_UART0;
  464. rSUBSRCPND=BIT_SUB_TXD0; // Clear Sub int pending
  465. ClearPending(BIT_UART0); // Clear master pending
  466. *fifo_cnt++ = ++fcnt;
  467. *fifo_cnt++ = rUFCON0;
  468. *fifo_cnt++ = (rUFSTAT0>>8)&0x3f;
  469. *fifo_cnt = 0;
  470.     while (!(rUFSTAT0 & 0x4000) && (*uart0TxStr != ''))  //until tx fifo full or end of string
  471.      WrUTXH0(*uart0TxStr++);
  472.     if(*uart0TxStr != '') 
  473.     {
  474.         rINTSUBMSK&=~(BIT_SUB_TXD0); // Unmask sub int
  475.         rINTMSK&=~(BIT_UART0);
  476.     }
  477. }
  478. void __irq Uart0_RxFifoOrErr(void)
  479. {
  480.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  481.     if(rSUBSRCPND&BIT_SUB_RXD0) __sub_Uart0_RxFifo();
  482.     else __sub_Uart0_RxErrInt();
  483.     ClearPending(BIT_UART0);
  484.     rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); // Clear Sub int pending    
  485.     rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);    
  486. }
  487. void __sub_Uart0_RxFifo(void)
  488. {
  489.     while(rUFSTAT0&0x7f) //During the Rx FIFO is not empty
  490.     {
  491. rx_point++;
  492. if(rx_point<5)
  493. rx_filesize |= (RdURXH0()<<(8*(rx_point-1))); // First 4-bytes mean file size
  494. else if(rx_point>(rx_filesize-2))
  495. {
  496. rx_dncs |= (RdURXH0()<<(8*(1-(rx_filesize-rx_point)))); //Last 2-bytes mean checksum.
  497. if(rx_point==rx_filesize) rx_isdone=0;
  498. }
  499. else
  500. rx_checksum+=RdURXH0();
  501.     }
  502. }
  503. void Test_Uart0_Fifo(void)
  504. {
  505. int i;
  506.     Uart_Port_Set(); 
  507.     Uart_Select(1);
  508.     /******* UART0 Tx FIFO test with interrupt ********/     
  509.     Uart_Printf("[Uart channel 0 Tx FIFO Interrupt Test]n");
  510.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  511.     Uart_Printf("nConnect PC[COM1 or COM2] and UART0 of SMDK2440 with a serial cable!!! n");
  512.     Uart_Printf("Then, press any key........n");
  513.    
  514.     Uart_Select(0);
  515.     Uart_Getch();
  516. fifo_cnt = (U32 *)_NONCACHE_STARTADDRESS; // temporary buffer
  517.     /* <Tx Trigger Level:empty> */    
  518.     uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART0 Tx FIFO interrupt(TL 48byte) test is good!!!!rn";
  519.     pISR_UART0=(U32)Uart0_TxFifo;
  520.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  521.     rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction    
  522.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(0);
  523.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:x
  524.     rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  525.     //Tx and Rx FIFO Trigger Level:8byte,Tx and Rx FIFO Reset,FIFO on
  526.     rINTMSK=~(BIT_UART0);
  527.     rINTSUBMSK=~(BIT_SUB_TXD0);
  528.     Delay(500);
  529. rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  530. // edited by junon
  531. /* <Tx Trigger Level:16Byte> */   
  532. rUFCON0=(2<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  533. uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART0 Tx FIFO interrupt(TL 32byte) test is good!!!!rn";
  534. rINTMSK=~(BIT_UART0);
  535. rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  536. Delay(500);
  537. /* <Tx Trigger Level:32Byte> */   
  538. rUFCON0=(1<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  539. uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART0 Tx FIFO interrupt(TL 16byte) test is good!!!!rn";
  540. rINTMSK=~(BIT_UART0);
  541. rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  542. Delay(500);
  543. /* <Tx Trigger Level:48Byte> */   
  544. rUFCON0=(0<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  545. uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ->UART0 Tx FIFO interrupt(TL 0byte) test is good!!!!rn";
  546. rINTMSK=~(BIT_UART0);
  547. rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  548. Delay(500);
  549. rUFCON0=(0<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  550. //Tx and Rx FIFO Trigger Level:48byte,Tx and Rx FIFO Reset,FIFO off
  551. Uart_Printf("Saved FIFO current count in ISR!! Interrupt count : %dn",fcnt);
  552. fifo_cnt = (U32 *)_NONCACHE_STARTADDRESS;
  553. while(*fifo_cnt)
  554. Uart_Printf("[0x%x,%d,0x%x,%d] ", fifo_cnt, *fifo_cnt++, *fifo_cnt++,*fifo_cnt++);
  555. fcnt = 0;
  556.     /******* UART0 Rx FIFO test with interrupt ********/     
  557.     rx_dncs=0;
  558.     rx_point=0;
  559.     rx_isdone=1;
  560.     rx_filesize=0;
  561.     rx_checksum=0;
  562.     Uart_Printf("[Uart channel 0 Rx FIFO Interrupt Test]n");
  563. //----------------------------------------------------
  564.     pISR_UART0=(unsigned)Uart0_RxFifoOrErr;
  565.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  566.     rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction
  567.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  568.     //Clock,Tx:Def,Rx:Def,Rx timeout:o,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  569.     rUFCON0=(1<<6)|(2<<4)|(1<<2)|(1<<1)|(1);
  570.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on
  571.     // Clear Int Pending and Unmask 
  572.     ClearPending(BIT_UART0);
  573.     rINTMSK=~(BIT_UART0);
  574.     rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  575.     rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
  576.     Uart_Printf("Download the target file[*.bin] by Uart0n");
  577.     while(rx_isdone);
  578.     rINTMSK |= (BIT_UART0);
  579.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  580.     rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  581.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off
  582.     if(rx_dncs==(rx_checksum&0xffff)) 
  583. Uart_Printf("nDownload test OK!!!n");
  584.     else 
  585. Uart_Printf("nError!!!n");
  586.     Uart_Printf("nConnect PC[COM1 or COM2] and UART1 of SMDK2440 with a serial cable!!! n");
  587.     Uart_Printf("Then, press any key........n");
  588.    
  589.     Uart_Select(1);
  590.     Uart_Getch();
  591.     Uart_Port_Return();
  592. }
  593. void __irq Uart0_AfcTx(void)
  594. {
  595.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  596.     if(tx_cnt<AFC_BUFLEN)
  597.     {
  598.      Uart_Printf("%d,",*txdataPt);
  599.      WrUTXH0(*txdataPt++);
  600. tx_cnt++;
  601.         ClearPending(BIT_UART0);
  602.         rSUBSRCPND=(BIT_SUB_TXD0);
  603.         rINTSUBMSK&=~(BIT_SUB_TXD0);
  604.     }
  605.     else
  606.     {
  607.      tx_end=1;
  608.         while(rUFSTAT0 & 0x7f00); //Until FIFO is empty
  609.         ClearPending(BIT_UART0);
  610.         rSUBSRCPND=(BIT_SUB_TXD0);
  611.      rINTMSK|=BIT_UART0;
  612.     }
  613. }
  614. void __irq Uart0_AfcRxOrErr(void)
  615. {
  616.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  617.     if(rSUBSRCPND&BIT_SUB_RXD0) __sub_Uart0_RxAfc();    
  618.     else __sub_Uart0_RxErrInt();
  619.     ClearPending(BIT_UART0);
  620.     rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  621.     rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  622. }
  623. void __sub_Uart0_RxAfc(void)
  624. {
  625.     while( rUFSTAT0 & 0x7f )
  626.     {
  627. *rxdataPt=rURXH0;
  628. Uart_Printf("%d,",*rxdataPt++);
  629. rx_cnt++;
  630.     }
  631.     if(rx_cnt == AFC_BUFLEN) 
  632.     {
  633.     rx_end=1;
  634.      rINTMSK|=BIT_UART0;
  635.     }
  636. }
  637.  
  638. void Test_Uart0_AfcTx(void)
  639. {
  640.     int i;
  641.     tx_cnt=0;
  642.     tx_end=0;
  643.     txdataFl=(volatile U8 *)UARTBUFFER;
  644.     txdataPt=(volatile U8 *)UARTBUFFER;
  645.     for(i=0;i<AFC_BUFLEN;i++) *txdataFl++=i; // Initialize the AFC data
  646.     Uart_Port_Set(); 
  647.     Uart_Select(1);
  648.     Uart_Printf("[Uart channel 0 AFC Tx Test]n");
  649.     Uart_Printf("This test should be configured two boards.n");
  650.     Uart_Printf("Connect Tx and Rx Board with twitsted(rx/tx, nCTS/nRTS) cable .n");
  651.      
  652.    
  653.     pISR_UART0=(unsigned) Uart0_AfcTx;
  654.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  655.     rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction    
  656.     rUCON0 |= (1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  657.     //Clock,Tx:Lev,Rx:Lev,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  658.     rUFCON0=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  659.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on
  660.     rUMCON0=0x10;   // Enable Uart0 AFC 
  661.     Uart_Printf("nKeep the connection between PC[COM1 or COM2] and UART1 of SMDK2410!!! n");
  662.     Uart_Printf("Press any key to start Rx and then Star Tx....n");
  663.     Uart_TxEmpty(1);
  664.     Uart_Getch();
  665.   
  666.     // Clear Int Pending and Unmask 
  667.     rINTMSK=~(BIT_UART0);
  668.     rINTSUBMSK=~(BIT_SUB_TXD0);
  669.      while(!tx_end);
  670.      rINTMSK|=(BIT_UART0);
  671.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  672.     rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  673.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off
  674.     Uart_Printf("nEnd Tx, transfer data count=%dn",tx_cnt);
  675.     Uart_Port_Return();
  676. }
  677. void Test_Uart0_AfcRx(void)
  678. {
  679.     unsigned int i;
  680.     rx_cnt=0;
  681.     rx_end=0;
  682.     afc_err=0;
  683.     rxdataCk=(volatile U8 *)UARTBUFFER;
  684.     rxdataPt=(volatile U8 *)UARTBUFFER;
  685.     Uart_Port_Set(); 
  686.     Uart_Select(1);
  687.     Uart_Printf("[Uart channel 0 AFC Rx Test]n");
  688.     Uart_Printf("This test should be configured two boards.n");
  689.     Uart_Printf("Connect Tx and Rx Board with twitsted(rx/tx, nCTS/nRTS) cable .n");
  690.     
  691.     pISR_UART0=(unsigned) Uart0_AfcRxOrErr;
  692.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  693.     rUCON0 &= 0x400; // For the PCLK <-> UCLK fuction    
  694.     rUCON0 |= (1<<9)|(1<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  695.     //Clock,Tx:Lev,Rx:Lev,Rx timeout:o,Rx error int:o,Loop-back:x,Send break:x,Tx:o,Rx:o
  696.     
  697.     rUFCON0=(1<<6)|(0<<4)|(1<<2)|(1<<1)|(1);
  698.     //Tx and Rx FIFO Trigger Level:4byte,Tx and Rx FIFO Reset,FIFO on
  699.     rUMCON0=0x10;   // Enable Uart0 AFC 
  700.     
  701.     Uart_Printf("nKeep the connection between PC[COM1 or COM2] and UART0 of SMDK2410!!! n");
  702.     Uart_Printf("Press any key to start Rx and then Star Tx....n");
  703.     Uart_Getch();
  704.  
  705.    // Clear Int Pending and Unmask 
  706.      rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  707.      rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
  708.      ClearPending(BIT_UART0);
  709.      rINTMSK=~(BIT_UART0);
  710.     while(!rx_end);
  711.   //  rINTMSK|=BIT_UART0;
  712.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  713.     rUFCON0=(3<<6)|(2<<4)|(1<<2)|(1<<1)|(0);
  714.     //Tx and Rx FIFO Trigger Level:12byte,Tx and Rx FIFO Reset,FIFO off
  715.     Uart_Printf("nEnd Rx, receive data count=%dn",rx_cnt);
  716.     for(i=0;i<AFC_BUFLEN;i++) 
  717.      if(i-(*rxdataCk++)) {
  718.      Uart_Printf("i=%dn",i);
  719.      afc_err++;
  720.      }
  721.     if(afc_err)
  722.      Uart_Printf("AFC test fail!! Error count=%dn",afc_err);
  723.     else
  724.      Uart_Printf("AFC test is good!!n");
  725.     Uart_Port_Return();
  726. }
  727. // added by junon start
  728. void __irq Uart0_RxOverrunErr(void)
  729. {
  730.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  731.     if(rSUBSRCPND&BIT_SUB_ERR0) 
  732. {
  733. __sub_Uart0_RxErrInt();
  734.      ClearPending(BIT_UART0); 
  735.     rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_ERR0); // Clear Sub int pending    
  736. return;
  737.     }
  738.     rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_ERR0);    
  739. }
  740. void Test_Uart0_RxErr(void) // need two serial port cables.
  741. {
  742. U8 ch;
  743. U8 cError;
  744.     Uart_Port_Set(); 
  745.    
  746.     Uart_Select(1);
  747.     Uart_Printf("nConnect PC[COM1 or COM2] and UART0 of SMDK2440 with a serial cable!!! n");
  748.     Uart_Printf("In this case, Uart0 : test port,  Uart1 : debug portn");
  749.     Uart_Printf("Then, press any key........n");
  750. //    Uart_Select(0); // Change the uart port    
  751.     Uart_Getch();
  752.    while(1)
  753. {
  754.     /*********** UART0 Rx test with interrupt ***********/
  755.     isRxInt=1;
  756.     uart0RxStr=(char *)UARTBUFFER;
  757.     Uart_Printf("n[Uart channel 0 Rx Error Check]n");
  758.     Uart_TxEmpty(1); //wait until tx buffer is empty.
  759. rUFCON0=(1<<6)|(0<<4)|(1<<2)|(1<<1)|0; // FIFO disable
  760. // for 2440A. add Frame error, Parity error, Break detect check.
  761.     Uart_Printf("n1. Overrun Error check[D]   2. Frame error   3. Parity error  n"); 
  762. cError = Uart_Getch();
  763.     if (cError== '2')
  764. {
  765. pISR_UART0 =(unsigned)Uart0_RxIntOrErr;
  766. rULCON0=(0<<6)|(4<<3)|(0<<2)|(0); // Normal,No parity,One stop bit, 7bit
  767. rUCON0 = (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  768. //Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  769. Uart_Printf("This port was set 7 data bit, no parity, 1 stop bit. Send just characters..n");
  770.     }
  771. else if (cError== '3')
  772. {
  773. pISR_UART0 =(unsigned)Uart0_RxIntOrErr;
  774. rULCON0=(0<<6)|(5<<3)|(0<<2)|(3); // Normal,Even parity,One stop bit, 8bit
  775. rUCON0 = (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  776. //Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  777. Uart_Printf("This port was set 8 data bit, even parity, 1 stop bit. Send just characters..n");
  778. }
  779.     else 
  780. {
  781. pISR_UART0 = (unsigned)Uart0_RxOverrunErr;
  782. rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  783.     rUCON0 = (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  784.     //Clock,Tx:pulse,Rx:pulse,Rx timeout:x,Rx error int:o,Loop-back:x,Send break:x,Tx:int,Rx:int
  785. Uart_Printf("1. Using FIFO 2. Not using FIFO[D] n");
  786. if (Uart_Getch() == '1') 
  787. {
  788. rUFCON0 |= 1;
  789. Uart_Printf("Press Any key as 65 times in UART0 terminal window..n");
  790. Uart_Printf("then Overrun error will be occured.. n"); 
  791. }
  792. else
  793. {
  794. rUFCON0 &= ~1;
  795. Uart_Printf("Press Any key as 2 times in UART0 terminal window..n");
  796. Uart_Printf("then Overrun error will be occured.. n");
  797. }
  798. }
  799.     // Clear Int Pending and Unmask    
  800.     rSUBSRCPND=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);    
  801.     ClearPending(BIT_UART0);
  802.     rINTSUBMSK=~(BIT_SUB_RXD0|BIT_SUB_ERR0);
  803.     rINTMSK=~(BIT_UART0);
  804.     while(isRxInt);
  805. // UART0 mask
  806.      rINTSUBMSK|=(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);
  807. rINTMSK|=(BIT_UART0);
  808. rUFCON0 |= 3<<1; // fifo reset
  809. Uart_Printf("1. One more  2. Exit[D] n");
  810. if (Uart_Getch() == '1') continue;
  811. else break;
  812. }
  813.     Uart_Port_Return();
  814. }
  815. #if 0
  816. void Enter_Uart0_ISR(void)
  817. {
  818. rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  819. rINTMSK |= BIT_UART0;
  820. ClearPending(BIT_UART0);
  821. rSUBSRCPND=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  822. }
  823. void Exit_Uart0_ISR(void)
  824. {
  825. rINTSUBMSK&=~(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  826. rINTMSK &= ~(BIT_UART0);
  827. }
  828. void __irq Uart0_Cts(void)
  829. {
  830. Enter_Uart0_ISR();
  831. Exit_Uart0_ISR();
  832. }
  833. void Test_Rts_Rx(void)
  834. {
  835.     int i = 1;
  836.     Uart_Port_Set(); 
  837.     //U32 safc_rGPHCON,safc_rGPHDAT,safc_rGPHUP;
  838.     tx_cnt=0;
  839.     Uart_Select(1);
  840.     Uart_Printf("[Uart channel 0 CTS Rx Test]n");
  841.     Uart_Printf("Check nCTS0 signal with oscilloscope! n");
  842. Uart_Printf("When FIFO nuber is 32, Active nRTS0... n");
  843.     
  844. //    pISR_UART0=(unsigned) Uart0_Cts;
  845.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  846.     rUCON0 |= (1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  847.     //Clock,Tx:Lev,Rx:Lev,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  848.     rUFCON0=(3<<6)|(3<<4)|(1<<2)|(1<<1)|(1);
  849.     //Tx and Rx FIFO Trigger Level:32byte,Tx and Rx FIFO Reset,FIFO on
  850.     rUMCON0=0x10;   // Enable Uart0 AFC 
  851. // rINTMSK&=~(BIT_UART0);
  852. // rINTSUBMSK&=~(BIT_SUB_RXD0);
  853. rINTMSK |= (BIT_UART0); 
  854. rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_TXD0|BIT_SUB_ERR0);
  855. while( Uart_Getch() != 'r');  // just press any key at 32 times..
  856. Uart_Printf("nEnd Tx, transfer data count=%dn",tx_cnt);
  857. Uart_Select(0);
  858.     Uart_Port_Return();
  859. }
  860. #endif
  861. void Test_Uart0_Temp(void)
  862. {
  863. U8 ch;
  864. int iBaud;
  865. volatile char *cStartBuf;
  866.     Uart_Port_Set(); 
  867.     Uart_Select(1);    
  868. /******** For operating clock test *********/
  869. Uart_Printf("[Uart channel 0 Interrupt test]n");
  870. Uart_Printf("Select operating clock 1. PCLK    2. UCLK     3. FCLK/n(D)  nChoose : ");
  871. ch = Uart_Getch();
  872. switch (ch)
  873. {
  874. case '1' :
  875. Uart_Pclk_En(0, 115200);
  876. break;
  877. case '2' :
  878. rMISCCR = rMISCCR & ~(7<<8) | (1<<10); // CLKOUT1 = PCLK
  879. Uart_Uextclk_En(0, 115200, Pclk);
  880. break;
  881. default :
  882. Uart_Printf("Type the baudrate and then change the same baudrate of host, too.n");
  883. Uart_Printf("Baudrate (ex 9600, 115200, 921600[D]) : ");
  884. iBaud = Uart_GetIntNum();
  885. if (iBaud == -1) iBaud = 921600;
  886. Uart_Fclkn_En(0, iBaud);
  887. Uart_Getch();
  888. break;
  889. }
  890. /*********** UART0 Tx test with interrupt ***********/  
  891.     isTxInt=1;
  892.     uart0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890->UART0 Tx interrupt test is good!!!!rn";
  893. cStartBuf = uart0TxStr;
  894.     Uart_Printf("[Uart channel 0 Tx Interrupt Test]n");
  895.     pISR_UART0=(unsigned)Uart0_TxInt;
  896.     rULCON0=(0<<6)|(0<<3)|(0<<2)|(3); // Normal,No parity,One stop bit, 8bit
  897.     rUCON0 |= (TX_INTTYPE<<9)|(RX_INTTYPE<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1);
  898.     //Clock,Tx:Def,Rx:Def,Rx timeout:x,Rx error int:x,Loop-back:x,Send break:x,Tx:int,Rx:int
  899. Uart_Printf("BRDIV0 = 0x%xn", rUBRDIV0);
  900. Uart_Printf("UCON0 = 0x%xn", rUCON0);
  901. Uart_Printf("UCON1 = 0x%xn", rUCON1);
  902. Uart_Printf("Press enter key to exit n");
  903.     Uart_TxEmpty(0); //wait until tx buffer is empty.
  904.     rINTMSK&=~(BIT_UART0);
  905.     rINTSUBMSK&=~(BIT_SUB_TXD0);
  906.     while(1)
  907. {
  908. if (isTxInt==0)
  909. {
  910. uart0TxStr = cStartBuf;
  911. rINTMSK&=~(BIT_UART0);
  912. rINTSUBMSK&=~(BIT_SUB_TXD0|BIT_SUB_RXD0|BIT_SUB_ERR0);
  913. isTxInt=1;
  914. }
  915. if (Uart_GetKey()=='r') break;
  916.     }
  917.     
  918.     rINTSUBMSK|=(BIT_SUB_RXD0|BIT_SUB_ERR0);
  919.     rINTMSK|=(BIT_UART0);
  920.  
  921.     Uart_Port_Return();
  922. }
  923. // junon end
  924. //---------------------------------------UART0 test function-------------------------------------