653 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			653 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /***********************************************************************
 | |||
|  | * $Id:: mw_usbd.h 197 2011-06-12 20:22:41Z usb06052                           $ | |||
|  | * | |||
|  | * Project: USB device ROM Stack | |||
|  | * | |||
|  | * Description: | |||
|  | *     USB Definitions. | |||
|  | * | |||
|  | *********************************************************************** | |||
|  | *   Copyright(C) 2011, NXP Semiconductor | |||
|  | *   All rights reserved. | |||
|  | * | |||
|  | * Software that is described herein is for illustrative purposes only | |||
|  | * which provides customers with programming information regarding the | |||
|  | * products. This software is supplied "AS IS" without any warranties. | |||
|  | * NXP Semiconductors assumes no responsibility or liability for the | |||
|  | * use of the software, conveys no license or title under any patent, | |||
|  | * copyright, or mask work right to the product. NXP Semiconductors | |||
|  | * reserves the right to make changes in the software without | |||
|  | * notification. NXP Semiconductors also make no representation or | |||
|  | * warranty that such application will be suitable for the specified | |||
|  | * use without further testing or modification. | |||
|  | **********************************************************************/ | |||
|  | 
 | |||
|  | #ifndef __USB_H__
 | |||
|  | #define __USB_H__
 | |||
|  | 
 | |||
|  | /** \file
 | |||
|  |  *  \brief Common definitions and declarations for the USB stack. | |||
|  |  * | |||
|  |  *  Common definitions and declarations for the USB stack. | |||
|  |  *  \addtogroup USBD_Core  | |||
|  |  *  @{ | |||
|  |  */ | |||
|  | 
 | |||
|  | #include <stdint.h>
 | |||
|  | 
 | |||
|  | #if defined(__GNUC__)
 | |||
|  | /* As per http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax,
 | |||
|  | 6.29 Attributes Syntax | |||
|  | "An attribute specifier list may appear as part of a struct, union or | |||
|  | enum specifier. It may go either immediately after the struct, union | |||
|  | or enum keyword, or after the closing brace. The former syntax is | |||
|  | preferred. Where attribute specifiers follow the closing brace, they | |||
|  | are considered to relate to the structure, union or enumerated type | |||
|  | defined, not to any enclosing declaration the type specifier appears | |||
|  | in, and the type defined is not complete until after the attribute | |||
|  | specifiers." | |||
|  | So use POST_PACK immediately after struct keyword | |||
|  | */ | |||
|  | #define PRE_PACK
 | |||
|  | #define POST_PACK	__attribute__((__packed__))
 | |||
|  | #define ALIGNED(n)  __attribute__((aligned (n)))
 | |||
|  | #elif defined(__arm)
 | |||
|  | #define PRE_PACK	__packed
 | |||
|  | #define POST_PACK
 | |||
|  | #define ALIGNED(n)  __align(n)
 | |||
|  | #endif
 | |||
|  | 
 | |||
|  | /** Structure to pack lower and upper byte to form 16 bit word. */ | |||
|  | PRE_PACK struct POST_PACK _WB_T | |||
|  | { | |||
|  |   uint8_t L; /**< lower byte */ | |||
|  |   uint8_t H; /**< upper byte */ | |||
|  | }; | |||
|  | /** Structure to pack lower and upper byte to form 16 bit word.*/ | |||
|  | typedef struct _WB_T WB_T; | |||
|  | 
 | |||
|  | /** Union of \ref _WB_T struct and 16 bit word.*/ | |||
|  | PRE_PACK union POST_PACK __WORD_BYTE | |||
|  | { | |||
|  |   uint16_t W; /**< data member to do 16 bit access */ | |||
|  |   WB_T WB; /**< data member to do 8 bit access */ | |||
|  | } ; | |||
|  | /** Union of \ref _WB_T struct and 16 bit word.*/ | |||
|  | typedef union __WORD_BYTE WORD_BYTE; | |||
|  | 
 | |||
|  | /** bmRequestType.Dir defines 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Request from host to device */ | |||
|  | #define REQUEST_HOST_TO_DEVICE     0
 | |||
|  | /** Request from device to host */ | |||
|  | #define REQUEST_DEVICE_TO_HOST     1
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** bmRequestType.Type defines  
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Standard Request */ | |||
|  | #define REQUEST_STANDARD           0
 | |||
