You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

usb_ch9.h 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
  2. This software may be distributed and modified under the terms of the GNU
  3. General Public License version 2 (GPL2) as published by the Free Software
  4. Foundation and appearing in the file GPL2.TXT included in the packaging of
  5. this file. Please note that GPL2 Section 2[b] requires that all works based
  6. on this software must also be made publicly available under the terms of
  7. the GPL2 ("Copyleft").
  8. Contact information
  9. -------------------
  10. Circuits At Home, LTD
  11. Web : http://www.circuitsathome.com
  12. e-mail : [email protected]
  13. */
  14. #if !defined(_usb_h_) || defined(_ch9_h_)
  15. #error "Never include usb_ch9.h directly; include Usb.h instead"
  16. #else
  17. /* USB chapter 9 structures */
  18. #define _ch9_h_
  19. /* Misc.USB constants */
  20. #define DEV_DESCR_LEN 18 //device descriptor length
  21. #define CONF_DESCR_LEN 9 //configuration descriptor length
  22. #define INTR_DESCR_LEN 9 //interface descriptor length
  23. #define EP_DESCR_LEN 7 //endpoint descriptor length
  24. /* Standard Device Requests */
  25. #define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS
  26. #define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE
  27. #define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE
  28. #define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS
  29. #define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR
  30. #define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR
  31. #define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION
  32. #define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION
  33. #define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE
  34. #define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE
  35. #define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME
  36. #define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt
  37. #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up
  38. #define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode
  39. /* Setup Data Constants */
  40. #define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer
  41. #define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer
  42. #define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard
  43. #define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class
  44. #define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor
  45. #define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device
  46. #define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface
  47. #define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint
  48. #define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other
  49. /* USB descriptors */
  50. #define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor.
  51. #define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor.
  52. #define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor.
  53. #define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor.
  54. #define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor.
  55. #define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier.
  56. #define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration.
  57. #define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power.
  58. #define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor.
  59. #define HID_DESCRIPTOR_HID 0x21
  60. /* OTG SET FEATURE Constants */
  61. #define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP
  62. #define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP
  63. #define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP
  64. /* USB Endpoint Transfer Types */
  65. #define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint.
  66. #define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint.
  67. #define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint.
  68. #define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint.
  69. #define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes
  70. /* Standard Feature Selectors for CLEAR_FEATURE Requests */
  71. #define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient
  72. #define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient
  73. #define USB_FEATURE_TEST_MODE 2 // Device recipient
  74. /* descriptor data structures */
  75. /* Device descriptor structure */
  76. typedef struct {
  77. uint8_t bLength; // Length of this descriptor.
  78. uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE).
  79. uint16_t bcdUSB; // USB Spec Release Number (BCD).
  80. uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
  81. uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF).
  82. uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
  83. uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0.
  84. uint16_t idVendor; // Vendor ID (assigned by the USB-IF).
  85. uint16_t idProduct; // Product ID (assigned by the manufacturer).
  86. uint16_t bcdDevice; // Device release number (BCD).
  87. uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer.
  88. uint8_t iProduct; // Index of String Descriptor describing the product.
  89. uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number.
  90. uint8_t bNumConfigurations; // Number of possible configurations.
  91. } __attribute__((packed)) USB_DEVICE_DESCRIPTOR;
  92. /* Configuration descriptor structure */
  93. typedef struct {
  94. uint8_t bLength; // Length of this descriptor.
  95. uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION).
  96. uint16_t wTotalLength; // Total length of all descriptors for this configuration.
  97. uint8_t bNumInterfaces; // Number of interfaces in this configuration.
  98. uint8_t bConfigurationValue; // Value of this configuration (1 based).
  99. uint8_t iConfiguration; // Index of String Descriptor describing the configuration.
  100. uint8_t bmAttributes; // Configuration characteristics.
  101. uint8_t bMaxPower; // Maximum power consumed by this configuration.
  102. } __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR;
  103. /* Interface descriptor structure */
  104. typedef struct {
  105. uint8_t bLength; // Length of this descriptor.
  106. uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE).
  107. uint8_t bInterfaceNumber; // Number of this interface (0 based).
  108. uint8_t bAlternateSetting; // Value of this alternate interface setting.
  109. uint8_t bNumEndpoints; // Number of endpoints in this interface.
  110. uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific.
  111. uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF).
  112. uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific.
  113. uint8_t iInterface; // Index of String Descriptor describing the interface.
  114. } __attribute__((packed)) USB_INTERFACE_DESCRIPTOR;
  115. /* Endpoint descriptor structure */
  116. typedef struct {
  117. uint8_t bLength; // Length of this descriptor.
  118. uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT).
  119. uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN).
  120. uint8_t bmAttributes; // Endpoint transfer type.
  121. uint16_t wMaxPacketSize; // Maximum packet size.
  122. uint8_t bInterval; // Polling interval in frames.
  123. } __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR;
  124. /* HID descriptor */
  125. typedef struct {
  126. uint8_t bLength;
  127. uint8_t bDescriptorType;
  128. uint16_t bcdHID; // HID class specification release
  129. uint8_t bCountryCode;
  130. uint8_t bNumDescriptors; // Number of additional class specific descriptors
  131. uint8_t bDescrType; // Type of class descriptor
  132. uint16_t wDescriptorLength; // Total size of the Report descriptor
  133. } __attribute__((packed)) USB_HID_DESCRIPTOR;
  134. typedef struct {
  135. uint8_t bDescrType; // Type of class descriptor
  136. uint16_t wDescriptorLength; // Total size of the Report descriptor
  137. } __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE;
  138. #endif // _ch9_h_