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

uCOS

开发平台:

C/C++

  1. /*============================================================
  2. File Name: SPI.c
  3. Description: S3C2440A SPI controller Function Test
  4.     Version: 0.1 
  5.     History:
  6.       0.1: 2003. 07. 06, Programming Start.
  7.       0.2: 2004. 05. 14, added keyboard test codes 
  8.                    
  9. =============================================================*/
  10. #include <string.h>
  11. #include "2440addr.h"
  12. #include "2440lib.h"
  13. #include "spi.h"
  14. #include "def.h"
  15. #define spi_count 0x80
  16. #define SPI_BUFFER _NONCACHE_STARTADDRESS
  17. void __irq Spi_Int(void);
  18. void __irq Dma1Tx_Int(void);
  19. void __irq Dma1Rx_Int(void);
  20. void Test_Spi1_MS_poll(void); // added by junon
  21. volatile char *spiTxStr,*spiRxStr;
  22. volatile int endSpiTx;
  23. volatile int tx_dma1Done;
  24. volatile int rx_dma1Done;
  25. unsigned int spi_rGPECON,spi_rGPEDAT,spi_rGPEUP;
  26. unsigned int spi_rGPGCON,spi_rGPGDAT,spi_rGPGUP;
  27. unsigned int spi_rGPDCON,spi_rGPDDAT,spi_rGPDUP;
  28. /////////////////////// 2004.05.14 added by junon
  29. #define ONEBIT    0x1
  30. int putcToKBCTL(U8 c);
  31. void getsFromKBCTL(U8 *m, int cnt);
  32. void Test_Spikbd_IO(void);
  33. void Test_Spikbd_keyscan(void);
  34. unsigned int spikbd_rGPBCON,spikbd_rGPBDAT,spikbd_rGPBUP;
  35. unsigned int spikbd_rGPDCON,spikbd_rGPDDAT,spikbd_rGPDUP;
  36. unsigned int spikbd_rGPFCON,spikbd_rGPFDAT,spikbd_rGPFUP;
  37. unsigned int spikbd_rGPGCON,spikbd_rGPGDAT,spikbd_rGPGUP;
  38. ///////////////////////
  39. /****************************************************************
  40.  *              SMDK2400 SPI configuration                 *
  41.  *  GPG2=nSS0, GPE11=SPIMISO0, GPE12=SPIMOSI0, GPE13=SPICLK0     *
  42.  *  GPG3=nSS1, GPG5 =SPIMISO1, GPG6 =SPIMOSI1, GPG7 =SPICLK1      *
  43.  *  SPI1 is tested by OS(WINCE). So, Only SPI0 is tested by this code          *               
  44.  ****************************************************************/
  45. void * func_spi_test[][2]=
  46. {
  47. //     "0123456789012345" max 15磊 肺茄沥窍咯 comment窍技夸.
  48. //SPI
  49. (void *)Test_Spi_MS_int,  "SPI0 RxTx Int  ",
  50. (void *)Test_Spi_MS_poll,  "SPI0 RxTx POLL ",
  51. (void *)Test_Spi_M_Int,  "SPI0 M Rx INT  ",
  52. (void *)Test_Spi_S_Int,  "SPI0 S Tx INT  ",
  53. (void *)Test_Spi_M_Tx_DMA1,  "SPI0 M Tx DMA1 ",
  54. (void *)Test_Spi_S_Rx_DMA1,  "SPI0 S Rx DMA1 ",
  55. (void *)Test_Spi_M_Rx_DMA1,  "SPI0 M Rx DMA1 ",
  56. (void *)Test_Spi_S_Tx_DMA1,  "SPI0 S Tx DMA1 ",
  57. (void *)Test_Spi1_MS_poll,  "SPI1 RxTx POLL ",
  58. (void *)Test_Spikbd_IO, "SPI1 keybd IO  ",
  59. (void *)Test_Spikbd_keyscan, "SPI1 keybd scan",
  60. 0,0
  61. };
  62. void Spi_Test(void)
  63. {
  64. int i;
  65. Uart_Printf("n======  SPI Test program start ======n");
  66. while(1)
  67. {
  68. i=0;
  69. Uart_Printf("nn");
  70. while(1)
  71. {   //display menu
  72. Uart_Printf("%2d:%s",i,func_spi_test[i][1]);
  73. i++;
  74. if((int)(func_spi_test[i][0])==0)
  75. {
  76. Uart_Printf("n");
  77. break;
  78. }
  79. if((i%4)==0)
  80. Uart_Printf("n");
  81. }
  82. Uart_Printf("nPress Enter key to exit : ");
  83. i = Uart_GetIntNum();
  84. if(i==-1) break; // return.
  85. if(i>=0 && (i<((sizeof(func_spi_test)-1)/8)) ) // select and execute...
  86. ( (void (*)(void)) (func_spi_test[i][0]) )();
  87. }
  88. Uart_Printf("n====== SPI Test program end ======n");
  89. }
  90. void SPI_Port_Init(int MASorSLV)
  91. {
  92. // SPI channel 0 setting
  93.     spi_rGPECON=rGPECON;
  94.     spi_rGPEDAT=rGPEDAT;
  95.     spi_rGPEUP=rGPEUP;
  96.     rGPECON=((rGPECON&0xf03fffff)|0xa800000); // using SPI 0
  97. rGPEUP = (rGPEUP & ~(7<<11)) | (1<<13);
  98.     spi_rGPGCON=rGPGCON;
  99.     spi_rGPGDAT=rGPGDAT;
  100.     spi_rGPGUP=rGPGUP;
  101.     if(MASorSLV==1)
  102.     {
  103.         rGPGCON=((rGPGCON&0xffffffcf)|0x10); // Master(GPIO_Output)
  104.         rGPGDAT|=0x4; // Activate nSS 
  105.     }
  106.     else
  107.      rGPGCON=((rGPGCON&0xffffffcf)|0x30); // Slave(nSS)
  108.     rGPGUP|=0x4;
  109. /*
  110. // SPI channel 1-1 setting --> Key board
  111. rGPGCON=(rGPGCON&0xffff033f)|(3<<6)|(3<<10)|(3<<12)|(1<<14); // MISO1, MOSI1, CLK1, Master
  112. rGPGDAT|=0x8;
  113. rGPGUP=(rGPGUP&~(7<<5))|(1<<7);
  114. */
  115. // SPI channel 1-2 setting --> VD16~18
  116. spi_rGPDCON=rGPDCON;
  117. spi_rGPDDAT=rGPDDAT;
  118. spi_rGPDUP=rGPDUP;
  119. rGPDCON=(rGPDCON&0xcfc0ffff)|(3<<16)|(3<<18)|(3<<20)|(1<<28); // MISO1, MOSI1, CLK1, Master
  120. rGPDDAT|=1<<14;
  121. rGPDUP=(rGPDUP&~(7<<8))|(1<<10);
  122. }
  123. void SPI_Port_Return(void)
  124. {
  125.     rGPECON=spi_rGPECON;
  126.     rGPEDAT=spi_rGPEDAT;
  127.     rGPEUP=spi_rGPEUP;
  128.     rGPGCON=spi_rGPGCON;
  129.     rGPGDAT=spi_rGPGDAT;
  130.     rGPGUP=spi_rGPGUP;
  131.     rGPDCON=spi_rGPDCON;
  132.     rGPDDAT=spi_rGPDDAT;
  133.     rGPDUP=spi_rGPDUP;
  134. }
  135. void Test_Spi1_MS_poll(void)
  136. {
  137.     int i;
  138.     char *txStr,*rxStr;
  139.     SPI_Port_Init(1); 
  140.     Uart_Printf("[SPI Polling Tx/Rx Test]n");
  141.     Uart_Printf("Connect SPIMOSI1 into SPIMISO1.n");
  142.     endSpiTx=0;
  143.     spiTxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 - SPI1";
  144.     spiRxStr=(char *) SPI_BUFFER;
  145.     txStr=(char *)spiTxStr;
  146.     rxStr=(char *)spiRxStr;
  147.     rSPPRE1=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  148.     rSPCON1=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
  149.     rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  150.     
  151.     while(endSpiTx==0)
  152.     {
  153. if(rSPSTA1&0x1)   //Check Tx ready state    
  154. {
  155.      if(*spiTxStr!='')
  156. rSPTDAT1=*spiTxStr++;
  157.      else
  158. endSpiTx=1;
  159.      while(!(rSPSTA1&0x1));   //Check Rx ready state 
  160. *spiRxStr++=rSPRDAT1;
  161. }
  162.     }
  163.     rSPCON1&=~(1<<4);//dis-SCK
  164.     *(spiRxStr-1)='';//remove last dummy data & attach End of String(Null)
  165.     
  166.     Uart_Printf("Tx Strings:%sn",txStr);
  167.     Uart_Printf("Rx Strings:%s :",rxStr);
  168.     
  169.     if(strcmp(rxStr,txStr)==0)
  170.         Uart_Printf("O.K.n");
  171.     else 
  172.         Uart_Printf("ERROR!!!n");
  173.     SPI_Port_Return();
  174. }
  175. void Test_Spi_MS_int(void)
  176. {
  177.     char *txStr,*rxStr;
  178.     SPI_Port_Init(1); 
  179.     Uart_Printf("[SPI0 Interrupt Tx/Rx Test]n");
  180.     Uart_Printf("Connect SPIMOSI0 into SPIMISO0.n");
  181.     pISR_SPI0=(unsigned)Spi_Int;
  182.     endSpiTx=0;
  183.     spiTxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  184.     spiRxStr=(char *) SPI_BUFFER;
  185.     txStr=(char *)spiTxStr;
  186.     rxStr=(char *)spiRxStr;
  187.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  188.     rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|0;//int,en-SCK,master,low,A,normal
  189.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  190.     rINTMSK=~(BIT_SPI0);
  191.     while(endSpiTx==0);
  192. rSPCON0&=~((1<<5)|(1<<4));//poll, dis-SCK
  193. Uart_Printf("Current Rx address = 0x%xn",spiRxStr);
  194.     *spiRxStr='';//attach End of String(Null)
  195.     Uart_Printf("Tx Strings:%sn",txStr);
  196.     Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
  197.     if(strcmp(rxStr+1,txStr)==0)
  198.         Uart_Printf("O.K.n");
  199.     else 
  200.         Uart_Printf("ERROR!!!n");
  201.     SPI_Port_Return();
  202. }
  203. void __irq Spi_Int(void)
  204. {
  205.     unsigned int status;
  206. rINTMSK|=BIT_SPI0;
  207.     ClearPending(BIT_SPI0); 
  208.     status=rSPSTA0;
  209.     if(rSPSTA0&0x6) 
  210.      Uart_Printf("Data Collision or Multi Master Error(0x%x)!!!n", status);
  211.     while(!(rSPSTA0&0x1));   //Check ready state
  212.     *spiRxStr++=rSPRDAT0;    //First Rx data is garbage data
  213. // Uart_Printf("Current Rx address = 0x%xn",spiRxStr);
  214.     
  215.     if(*spiTxStr!='') 
  216.     {
  217.      rSPTDAT0=*spiTxStr++;
  218. rINTMSK&=~BIT_SPI0;
  219.     }
  220.     else
  221.     {
  222.     endSpiTx=1;
  223.     }
  224. }
  225. void Test_Spi_MS_poll(void)
  226. {
  227.     int i;
  228.     char *txStr,*rxStr;
  229.     SPI_Port_Init(1); 
  230.     Uart_Printf("[SPI Polling Tx/Rx Test]n");
  231.     Uart_Printf("Connect SPIMOSI0 into SPIMISO0.n");
  232.     endSpiTx=0;
  233.     spiTxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  234.     spiRxStr=(char *) SPI_BUFFER;
  235.     txStr=(char *)spiTxStr;
  236.     rxStr=(char *)spiRxStr;
  237.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  238.     rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
  239.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  240.     
  241.     while(endSpiTx==0)
  242.     {
  243. if(rSPSTA0&0x1)   //Check Tx ready state    
  244. {
  245.      if(*spiTxStr!='')
  246. rSPTDAT0=*spiTxStr++;
  247.      else
  248. endSpiTx=1;
  249.      while(!(rSPSTA0&0x1));   //Check Rx ready state 
  250. *spiRxStr++=rSPRDAT0;
  251. }
  252.     }
  253.     rSPCON0&=~(1<<4);//dis-SCK
  254.     *(spiRxStr-1)='';//remove last dummy data & attach End of String(Null)
  255.     
  256.     Uart_Printf("Tx Strings:%sn",txStr);
  257.     Uart_Printf("Rx Strings:%s :",rxStr);
  258.     
  259.     if(strcmp(rxStr,txStr)==0)
  260.         Uart_Printf("O.K.n");
  261.     else 
  262.         Uart_Printf("ERROR!!!n");
  263.     SPI_Port_Return();
  264. }
  265. void Test_Spi_M_Tx_DMA1(void)
  266. {
  267.     int i,first,second;
  268.     unsigned char *tx_ptr;
  269.     SPI_Port_Init(1); // Master(GPIO) 
  270.     Uart_Printf("[SPI DMA1 Master Tx test]n");
  271.     Uart_Printf("This test should be configured two boardsnStart Rx first.n");
  272.     tx_ptr=(unsigned char *) SPI_BUFFER;
  273.     for(i=0; i<spi_count; i++)
  274. *(tx_ptr+i)=i; 
  275.     tx_dma1Done=0;
  276.     pISR_DMA1 = (unsigned)Dma1Tx_Int;
  277.     rINTMSK=~(BIT_DMA1);
  278.     //Step1. SPI init
  279.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  280.     rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//DMA1,en-SCK,master,low,A,normal
  281. //    rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//DMA1,en-SCK,master,low,B,normal    
  282.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  283.     //Step2. DMA1 init 
  284.     rDISRC1=(unsigned)tx_ptr; //Address of Memory
  285.     rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
  286.     rDIDST1=(unsigned)0x59000010;//Address of SPTDAT Register
  287.     rDIDSTC1=(1<<1)|(1); //APB(SPI), fix
  288.     rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(3<<24)|(1<<23)|(1<<22)|(0<<20)|(spi_count);
  289.     //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
  290.     //off-reload, byte, 128Bytes
  291.     rGPGDAT&=0xfffffffb; // Activate nSS 
  292.     rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 
  293.     while(tx_dma1Done==0);
  294.     while(!(rSPSTA0&0x1)); // Tx is done
  295.     rGPGDAT|=0x4; // Deactivate nSS 
  296. //    rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//poll,dis-SCK,master,low,A,normal
  297.     rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,master,low,B,normal
  298.     Uart_Printf("nDMA1 transfer endn");
  299.     for(i=0; i<spi_count; i++)
  300. Uart_Printf("0x%02x,",*tx_ptr++);
  301.     SPI_Port_Return();
  302. }
  303. void __irq Dma1Tx_Int(void)
  304. {
  305.     tx_dma1Done=1;
  306.     rINTMSK|=BIT_DMA1;
  307.     ClearPending(BIT_DMA1);
  308. }
  309. void Test_Spi_S_Rx_DMA1(void)
  310. {
  311.     int i;
  312.     unsigned char *rx_ptr;
  313.     SPI_Port_Init(0); // Slave(nSS) 
  314.     Uart_Printf("[SPI DMA1 Slave Rx Test]n");
  315.     Uart_Printf("This test should be configured two boardsnStart Rx first.n");
  316.     rx_ptr=(unsigned char *) SPI_BUFFER;
  317.     for(i=0;i<0x500;i++)
  318. *(rx_ptr+i)=0x0; // Zero Initialize
  319.     rx_dma1Done=0;
  320.     pISR_DMA1 = (unsigned)Dma1Rx_Int;
  321.     rINTMSK=~(BIT_DMA1);
  322.     //Step1. SPI init
  323.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  324.     rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,dis-SCK,slave,low,A,TAGD
  325. //    rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(1<<0);//DMA1,dis-SCK,slave,low,B,TAGD
  326.     //When you use [Slave Rx with DMA] function you should have to set TAGD bit
  327.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  328.     //Step2. DMA1 init 
  329.     rDISRC1=(unsigned)0x59000014;//Address of SPRDAT Register
  330.     rDISRCC1=(1<<1)|(1); //APB(SPI), fix
  331.     rDIDST1=(unsigned)rx_ptr; //Address of Memory
  332.     rDIDSTC1=(0<<1)|(0); //AHB(Memory), inc
  333.     rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(3<<24)|(1<<23)|(1<<22)|(0<<20)|(spi_count);
  334.     //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
  335.     //off-reload, byte, 128Bytes
  336.     rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 
  337.     while(rx_dma1Done==0);
  338.     rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,slave,low,B,normal
  339.     while(!rSPSTA0&0x1);
  340.     *(rx_ptr+spi_count)=rSPRDAT0;
  341.     rx_ptr=(unsigned char *) SPI_BUFFER;
  342.     for(i=1;i<(spi_count+1);i++)
  343. Uart_Printf("0x%02x,",*(rx_ptr+i));
  344.     Uart_Printf("nDMA1 receive end");
  345.     SPI_Port_Return();
  346. }
  347. void __irq Dma1Rx_Int(void)
  348. {
  349.     rx_dma1Done=1;
  350.     rINTMSK|=BIT_DMA1;
  351.     ClearPending(BIT_DMA1);
  352. }
  353. void Test_Spi_M_Rx_DMA1(void)
  354. {
  355.     int i;
  356.     unsigned char *rx_ptr;
  357.     SPI_Port_Init(1); // Master(GPIO)
  358.     Uart_Printf("[SPI DMA1 Master Rx Test]n");
  359.     Uart_Printf("This test should be configured two boardsnStart Tx first.n");
  360.     rx_ptr=(unsigned char *)SPI_BUFFER;
  361.     for(i=0;i<0x500;i++)
  362. *(rx_ptr+i)=0x0; // Zero Initialize
  363.     rx_dma1Done=0;
  364.     pISR_DMA1 = (unsigned)Dma1Rx_Int;
  365.     rINTMSK=~(BIT_DMA1);
  366.     //Step1. SPI init
  367.     rSPPRE0=0x1; //if PCLK=50Mhz,SPICLK=25Mhz
  368. //    rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(1<<0);//DMA1,en-SCK,master,low,A,TAGD    
  369.     rSPCON0=(2<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);//DMA1,en-SCK,master,low,B,TAGD
  370.     rGPGDAT&=0xfffffffb; // Activate nSS 
  371.     //When you use [Master Rx with DMA] function you should have to set TAGD bit
  372.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  373.  
  374.     //Step2. DMA1 init 
  375.     rDISRC1=(unsigned)0x59000014;//Address of SPRDAT Register
  376.     rDISRCC1=(1<<1)|(1); //APB(SPI), fix
  377.     rDIDST1=(unsigned)rx_ptr; //Address of Memory
  378.     rDIDSTC1=(0<<1)|(0); //AHB(Memory), inc
  379.     rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(3<<24)|(1<<23)|(1<<22)|(0<<20)|(spi_count);
  380.     //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
  381.     //off-reload, byte, 128Bytes
  382.     rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 
  383.     while(rx_dma1Done==0);
  384.     rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//poll,dis-SCK,master,low,A,normal
  385. //    rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,master,low,B,normal
  386.     while(!rSPSTA0&0x1);
  387.     *(rx_ptr+spi_count)=rSPRDAT0;
  388.     rx_ptr=(unsigned char *)SPI_BUFFER;
  389.     rGPGDAT|=0x4; // Deactivate nSS 
  390.     
  391.     for(i=1;i<(spi_count+1);i++)
  392. Uart_Printf("0x%02x,",*(rx_ptr+i));//to remove first dummy data
  393.     Uart_Printf("nDMA1 receive end");
  394.     SPI_Port_Return();
  395. }
  396. void Test_Spi_S_Tx_DMA1(void)
  397. {
  398.     int i;
  399.     unsigned char *tx_ptr;
  400.     SPI_Port_Init(0); // Slave (nSS)
  401.     Uart_Printf("[SPI DMA1 Slave Tx test]n");
  402.     Uart_Printf("This test should be configured two boardsnStart Tx first.n");
  403.     tx_ptr=(U8 *) SPI_BUFFER;
  404.     for(i=0; i<spi_count; i++)
  405. *(tx_ptr+i)=i;
  406.     tx_dma1Done=0;
  407.     pISR_DMA1 = (unsigned)Dma1Tx_Int;
  408.     rINTMSK=~(BIT_DMA1);
  409.     //Step1. SPI init
  410.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  411. //    rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//DMA1,dis-SCK,slave,low,A,normal
  412.     rSPCON0=(2<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//DMA1,dis-SCK,slave,low,B,normal
  413.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  414.     //Step2. DMA1 init 
  415.     rDISRC1=(unsigned)tx_ptr; //Address of Memory
  416.     rDISRCC1=(0<<1)|(0); //AHB(Memory), inc
  417.     rDIDST1=(unsigned)0x59000010;//Address of SPTDAT Register
  418.     rDIDSTC1=(1<<1)|(1); //APB(SPI), fix
  419.     rDCON1=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(3<<24)|(1<<23)|(1<<22)|(0<<20)|(spi_count);
  420.     //handshake, sync PCLK, TC int, single tx, single service, SPI, H/W request, 
  421.     //off-reload, byte, 128Bytes
  422.     rDMASKTRIG1=(0<<2)|(1<<1)|(0);    //run, DMA1 channel on, no-sw trigger 
  423.     while(tx_dma1Done==0);
  424.     while(!(rSPSTA0&0x1)); // Tx is done
  425.     rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//poll,dis-SCK,slave,low,A,normal
  426. //    rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//poll,dis-SCK,slave,low,B,normal
  427.     Uart_Printf("nDMA1 transfer endn");
  428.     for(i=0; i<spi_count; i++)
  429. Uart_Printf("0x%02x,",*tx_ptr++);
  430.     SPI_Port_Return();
  431. }
  432. void Test_Spi_M_Int(void)
  433. {
  434.     char *rxStr,*txStr;
  435.     SPI_Port_Init(1); // Master
  436.     Uart_Printf("[SPI Interrupt Master Rx test]n");
  437.     Uart_Printf("This test should be configured two boardsnStart Slave first.n");
  438.     pISR_SPI0=(unsigned)Spi_Int;
  439.     endSpiTx=0;
  440.     spiTxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
  441.     spiRxStr=(char *) SPI_BUFFER;
  442.     txStr=(char *)spiTxStr;
  443.     rxStr=(char *)spiRxStr;
  444.     rSPPRE0=0x1; //if PCLK=50Mhz,SPICLK=12.5Mhz
  445.     rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//int,en-SCK,master,low,A,normal
  446. //    rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//int,en-SCK,master,low,B,normal
  447.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  448.     rGPGDAT&=0xfffffffb; // Activate nSS 
  449.     rINTMSK=~(BIT_SPI0);
  450.     while(endSpiTx==0);
  451.     rGPGDAT|=0x4; // Deactivate nSS 
  452.     rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
  453. //    rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
  454.     Uart_Printf("Current address :0x%xn",spiRxStr);
  455.     *spiRxStr='';//attach End of String(Null)
  456.     Uart_Printf("Tx Strings:%sn",txStr);
  457.     Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
  458.     if(strcmp((rxStr+1),txStr)==0)
  459.         Uart_Printf("O.K.n");
  460.     else 
  461.         Uart_Printf("ERROR!!!n");
  462.     SPI_Port_Return();
  463. }
  464. void Test_Spi_S_Int(void)
  465. {
  466.     char *rxStr,*txStr;
  467.     SPI_Port_Init(0); // Slave (nSS)
  468.     Uart_Printf("[SPI Interrupt Slave Tx test]n");
  469.     Uart_Printf("This test should be configured two boardsnStart Slave first.n");
  470.     pISR_SPI0=(unsigned)Spi_Int;
  471.     endSpiTx=0;
  472.     spiTxStr="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
  473.     spiRxStr=(char *) SPI_BUFFER;
  474.     txStr=(char *)spiTxStr;
  475.     rxStr=(char *)spiRxStr;
  476.     rSPPRE0=0x0; //if PCLK=50Mhz,SPICLK=25Mhz
  477.     rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//int,dis-SCK,slave,low,A,normal
  478. //    rSPCON0=(1<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//int,dis-SCK,slave,low,B,normal
  479.     rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
  480.     rINTMSK=~(BIT_SPI0);
  481.     while(endSpiTx==0);
  482.     rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
  483. //    rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1)|(0<<0);//Poll,dis-SCK,master,low,B,normal
  484. Uart_Printf("Current address :0x%xn",spiRxStr);
  485.     *spiRxStr='';//attach End of String(Null)
  486.     Uart_Printf("Tx Strings:%sn",txStr);
  487.     Uart_Printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
  488.     if(strcmp((rxStr+1),txStr)==0)
  489.         Uart_Printf("O.K.n");
  490.     else 
  491.         Uart_Printf("ERROR!!!n");
  492.     SPI_Port_Return();
  493. }
  494. ///////////////////////// 2004.05.14 added by junon 
  495. static void __irq Eint1(void)
  496. {
  497.     U8           ui8ScanCode;
  498. getsFromKBCTL(&ui8ScanCode, 1);
  499. ClearPending(BIT_EINT1);
  500. Uart_Printf("keybd interrupt asserted -> scancode = 0x%xn", ui8ScanCode);
  501. }
  502. void SPIKBD_Port_Init()
  503. {
  504. spikbd_rGPBCON = rGPBCON;
  505. spikbd_rGPBDAT = rGPBDAT;
  506. spikbd_rGPBUP  = rGPBUP;
  507. spikbd_rGPDCON = rGPDCON;
  508. spikbd_rGPDDAT = rGPDDAT;
  509. spikbd_rGPDUP  = rGPDUP;
  510. spikbd_rGPFCON = rGPFCON;
  511. spikbd_rGPFDAT = rGPFDAT;
  512. spikbd_rGPFUP  = rGPFUP;
  513. spikbd_rGPGCON = rGPGCON;
  514. spikbd_rGPGDAT = rGPGDAT;
  515. spikbd_rGPGUP  = rGPGUP;
  516. // Setup IO port for SPI interface & Keyboard
  517. // Setup EINT1 (KBDINT)
  518.     rGPFCON &= ~(0x3 << 2);  // Clear GPF1 
  519.     rGPFCON |= (0x2 << 2);   // Set GPF1 to EINT1 for Keyboard interrupt
  520.     rEXTINT0 &= ~(0x7 << 4);    // Clear EINT1
  521.     rEXTINT0 |= (0x2 << 4);     // fallig edge triggered for EINT1
  522. // setup SPI interface
  523. // GPG5 : SPIMISO (KBDSPIMISO)
  524. // GPG6 : SPIMOSI (KBDSPIMOSI)
  525. // GPG7 : SPICLK  (KBDSPICLK)
  526.     rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14));   // Clear GPG5,6,7
  527.     rGPGCON |= ((0x3 << 10) | (0x3 << 12) | (0x3 << 14));    
  528.      
  529. // setup _SS signal(nSS_KBD)
  530.     rGPBCON &= ~(0x3 << 12);         // Clear GPB6
  531.     rGPBCON |= (ONEBIT << 12);        // Set Port GPB6 to output for nSS signal
  532. // setup _PWR_OK signal (KEYBOARD)
  533.     rGPBCON &= ~(0x3 << 0);         // Clear GPB0 
  534.     rGPBCON |= (ONEBIT << 0);       // Set Port GPB0 to output for _PWR_OK signal
  535.     rGPDDAT &=~(ONEBIT << 0);        // set _PWR_OK to 0
  536. }
  537. void SPIKBD_Port_Return(void)
  538. {
  539. rGPBCON = spikbd_rGPBCON;
  540. rGPBDAT = spikbd_rGPBDAT;
  541. rGPBUP  = spikbd_rGPBUP;
  542. rGPDCON = spikbd_rGPDCON;
  543. rGPDDAT = spikbd_rGPDDAT;
  544. rGPDUP  = spikbd_rGPDUP;
  545.                  
  546. rGPFCON = spikbd_rGPFCON;
  547. rGPFDAT = spikbd_rGPFDAT;
  548. rGPFUP  = spikbd_rGPFUP;
  549.                  
  550. rGPGCON = spikbd_rGPGCON;
  551. rGPGDAT = spikbd_rGPGDAT;
  552. rGPGUP  = spikbd_rGPGUP;
  553. }
  554. int putcToKBCTL(U8 c)
  555. {
  556. U32 i;
  557.    rGPBDAT &= ~(ONEBIT << 6);       //Set _SS signal to low (Slave Select)
  558. while((rSPSTA1 & ONEBIT)==0); // wait while busy
  559. rSPTDAT1 = c;                 // write left justified data
  560. while((rSPSTA1 & ONEBIT)==0); // wait while busy
  561.    
  562.     rGPBDAT |= (ONEBIT << 6);        //Set _SS signal to high (Slave Select)
  563. i = rSPRDAT1;
  564. return(i);
  565. }
  566. void getsFromKBCTL(U8 *m, int cnt)
  567. {
  568. int i, j;
  569. volatile tmp = 1;
  570. for(j = 0; j < 3; j++)
  571. tmp += tmp;
  572. for(j = 0; j < 250 * 30; j++)
  573. tmp += tmp;
  574. for(i = 0; i < cnt; i++) 
  575. {
  576. m[i] = putcToKBCTL(0xFF);
  577. for(j = 0; j < 400; j++)
  578. tmp+= tmp;
  579. }
  580. }
  581. void putsToKBCTL(U8 *m,  int cnt)
  582. {
  583. int i, j, x;
  584. volatile tmp = 1;
  585. for(j = 0; j < 3; j++)
  586. x = j;
  587. for(j = 0; j < 3; j++)
  588. tmp += tmp;
  589. for(j = 0; j < 250 * 30; j++)
  590. tmp += tmp;
  591. for(i = 0; i < cnt; i++) {
  592. j = putcToKBCTL(m[i]);
  593. for(j = 0; j < 400; j++)
  594. tmp+= tmp;
  595. for(j = 0; j < 400; j++)
  596. x = j;
  597.     }
  598. }
  599. char lrc(U8 *buffer, int count)
  600. {
  601.     char lrc;
  602.     int n;
  603.     lrc = buffer[0] ^ buffer[1];
  604.     for (n = 2; n < count; n++)
  605.     {
  606.         lrc ^= buffer[n];
  607.     }
  608.     if (lrc & 0x80)
  609.         lrc ^= 0xC0;
  610.     return lrc;
  611. }
  612. int USAR_WriteRegister(int reg, int data)
  613. {
  614.     U8 cmd_buffer[4];
  615.     cmd_buffer[0] = 0x1b; //USAR_PH_WR;
  616.     cmd_buffer[1] = (unsigned char)reg;
  617.     cmd_buffer[2] = (unsigned char)data;
  618.     cmd_buffer[3] = lrc((U8 *)cmd_buffer,3);
  619.     putsToKBCTL((U8 *)cmd_buffer,4);
  620.     return TRUE;
  621. }
  622. void Kbd_PowerOn(void)
  623. {
  624. U8 msg[5];
  625. int t;
  626. char dummy = (char)0xff;
  627. SPIKBD_Port_Init();
  628. // Setup SPI registers
  629.     // Interrupt mode, prescaler enable, master mode, active high clock, format B, normal mode
  630.     rSPCON1 = (ONEBIT<<5)|(ONEBIT<<4)|(ONEBIT<<3)|(0x0<<2)|(ONEBIT<<1);
  631.     
  632. // Developer MUST change the value of prescaler properly whenever value of PCLK is changed.
  633.     rSPPRE1 = 255;// 99.121K = 203M/4/2/(255+1) PCLK=50.75Mhz FCLK=203Mhz SPICLK=99.121Khz
  634.          
  635.     for(t=0;t<20000; t++); // delay
  636.     msg[0] = (char)0x1b; msg[1] = (char)0xa0; msg[2] = (char)0x7b; msg[3] = (char)0; // Initialize USAR
  637.      for(t=0; t < 10; t++) {
  638.      dummy = putcToKBCTL(0xff);
  639.     }
  640.     
  641.     for(t=0; t<10; t++) { // wait for a while
  642.         putsToKBCTL(msg,3);
  643.         for(t=0;t<20000; t++);
  644.     }
  645.     t = 100;
  646.     while(t--) {
  647.         if((rGPFDAT & 0x2)==0) { // Read _ATN (KBDINT) GPF1
  648.             break;
  649.         }
  650.     } //check _ATN
  651.     if(t != 0) {
  652.         getsFromKBCTL(msg,3);
  653.     }    
  654.     t=100000;
  655.     while(t--); // delay
  656. msg[0] = (char)0x1b; msg[1] = (char)0xa1; msg[2] = (char)0x7a; msg[3] = (char)0; //Initialization complete
  657. putsToKBCTL(msg,3);
  658. Uart_Printf("KeybdPowerOnn");
  659. }
  660. void Test_Spikbd_keyscan(void)
  661. {
  662.     Uart_Printf("[SPIKBD Test keyscan] start.n");
  663. Kbd_PowerOn();
  664. rEXTINT0 = (rEXTINT0 & ~(7<<4)) | (2<<4); // falling edge
  665. pISR_EINT1=(U32)Eint1;
  666.     rSRCPND = BIT_EINT1;
  667.     rINTPND = BIT_EINT1;
  668.     rINTMSK=~(BIT_EINT1);
  669. Uart_Getch();
  670. rINTMSK = BIT_ALLMSK;
  671.     Uart_Printf("[SPIKBD Test keyscan] end.n");
  672.     SPIKBD_Port_Return();
  673. }
  674. void SPIKBD_Port_Init_IO()
  675. {
  676. spikbd_rGPBCON = rGPBCON;
  677. spikbd_rGPBDAT = rGPBDAT;
  678. spikbd_rGPBUP  = rGPBUP;
  679. spikbd_rGPDCON = rGPDCON;
  680. spikbd_rGPDDAT = rGPDDAT;
  681. spikbd_rGPDUP  = rGPDUP;
  682. spikbd_rGPFCON = rGPFCON;
  683. spikbd_rGPFDAT = rGPFDAT;
  684. spikbd_rGPFUP  = rGPFUP;
  685. spikbd_rGPGCON = rGPGCON;
  686. spikbd_rGPGDAT = rGPGDAT;
  687. spikbd_rGPGUP  = rGPGUP;
  688. // Setup IO port for SPI interface & Keyboard
  689. // Setup KBDINT as output
  690.     rGPFCON &= ~(0x3 << 2);  // Clear GPF1 
  691.     rGPFCON |= (0x1 << 2);   // Set GPF1 to EINT1 for Keyboard interrupt
  692. // setup SPI interface
  693. // GPG5 : SPIMISO (KBDSPIMISO)
  694. // GPG6 : SPIMOSI (KBDSPIMOSI)
  695. // GPG7 : SPICLK  (KBDSPICLK)
  696.     rGPGCON &= ~((0x3 << 10) | (0x3 << 12) | (0x3 << 14));   // Clear GPG5,6,7
  697.     rGPGCON |= ((0x1 << 10) | (0x1 << 12) | (0x1 << 14));    
  698.      
  699. // setup _SS signal(nSS_KBD)
  700.     rGPBCON &= ~(0x3 << 12);         // Clear GPB6
  701.     rGPBCON |= (ONEBIT << 12);        // Set Port GPB6 to output for nSS signal
  702. // setup _PWR_OK signal (KEYBOARD)
  703.     rGPBCON &= ~(0x3 << 0);         // Clear GPB0 
  704.     rGPBCON |= (ONEBIT << 0);       // Set Port GPB0 to output for _PWR_OK signal
  705. }
  706. void Test_Spikbd_IO(void)
  707. {
  708. int i = 0;
  709.     Uart_Printf("[SPIKBD IO-Test] startn");
  710. SPIKBD_Port_Init_IO();
  711. do 
  712. {
  713. Uart_Printf("test loop going - %dn", i);
  714. i++;
  715. if (i%2) 
  716. {
  717. rGPFDAT &= ~(1<<1); // GPF1 KBDINT
  718. rGPBDAT &= ~(1<<6); // GPB6
  719. rGPBDAT &= ~(1<<0); // GPB0
  720. rGPGDAT &= ~(7<<5); // GPG5,6,7 (SPIMISO,SPIMOSI,SPICLK)
  721. }
  722. else 
  723. {
  724. rGPFDAT |= (1<<1); // GPF1 KBDINT
  725. rGPBDAT |= (1<<6); // GPB6
  726. rGPBDAT |= (1<<0); // GPB0
  727. rGPGDAT |= (7<<5); // GPG5,6,7 (SPIMISO,SPIMOSI,SPICLK)
  728. }
  729. } while(Uart_GetKey() == 0);
  730.     Uart_Printf("[SPIKBD IO-Test] endn");
  731.     
  732.     SPIKBD_Port_Return();
  733. }
  734. //////////////////////////////////