|  | /** Class Request */ | |||
|  | #define REQUEST_CLASS              1
 | |||
|  | /** Vendor Request */ | |||
|  | #define REQUEST_VENDOR             2
 | |||
|  | /** Reserved Request */ | |||
|  | #define REQUEST_RESERVED           3
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** bmRequestType.Recipient defines  
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Request to device */ | |||
|  | #define REQUEST_TO_DEVICE          0
 | |||
|  | /** Request to interface */ | |||
|  | #define REQUEST_TO_INTERFACE       1
 | |||
|  | /** Request to endpoint */ | |||
|  | #define REQUEST_TO_ENDPOINT        2
 | |||
|  | /** Request to other */ | |||
|  | #define REQUEST_TO_OTHER           3
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** Structure to define 8 bit USB request.*/ | |||
|  | PRE_PACK struct POST_PACK _BM_T | |||
|  | { | |||
|  |   uint8_t Recipient :  5; /**< Recipeint type. */ | |||
|  |   uint8_t Type      :  2; /**< Request type.  */ | |||
|  |   uint8_t Dir       :  1; /**< Directtion type. */ | |||
|  | }; | |||
|  | /** Structure to define 8 bit USB request.*/ | |||
|  | typedef struct _BM_T BM_T; | |||
|  | 
 | |||
|  | /** Union of \ref _BM_T struct and 8 bit byte.*/ | |||
|  | PRE_PACK union POST_PACK _REQUEST_TYPE | |||
|  | { | |||
|  |   uint8_t B; /**< byte wide access memeber */ | |||
|  |   BM_T BM;   /**< bitfield structure access memeber */ | |||
|  | } ; | |||
|  | /** Union of \ref _BM_T struct and 8 bit byte.*/ | |||
|  | typedef union _REQUEST_TYPE REQUEST_TYPE; | |||
|  | 
 | |||
|  | /** USB Standard Request Codes 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** GET_STATUS request */ | |||
|  | #define USB_REQUEST_GET_STATUS                 0
 | |||
|  | /** CLEAR_FEATURE request */ | |||
|  | #define USB_REQUEST_CLEAR_FEATURE              1
 | |||
|  | /** SET_FEATURE request */ | |||
|  | #define USB_REQUEST_SET_FEATURE                3
 | |||
|  | /** SET_ADDRESS request */ | |||
|  | #define USB_REQUEST_SET_ADDRESS                5
 | |||
|  | /** GET_DESCRIPTOR request */ | |||
|  | #define USB_REQUEST_GET_DESCRIPTOR             6
 | |||
|  | /** SET_DESCRIPTOR request */ | |||
|  | #define USB_REQUEST_SET_DESCRIPTOR             7
 | |||
|  | /** GET_CONFIGURATION request */ | |||
|  | #define USB_REQUEST_GET_CONFIGURATION          8
 | |||
|  | /** SET_CONFIGURATION request */ | |||
|  | #define USB_REQUEST_SET_CONFIGURATION          9
 | |||
|  | /** GET_INTERFACE request */ | |||
|  | #define USB_REQUEST_GET_INTERFACE              10
 | |||
|  | /** SET_INTERFACE request */ | |||
|  | #define USB_REQUEST_SET_INTERFACE              11
 | |||
|  | /** SYNC_FRAME request */ | |||
|  | #define USB_REQUEST_SYNC_FRAME                 12
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** USB GET_STATUS Bit Values 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** SELF_POWERED status*/ | |||
|  | #define USB_GETSTATUS_SELF_POWERED             0x01
 | |||
|  | /** REMOTE_WAKEUP capable status*/ | |||
|  | #define USB_GETSTATUS_REMOTE_WAKEUP            0x02
 | |||
|  | /** ENDPOINT_STALL status*/ | |||
|  | #define USB_GETSTATUS_ENDPOINT_STALL           0x01
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** USB Standard Feature selectors 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** ENDPOINT_STALL feature*/ | |||
|  | #define USB_FEATURE_ENDPOINT_STALL             0
 | |||
|  | /** REMOTE_WAKEUP feature*/ | |||
|  | #define USB_FEATURE_REMOTE_WAKEUP              1
 | |||
