- doxygen styling added - CDC -> ACM refactor - type refactoring - examples categorized - flatUSB_config.h examples added
230 lines
6.6 KiB
C
230 lines
6.6 KiB
C
#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 */
|