usblib.c
上传用户:hank9955
上传日期:2022-08-05
资源大小:14k
文件大小:6k
源码类别:

USB编程

开发平台:

C/C++

  1. /****************************************************************
  2.  NAME: usblib.c
  3.  DESC: S3C2410X USB library functions
  4.  HISTORY:
  5.  Mar.25.2002:purnnamu: ported for S3C2410X.
  6.  Mar.27.2002:purnnamu: DMA is enabled.
  7.  ****************************************************************/
  8. #include <string.h>
  9. #include "option.h"
  10. #include "2410addr.h"
  11. #include "2410lib.h"
  12. #include "def.h"
  13. #include "2410usb.h"
  14. #include "usbmain.h"
  15. #include "usblib.h"
  16. #include "usbsetup.h"
  17. #include "usbmain.h"
  18. void ConfigUsbd(void)
  19. {
  20.     ReconfigUsbd();
  21. /*
  22.     pISR_USBD =(unsigned)IsrUsbd;
  23.     ClearPending(BIT_USBD);
  24.     rINTMSK&=~(BIT_USBD);  
  25. */   
  26.     rINTMSK&=~(BIT_USBD);  
  27. }
  28. void ReconfigUsbd(void)
  29. {
  30. // *** End point information ***
  31. //   EP0: control
  32. //   EP1: bulk in end point
  33. //   EP2: not used
  34. //   EP3: bulk out end point
  35. //   EP4: not used
  36.     
  37.     rPWR_REG=PWR_REG_DEFAULT_VALUE; //disable suspend mode
  38.     rINDEX_REG=0;
  39.     rMAXP_REG=FIFO_SIZE_8;    //EP0 max packit size = 8 
  40.     rEP0_CSR=EP0_SERVICED_OUT_PKT_RDY|EP0_SERVICED_SETUP_END;
  41.   //EP0:clear OUT_PKT_RDY & SETUP_END
  42.     rINDEX_REG=1;
  43.     #if (EP1_PKT_SIZE==32)
  44.         rMAXP_REG=FIFO_SIZE_32; //EP1:max packit size = 32
  45.     #else
  46. rMAXP_REG=FIFO_SIZE_64; //EP1:max packit size = 64
  47.     #endif
  48.     rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT;
  49.     rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK|EPI_BULK; //IN mode, IN_DMA_INT=masked    
  50.     rOUT_CSR1_REG=EPO_CDT;   
  51.     rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;   
  52.     rINDEX_REG=2;
  53.     rMAXP_REG=FIFO_SIZE_64; //EP2:max packit size = 64
  54.     rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK;
  55.     rIN_CSR2_REG=EPI_MODE_IN|EPI_IN_DMA_INT_MASK; //IN mode, IN_DMA_INT=masked    
  56.     rOUT_CSR1_REG=EPO_CDT;   
  57.     rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;   
  58.     rINDEX_REG=3;
  59.     #if (EP3_PKT_SIZE==32)
  60.         rMAXP_REG=FIFO_SIZE_32; //EP3:max packit size = 32
  61.     #else
  62. rMAXP_REG=FIFO_SIZE_64; //EP3:max packit size = 64
  63.     #endif
  64.     rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK;
  65.     rIN_CSR2_REG=EPI_MODE_OUT|EPI_IN_DMA_INT_MASK; //OUT mode, IN_DMA_INT=masked    
  66.     rOUT_CSR1_REG=EPO_CDT;   
  67.      //clear OUT_PKT_RDY, data_toggle_bit.
  68. //The data toggle bit should be cleared when initialization.
  69.     rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;   
  70.     rINDEX_REG=4;
  71.     rMAXP_REG=FIFO_SIZE_64; //EP4:max packit size = 64
  72.     rIN_CSR1_REG=EPI_FIFO_FLUSH|EPI_CDT|EPI_BULK;
  73.     rIN_CSR2_REG=EPI_MODE_OUT|EPI_IN_DMA_INT_MASK; //OUT mode, IN_DMA_INT=masked    
  74.     rOUT_CSR1_REG=EPO_CDT;   
  75.      //clear OUT_PKT_RDY, data_toggle_bit.
  76. //The data toggle bit should be cleared when initialization.
  77.     rOUT_CSR2_REG=EPO_BULK|EPO_OUT_DMA_INT_MASK;   
  78.     
  79.     rEP_INT_REG=EP0_INT|EP1_INT|EP2_INT|EP3_INT|EP4_INT;
  80.     rUSB_INT_REG=RESET_INT|SUSPEND_INT|RESUME_INT; 
  81.      //Clear all usbd pending bits
  82.     
  83.     //EP0,1,3 & reset interrupt are enabled
  84.     rEP_INT_EN_REG=EP0_INT|EP1_INT|EP3_INT;
  85.     rUSB_INT_EN_REG=RESET_INT;
  86.     ep0State=EP0_SETUP_STATE;
  87.     
  88. }
  89. void RdPktEp0(U8 *buf,int num)
  90. {
  91.     int i;
  92.     
  93.     for(i=0;i<num;i++)
  94.     {
  95.         buf[i]=(U8)rEP0_FIFO;
  96.     }
  97. }
  98.     
  99. void WrPktEp0(U8 *buf,int num)
  100. {
  101.     int i;
  102.     
  103.     for(i=0;i<num;i++)
  104.     {
  105.         rEP0_FIFO=buf[i];
  106.     }
  107. }
  108. void WrByteEp0(U8 value)
  109. {
  110.   rEP0_FIFO= value;
  111. }
  112. void WrPktEp1(U8 *buf,int num)
  113. {
  114.     int i;
  115.     
  116.     for(i=0;i<num;i++)
  117.     {
  118.         rEP1_FIFO=buf[i];
  119.     }
  120. }
  121. void WrPktEp2(U8 *buf,int num)
  122. {
  123.     int i;
  124.     
  125.     for(i=0;i<num;i++)
  126.     {
  127.         rEP2_FIFO=buf[i];
  128.     }
  129. }
  130. void RdPktEp3(U8 *buf,int num)
  131. {
  132.     int i;
  133.     
  134.     for(i=0;i<num;i++)
  135.     {
  136.         buf[i]=(U8)rEP3_FIFO;
  137.     }
  138. }
  139. void RdPktEp4(U8 *buf,int num)
  140. {
  141.     int i;
  142.     
  143.     for(i=0;i<num;i++)
  144.     {
  145.         buf[i]=(U8)rEP4_FIFO;
  146.     }
  147. }
  148. void ConfigEp3DmaMode(U32 bufAddr,U32 count)
  149. {
  150.     int i;
  151.     rINDEX_REG=3;
  152.     count=count&0xfffff; //transfer size should be <1MB
  153.     
  154.     rDISRCC2=(1<<1)|(1<<0);
  155.     rDISRC2=ADDR_EP3_FIFO; //src=APB,fixed,src=EP3_FIFO 
  156.     rDIDSTC2=(0<<1)|(0<<0);
  157.     rDIDST2=bufAddr;       //dst=AHB,increase,dst=bufAddr
  158. #if USBDMA_DEMAND
  159.     rDCON2=(count)|(0<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(4<<24)|(1<<23)|(0<<22)|(0<<20); 
  160.         //demand,requestor=APB,CURR_TC int enable,unit transfer,
  161.         //single service,src=USBD,H/W request,autoreload,byte,CURR_TC
  162. #else
  163.     rDCON2=(count)|(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(4<<24)|(1<<23)|(0<<22)|(0<<20); 
  164.         //handshake,requestor=APB,CURR_TC int enable,unit transfer,
  165.         //single service,src=USBD,H/W request,autoreload,byte,CURR_TC
  166. #endif        
  167.     rDMASKTRIG2= (1<<1); 
  168.         //DMA 2 on
  169.     //rEP3_DMA_FIFO=0x40; //not needed for OUT operation. 
  170.     rEP3_DMA_TTC_L=0xff;
  171.     rEP3_DMA_TTC_M=0xff;
  172.     rEP3_DMA_TTC_H=0x0f;
  173.     rOUT_CSR2_REG=rOUT_CSR2_REG|EPO_AUTO_CLR|EPO_OUT_DMA_INT_MASK; 
  174.      //AUTO_CLR(OUT_PKT_READY is cleared automatically), interrupt_masking.
  175. #if USBDMA_DEMAND
  176.     rEP3_DMA_UNIT=EP3_PKT_SIZE; //DMA transfer unit=64 bytes
  177.     rEP3_DMA_CON=UDMA_DEMAND_MODE|UDMA_OUT_DMA_RUN|UDMA_DMA_MODE_EN; 
  178.         // deamnd enable,out_dma_run=run,in_dma_run=stop,DMA mode enable
  179. #else        
  180.     rEP3_DMA_UNIT=0x01; //DMA transfer unit=1byte
  181.     rEP3_DMA_CON=UDMA_OUT_DMA_RUN|UDMA_DMA_MODE_EN;
  182.         // deamnd disable,out_dma_run=run,in_dma_run=stop,DMA mode enable
  183. #endif  
  184.     //wait until DMA_CON is effective.
  185.     rEP3_DMA_CON;
  186.     for(i=0;i<10;i++);    
  187. }
  188. void ConfigEp3IntMode(void)
  189. {
  190.     rINDEX_REG=3;
  191.     
  192.     rDMASKTRIG2= (0<<1);  // EP3=DMA ch 2
  193.         //DMA channel off
  194.     rOUT_CSR2_REG=rOUT_CSR2_REG&~(EPO_AUTO_CLR/*|EPO_OUT_DMA_INT_MASK*/); 
  195.      //AUTOCLEAR off,interrupt_enabled (???)
  196.     rEP3_DMA_UNIT=1;
  197.     rEP3_DMA_CON=0; 
  198.      // deamnd disable,out_dma_run=stop,in_dma_run=stop,DMA mode disable
  199.     //wait until DMA_CON is effective.
  200.     rEP3_DMA_CON;
  201.     
  202. }