|  | /** TEST_MODE feature*/ | |||
|  | #define USB_FEATURE_TEST_MODE                  2
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** USB Default Control Pipe Setup Packet*/ | |||
|  | PRE_PACK struct POST_PACK _USB_SETUP_PACKET | |||
|  | { | |||
|  |   REQUEST_TYPE bmRequestType; /**< This bitmapped field identifies the characteristics
 | |||
|  |                               of the specific request. \sa _BM_T. | |||
|  |                               */ | |||
|  |   uint8_t      bRequest; /**< This field specifies the particular request. The 
 | |||
|  |                          Type bits in the bmRequestType field modify the meaning  | |||
|  |                          of this field. \sa USBD_REQUEST. | |||
|  |                          */ | |||
|  |   WORD_BYTE    wValue; /**< Used to pass a parameter to the device, specific
 | |||
|  |                         to the request. | |||
|  |                         */ | |||
|  |   WORD_BYTE    wIndex; /**< Used to pass a parameter to the device, specific
 | |||
|  |                         to the request. The wIndex field is often used in  | |||
|  |                         requests to specify an endpoint or an interface. | |||
|  |                         */ | |||
|  |   uint16_t     wLength; /**< This field specifies the length of the data 
 | |||
|  |                         transferred during the second phase of the control  | |||
|  |                         transfer. | |||
|  |                         */ | |||
|  | } ; | |||
|  | /** USB Default Control Pipe Setup Packet*/ | |||
|  | typedef struct _USB_SETUP_PACKET USB_SETUP_PACKET; | |||
|  | 
 | |||
|  | 
 | |||
|  | /** USB Descriptor Types 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Device descriptor type  */ | |||
|  | #define USB_DEVICE_DESCRIPTOR_TYPE             1
 | |||
|  | /** Configuration descriptor type  */ | |||
|  | #define USB_CONFIGURATION_DESCRIPTOR_TYPE      2
 | |||
|  | /** String descriptor type  */ | |||
|  | #define USB_STRING_DESCRIPTOR_TYPE             3
 | |||
|  | /** Interface descriptor type  */ | |||
|  | #define USB_INTERFACE_DESCRIPTOR_TYPE          4
 | |||
|  | /** Endpoint descriptor type  */ | |||
|  | #define USB_ENDPOINT_DESCRIPTOR_TYPE           5
 | |||
|  | /** Device qualifier descriptor type  */ | |||
|  | #define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE   6
 | |||
|  | /** Other speed configuration descriptor type  */ | |||
|  | #define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
 | |||
|  | /** Interface power descriptor type  */ | |||
|  | #define USB_INTERFACE_POWER_DESCRIPTOR_TYPE    8
 | |||
|  | /** OTG descriptor type  */ | |||
|  | #define USB_OTG_DESCRIPTOR_TYPE                     9
 | |||
|  | /** Debug descriptor type  */ | |||
|  | #define USB_DEBUG_DESCRIPTOR_TYPE                  10
 | |||
|  | /** Interface association descriptor type  */ | |||
|  | #define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE  11
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** USB Device Classes 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Reserved device class  */ | |||
|  | #define USB_DEVICE_CLASS_RESERVED              0x00
 | |||
|  | /** Audio device class  */ | |||
|  | #define USB_DEVICE_CLASS_AUDIO                 0x01
 | |||
|  | /** Communications device class  */ | |||
|  | #define USB_DEVICE_CLASS_COMMUNICATIONS        0x02
 | |||
|  | /** Human interface device class  */ | |||
|  | #define USB_DEVICE_CLASS_HUMAN_INTERFACE       0x03
 | |||
|  | /** monitor device class  */ | |||
|  | #define USB_DEVICE_CLASS_MONITOR               0x04
 | |||
|  | /** physical interface device class  */ | |||
|  | #define USB_DEVICE_CLASS_PHYSICAL_INTERFACE    0x05
 | |||
|  | /** power device class  */ | |||
|  | #define USB_DEVICE_CLASS_POWER                 0x06
 | |||
|  | /** Printer device class  */ | |||
|  | #define USB_DEVICE_CLASS_PRINTER               0x07
 | |||
|  | /** Storage device class  */ | |||
|  | #define USB_DEVICE_CLASS_STORAGE               0x08
 | |||
