#ifndef CORE_USB_USB_DEVICE_TYPES #define CORE_USB_USB_DEVICE_TYPES #include "usb_common_types.h" // /* USB endpoint direction */ // typedef enum { USB_IN = 0, // USB_OUT = 1 } USB_Ep_Dir; /* ------ USB DESCRIPTORS ------- */ /** * USB Descriptor type codes. */ typedef enum { UD_Device = 1, ///< Device Descriptor UD_Configuration = 2, ///< Configuration Descriptor UD_String = 3, ///< String Descriptor UD_Interface = 4, ///< Interface Descriptor UD_Endpoint = 5, ///< Endpoint Descriptor UD_DeviceQualifier = 6, ///< DeviceQualifier Descriptor UD_OtherSpeedConfiguration = 7 ///< OtherSpeedConfiguration Descriptor // NOT FULL! } USB_DescType; /** * USB descriptor header */ #define USB_DESC_HEADER \ uint8_t bLength; /* length in bytes */ \ uint8_t bDescriptorType; /* descriptor type */ #define USB_DESC_HEADER_SIZE (2) ///< USB descriptor header size /** * USB Descriptor header */ typedef struct { USB_DESC_HEADER } USB_DescHdr; /** * USB Device descriptor */ typedef struct { USB_DESC_HEADER uint16_t bcdUSB; ///< USB specification release number (BCD) uint8_t bDeviceClass; ///< Class code uint8_t bDeviceSubclass; ///< Subclass code uint8_t bDeviceProtocol; ///< Protocol code uint8_t bMaxPacketSize0; ///< Maximum packet size for endpoint 0 uint16_t idVendor; ///< Vendor ID uint16_t idProduct; ///< Product ID uint16_t bcdDevice; ///< Device release number (BCD) uint8_t iManufacturer; ///< Index of string descriptor for manufacturer uint8_t iProduct; ///< Index of string descriptor for the product uint8_t iSerialNumber; ///< Index of string descriptor for the serial number uint8_t bNumConfiguration; ///< Number of possible configurations } USB_DeviceDesc; /** * USB Device Qualifier descriptor */ typedef struct { USB_DESC_HEADER uint16_t bcdUSB; ///< USB specification release number (BCD) uint8_t bDeviceClass; ///< Class code uint8_t bDeviceSubclass; ///< Subclass code uint8_t bDeviceProtocol; ///< Protocol code uint8_t bMaxPacketSize0; ///< Maximum packet size for endpoint 0 uint8_t bNumConfiguration; ///< Number of possible configurations } __attribute__((packed)) USB_DeviceQualifierDesc; #define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) ///< Device is self-powered #define USB_CONFIG_ATTR_REMOTE_WKUP (1 << 5) ///< Device is intended to wake up the host #define USB_CONFIG_ATTR_USB1_1_FLAG (1 << 7) ///< It's a USB 1.1 or newer device /** * USB Configuration descriptor */ typedef struct { USB_DESC_HEADER uint16_t wTotalLength; ///< The number of bytes in the configuration descriptor and all of its subordinate descriptors uint8_t bNumInterfaces; ///< Number of interfaces in the configuration uint8_t bConfigrationValue; ///< Identifier for Set Configuration and Get Configuration Requests uint8_t iConfiguration; ///< Index of string descriptor for the configuration uint8_t bmAttributes; ///< Self/bus power and remote wakeup settings uint8_t bMaxPower; ///< Bus power required in units of 2 mA } __attribute__((packed)) USB_ConfigurationDesc; /** * USB Interface descriptor */ typedef struct { USB_DESC_HEADER uint8_t bInterfaceNumber; ///< Number identifying this interface uint8_t bAlternateSetting; ///< A number that identifies a descriptor with alternate settings for this bInterfaceNumber uint8_t bNumEndpoints; ///< Number of endpoints supported not counting endpoint zero uint8_t bInterfaceClass; ///< Class code uint8_t bInterfaceSubclass; ///< Subclass code uint8_t bInterfaceProtocol; ///< Protocol code uint8_t iInterface; ///< Index of string descriptor for the interface } __attribute__((packed)) USB_InterfaceDesc; /** * USB Transfer type */ typedef enum { UT_Control = 0b00, ///< Control UT_Isochronous = 0b01, ///< Isochronous UT_Bulk = 0b10, ///< Bulk UT_Interrupt = 0b11 ///< Interrupt } USB_TransferType; /** * USB Endpoint descriptor */ typedef struct { USB_DESC_HEADER uint8_t bEndpointAddress; ///< Endpoint number and direction uint8_t bmAttributes; ///< Transfer type and supplementary information uint16_t wMaxPacketSize; ///< Maximum packet size supported uint8_t bInterval; ///< Service interval or NAK rate } __attribute__((packed)) USB_EndpointDesc; /* struct { uint8_t n : 7; // endpoint number (four bits, but this style no "spacer" needed) uint8_t dir; // direction } bEndpointAddress; // Endpoint number and direction*/ /** * USB String descriptor */ typedef struct { USB_DESC_HEADER } USB_StringDesc; /** * USB endpoint direction */ typedef enum { USB_OUT = 0, ///< OUT USB_IN = 1 ///< IN } USB_EndpointDir; /** * USB PIDs */ typedef enum { PID_EXT = 0, PID_OUT = 1, PID_ACK = 2, PID_DATA0 = 3, PID_PING = 4, PID_SOF = 5, PID_NYET = 6, PID_DATA2 = 7, PID_SPLIT = 8, PID_IN = 9, PID_NAK = 10, PID_DATA1 = 11, PID_PRE_ERR = 12, PID_SETUP = 13, PID_STALL = 14, PID_MDATA = 15, } USB_PID; /** * USB Request types */ typedef enum { UR_Standard = 0, UR_VendorSpec = 1, UR_ReqDefVendorSpec = 2 } USB_RequestType; /** * USB Recipients */ typedef enum { UREC_Device = 0, UREC_SpecificInterface = 1, UREC_Endpoint = 2, UREC_OtherElement = 3 } USB_Recipient; /** * USB Request types */ typedef enum { UREQ_GetStatus = 0x00, UREQ_ClearFeature = 0x01, UREQ_SetFeature = 0x03, UREQ_SetAddress = 0x05, UREQ_GetDescriptor = 0x06, UREQ_SetDescriptor = 0x07, UREQ_GetConfiguration = 0x08, UREQ_SetConfiguration = 0x09, UREQ_GetInterface = 0x0A, UREQ_SetInterface = 0x0B, UREQ_SyncFrame = 0x0C, UREQ_SetSEL = 0x30, UREQ_SetIsochronousDelay = 0x31 } USB_RequestCode; /** * Setup request structure */ typedef struct { union { uint8_t bmRequestType; ///< Request type struct { uint8_t recipient : 5; ///< Recipient uint8_t type : 2; ///< Type uint8_t dir : 1; ///< Direction } fields; } bmRequestType; ///< Request type uint8_t bRequest; ///< Request uint16_t wValue; ///< Value uint16_t wIndex; ///< Index uint16_t wLength; ///< Number of bytes in the data stage } USB_SetupRequest; #endif /* CORE_USB_USB_DEVICE_TYPES */