vendor.c
上传用户:ids068
上传日期:2013-04-04
资源大小:639k
文件大小:6k
源码类别:

USB编程

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                 http://www.zlgmcu.com
  5. **--------------当前版本修订------------------------------------------------------------------------------
  6. ** 修改人: 刘英斌
  7. ** 日 期:2003-03-13
  8. ** 描 述:ISP1581 V1.0
  9. **------------------------------------------------------------------------------------------------------
  10. ********************************************************************************************************/
  11. #include "standard.h"
  12. #include "Kernel.h"
  13. #include "D14.h"
  14. //***********************************************************************
  15. //*                *
  16. //*                  External Variable Definition        *
  17. //*                *
  18. //***********************************************************************
  19. extern USB_DEVICE USB_Device;
  20. extern DMA_INT_FLAG DMA_Int_Flag;
  21. extern USB_INT_FLAG USB_Int_Flag;
  22. extern volatile D14_CNTRL_REG xdata D14_Cntrl_Reg;
  23. extern void Start_mSEC_Timer(Data);
  24. extern UC Data;
  25. extern UI Temp,PIO_Count;
  26. extern KERNEL Kernel_Flag;
  27. extern ULI  bytecount;
  28. extern FILESIZE FileSize;
  29. extern UI count;
  30. extern UC idata Endpt_FIFO[MAX_BUF];
  31. extern UC Type;
  32. //***********************************************************************
  33. //*                *
  34. //*                      Variable Definition        *
  35. //*                *
  36. //***********************************************************************
  37. UI Count_PIO;
  38. //***********************************************************************
  39. //*                *
  40. //*                      Prototype Definition     *
  41. //*                *
  42. //***********************************************************************
  43. void DMA_Debug_Mode(void);
  44. void DMA_Init(void);
  45. void DMA_Mode(Data);
  46. //***********************************************************************
  47. //*                *
  48. //*                      Routine Definition    *
  49. //*                *
  50. //***********************************************************************
  51. //***********************************************************************
  52. //*                     *
  53. //* Routine  : DMA Debug Mode                                     *
  54. //* Input : None                          *
  55. //* Output : None                                      *
  56. //* Function : Generic DMA mode routine                       *
  57. //*                *
  58. //***********************************************************************
  59. void DMA_Debug_Mode(void)
  60. {
  61. if(Kernel_Flag.BITS.Transfer_Start)
  62. {
  63. if(FileSize.Size.Address[0] == 0 &&
  64. FileSize.Size.Address[1] == 0 &&
  65. FileSize.Size.Address[2] == 0)
  66. {
  67. Kernel_Flag.BITS.Out_Reset_Done = 0;
  68. Kernel_Flag.BITS.In_Reset_Done = 0;
  69. }
  70. if(FileSize.Size.DIR == 0x00 || FileSize.Size.DIR == 0x80)
  71. DMA_Mode(Write);
  72. else
  73. DMA_Mode(Read);
  74. }
  75. }
  76. //***********************************************************************
  77. //*                     *
  78. //* Routine  : DMA Mode                                           *
  79. //* Input : DMA Controller setting                      *
  80. //* Output : None                                      *
  81. //* Function : to do GDMA data transfer                       *
  82. //*                *
  83. //***********************************************************************
  84. void DMA_Mode(Data)
  85. {
  86. UI Datcount;
  87. if(Data)
  88. {
  89. //read
  90. do
  91. {
  92. //Check for Out Token ACK interrupt
  93. while(!USB_Int_Flag.BITS.EP2RX)
  94. {
  95. if(USB_Int_Flag.BITS.SUSP || Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.EP0SETUP)
  96. break;
  97. }
  98. EA_DISABLE;
  99. USB_Int_Flag.BITS.EP2RX = 0;
  100. EA_ENABLE;
  101. D14_Cntrl_Reg.D14_ENDPT_INDEX = 4;
  102. //Read in FIFO data
  103. if (bytecount > PIO_Count)
  104. {
  105. Datcount = PIO_Count;
  106. }
  107. else
  108. {
  109. Datcount = bytecount;
  110. }
  111. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  112. {
  113. for(Count_PIO = 0 ; Count_PIO < Datcount ; Count_PIO++)
  114. Endpt_FIFO[Count_PIO] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  115. }
  116. else
  117. {
  118. for(Count_PIO = 0 ; Count_PIO < Datcount; Count_PIO++)
  119. Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
  120. }
  121. bytecount -= Datcount;
  122. }while(bytecount);
  123. }
  124. else
  125. {
  126. //write
  127. do
  128. {
  129. //initialize endpoint index
  130. D14_Cntrl_Reg.D14_ENDPT_INDEX = 5;
  131. //Write data to FIFO
  132. if (bytecount>PIO_Count)
  133. {
  134. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB =( unsigned char ) PIO_Count;
  135. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = ( unsigned char ) (PIO_Count>>8);
  136. Datcount = PIO_Count;
  137. }
  138. else
  139. {
  140. D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB =( unsigned char ) bytecount;
  141. D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = ( unsigned char ) (bytecount>>8);
  142. Datcount = bytecount;
  143. }
  144. if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
  145. {
  146. for(Count_PIO = 0 ; Count_PIO < Datcount ; Count_PIO++)
  147. D14_Cntrl_Reg.D14_DATA_PORT_LSB = Endpt_FIFO[Count_PIO];
  148. }
  149. else
  150. {
  151. for(Count_PIO = 0 ; Count_PIO < Datcount ; Count_PIO++)
  152. D14_Cntrl_Reg.D14_DATA_PORT_LSB = Count_PIO % 256;
  153. }
  154. //Check for In Token ACK
  155. while(!USB_Int_Flag.BITS.EP2TX)
  156. {    
  157. if(USB_Int_Flag.BITS.SUSP || Kernel_Flag.BITS.Bus_Reset || USB_Int_Flag.BITS.EP0SETUP)
  158. break;
  159. }    
  160. EA_DISABLE;
  161. USB_Int_Flag.BITS.EP2TX = 0;
  162. EA_ENABLE;
  163. bytecount -= Datcount; 
  164. }while(bytecount);
  165. Count_PIO = 0;
  166. }
  167. Kernel_Flag.BITS.Transfer_Start = 0;  
  168. }