|  | /** Hub device class  */ | |||
|  | #define USB_DEVICE_CLASS_HUB                   0x09
 | |||
|  | /** miscellaneous device class  */ | |||
|  | #define USB_DEVICE_CLASS_MISCELLANEOUS         0xEF
 | |||
|  | /** Application device class  */ | |||
|  | #define USB_DEVICE_CLASS_APP                   0xFE
 | |||
|  | /** Vendor specific device class  */ | |||
|  | #define USB_DEVICE_CLASS_VENDOR_SPECIFIC       0xFF
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** bmAttributes in Configuration Descriptor 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Power field mask */ | |||
|  | #define USB_CONFIG_POWERED_MASK                0x40
 | |||
|  | /** Bus powered */ | |||
|  | #define USB_CONFIG_BUS_POWERED                 0x80
 | |||
|  | /** Self powered */ | |||
|  | #define USB_CONFIG_SELF_POWERED                0xC0
 | |||
|  | /** remote wakeup */ | |||
|  | #define USB_CONFIG_REMOTE_WAKEUP               0x20
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** bMaxPower in Configuration Descriptor */ | |||
|  | #define USB_CONFIG_POWER_MA(mA)                ((mA)/2)
 | |||
|  | 
 | |||
|  | /** bEndpointAddress in Endpoint Descriptor 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Endopint address mask */ | |||
|  | #define USB_ENDPOINT_DIRECTION_MASK            0x80
 | |||
|  | /** Macro to convert OUT endopint number to endpoint address value. */ | |||
|  | #define USB_ENDPOINT_OUT(addr)                 ((addr) | 0x00)
 | |||
|  | /** Macro to convert IN endopint number to endpoint address value. */ | |||
|  | #define USB_ENDPOINT_IN(addr)                  ((addr) | 0x80)
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** bmAttributes in Endpoint Descriptor 
 | |||
