PageRenderTime 46ms CodeModel.GetById 26ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 0ms

/arduino-board-definitions/Telepoll-1.0.0/cores/arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src/common/tusb_types.h

https://codeberg.org/ccoenen/Telepoll
C Header | 481 lines | 346 code | 72 blank | 63 comment | 1 complexity | d9cad8a91e9679b8b6a8e6fe6f8e2c73 MD5 | raw file
Possible License(s): JSON
  1/* 
  2 * The MIT License (MIT)
  3 *
  4 * Copyright (c) 2019 Ha Thach (tinyusb.org)
  5 *
  6 * Permission is hereby granted, free of charge, to any person obtaining a copy
  7 * of this software and associated documentation files (the "Software"), to deal
  8 * in the Software without restriction, including without limitation the rights
  9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 10 * copies of the Software, and to permit persons to whom the Software is
 11 * furnished to do so, subject to the following conditions:
 12 *
 13 * The above copyright notice and this permission notice shall be included in
 14 * all copies or substantial portions of the Software.
 15 *
 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 22 * THE SOFTWARE.
 23 *
 24 * This file is part of the TinyUSB stack.
 25 */
 26
 27/** \ingroup group_usb_definitions
 28 *  \defgroup USBDef_Type USB Types
 29 *  @{ */
 30
 31#ifndef _TUSB_TYPES_H_
 32#define _TUSB_TYPES_H_
 33
 34#include <stdbool.h>
 35#include <stdint.h>
 36#include "tusb_compiler.h"
 37
 38#ifdef __cplusplus
 39 extern "C" {
 40#endif
 41
 42/*------------------------------------------------------------------*/
 43/* CONSTANTS
 44 *------------------------------------------------------------------*/
 45
 46/// defined base on EHCI specs value for Endpoint Speed
 47typedef enum
 48{
 49  TUSB_SPEED_FULL = 0,
 50  TUSB_SPEED_LOW     ,
 51  TUSB_SPEED_HIGH
 52}tusb_speed_t;
 53
 54/// defined base on USB Specs Endpoint's bmAttributes
 55typedef enum
 56{
 57  TUSB_XFER_CONTROL = 0 ,
 58  TUSB_XFER_ISOCHRONOUS ,
 59  TUSB_XFER_BULK        ,
 60  TUSB_XFER_INTERRUPT
 61}tusb_xfer_type_t;
 62
 63typedef enum
 64{
 65  TUSB_DIR_OUT = 0,
 66  TUSB_DIR_IN  = 1,
 67
 68  TUSB_DIR_IN_MASK = 0x80
 69}tusb_dir_t;
 70
 71/// USB Descriptor Types
 72typedef enum
 73{
 74  TUSB_DESC_DEVICE                = 0x01,
 75  TUSB_DESC_CONFIGURATION         = 0x02,
 76  TUSB_DESC_STRING                = 0x03,
 77  TUSB_DESC_INTERFACE             = 0x04,
 78  TUSB_DESC_ENDPOINT              = 0x05,
 79  TUSB_DESC_DEVICE_QUALIFIER      = 0x06,
 80  TUSB_DESC_OTHER_SPEED_CONFIG    = 0x07,
 81  TUSB_DESC_INTERFACE_POWER       = 0x08,
 82  TUSB_DESC_OTG                   = 0x09,
 83  TUSB_DESC_DEBUG                 = 0x0A,
 84  TUSB_DESC_INTERFACE_ASSOCIATION = 0x0B,
 85
 86  TUSB_DESC_BOS                   = 0x0F,
 87  TUSB_DESC_DEVICE_CAPABILITY     = 0x10,
 88
 89  TUSB_DESC_FUNCTIONAL            = 0x21,
 90
 91  // Class Specific Descriptor
 92  TUSB_DESC_CS_DEVICE             = 0x21,
 93  TUSB_DESC_CS_CONFIGURATION      = 0x22,
 94  TUSB_DESC_CS_STRING             = 0x23,
 95  TUSB_DESC_CS_INTERFACE          = 0x24,
 96  TUSB_DESC_CS_ENDPOINT           = 0x25,
 97
 98  TUSB_DESC_SUPERSPEED_ENDPOINT_COMPANION     = 0x30,
 99  TUSB_DESC_SUPERSPEED_ISO_ENDPOINT_COMPANION = 0x31
100}tusb_desc_type_t;
101
102typedef enum
103{
104  TUSB_REQ_GET_STATUS        = 0  ,
105  TUSB_REQ_CLEAR_FEATURE     = 1  ,
106  TUSB_REQ_RESERVED          = 2  ,
107  TUSB_REQ_SET_FEATURE       = 3  ,
108  TUSB_REQ_RESERVED2         = 4  ,
109  TUSB_REQ_SET_ADDRESS       = 5  ,
110  TUSB_REQ_GET_DESCRIPTOR    = 6  ,
111  TUSB_REQ_SET_DESCRIPTOR    = 7  ,
112  TUSB_REQ_GET_CONFIGURATION = 8  ,
113  TUSB_REQ_SET_CONFIGURATION = 9  ,
114  TUSB_REQ_GET_INTERFACE     = 10 ,
115  TUSB_REQ_SET_INTERFACE     = 11 ,
116  TUSB_REQ_SYNCH_FRAME       = 12
117}tusb_request_code_t;
118
119typedef enum
120{
121  TUSB_REQ_FEATURE_EDPT_HALT     = 0,
122  TUSB_REQ_FEATURE_REMOTE_WAKEUP = 1,
123  TUSB_REQ_FEATURE_TEST_MODE     = 2
124}tusb_request_feature_selector_t;
125
126typedef enum
127{
128  TUSB_REQ_TYPE_STANDARD = 0,
129  TUSB_REQ_TYPE_CLASS,
130  TUSB_REQ_TYPE_VENDOR,
131  TUSB_REQ_TYPE_INVALID
132} tusb_request_type_t;
133
134typedef enum
135{
136  TUSB_REQ_RCPT_DEVICE =0,
137  TUSB_REQ_RCPT_INTERFACE,
138  TUSB_REQ_RCPT_ENDPOINT,
139  TUSB_REQ_RCPT_OTHER
140} tusb_request_recipient_t;
141
142typedef enum
143{
144  TUSB_CLASS_UNSPECIFIED          = 0    ,
145  TUSB_CLASS_AUDIO                = 1    ,
146  TUSB_CLASS_CDC                  = 2    ,
147  TUSB_CLASS_HID                  = 3    ,
148  TUSB_CLASS_RESERVED_4           = 4    ,
149  TUSB_CLASS_PHYSICAL             = 5    ,
150  TUSB_CLASS_IMAGE                = 6    ,
151  TUSB_CLASS_PRINTER              = 7    ,
152  TUSB_CLASS_MSC                  = 8    ,
153  TUSB_CLASS_HUB                  = 9    ,
154  TUSB_CLASS_CDC_DATA             = 10   ,
155  TUSB_CLASS_SMART_CARD           = 11   ,
156  TUSB_CLASS_RESERVED_12          = 12   ,
157  TUSB_CLASS_CONTENT_SECURITY     = 13   ,
158  TUSB_CLASS_VIDEO                = 14   ,
159  TUSB_CLASS_PERSONAL_HEALTHCARE  = 15   ,
160  TUSB_CLASS_AUDIO_VIDEO          = 16   ,
161
162  TUSB_CLASS_DIAGNOSTIC           = 0xDC ,
163  TUSB_CLASS_WIRELESS_CONTROLLER  = 0xE0 ,
164  TUSB_CLASS_MISC                 = 0xEF ,
165  TUSB_CLASS_APPLICATION_SPECIFIC = 0xFE ,
166  TUSB_CLASS_VENDOR_SPECIFIC      = 0xFF
167}tusb_class_code_t;
168
169typedef enum
170{
171  MISC_SUBCLASS_COMMON = 2
172}misc_subclass_type_t;
173
174typedef enum
175{
176  MISC_PROTOCOL_IAD = 1
177}misc_protocol_type_t;
178
179typedef enum
180{
181  DEVICE_CAPABILITY_WIRELESS_USB               = 0x01,
182  DEVICE_CAPABILITY_USB20_EXTENSION            = 0x02,
183  DEVICE_CAPABILITY_SUPERSPEED_USB             = 0x03,
184  DEVICE_CAPABILITY_CONTAINER_id               = 0x04,
185  DEVICE_CAPABILITY_PLATFORM                   = 0x05,
186  DEVICE_CAPABILITY_POWER_DELIVERY             = 0x06,
187  DEVICE_CAPABILITY_BATTERY_INFO               = 0x07,
188  DEVICE_CAPABILITY_PD_CONSUMER_PORT           = 0x08,
189  DEVICE_CAPABILITY_PD_PROVIDER_PORT           = 0x09,
190  DEVICE_CAPABILITY_SUPERSPEED_PLUS            = 0x0A,
191  DEVICE_CAPABILITY_PRECESION_TIME_MEASUREMENT = 0x0B,
192  DEVICE_CAPABILITY_WIRELESS_USB_EXT           = 0x0C,
193  DEVICE_CAPABILITY_BILLBOARD                  = 0x0D,
194  DEVICE_CAPABILITY_AUTHENTICATION             = 0x0E,
195  DEVICE_CAPABILITY_BILLBOARD_EX               = 0x0F,
196  DEVICE_CAPABILITY_CONFIGURATION_SUMMARY      = 0x10
197}device_capability_type_t;
198
199enum {
200  TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP = TU_BIT(5),
201  TUSB_DESC_CONFIG_ATT_SELF_POWERED  = TU_BIT(6),
202};
203
204#define TUSB_DESC_CONFIG_POWER_MA(x)  ((x)/2)
205
206/// Device State TODO remove
207typedef enum
208{
209  TUSB_DEVICE_STATE_UNPLUG = 0  ,
210  TUSB_DEVICE_STATE_CONFIGURED  ,
211  TUSB_DEVICE_STATE_SUSPENDED   ,
212}tusb_device_state_t;
213
214typedef enum
215{
216  XFER_RESULT_SUCCESS,
217  XFER_RESULT_FAILED,
218  XFER_RESULT_STALLED,
219}xfer_result_t;
220
221enum // TODO remove
222{
223  DESC_OFFSET_LEN  = 0,
224  DESC_OFFSET_TYPE = 1
225};
226
227enum
228{
229  INTERFACE_INVALID_NUMBER = 0xff
230};
231
232
233typedef enum
234{
235  MS_OS_20_SET_HEADER_DESCRIPTOR       = 0x00,
236  MS_OS_20_SUBSET_HEADER_CONFIGURATION = 0x01,
237  MS_OS_20_SUBSET_HEADER_FUNCTION      = 0x02,
238  MS_OS_20_FEATURE_COMPATBLE_ID        = 0x03,
239  MS_OS_20_FEATURE_REG_PROPERTY        = 0x04,
240  MS_OS_20_FEATURE_MIN_RESUME_TIME     = 0x05,
241  MS_OS_20_FEATURE_MODEL_ID            = 0x06,
242  MS_OS_20_FEATURE_CCGP_DEVICE         = 0x07,
243  MS_OS_20_FEATURE_VENDOR_REVISION     = 0x08
244} microsoft_os_20_type_t;
245
246//--------------------------------------------------------------------+
247// USB Descriptors
248//--------------------------------------------------------------------+
249
250/// USB Device Descriptor
251typedef struct TU_ATTR_PACKED
252{
253  uint8_t  bLength            ; ///< Size of this descriptor in bytes.
254  uint8_t  bDescriptorType    ; ///< DEVICE Descriptor Type.
255  uint16_t bcdUSB             ; ///< BUSB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H). This field identifies the release of the USB Specification with which the device and its descriptors are compliant.
256
257  uint8_t  bDeviceClass       ; ///< Class code (assigned by the USB-IF). \li If this field is reset to zero, each interface within a configuration specifies its own class information and the various interfaces operate independently. \li If this field is set to a value between 1 and FEH, the device supports different class specifications on different interfaces and the interfaces may not operate independently. This value identifies the class definition used for the aggregate interfaces. \li If this field is set to FFH, the device class is vendor-specific.
258  uint8_t  bDeviceSubClass    ; ///< Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bDeviceClass field. \li If the bDeviceClass field is reset to zero, this field must also be reset to zero. \li If the bDeviceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.
259  uint8_t  bDeviceProtocol    ; ///< Protocol code (assigned by the USB-IF). These codes are qualified by the value of the bDeviceClass and the bDeviceSubClass fields. If a device supports class-specific protocols on a device basis as opposed to an interface basis, this code identifies the protocols that the device uses as defined by the specification of the device class. \li If this field is reset to zero, the device does not use class-specific protocols on a device basis. However, it may use classspecific protocols on an interface basis. \li If this field is set to FFH, the device uses a vendor-specific protocol on a device basis.
260  uint8_t  bMaxPacketSize0    ; ///< Maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid). For HS devices is fixed to 64.
261
262  uint16_t idVendor           ; ///< Vendor ID (assigned by the USB-IF).
263  uint16_t idProduct          ; ///< Product ID (assigned by the manufacturer).
264  uint16_t bcdDevice          ; ///< Device release number in binary-coded decimal.
265  uint8_t  iManufacturer      ; ///< Index of string descriptor describing manufacturer.
266  uint8_t  iProduct           ; ///< Index of string descriptor describing product.
267  uint8_t  iSerialNumber      ; ///< Index of string descriptor describing the device's serial number.
268
269  uint8_t  bNumConfigurations ; ///< Number of possible configurations.
270} tusb_desc_device_t;
271
272// USB Binary Device Object Store (BOS) Descriptor
273typedef struct TU_ATTR_PACKED
274{
275  uint8_t  bLength         ; ///< Size of this descriptor in bytes
276  uint8_t  bDescriptorType ; ///< CONFIGURATION Descriptor Type
277  uint16_t wTotalLength    ; ///< Total length of data returned for this descriptor
278  uint8_t  bNumDeviceCaps  ; ///< Number of device capability descriptors in the BOS
279} tusb_desc_bos_t;
280
281/// USB Configuration Descriptor
282typedef struct TU_ATTR_PACKED
283{
284  uint8_t  bLength             ; ///< Size of this descriptor in bytes
285  uint8_t  bDescriptorType     ; ///< CONFIGURATION Descriptor Type
286  uint16_t wTotalLength        ; ///< Total length of data returned for this configuration. Includes the combined length of all descriptors (configuration, interface, endpoint, and class- or vendor-specific) returned for this configuration.
287
288  uint8_t  bNumInterfaces      ; ///< Number of interfaces supported by this configuration
289  uint8_t  bConfigurationValue ; ///< Value to use as an argument to the SetConfiguration() request to select this configuration.
290  uint8_t  iConfiguration      ; ///< Index of string descriptor describing this configuration
291  uint8_t  bmAttributes        ; ///< Configuration characteristics \n D7: Reserved (set to one)\n D6: Self-powered \n D5: Remote Wakeup \n D4...0: Reserved (reset to zero) \n D7 is reserved and must be set to one for historical reasons. \n A device configuration that uses power from the bus and a local source reports a non-zero value in bMaxPower to indicate the amount of bus power required and sets D6. The actual power source at runtime may be determined using the GetStatus(DEVICE) request (see USB 2.0 spec Section 9.4.5). \n If a device configuration supports remote wakeup, D5 is set to one.
292  uint8_t  bMaxPower           ; ///< Maximum power consumption of the USB device from the bus in this specific configuration when the device is fully operational. Expressed in 2 mA units (i.e., 50 = 100 mA).
293} tusb_desc_configuration_t;
294
295/// USB Interface Descriptor
296typedef struct TU_ATTR_PACKED
297{
298  uint8_t  bLength            ; ///< Size of this descriptor in bytes
299  uint8_t  bDescriptorType    ; ///< INTERFACE Descriptor Type
300
301  uint8_t  bInterfaceNumber   ; ///< Number of this interface. Zero-based value identifying the index in the array of concurrent interfaces supported by this configuration.
302  uint8_t  bAlternateSetting  ; ///< Value used to select this alternate setting for the interface identified in the prior field
303  uint8_t  bNumEndpoints      ; ///< Number of endpoints used by this interface (excluding endpoint zero). If this value is zero, this interface only uses the Default Control Pipe.
304  uint8_t  bInterfaceClass    ; ///< Class code (assigned by the USB-IF). \li A value of zero is reserved for future standardization. \li If this field is set to FFH, the interface class is vendor-specific. \li All other values are reserved for assignment by the USB-IF.
305  uint8_t  bInterfaceSubClass ; ///< Subclass code (assigned by the USB-IF). \n These codes are qualified by the value of the bInterfaceClass field. \li If the bInterfaceClass field is reset to zero, this field must also be reset to zero. \li If the bInterfaceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.
306  uint8_t  bInterfaceProtocol ; ///< Protocol code (assigned by the USB). \n These codes are qualified by the value of the bInterfaceClass and the bInterfaceSubClass fields. If an interface supports class-specific requests, this code identifies the protocols that the device uses as defined by the specification of the device class. \li If this field is reset to zero, the device does not use a class-specific protocol on this interface. \li If this field is set to FFH, the device uses a vendor-specific protocol for this interface.
307  uint8_t  iInterface         ; ///< Index of string descriptor describing this interface
308} tusb_desc_interface_t;
309
310/// USB Endpoint Descriptor
311typedef struct TU_ATTR_PACKED
312{
313  uint8_t  bLength          ; ///< Size of this descriptor in bytes
314  uint8_t  bDescriptorType  ; ///< ENDPOINT Descriptor Type
315
316  uint8_t  bEndpointAddress ; ///< The address of the endpoint on the USB device described by this descriptor. The address is encoded as follows: \n Bit 3...0: The endpoint number \n Bit 6...4: Reserved, reset to zero \n Bit 7: Direction, ignored for control endpoints 0 = OUT endpoint 1 = IN endpoint.
317
318  struct TU_ATTR_PACKED {
319    uint8_t xfer  : 2;
320    uint8_t sync  : 2;
321    uint8_t usage : 2;
322    uint8_t       : 2;
323  } bmAttributes     ; ///< This field describes the endpoint's attributes when it is configured using the bConfigurationValue. \n Bits 1..0: Transfer Type \n- 00 = Control \n- 01 = Isochronous \n- 10 = Bulk \n- 11 = Interrupt \n If not an isochronous endpoint, bits 5..2 are reserved and must be set to zero. If isochronous, they are defined as follows: \n Bits 3..2: Synchronization Type \n- 00 = No Synchronization \n- 01 = Asynchronous \n- 10 = Adaptive \n- 11 = Synchronous \n Bits 5..4: Usage Type \n- 00 = Data endpoint \n- 01 = Feedback endpoint \n- 10 = Implicit feedback Data endpoint \n- 11 = Reserved \n Refer to Chapter 5 of USB 2.0 specification for more information. \n All other bits are reserved and must be reset to zero. Reserved bits must be ignored by the host.
324
325  struct TU_ATTR_PACKED {
326    uint16_t size           : 11; ///< Maximum packet size this endpoint is capable of sending or receiving when this configuration is selected. \n For isochronous endpoints, this value is used to reserve the bus time in the schedule, required for the per-(micro)frame data payloads. The pipe may, on an ongoing basis, actually use less bandwidth than that reserved. The device reports, if necessary, the actual bandwidth used via its normal, non-USB defined mechanisms. \n For all endpoints, bits 10..0 specify the maximum packet size (in bytes). \n For high-speed isochronous and interrupt endpoints: \n Bits 12..11 specify the number of additional transaction opportunities per microframe: \n- 00 = None (1 transaction per microframe) \n- 01 = 1 additional (2 per microframe) \n- 10 = 2 additional (3 per microframe) \n- 11 = Reserved \n Bits 15..13 are reserved and must be set to zero.
327    uint16_t hs_period_mult : 2;
328    uint16_t : 0;
329  }wMaxPacketSize;
330
331  uint8_t  bInterval        ; ///< Interval for polling endpoint for data transfers. Expressed in frames or microframes depending on the device operating speed (i.e., either 1 millisecond or 125 us units). \n- For full-/high-speed isochronous endpoints, this value must be in the range from 1 to 16. The bInterval value is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$). \n- For full-/low-speed interrupt endpoints, the value of this field may be from 1 to 255. \n- For high-speed interrupt endpoints, the bInterval value is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$) . This value must be from 1 to 16. \n- For high-speed bulk/control OUT endpoints, the bInterval must specify the maximum NAK rate of the endpoint. A value of 0 indicates the endpoint never NAKs. Other values indicate at most 1 NAK each bInterval number of microframes. This value must be in the range from 0 to 255. \n Refer to Chapter 5 of USB 2.0 specification for more information.
332} tusb_desc_endpoint_t;
333
334/// USB Other Speed Configuration Descriptor
335typedef struct TU_ATTR_PACKED
336{
337  uint8_t  bLength             ; ///< Size of descriptor
338  uint8_t  bDescriptorType     ; ///< Other_speed_Configuration Type
339  uint16_t wTotalLength        ; ///< Total length of data returned
340
341  uint8_t  bNumInterfaces      ; ///< Number of interfaces supported by this speed configuration
342  uint8_t  bConfigurationValue ; ///< Value to use to select configuration
343  uint8_t  IConfiguration      ; ///< Index of string descriptor
344  uint8_t  bmAttributes        ; ///< Same as Configuration descriptor
345  uint8_t  bMaxPower           ; ///< Same as Configuration descriptor
346} tusb_desc_other_speed_t;
347
348/// USB Device Qualifier Descriptor
349typedef struct TU_ATTR_PACKED
350{
351  uint8_t  bLength            ; ///< Size of descriptor
352  uint8_t  bDescriptorType    ; ///< Device Qualifier Type
353  uint16_t bcdUSB             ; ///< USB specification version number (e.g., 0200H for V2.00)
354
355  uint8_t  bDeviceClass       ; ///< Class Code
356  uint8_t  bDeviceSubClass    ; ///< SubClass Code
357  uint8_t  bDeviceProtocol    ; ///< Protocol Code
358  uint8_t  bMaxPacketSize0    ; ///< Maximum packet size for other speed
359  uint8_t  bNumConfigurations ; ///< Number of Other-speed Configurations
360  uint8_t  bReserved          ; ///< Reserved for future use, must be zero
361} tusb_desc_device_qualifier_t;
362
363/// USB Interface Association Descriptor (IAD ECN)
364typedef struct TU_ATTR_PACKED
365{
366  uint8_t bLength           ; ///< Size of descriptor
367  uint8_t bDescriptorType   ; ///< Other_speed_Configuration Type
368
369  uint8_t bFirstInterface   ; ///< Index of the first associated interface.
370  uint8_t bInterfaceCount   ; ///< Total number of associated interfaces.
371
372  uint8_t bFunctionClass    ; ///< Interface class ID.
373  uint8_t bFunctionSubClass ; ///< Interface subclass ID.
374  uint8_t bFunctionProtocol ; ///< Interface protocol ID.
375
376  uint8_t iFunction         ; ///< Index of the string descriptor describing the interface association.
377} tusb_desc_interface_assoc_t;
378
379// USB String Descriptor
380typedef struct TU_ATTR_PACKED
381{
382  uint8_t  bLength         ; ///< Size of this descriptor in bytes
383  uint8_t  bDescriptorType ; ///< Descriptor Type
384  uint16_t unicode_string[];
385} tusb_desc_string_t;
386
387// USB Binary Device Object Store (BOS)
388typedef struct TU_ATTR_PACKED
389{
390  uint8_t bLength;
391  uint8_t bDescriptorType ;
392  uint8_t bDevCapabilityType;
393  uint8_t bReserved;
394  uint8_t PlatformCapabilityUUID[16];
395  uint8_t CapabilityData[];
396} tusb_desc_bos_platform_t;
397
398// USB WebuSB URL Descriptor
399typedef struct TU_ATTR_PACKED
400{
401  uint8_t bLength;
402  uint8_t bDescriptorType;
403  uint8_t bScheme;
404  char    url[];
405} tusb_desc_webusb_url_t;
406
407/*------------------------------------------------------------------*/
408/* Types
409 *------------------------------------------------------------------*/
410typedef struct TU_ATTR_PACKED{
411  union {
412    struct TU_ATTR_PACKED {
413      uint8_t recipient :  5; ///< Recipient type tusb_request_recipient_t.
414      uint8_t type      :  2; ///< Request type tusb_request_type_t.
415      uint8_t direction :  1; ///< Direction type. tusb_dir_t
416    } bmRequestType_bit;
417
418    uint8_t bmRequestType;
419  };
420
421  uint8_t  bRequest;
422  uint16_t wValue;
423  uint16_t wIndex;
424  uint16_t wLength;
425} tusb_control_request_t;
426
427TU_VERIFY_STATIC( sizeof(tusb_control_request_t) == 8, "mostly compiler option issue");
428
429// TODO move to somewhere suitable
430static inline uint8_t bm_request_type(uint8_t direction, uint8_t type, uint8_t recipient)
431{
432  return ((uint8_t) (direction << 7)) | ((uint8_t) (type << 5)) | (recipient);
433}
434
435//--------------------------------------------------------------------+
436// Endpoint helper
437//--------------------------------------------------------------------+
438
439// Get direction from Endpoint address
440static inline tusb_dir_t tu_edpt_dir(uint8_t addr)
441{
442  return (addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;
443}
444
445// Get Endpoint number from address
446static inline uint8_t tu_edpt_number(uint8_t addr)
447{
448  return (uint8_t)(addr & (~TUSB_DIR_IN_MASK));
449}
450
451static inline uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)
452{
453  return (uint8_t)(num | (dir ? TUSB_DIR_IN_MASK : 0));
454}
455
456//--------------------------------------------------------------------+
457// Descriptor helper
458//--------------------------------------------------------------------+
459static inline uint8_t const * tu_desc_next(void const* desc)
460{
461  uint8_t const* desc8 = (uint8_t const*) desc;
462  return desc8 + desc8[DESC_OFFSET_LEN];
463}
464
465static inline uint8_t tu_desc_type(void const* desc)
466{
467  return ((uint8_t const*) desc)[DESC_OFFSET_TYPE];
468}
469
470static inline uint8_t tu_desc_len(void const* desc)
471{
472  return ((uint8_t const*) desc)[DESC_OFFSET_LEN];
473}
474
475#ifdef __cplusplus
476 }
477#endif
478
479#endif /* _TUSB_TYPES_H_ */
480
481/** @} */