/* Copyright (c) 2014 Arduino LLC. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* **Modified 04/04/2016 by Arduino.org development team */ #ifndef __USBCORE_H__ #define __USBCORE_H__ // Standard requests #define GET_STATUS 0 #define CLEAR_FEATURE 1 #define SET_FEATURE 3 #define SET_ADDRESS 5 #define GET_DESCRIPTOR 6 #define SET_DESCRIPTOR 7 #define GET_CONFIGURATION 8 #define SET_CONFIGURATION 9 #define GET_INTERFACE 10 #define SET_INTERFACE 11 // bEndpointAddress in Endpoint Descriptor #define USB_ENDPOINT_DIRECTION_MASK 0x80 #define USB_ENDPOINT_OUT(addr) ((addr) | 0x00) #define USB_ENDPOINT_IN(addr) ((addr) | 0x80) #define USB_ENDPOINTS 7 #define USB_ENDPOINT_TYPE_MASK 0x03 #define USB_ENDPOINT_TYPE_CONTROL 0x00 #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 #define USB_ENDPOINT_TYPE_BULK 0x02 #define USB_ENDPOINT_TYPE_INTERRUPT 0x03 // bmRequestType #define REQUEST_HOSTTODEVICE 0x00 #define REQUEST_DEVICETOHOST 0x80 #define REQUEST_DIRECTION 0x80 #define REQUEST_STANDARD 0x00 #define REQUEST_CLASS 0x20 #define REQUEST_VENDOR 0x40 #define REQUEST_TYPE 0x60 #define REQUEST_DEVICE 0x00 #define REQUEST_INTERFACE 0x01 #define REQUEST_ENDPOINT 0x02 #define REQUEST_OTHER 0x03 #define REQUEST_RECIPIENT 0x1F #define REQUEST_DEVICETOHOST_CLASS_INTERFACE (REQUEST_DEVICETOHOST | REQUEST_CLASS | REQUEST_INTERFACE) #define REQUEST_HOSTTODEVICE_CLASS_INTERFACE (REQUEST_HOSTTODEVICE | REQUEST_CLASS | REQUEST_INTERFACE) #define REQUEST_DEVICETOHOST_STANDARD_INTERFACE (REQUEST_DEVICETOHOST | REQUEST_STANDARD | REQUEST_INTERFACE) // Class requests #define CDC_SET_LINE_CODING 0x20 #define CDC_GET_LINE_CODING 0x21 #define CDC_SET_CONTROL_LINE_STATE 0x22 #define CDC_SEND_BREAK 0x23 #define MSC_RESET 0xFF #define MSC_GET_MAX_LUN 0xFE #define HID_GET_REPORT 0x01 #define HID_GET_IDLE 0x02 #define HID_GET_PROTOCOL 0x03 #define HID_SET_REPORT 0x09 #define HID_SET_IDLE 0x0A #define HID_SET_PROTOCOL 0x0B // Descriptors // #define USB_DEVICE_DESC_SIZE 18 // #define USB_CONFIGUARTION_DESC_SIZE 9 // #define USB_INTERFACE_DESC_SIZE 9 // #define USB_ENDPOINT_DESC_SIZE 7 #define USB_DEVICE_DESCRIPTOR_TYPE 1 #define USB_CONFIGURATION_DESCRIPTOR_TYPE 2 #define USB_STRING_DESCRIPTOR_TYPE 3 #define USB_INTERFACE_DESCRIPTOR_TYPE 4 #define USB_ENDPOINT_DESCRIPTOR_TYPE 5 #define USB_DEVICE_QUALIFIER 6 #define USB_OTHER_SPEED_CONFIGURATION 7 #define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 #define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 #define USB_DEVICE_CLASS_STORAGE 0x08 #define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF #define USB_CONFIG_POWERED_MASK 0x40 #define USB_CONFIG_BUS_POWERED 0x80 #define USB_CONFIG_SELF_POWERED 0xC0 #define USB_CONFIG_REMOTE_WAKEUP 0x20 // bMaxPower in Configuration Descriptor #define USB_CONFIG_POWER_MA(mA) ((mA)/2) #define CDC_V1_10 0x0110 #define CDC_COMMUNICATION_INTERFACE_CLASS 0x02 #define CDC_CALL_MANAGEMENT 0x01 #define CDC_ABSTRACT_CONTROL_MODEL 0x02 #define CDC_HEADER 0x00 #define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02 #define CDC_UNION 0x06 #define CDC_CS_INTERFACE 0x24 #define CDC_CS_ENDPOINT 0x25 #define CDC_DATA_INTERFACE_CLASS 0x0A #define MSC_SUBCLASS_SCSI 0x06 #define MSC_PROTOCOL_BULK_ONLY 0x50 _Pragma("pack(1)") // Device typedef struct { uint8_t len; // 18 uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE uint16_t usbVersion; // 0x200 uint8_t deviceClass; uint8_t deviceSubClass; uint8_t deviceProtocol; uint8_t packetSize0; // Packet 0 uint16_t idVendor; uint16_t idProduct; uint16_t deviceVersion; // 0x100 uint8_t iManufacturer; uint8_t iProduct; uint8_t iSerialNumber; uint8_t bNumConfigurations; } DeviceDescriptor; // Config typedef struct { uint8_t len; // 9 uint8_t dtype; // 2 uint16_t clen; // total length uint8_t numInterfaces; uint8_t config; uint8_t iconfig; uint8_t attributes; uint8_t maxPower; } ConfigDescriptor; // String // Interface typedef struct { uint8_t len; // 9 uint8_t dtype; // 4 uint8_t number; uint8_t alternate; uint8_t numEndpoints; uint8_t interfaceClass; uint8_t interfaceSubClass; uint8_t protocol; uint8_t iInterface; } InterfaceDescriptor; // Endpoint typedef struct { uint8_t len; // 7 uint8_t dtype; // 5 uint8_t addr; uint8_t attr; uint16_t packetSize; uint8_t interval; } EndpointDescriptor; // Interface Association Descriptor // Used to bind 2 interfaces together in CDC compostite device typedef struct { uint8_t len; // 8 uint8_t dtype; // 11 uint8_t firstInterface; uint8_t interfaceCount; uint8_t functionClass; uint8_t funtionSubClass; uint8_t functionProtocol; uint8_t iInterface; } IADDescriptor; // CDC CS interface descriptor typedef struct { uint8_t len; // 5 uint8_t dtype; // 0x24 uint8_t subtype; uint8_t d0; uint8_t d1; } CDCCSInterfaceDescriptor; typedef struct { uint8_t len; // 4 uint8_t dtype; // 0x24 uint8_t subtype; uint8_t d0; } CDCCSInterfaceDescriptor4; typedef struct { uint8_t len; uint8_t dtype; // 0x24 uint8_t subtype; // 1 uint8_t bmCapabilities; uint8_t bDataInterface; } CMFunctionalDescriptor; typedef struct { uint8_t len; uint8_t dtype; // 0x24 uint8_t subtype; // 1 uint8_t bmCapabilities; } ACMFunctionalDescriptor; typedef struct { // IAD IADDescriptor iad; // Only needed on compound device // Control InterfaceDescriptor cif; CDCCSInterfaceDescriptor header; ACMFunctionalDescriptor controlManagement; // ACM CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION CMFunctionalDescriptor callManagement; // Call Management EndpointDescriptor cifin; // Data InterfaceDescriptor dif; EndpointDescriptor in; EndpointDescriptor out; } CDCDescriptor; typedef struct { InterfaceDescriptor msc; EndpointDescriptor in; EndpointDescriptor out; } MSCDescriptor; typedef struct { uint8_t len; // 9 uint8_t dtype; // 0x21 uint8_t addr; uint8_t versionL; // 0x101 uint8_t versionH; // 0x101 uint8_t country; uint8_t desctype; // 0x22 report uint8_t descLenL; uint8_t descLenH; } HIDDescDescriptor; typedef struct { InterfaceDescriptor hid; HIDDescDescriptor desc; EndpointDescriptor in; } HIDDescriptor; _Pragma("pack()") #define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \ { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs } /* Table 9-8. Standard Device Descriptor * bLength, bDescriptorType, bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, bMaxPacketSize0, * idVendor, idProduct, bcdDevice, iManufacturer, iProduct, iSerialNumber, bNumConfigurations */ #define D_CONFIG(_totalLength,_interfaces) \ { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) } /* Table 9-10. Standard Configuration Descriptor * bLength, bDescriptorType, wTotalLength, bNumInterfaces, bConfigurationValue, iConfiguration * bmAttributes, bMaxPower */ #define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \ { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 } /* Table 9-12. Standard Interface Descriptor * bLength, bDescriptorType, bInterfaceNumber, bAlternateSetting, bNumEndpoints, bInterfaceClass, * bInterfaceSubClass, bInterfaceProtocol, iInterface */ #define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \ { 7, 5, _addr,_attr,_packetSize, _interval } /* Table 9-13. Standard Endpoint Descriptor * bLength, bDescriptorType, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval */ #define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \ { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 } /* iadclasscode_r10.pdf, Table 9\96Z. Standard Interface Association Descriptor * bLength, bDescriptorType, bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol, iFunction */ #define D_HIDREPORT(_descriptorLength) \ { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 } /* HID1_11.pdf E.8 HID Descriptor (Mouse) * bLength, bDescriptorType, bcdHID, bCountryCode, bNumDescriptors, bDescriptorType, wItemLength */ // Functional Descriptor General Format #define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 } #define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 } /* bFunctionLength, bDescriptorType, bDescriptorSubtype, function specific data0, functional specific data N-1 * CS_INTERFACE 24h */ #endif