|  |  * @{  | |||
|  |  */ | |||
|  | /** Endopint type mask */ | |||
|  | #define USB_ENDPOINT_TYPE_MASK                 0x03
 | |||
|  | /** Control Endopint type */ | |||
|  | #define USB_ENDPOINT_TYPE_CONTROL              0x00
 | |||
|  | /** isochronous Endopint type */ | |||
|  | #define USB_ENDPOINT_TYPE_ISOCHRONOUS          0x01
 | |||
|  | /** bulk Endopint type */ | |||
|  | #define USB_ENDPOINT_TYPE_BULK                 0x02
 | |||
|  | /** interrupt Endopint type */ | |||
|  | #define USB_ENDPOINT_TYPE_INTERRUPT            0x03
 | |||
|  | /** Endopint sync type mask */ | |||
|  | #define USB_ENDPOINT_SYNC_MASK                 0x0C
 | |||
|  | /** no synchronization Endopint */ | |||
|  | #define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION   0x00
 | |||
|  | /** Asynchronous sync Endopint */ | |||
|  | #define USB_ENDPOINT_SYNC_ASYNCHRONOUS         0x04
 | |||
|  | /** Adaptive sync Endopint */ | |||
|  | #define USB_ENDPOINT_SYNC_ADAPTIVE             0x08
 | |||
|  | /** Synchronous sync Endopint */ | |||
|  | #define USB_ENDPOINT_SYNC_SYNCHRONOUS          0x0C
 | |||
|  | /** Endopint usage type mask */ | |||
|  | #define USB_ENDPOINT_USAGE_MASK                0x30
 | |||
|  | /** Endopint data usage type  */ | |||
|  | #define USB_ENDPOINT_USAGE_DATA                0x00
 | |||
|  | /** Endopint feedback usage type  */ | |||
|  | #define USB_ENDPOINT_USAGE_FEEDBACK            0x10
 | |||
|  | /** Endopint implicit feedback usage type  */ | |||
|  | #define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK   0x20
 | |||
|  | /** Endopint reserved usage type  */ | |||
|  | #define USB_ENDPOINT_USAGE_RESERVED            0x30
 | |||
|  | /** @} */ | |||
|  | 
 | |||
|  | /** Control endopint EP0's maximum packet size in high-speed mode.*/ | |||
|  | #define USB_ENDPOINT_0_HS_MAXP                 64
 | |||
|  | /** Control endopint EP0's maximum packet size in low-speed mode.*/ | |||
|  | #define USB_ENDPOINT_0_LS_MAXP                 8
 | |||
|  | /** Bulk endopint's maximum packet size in high-speed mode.*/ | |||
|  | #define USB_ENDPOINT_BULK_HS_MAXP              512
 | |||
|  | 
 | |||
|  | /** USB Standard Device Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_DEVICE_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength;     /**< Size of this descriptor in bytes. */ | |||
|  |   uint8_t  bDescriptorType; /**< DEVICE Descriptor Type. */ | |||
|  |   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. | |||
|  |                    */ | |||
|  |   uint8_t  bDeviceClass; /**< Class code (assigned by the USB-IF).
 | |||
|  |                           If this field is reset to zero, each interface | |||
|  |                           within a configuration specifies its own | |||
|  |                           class information and the various | |||
|  |                           interfaces operate independently.\n | |||
|  |                           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. \n | |||
|  |                           If this field is set to FFH, the device class | |||
|  |                           is vendor-specific. | |||
|  |                           */ | |||
|  |   uint8_t  bDeviceSubClass; /**< Subclass code (assigned by the USB-IF).
 | |||
|  |                             These codes are qualified by the value of | |||
|  |                             the bDeviceClass field. \n | |||
|  |                             If the bDeviceClass field is reset to zero, | |||
|  |                             this field must also be reset to zero. \n | |||
|  |                             If the bDeviceClass field is not set to FFH, | |||
|  |                             all values are reserved for assignment by | |||
|  |                             the USB-IF.  | |||
|  |                             */ | |||
|  |   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. \n | |||
|  |                             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. \n | |||
|  |                             If this field is set to FFH, the device uses a | |||
|  |                             vendor-specific protocol on a device basis.  | |||
|  |                             */ | |||
|  |   uint8_t  bMaxPacketSize0; /**< Maximum packet size for endpoint zero
 | |||
|  |                             (only 8, 16, 32, or 64 are valid). For HS devices | |||
|  |                             is fixed to 64. | |||
|  |                             */ | |||
|  | 
 | |||
|  |   uint16_t idVendor; /**< Vendor ID (assigned by the USB-IF). */ | |||
|  |   uint16_t idProduct; /**< Product ID (assigned by the manufacturer). */ | |||
|  |   uint16_t bcdDevice; /**< Device release number in binary-coded decimal. */ | |||
|  |   uint8_t  iManufacturer; /**< Index of string descriptor describing manufacturer. */ | |||
|  |   uint8_t  iProduct; /**< Index of string descriptor describing product. */ | |||
|  |   uint8_t  iSerialNumber; /**< Index of string descriptor describing the device<63>s 
 | |||
|  |                           serial number. | |||
|  |                           */ | |||
|  |   uint8_t  bNumConfigurations; /**< Number of possible configurations. */ | |||
|  | } ; | |||
|  | /** USB Standard Device Descriptor */ | |||
|  | typedef struct _USB_DEVICE_DESCRIPTOR USB_DEVICE_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB 2.0 Device Qualifier Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_DEVICE_QUALIFIER_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of descriptor */ | |||
|  |   uint8_t  bDescriptorType; /**< Device Qualifier Type */ | |||
|  |   uint16_t bcdUSB; /**< USB specification version number (e.g., 0200H for V2.00) */ | |||
|  |   uint8_t  bDeviceClass; /**< Class Code */ | |||
|  |   uint8_t  bDeviceSubClass; /**< SubClass Code */ | |||
|  |   uint8_t  bDeviceProtocol; /**< Protocol Code */ | |||
|  |   uint8_t  bMaxPacketSize0; /**< Maximum packet size for other speed */ | |||
|  |   uint8_t  bNumConfigurations; /**< Number of Other-speed Configurations */ | |||
|  |   uint8_t  bReserved; /**< Reserved for future use, must be zero */ | |||
|  | } ; | |||
|  | /** USB 2.0 Device Qualifier Descriptor */ | |||
|  | typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR USB_DEVICE_QUALIFIER_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB Standard Configuration Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_CONFIGURATION_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of this descriptor in bytes */ | |||
|  |   uint8_t  bDescriptorType; /**< CONFIGURATION Descriptor Type*/ | |||
|  |   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.*/ | |||
|  |   uint8_t  bNumInterfaces; /**< Number of interfaces supported by this configuration*/ | |||
|  |   uint8_t  bConfigurationValue; /**< Value to use as an argument to the
 | |||
|  |                                 SetConfiguration() request to select this  | |||
|  |                                 configuration. */ | |||
|  |   uint8_t  iConfiguration; /**< Index of string descriptor describing this
 | |||
|  |                             configuration*/ | |||
|  |   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.*/ | |||
|  |   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). \n | |||
|  |                       Note: A device configuration reports whether | |||
|  |                       the configuration is bus-powered or selfpowered. | |||
|  |                       Device status reports whether the | |||
|  |                       device is currently self-powered. If a device is | |||
|  |                       disconnected from its external power source, it | |||
|  |                       updates device status to indicate that it is no | |||
|  |                       longer self-powered. \n | |||
|  |                       A device may not increase its power draw | |||
|  |                       from the bus, when it loses its external power | |||
|  |                       source, beyond the amount reported by its | |||
|  |                       configuration. \n | |||
|  |                       If a device can continue to operate when | |||
|  |                       disconnected from its external power source, it | |||
|  |                       continues to do so. If the device cannot | |||
|  |                       continue to operate, it fails operations it can | |||
|  |                       no longer support. The USB System Software | |||
|  |                       may determine the cause of the failure by | |||
|  |                       checking the status and noting the loss of the | |||
|  |                       device<EFBFBD>s power source.*/ | |||
|  | } ; | |||
|  | /** USB Standard Configuration Descriptor */ | |||
|  | typedef struct _USB_CONFIGURATION_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB Standard Interface Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_INTERFACE_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of this descriptor in bytes*/ | |||
|  |   uint8_t  bDescriptorType; /**< INTERFACE Descriptor Type*/ | |||
|  |   uint8_t  bInterfaceNumber; /**< Number of this interface. Zero-based
 | |||
|  |                               value identifying the index in the array of | |||
|  |                               concurrent interfaces supported by this | |||
|  |                               configuration.*/ | |||
|  |   uint8_t  bAlternateSetting; /**< Value used to select this alternate setting
 | |||
|  |                               for the interface identified in the prior field*/ | |||
|  |   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.*/ | |||
|  |   uint8_t  bInterfaceClass; /**< Class code (assigned by the USB-IF). \n
 | |||
|  |                             A value of zero is reserved for future | |||
|  |                             standardization. \n | |||
|  |                             If this field is set to FFH, the interface | |||
|  |                             class is vendor-specific. \n | |||
|  |                             All other values are reserved for | |||
|  |                             assignment by the USB-IF.*/ | |||
|  |   uint8_t  bInterfaceSubClass; /**< Subclass code (assigned by the USB-IF). \n
 | |||
|  |                               These codes are qualified by the value of | |||
|  |                               the bInterfaceClass field. \n | |||
|  |                               If the bInterfaceClass field is reset to zero, | |||
|  |                               this field must also be reset to zero. \n | |||
|  |                               If the bInterfaceClass field is not set to | |||
|  |                               FFH, all values are reserved for | |||
|  |                               assignment by the USB-IF.*/ | |||
|  |   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. \n | |||
|  |                                 If this field is reset to zero, the device | |||
|  |                                 does not use a class-specific protocol on | |||
|  |                                 this interface. \n | |||
|  |                                 If this field is set to FFH, the device uses | |||
|  |                                 a vendor-specific protocol for this | |||
|  |                                 interface.*/ | |||
|  |   uint8_t  iInterface; /**< Index of string descriptor describing this interface*/ | |||
|  | } ; | |||
|  | /** USB Standard Interface Descriptor */ | |||
|  | typedef struct _USB_INTERFACE_DESCRIPTOR USB_INTERFACE_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB Standard Endpoint Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_ENDPOINT_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of this descriptor in bytes*/ | |||
|  |   uint8_t  bDescriptorType; /**< ENDPOINT Descriptor Type*/ | |||
|  |   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.  \n \sa USBD_ENDPOINT_ADR_Type*/ | |||
|  |   uint8_t  bmAttributes; /**< This field describes the endpoint<6E>s attributes when it is
 | |||
|  |                           configured using the bConfigurationValue. \n | |||
|  |                           Bits 1..0: Transfer Type | |||
|  |                           \li 00 = Control | |||
|  |                           \li 01 = Isochronous | |||
|  |                           \li 10 = Bulk | |||
|  |                           \li 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 | |||
|  |                           \li 00 = No Synchronization | |||
|  |                           \li 01 = Asynchronous | |||
|  |                           \li 10 = Adaptive | |||
|  |                           \li 11 = Synchronous \n | |||
|  |                           Bits 5..4: Usage Type | |||
|  |                           \li 00 = Data endpoint | |||
|  |                           \li 01 = Feedback endpoint | |||
|  |                           \li 10 = Implicit feedback Data endpoint | |||
|  |                           \li 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. | |||
|  |                          \n \sa USBD_EP_ATTR_Type*/ | |||
|  |   uint16_t wMaxPacketSize; /**< 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 | |||
|  |                           \li 00 = None (1 transaction per microframe) | |||
|  |                           \li 01 = 1 additional (2 per microframe) | |||
|  |                           \li 10 = 2 additional (3 per microframe) | |||
|  |                           \li 11 = Reserved \n | |||
|  |                           Bits 15..13 are reserved and must be set to zero.*/ | |||
|  |   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 <EFBFBD>s units).  | |||
|  |                       \li 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$).  | |||
|  |                       \li For full-/low-speed interrupt endpoints, the value of | |||
|  |                       this field may be from 1 to 255. | |||
|  |                       \li 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. | |||
|  |                       \li 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. | |||
|  |                       */ | |||
|  | } ; | |||
|  | /** USB Standard Endpoint Descriptor */ | |||
|  | typedef struct _USB_ENDPOINT_DESCRIPTOR USB_ENDPOINT_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB String Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_STRING_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of this descriptor in bytes*/ | |||
|  |   uint8_t  bDescriptorType; /**< STRING Descriptor Type*/ | |||
|  |   uint16_t bString/*[]*/; /**< UNICODE encoded string */ | |||
|  | }  ; | |||
|  | /** USB String Descriptor */ | |||
|  | typedef struct _USB_STRING_DESCRIPTOR USB_STRING_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB Common Descriptor */ | |||
|  | PRE_PACK struct POST_PACK _USB_COMMON_DESCRIPTOR | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of this descriptor in bytes*/ | |||
|  |   uint8_t  bDescriptorType; /**< Descriptor Type*/ | |||
|  | } ; | |||
|  | /** USB Common Descriptor */ | |||
|  | typedef struct _USB_COMMON_DESCRIPTOR USB_COMMON_DESCRIPTOR; | |||
|  | 
 | |||
