usb_core.h
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:6k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : usb_core.h
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 27/10/2003
  5. * Description        : standard protocol processing (USB v1.1)
  6. *
  7. ********************************************************************************/
  8. #define Type_Recipient (pInfo->USBbmRequestType & (REQUEST_TYPE | RECIPIENT))
  9. typedef enum _CONTROL_STATE {
  10. WAIT_SETUP,   /* 0 */
  11. SETTING_UP,   /* 1 */
  12. IN_DATA,   /* 2 */
  13. OUT_DATA, /* 3 */
  14. LAST_IN_DATA, /* 4 */
  15. LAST_OUT_DATA, /* 5 */
  16. WAIT_IN_ZERO, /* 6 */
  17. WAIT_OUT_ZERO, /* 7 */
  18. WAIT_STATUS_IN, /* 8 */
  19. WAIT_STATUS_OUT,/* 9 */
  20. STALLED, /* 10 */
  21. PAUSE /* 11 */
  22. } CONTROL_STATE; /* The state machine states of a control pipe */
  23. #define STD_MAXPACKETSIZE 8 /* Maximum packet size */
  24. typedef struct OneDescriptor {
  25. BYTE *Descriptor;
  26. WORD Descriptor_Size;
  27. } ONE_DESCRIPTOR, *PONE_DESCRIPTOR;
  28. /* All the request process routines return a value of this type
  29.    If the return value is not SUCCESS or NOT_READY,
  30.    the software will STALL the correspond endpoint
  31. */
  32. typedef enum _RESULT {
  33. SUCCESS = 0, /* Process sucessfully */
  34. ERROR,
  35. UNSUPPORT,
  36. NOT_READY /* The process has not been finished, */
  37. /* endpoint will be NAK to further rquest */
  38. } RESULT;
  39. /*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/
  40. typedef struct _ENDPOINT_INFO {
  41. /*
  42. When send data out of the device,
  43. CopyData() is used to get data buffer 'Length' bytes data
  44. if Length is 0,
  45. CopyData() returns the total length of the data
  46. if the request is not supported, returns 0
  47. (NEW Feature )
  48. if CopyData() returns -1, the calling routine should not proceed
  49. further and will resume the SETUP process by the class device
  50. if Length is not 0,
  51. CopyData() returns a pointer to indicate the data location
  52. Usb_wLength is the data remain to be sent,
  53. Usb_wOffset is the Offset of original data
  54. When receive data from the host,
  55. CopyData() is used to get user data buffer which is capable
  56. of Length bytes data to copy data from the endpoint buffer.
  57. if Length is 0,
  58. CopyData() returns the available data length,
  59. if Length is not 0,
  60. CopyData() returns user buffer address
  61. Usb_rLength is the data remain to be received,
  62. Usb_rPointer is the Offset of data buffer
  63. */
  64. WORD Usb_wLength;
  65. WORD Usb_wOffset;
  66. WORD PacketSize;
  67. BYTE  *(*CopyData)(WORD Length);
  68. } ENDPOINT_INFO;
  69. #define Usb_rLength Usb_wLength
  70. #define Usb_rOffset Usb_wOffset
  71. /*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/
  72. typedef struct _DEVICE {
  73. /*sb BYTE EP0; */  /* Endpoint number */
  74. BYTE Total_Endpoint;  /* Number of endpoints that are used */
  75. BYTE Total_Configuration;/* Number of configuration available */
  76. } DEVICE;
  77. typedef union {
  78. WORD w;
  79. struct BW {
  80. BYTE bb1;
  81. BYTE bb0;
  82. } bw;
  83. } WORD_BYTE;
  84. typedef struct _DEVICE_INFO {
  85. BYTE USBbmRequestType; /* bmRequestType */
  86. BYTE USBbRequest; /* bRequest */
  87. WORD_BYTE USBwValues; /* wValue */
  88. WORD_BYTE USBwIndexs; /* wIndex */
  89. WORD_BYTE USBwLengths; /* wLength */
  90. BYTE ControlState; /* of type CONTROL_STATE */
  91. BYTE Current_Feature;
  92. BYTE Current_Configuration;
  93. BYTE Current_Interface;
  94. /* Selected interface of current configuration */
  95. ENDPOINT_INFO Ctrl_Info;
  96. } DEVICE_INFO;
  97. typedef struct _DEVICE_PROP {
  98. void (*Init)(void); /* Initialize the device */
  99. void (*Reset)(void); /* Reset routine of this device */
  100. /* Device dependent process after the status stage */
  101. void (*Process_Status_IN)(void);
  102. void (*Process_Status_OUT)(void);
  103. /* Procedure of process on setup stage of a class specified request with data stage */
  104. /* All class specified requests with data stage are processed in Class_Data_Setup
  105. Class_Data_Setup()
  106. responses to check all special requests and fills ENDPOINT_INFO
  107. according to the request
  108. If IN tokens are expected, then wLength & wOffset will be filled
  109. with the total transferring bytes and the starting position
  110. If OUT tokens are expected, then rLength & rOffset will be filled
  111. with the total expected bytes and the starting position in the buffer
  112. If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT
  113. CAUTION:
  114. Since GET_CONFIGURATION & GET_INTERFACE are highly related to
  115. the individual classes, they will be checked and processed here.
  116. */
  117. RESULT (*Class_Data_Setup)(BYTE RequestNo);
  118. /* Procedure of process on setup stage of a class specified request without data stage */
  119. /* All class specified requests without data stage are processed in Class_NoData_Setup
  120. Class_NoData_Setup
  121. responses to check all special requests and perform the request
  122. CAUTION:
  123. Since SET_CONFIGURATION & SET_INTERFACE are highly related to
  124. the individual classes, they will be checked and processed here.
  125. */
  126. RESULT (*Class_NoData_Setup)(BYTE RequestNo);
  127. BYTE* (*GetDeviceDescriptor)(WORD Length);
  128. BYTE* (*GetConfigDescriptor)(WORD Length);
  129. BYTE* (*GetStringDescriptor)(WORD Length);
  130. BYTE* RxEP_buffer;
  131. WORD MaxPacketSize;
  132. } DEVICE_PROP;
  133. extern DEVICE_PROP Device_Property;
  134. extern  DEVICE  Device_Table;
  135. extern DEVICE_INFO Device_Info;
  136. /* cells saving status during interrupt servicing */
  137. extern WORD SaveRState;
  138. extern WORD SaveTState;
  139. #define USBwValue USBwValues.w
  140. #define USBwValue0 USBwValues.bw.bb0
  141. #define USBwValue1 USBwValues.bw.bb1
  142. #define USBwIndex USBwIndexs.w
  143. #define USBwIndex0 USBwIndexs.bw.bb0
  144. #define USBwIndex1 USBwIndexs.bw.bb1
  145. #define USBwLength USBwLengths.w
  146. #define USBwLength0 USBwLengths.bw.bb0
  147. #define USBwLength1 USBwLengths.bw.bb1
  148. BYTE Setup0_Process(void);
  149. BYTE Post0_Process(void);
  150. BYTE Out0_Process(void);
  151. BYTE In0_Process(void);
  152. BYTE *Standard_GetConfiguration(WORD Length);
  153. RESULT Standard_SetConfiguration(void);
  154. BYTE *Standard_GetInterface(WORD Length);
  155. RESULT Standard_SetInterface(void);
  156. BYTE *Standard_GetDescriptorData(WORD Length, PONE_DESCRIPTOR pDesc);
  157. BYTE *Standard_GetStringDescriptor(WORD Length, PONE_DESCRIPTOR pDesc);
  158. void SetDeviceAddress(BYTE);
  159. void NOP_Process(void);