1 /**
2   ******************************************************************************
3   * @file    usbd_def.h
4   * @author  MCD Application Team
5   * @version V2.4.2
6   * @date    11-December-2015
7   * @brief   General defines for the usb device library
8   ******************************************************************************
9   * @attention
10   *
11   * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
12   *
13   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
14   * You may not use this file except in compliance with the License.
15   * You may obtain a copy of the License at:
16   *
17   *        http://www.st.com/software_license_agreement_liberty_v2
18   *
19   * Unless required by applicable law or agreed to in writing, software
20   * distributed under the License is distributed on an "AS IS" BASIS,
21   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22   * See the License for the specific language governing permissions and
23   * limitations under the License.
24   *
25   ******************************************************************************
26   */
27 
28 /* Define to prevent recursive inclusion -------------------------------------*/
29 #ifndef __USBD_DEF_H
30 #define __USBD_DEF_H
31 
32 #ifdef __cplusplus
33  extern "C" {
34 #endif
35 
36 /* Includes ------------------------------------------------------------------*/
37 #include "usbd_conf.h"
38 
39 /** @addtogroup STM32_USBD_DEVICE_LIBRARY
40   * @{
41   */
42 
43 /** @defgroup USB_DEF
44   * @brief general defines for the usb device library file
45   * @{
46   */
47 
48 /** @defgroup USB_DEF_Exported_Defines
49   * @{
50   */
51 
52 #ifndef NULL
53 #define NULL  0
54 #endif
55 
56 
57 #define  USB_LEN_DEV_QUALIFIER_DESC                     0x0A
58 #define  USB_LEN_DEV_DESC                               0x12
59 #define  USB_LEN_CFG_DESC                               0x09
60 #define  USB_LEN_IF_DESC                                0x09
61 #define  USB_LEN_EP_DESC                                0x07
62 #define  USB_LEN_OTG_DESC                               0x03
63 #define  USB_LEN_LANGID_STR_DESC                        0x04
64 #define  USB_LEN_OTHER_SPEED_DESC_SIZ                   0x09
65 
66 #define  USBD_IDX_LANGID_STR                            0x00
67 #define  USBD_IDX_MFC_STR                               0x01
68 #define  USBD_IDX_PRODUCT_STR                           0x02
69 #define  USBD_IDX_SERIAL_STR                            0x03
70 #define  USBD_IDX_CONFIG_STR                            0x04
71 #define  USBD_IDX_INTERFACE_STR                         0x05
72 
73 #define  USB_REQ_TYPE_STANDARD                          0x00
74 #define  USB_REQ_TYPE_CLASS                             0x20
75 #define  USB_REQ_TYPE_VENDOR                            0x40
76 #define  USB_REQ_TYPE_MASK                              0x60
77 
78 #define  USB_REQ_RECIPIENT_DEVICE                       0x00
79 #define  USB_REQ_RECIPIENT_INTERFACE                    0x01
80 #define  USB_REQ_RECIPIENT_ENDPOINT                     0x02
81 #define  USB_REQ_RECIPIENT_MASK                         0x03
82 
83 #define  USB_REQ_GET_STATUS                             0x00
84 #define  USB_REQ_CLEAR_FEATURE                          0x01
85 #define  USB_REQ_SET_FEATURE                            0x03
86 #define  USB_REQ_SET_ADDRESS                            0x05
87 #define  USB_REQ_GET_DESCRIPTOR                         0x06
88 #define  USB_REQ_SET_DESCRIPTOR                         0x07
89 #define  USB_REQ_GET_CONFIGURATION                      0x08
90 #define  USB_REQ_SET_CONFIGURATION                      0x09
91 #define  USB_REQ_GET_INTERFACE                          0x0A
92 #define  USB_REQ_SET_INTERFACE                          0x0B
93 #define  USB_REQ_SYNCH_FRAME                            0x0C
94 
95 #define  USB_DESC_TYPE_DEVICE                              1
96 #define  USB_DESC_TYPE_CONFIGURATION                       2
97 #define  USB_DESC_TYPE_STRING                              3
98 #define  USB_DESC_TYPE_INTERFACE                           4
99 #define  USB_DESC_TYPE_ENDPOINT                            5
100 #define  USB_DESC_TYPE_DEVICE_QUALIFIER                    6
101 #define  USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION           7
102 #define  USB_DESC_TYPE_BOS                                 0x0F
103 
104 #define USB_CONFIG_REMOTE_WAKEUP                           2
105 #define USB_CONFIG_SELF_POWERED                            1
106 
107 #define USB_FEATURE_EP_HALT                                0
108 #define USB_FEATURE_REMOTE_WAKEUP                          1
109 #define USB_FEATURE_TEST_MODE                              2
110 
111 #define USB_DEVICE_CAPABITY_TYPE                           0x10
112 
113 #define USB_HS_MAX_PACKET_SIZE                            512
114 #define USB_FS_MAX_PACKET_SIZE                            64
115 #define USB_MAX_EP0_SIZE                                  64
116 
117 /*  Device Status */
118 #define USBD_STATE_DEFAULT                                1
119 #define USBD_STATE_ADDRESSED                              2
120 #define USBD_STATE_CONFIGURED                             3
121 #define USBD_STATE_SUSPENDED                              4
122 
123 
124 /*  EP0 State */
125 #define USBD_EP0_IDLE                                     0
126 #define USBD_EP0_SETUP                                    1
127 #define USBD_EP0_DATA_IN                                  2
128 #define USBD_EP0_DATA_OUT                                 3
129 #define USBD_EP0_STATUS_IN                                4
130 #define USBD_EP0_STATUS_OUT                               5
131 #define USBD_EP0_STALL                                    6
132 
133 #define USBD_EP_TYPE_CTRL                                 0
134 #define USBD_EP_TYPE_ISOC                                 1
135 #define USBD_EP_TYPE_BULK                                 2
136 #define USBD_EP_TYPE_INTR                                 3
137 
138 
139 /**
140   * @}
141   */
142 
143 
144 /** @defgroup USBD_DEF_Exported_TypesDefinitions
145   * @{
146   */
147 
148 typedef  struct  usb_setup_req
149 {
150 
151     uint8_t   bmRequest;
152     uint8_t   bRequest;
153     uint16_t  wValue;
154     uint16_t  wIndex;
155     uint16_t  wLength;
156 }USBD_SetupReqTypedef;
157 
158 struct _USBD_HandleTypeDef;
159 
160 typedef struct _Device_cb
161 {
162   uint8_t  (*Init)             (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx);
163   uint8_t  (*DeInit)           (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx);
164  /* Control Endpoints*/
165   uint8_t  (*Setup)            (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef  *req);
166   uint8_t  (*EP0_TxSent)       (struct _USBD_HandleTypeDef *pdev );
167   uint8_t  (*EP0_RxReady)      (struct _USBD_HandleTypeDef *pdev );
168   /* Class Specific Endpoints*/
169   uint8_t  (*DataIn)           (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
170   uint8_t  (*DataOut)          (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
171   uint8_t  (*SOF)              (struct _USBD_HandleTypeDef *pdev);
172   uint8_t  (*IsoINIncomplete)  (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
173   uint8_t  (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum);
174 
175   uint8_t  *(*GetHSConfigDescriptor)(uint16_t *length);
176   uint8_t  *(*GetFSConfigDescriptor)(uint16_t *length);
177   uint8_t  *(*GetOtherSpeedConfigDescriptor)(uint16_t *length);
178   uint8_t  *(*GetDeviceQualifierDescriptor)(uint16_t *length);
179 #if (USBD_SUPPORT_USER_STRING == 1)
180   uint8_t  *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index,  uint16_t *length);
181 #endif
182 
183 } USBD_ClassTypeDef;
184 
185 /* Following USB Device Speed */
186 typedef enum
187 {
188   USBD_SPEED_HIGH  = 0,
189   USBD_SPEED_FULL  = 1,
190   USBD_SPEED_LOW   = 2,
191 }USBD_SpeedTypeDef;
192 
193 /* Following USB Device status */
194 typedef enum {
195   USBD_OK   = 0,
196   USBD_BUSY,
197   USBD_FAIL,
198 }USBD_StatusTypeDef;
199 
200 /* USB Device descriptors structure */
201 typedef struct
202 {
203   uint8_t  *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
204   uint8_t  *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
205   uint8_t  *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
206   uint8_t  *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
207   uint8_t  *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
208   uint8_t  *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
209   uint8_t  *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
210 #if (USBD_LPM_ENABLED == 1)
211   uint8_t  *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);
212 #endif
213 } USBD_DescriptorsTypeDef;
214 
215 /* USB Device handle structure */
216 typedef struct
217 {
218   uint32_t                status;
219   uint32_t                total_length;
220   uint32_t                rem_length;
221   uint32_t                maxpacket;
222 } USBD_EndpointTypeDef;
223 
224 /* USB Device handle structure */
225 typedef struct _USBD_HandleTypeDef
226 {
227   uint8_t                 id;
228   uint32_t                dev_config;
229   uint32_t                dev_default_config;
230   uint32_t                dev_config_status;
231   USBD_SpeedTypeDef       dev_speed;
232   USBD_EndpointTypeDef    ep_in[15];
233   USBD_EndpointTypeDef    ep_out[15];
234   uint32_t                ep0_state;
235   uint32_t                ep0_data_len;
236   uint8_t                 dev_state;
237   uint8_t                 dev_old_state;
238   uint8_t                 dev_address;
239   uint8_t                 dev_connection_status;
240   uint8_t                 dev_test_mode;
241   uint32_t                dev_remote_wakeup;
242 
243   USBD_SetupReqTypedef    request;
244   USBD_DescriptorsTypeDef *pDesc;
245   USBD_ClassTypeDef       *pClass;
246   void                    *pClassData;
247   void                    *pUserData;
248   void                    *pData;
249 } USBD_HandleTypeDef;
250 
251 /**
252   * @}
253   */
254 
255 
256 
257 /** @defgroup USBD_DEF_Exported_Macros
258   * @{
259   */
260 #define  SWAPBYTE(addr)        (((uint16_t)(*((uint8_t *)(addr)))) + \
261                                (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8))
262 
263 #define LOBYTE(x)  ((uint8_t)(x & 0x00FF))
264 #define HIBYTE(x)  ((uint8_t)((x & 0xFF00) >>8))
265 #ifndef MIN
266 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
267 #endif
268 #ifndef MAX
269 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
270 #endif
271 
272 #if  defined ( __GNUC__ )
273   #ifndef __weak
274     #define __weak   __attribute__((weak))
275   #endif /* __weak */
276   #ifndef __packed
277     #define __packed __attribute__((__packed__))
278   #endif /* __packed */
279 #endif /* __GNUC__ */
280 
281 
282 /* In HS mode and when the DMA is used, all variables and data structures dealing
283    with the DMA during the transaction process should be 4-bytes aligned */
284 
285 #if defined   (__GNUC__)        /* GNU Compiler */
286   #define __ALIGN_END    __attribute__ ((aligned (4)))
287   #define __ALIGN_BEGIN
288 #else
289   #define __ALIGN_END
290   #if defined   (__CC_ARM)      /* ARM Compiler */
291     #define __ALIGN_BEGIN    __align(4)
292   #elif defined (__ICCARM__)    /* IAR Compiler */
293     #define __ALIGN_BEGIN
294   #elif defined  (__TASKING__)  /* TASKING Compiler */
295     #define __ALIGN_BEGIN    __align(4)
296   #endif /* __CC_ARM */
297 #endif /* __GNUC__ */
298 
299 
300 /**
301   * @}
302   */
303 
304 /** @defgroup USBD_DEF_Exported_Variables
305   * @{
306   */
307 
308 /**
309   * @}
310   */
311 
312 /** @defgroup USBD_DEF_Exported_FunctionsPrototype
313   * @{
314   */
315 
316 /**
317   * @}
318   */
319 
320 #ifdef __cplusplus
321 }
322 #endif
323 
324 #endif /* __USBD_DEF_H */
325 
326 /**
327   * @}
328   */
329 
330 /**
331 * @}
332 */
333 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
334