|  | /** USB Other Speed Configuration */ | |||
|  | PRE_PACK struct POST_PACK _USB_OTHER_SPEED_CONFIGURATION | |||
|  | { | |||
|  |   uint8_t  bLength; /**< Size of descriptor*/ | |||
|  |   uint8_t  bDescriptorType; /**< Other_speed_Configuration Type*/ | |||
|  |   uint16_t wTotalLength; /**< Total length of data returned*/ | |||
|  |   uint8_t  bNumInterfaces; /**< Number of interfaces supported by this speed configuration*/ | |||
|  |   uint8_t  bConfigurationValue; /**< Value to use to select configuration*/ | |||
|  |   uint8_t  IConfiguration; /**< Index of string descriptor*/ | |||
|  |   uint8_t  bmAttributes; /**< Same as Configuration descriptor*/ | |||
|  |   uint8_t  bMaxPower; /**< Same as Configuration descriptor*/ | |||
|  | } ; | |||
|  | /** USB Other Speed Configuration */ | |||
|  | typedef struct _USB_OTHER_SPEED_CONFIGURATION USB_OTHER_SPEED_CONFIGURATION; | |||
|  | 
 | |||
|  | /** \ingroup USBD_Core 
 | |||
|  |  * USB device stack/module handle.  | |||
|  |  */ | |||
|  | typedef void* USBD_HANDLE_T; | |||
|  | 
 | |||
|  | /** @}*/ | |||
|  | 
 | |||
|  | #endif  /* __USB_H__ */
 |