/* usb.h - Basic USB (Universal Serial Bus) definitions */ /* Copyright 2000-2005 Wind River Systems, Inc. */ /* Modification history -------------------- 01b,19jan05,h_k added pragma pack to USB_DESCR_TYPLEN and USB_HID_DESCR and added USB_HID_DESCR_LEN. (SPR #104230) 01a,08sep04,ami New macros added 01a,16jul04,??? Backward compatibility with the USB 1.1 Peripheral stack 02b,03may04,??? Addition of macros for USB 2.0 02a,2April04,prashee USB 2.0 modifications 01i,28mar02,h_k removed #if (CPU==SH7700)&&(_BYTE_ORDER==_BIG_ENDIAN) and set USB_MAX_DESCR_LEN 255 for SH7700 (SPR #73896). 01h,16nov11,wef Pack ENDPOINT_DESCRIPTOR structure. 01g,08nov11,wef add provisions for SH - pack structures and conditionally make USB_MAX_DESCR_LEN a multiple of 4 01f,18sep01,wef merge from wrs.tor2_0.usb1_1-f for veloce 01e,25jul01,rcb fixed spr #69287 01d,26jan00,rcb Add "dataBlockSize" field to USB_IRP to give application greater control over isochronous transfer sizes. Change USB_BFR_LIST "bfrLen" and "actLen" fields to UINT32. 01c,12jan00,rcb Add definition for USB_CLASS_AUDIO. Add typedef for USB_DESCR_HDR_SUBHDR. 01b,07sep99,rcb Add definition for USB_TIME_RESUME. 01a,03jun99,rcb First. */ /* DESCRIPTION This file defines constants and structures related to the USB (Universal Serial Bus). NOTE: The USB specification defines that multi-byte fields will be stored in little-endian format. */ #ifndef __INCusbh #define __INCusbh #ifdef __cplusplus extern "C" { #endif /* includes */ #include "usb/usbListLib.h" #include "usb/usbHandleLib.h" /* Defined by the USB */ /* defines */ #define USB_MAX_DEVICES 127 #define USB_MAX_TOPOLOGY_DEPTH 6 #define USB_MAX_DESCR_LEN 255 /* USB class codes */ #define USB_CLASS_AUDIO 0x01 #define USB_CLASS_HID 0x03 #define USB_CLASS_PRINTER 0x07 #define USB_CLASS_HUB 0x09 /* USB requestType (bmRequestType) bit fields */ #define USB_RT_DIRECTION_MASK 0x80 #define USB_RT_HOST_TO_DEV 0x00 #define USB_RT_DEV_TO_HOST 0x80 #define USB_RT_CATEGORY_MASK 0x60 #define USB_RT_STANDARD 0x00 #define USB_RT_CLASS 0x20 #define USB_RT_VENDOR 0x40 #define USB_RT_RECIPIENT_MASK 0x03 #define USB_RT_DEVICE 0x00 #define USB_RT_INTERFACE 0x01 #define USB_RT_ENDPOINT 0x02 #define USB_RT_OTHER 0x03 /* USB requests (bRequest) */ #define USB_REQ_GET_STATUS 0 #define USB_REQ_CLEAR_FEATURE 1 #define USB_REQ_GET_STATE 2 #define USB_REQ_SET_FEATURE 3 #define USB_REQ_SET_ADDRESS 5 #define USB_REQ_GET_DESCRIPTOR 6 #define USB_REQ_SET_DESCRIPTOR 7 #define USB_REQ_GET_CONFIGURATION 8 #define USB_REQ_SET_CONFIGURATION 9 #define USB_REQ_GET_INTERFACE 10 #define USB_REQ_SET_INTERFACE 11 #define USB_REQ_GET_SYNCH_FRAME 12 /* USB descriptor types */ #define USB_DESCR_DEVICE 0x01 #define USB_DESCR_CONFIGURATION 0x02 #define USB_DESCR_STRING 0x03 #define USB_DESCR_INTERFACE 0x04 #define USB_DESCR_ENDPOINT 0x05 #define USB_DESCR_DEVICE_QUALIFIER 0x06 #define USB_DESCR_OTHER_SPEED_CONFIGURATION 0x07 #define USB_DESCR_INTERFACE_POWER 0x08 #define USB_DESCR_HID 0x21 #define USB_DESCR_REPORT 0x22 /* HID report descriptor */ #define USB_DESCR_PHYSICAL 0x23 /* HID physical descriptor */ #define USB_DESCR_HUB 0x29 /* configuration descriptor attributes values */ #define USB_ATTR_SELF_POWERED 0x40 #define USB_ATTR_REMOTE_WAKEUP 0x20 /* Max power available from a hub port */ #define USB_POWER_SELF_POWERED 500 /* 500 mA */ #define USB_POWER_BUS_POWERED 100 /* 100 mA */ /* power requirements as reported in configuration descriptors */ #define USB_POWER_MA_PER_UNIT 2 /* 2 mA per unit */ /* endpoint descriptor attributes values */ #define USB_ATTR_EPTYPE_MASK 0x03 #define USB_ATTR_CONTROL 0x00 #define USB_ATTR_ISOCH 0x01 #define USB_ATTR_BULK 0x02 #define USB_ATTR_INTERRUPT 0x03 /* standard USB feature selectors */ #define USB_FSEL_DEV_REMOTE_WAKEUP 1 #define USB_FSEL_DEV_TEST_MODE 2 #define USB_FSEL_DEV_ENDPOINT_HALT 0 /* test selector values for the TEST_MODE feature */ #define USB_TEST_MODE_J_STATE 0x01 /* Test_J */ #define USB_TEST_MODE_K_STATE 0x02 /* Test_K */ #define USB_TEST_MODE_SE0_ACK 0x03 /* Test_SE0 */ #define USB_TEST_MODE_TEST_PACKET 0x04 /* Test Packet */ #define USB_TEST_MODE_TEST_FORCE_ENABLE 0x05 /* Test Force Enable */ /* hub feature selections */ #define USB_HUB_FSEL_C_HUB_LOCAL_POWER 0 #define USB_HUB_FSEL_C_HUB_OVER_CURRENT 1 #define USB_HUB_FSEL_PORT_CONNECTION 0 #define USB_HUB_FSEL_PORT_ENABLE 1 #define USB_HUB_FSEL_PORT_SUSPEND 2 #define USB_HUB_FSEL_PORT_OVER_CURRENT 3 #define USB_HUB_FSEL_PORT_RESET 4 #define USB_HUB_FSEL_PORT_POWER 8 #define USB_HUB_FSEL_PORT_LOW_SPEED 9 #define USB_HUB_FSEL_C_PORT_CONNECTION 16 #define USB_HUB_FSEL_C_PORT_ENABLE 17 #define USB_HUB_FSEL_C_PORT_SUSPEND 18 #define USB_HUB_FSEL_C_PORT_OVER_CURRENT 19 #define USB_HUB_FSEL_C_PORT_RESET 20 /* endpoint direction mask */ #define USB_ENDPOINT_DIR_MASK 0x80 #define USB_ENDPOINT_OUT 0x00 #define USB_ENDPOINT_IN 0x80 /* standard endpoints */ #define USB_MAX_ENDPOINT_NUM 15 #define USB_ENDPOINT_MASK 0xf /* Max packet size related macros */ #define USB_MAX_PACKET_SIZE_MASK 0x7ff #define USB_NUMBER_OF_TRANSACTIONS_MASK 0x1800 #define USB_NUMBER_OF_TRANSACTIONS_BITPOSITION 11 #define USB_ENDPOINT_DEFAULT_CONTROL 0 /* hub characteristics */ #define USB_HUB_GANGED_POWER 0x0000 #define USB_HUB_INDIVIDUAL_POWER 0x0001 #define USB_HUB_NOT_COMPOUND 0x0000 #define USB_HUB_COMPOUND 0x0004 #define USB_HUB_GLOBAL_OVERCURRENT 0x0000 #define USB_HUB_INDIVIDUAL_OVERCURRENT 0x0008 /* standard device status */ #define USB_DEV_STS_LOCAL_POWER 0x0001 #define USB_DEV_STS_REMOTE_WAKEUP 0x0002 /* standard endpoint status */ #define USB_ENDPOINT_STS_HALT 0x0001 /* hub status & change */ #define USB_HUB_STS_LOCAL_POWER 0x0001 #define USB_HUB_STS_OVER_CURRENT 0x0002 #define USB_HUB_C_LOCAL_POWER 0x0001 #define USB_HUB_C_OVER_CURRENT 0x0002 /* hub port status & change */ #define USB_HUB_STS_PORT_CONNECTION 0x0001 #define USB_HUB_STS_PORT_ENABLE 0x0002 #define USB_HUB_STS_PORT_SUSPEND 0x0004 #define USB_HUB_STS_PORT_OVER_CURRENT 0x0008 #define USB_HUB_STS_PORT_RESET 0x0010 #define USB_HUB_STS_PORT_POWER 0x0100 #define USB_HUB_STS_PORT_LOW_SPEED 0x0200 #define USB_HUB_C_PORT_CONNECTION 0x0001 #define USB_HUB_C_PORT_ENABLE 0x0002 #define USB_HUB_C_PORT_SUSPEND 0x0004 #define USB_HUB_C_PORT_OVER_CURRENT 0x0008 #define USB_HUB_C_PORT_RESET 0x0010 /* hub status endpoint */ #define USB_HUB_ENDPOINT_STS_HUB 0x01 #define USB_HUB_ENDPOINT_STS_PORT0 0x02 /* USB timing */ #define USB_TIME_POWER_ON 100 /* 100 msec */ #define USB_TIME_RESET 50 /* 50 msec */ #define USB_TIME_RESET_RECOVERY 10 /* 10 msec */ #define USB_TIME_SET_ADDRESS 2 /* 2 msec */ #define USB_TIME_REQUEST 5000 /* 5 seconds */ #define USB_TIME_RESUME 20 /* 20 msec */ /* USB packet identifiers */ #define USB_PID_SETUP 0x2d #define USB_PID_OUT 0xe1 #define USB_PID_IN 0x69 /* packet size range */ #define USB_MIN_CTRL_PACKET_SIZE 8 /* min for control pipe */ #define USB_MAX_CTRL_PACKET_SIZE 64 /* max for control pipe */ #define USB_MAX_HIGH_SPEED_BULK_SIZE 512 /* Maximum size for a high speed * bulk pipe */ #define USB_MAX_BULK_OUT_NAK_RATE 255 /* Maximum NAK rate for a bulk * OUT pipe */ /* maximum bandwidth (expressed as nanoseconds per frame) which may be * allocated for various purposes. */ #define USB_LIMIT_ISOCH_INT ((UINT32) 900000L) /* 900 usec */ #define USB_LIMIT_ALL ((UINT32) 999000L) /* 999 usec */ /* Typedefs */ /* * USB_SETUP */ typedef struct usb_setup { UINT8 requestType; /* bmRequestType */ UINT8 request; /* bRequest */ UINT16 value; /* wValue */ UINT16 index; /* wIndex */ UINT16 length; /* wLength */ } USB_SETUP, *pUSB_SETUP; /* * USB_DESCR_HDR * * header common to all USB descriptors */ typedef struct usb_descr_hdr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ } USB_DESCR_HDR, *pUSB_DESCR_HDR; #define USB_DESCR_HDR_LEN 2 /* * USB_DESCR_HDR_SUBHDR * * Some classes of USB devices (e.g., audio) use descriptors with a * header and a subheader. */ typedef struct usb_descr_hdr_subhdr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT8 descriptorSubType; /* bDescriptorSubType */ } USB_DESCR_HDR_SUBHDR, *pUSB_DESCR_HDR_SUBHDR; /* * USB_DEVICE_DESCR */ typedef struct usb_device_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT16 bcdUsb; /* bcdUSB - USB release in BCD */ UINT8 deviceClass; /* bDeviceClass */ UINT8 deviceSubClass; /* bDeviceSubClass */ UINT8 deviceProtocol; /* bDeviceProtocol */ UINT8 maxPacketSize0; /* bMaxPacketSize0 */ UINT16 vendor; /* idVendor */ UINT16 product; /* idProduct */ UINT16 bcdDevice; /* bcdDevice - dev release in BCD */ UINT8 manufacturerIndex; /* iManufacturer */ UINT8 productIndex; /* iProduct */ UINT8 serialNumberIndex; /* iSerialNumber */ UINT8 numConfigurations; /* bNumConfigurations */ } WRS_PACK_ALIGN(4) USB_DEVICE_DESCR, *pUSB_DEVICE_DESCR; #define USB_DEVICE_DESCR_LEN 18 /* Device Qualifier Descriptor */ typedef struct usb_device_qualifier_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT16 bcdUsb; /* bcdUSB - USB release in BCD */ UINT8 deviceClass; /* bDeviceClass */ UINT8 deviceSubClass; /* bDeviceSubClass */ UINT8 deviceProtocol; /* bDeviceProtocol */ UINT8 maxPacketSize0; /* bMaxPacketSize0 */ UINT8 numConfigurations; /* bNumConfigurations */ UINT8 reserved; /* reserved */ } WRS_PACK_ALIGN(4) USB_DEVICE_QUALIFIER_DESCR, *pUSB_DEVICE_QUALIFIER_DESCR; #define USB_DEVICE_QUALIFIER_DESCR_LEN 10 /* * USB_CONFIG_DESCR */ typedef struct usb_config_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT16 totalLength; /* wTotalLength */ UINT8 numInterfaces; /* bNumInterfaces */ UINT8 configurationValue; /* bConfigurationValue */ UINT8 configurationIndex; /* iConfiguration */ UINT8 attributes; /* bmAttributes */ UINT8 maxPower; /* MaxPower */ } WRS_PACK_ALIGN(4) USB_CONFIG_DESCR, *pUSB_CONFIG_DESCR; #define USB_CONFIG_DESCR_LEN 9 /* * USB_INTERFACE_DESCR */ typedef struct usb_interface_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT8 interfaceNumber; /* bInterfaceNumber */ UINT8 alternateSetting; /* bAlternateSetting */ UINT8 numEndpoints; /* bNumEndpoints */ UINT8 interfaceClass; /* bInterfaceClass */ UINT8 interfaceSubClass; /* bInterfaceSubClass */ UINT8 interfaceProtocol; /* bInterfaceProtocol */ UINT8 interfaceIndex; /* iInterface */ } USB_INTERFACE_DESCR, *pUSB_INTERFACE_DESCR; #define USB_INTERFACE_DESCR_LEN 9 /* * USB_ENDPOINT_DESCR */ typedef struct usb_endpoint_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT8 endpointAddress; /* bEndpointAddress */ UINT8 attributes; /* bmAttributes */ UINT16 maxPacketSize; /* wMaxPacketSize */ UINT8 interval; /* bInterval */ } WRS_PACK_ALIGN(1) USB_ENDPOINT_DESCR, *pUSB_ENDPOINT_DESCR; #define USB_ENDPOINT_DESCR_LEN 7 /* * USB_LANGUAGE_DESCR */ typedef struct usb_language_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT16 langId [1]; /* wLANGID[] - variable len */ } USB_LANGUAGE_DESCR, *pUSB_LANGUAGE_DESCR; /* * USB_STRING_DESCR */ typedef struct usb_string_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT8 string [1]; /* bString - variable len */ } USB_STRING_DESCR, *pUSB_STRING_DESCR; /* * USB_HID_DESCR */ typedef struct usb_descr_typlen { UINT8 type; /* bDescriptorType */ UINT16 length; /* wDescriptorLength */ } WRS_PACK_ALIGN(1) USB_DESCR_TYPLEN; typedef struct usb_hid_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT16 bcdHid; /* bcdHID */ UINT8 countryCode; /* bCountryCode */ UINT8 numDescriptors; /* bNumDescriptors */ USB_DESCR_TYPLEN descriptor [1]; /* (variable length) */ } WRS_PACK_ALIGN(1) USB_HID_DESCR, *pUSB_HID_DESCR; #define USB_HID_DESCR_LEN 9 /* size of USB_HID_DESCR */ /* * USB_HUB_DESCR */ typedef struct usb_hub_descr { UINT8 length; /* bLength */ UINT8 descriptorType; /* bDescriptorType */ UINT8 nbrPorts; /* bNbrPorts */ UINT16 hubCharacteristics; /* wHubCharacteristics */ UINT8 pwrOn2PwrGood; /* bPwrOn2PwrGood */ UINT8 hubContrCurrent; /* bHubContrCurrent */ UINT8 deviceRemovable [1]; /* DeviceRemovable - variable len */ UINT8 portPwrCtrlMask [1]; /* portPwrCtrlMask - variable len */ } WRS_PACK_ALIGN(4) USB_HUB_DESCR, *pUSB_HUB_DESCR; #define USB_HUB_DESCR_LEN 9 /* * USB_STANDARD_STATUS */ typedef struct usb_standard_status { UINT16 status; /* status word */ } USB_STANDARD_STATUS, *pUSB_STANDARD_STATUS; /* * USB_HUB_STATUS */ typedef struct usb_hub_status { UINT16 status; /* wHubStatus or wPortStatus*/ UINT16 change; /* wHubChange or wPortChange*/ } USB_HUB_STATUS, *pUSB_HUB_STATUS; /* Implementation-specific host definitions */ /* defines */ /* node types */ #define USB_NODETYPE_NONE 0 #define USB_NODETYPE_HUB 1 #define USB_NODETYPE_DEVICE 2 /* node speeds */ #define USB_SPEED_FULL 0 /* 12 mbit device */ #define USB_SPEED_LOW 1 /* low speed device (1.5 mbit) */ /* standard endpoints */ #define USB_ENDPOINT_CONTROL 0 /* transfer (pipe) types */ #define USB_XFRTYPE_CONTROL 1 #define USB_XFRTYPE_ISOCH 2 #define USB_XFRTYPE_INTERRUPT 3 #define USB_XFRTYPE_BULK 4 /* direction indicators for IRPs */ #define USB_DIR_OUT 1 #define USB_DIR_IN 2 #define USB_DIR_INOUT 3 /* data toggle specifiers for USB_IRP */ #define USB_DATA0 0 #define USB_DATA1 1 /* flags for IRPs */ #define USB_FLAG_SHORT_OK 0x00 #define USB_FLAG_SHORT_FAIL 0x01 #define USB_FLAG_ISO_ASAP 0x02 /* IRP timeouts */ #define USB_TIMEOUT_DEFAULT 5000 /* 5 seconds */ #define USB_TIMEOUT_NONE 0xffffffff /* no timeout */ /* typedefs */ /* * IRP_CALLBACK */ typedef VOID (*IRP_CALLBACK) (pVOID pIrp); /* * USB_BFR_LIST */ typedef struct usb_bfr_list { UINT16 pid; /* Specifies packet type as USB_PID_xxxx */ pUINT8 pBfr; /* Pointer to bfr */ UINT32 bfrLen; /* Length of buffer */ UINT32 actLen; /* actual length transferred */ } USB_BFR_LIST, *pUSB_BFR_LIST; /* * USB_IRP * * NOTE: There are certain requirements on the layout of buffers described * in the bfrList[]. * * For control transfers, the first bfrList [] entry must be the Setup packet. * If there is a data stage, the bfrList [] entry for the data stage should * follow. Finally, a zero-length bfrList [] entry must follow which serves * as a place-holder for the status stage. * * For isochronous, interrupt, and bulk transfers there may be one or more * bfrList[] entries. * * If there is more than one bfrList[] entry for an isochronous, interrupt, * or bulk transfers or more than two bfrList [] entries for control * transfers, then each bfrList[].bfrLen (except the last) must be an exact * multiple of the maxPacketSize. The HCD and underlying hardware will * make no attempt to gather (during OUT) or scatter (during IN) a single * USB packet across multiple bfrList[] entries. */ typedef struct usb_irp { LINK usbdLink; /* Link field used internally by USBD */ pVOID usbdPtr; /* Ptr field for use by USBD */ LINK hcdLink; /* Link field used internally by USB HCD */ pVOID hcdPtr; /* Ptr field for use by USB HCD */ pVOID userPtr; /* Ptr field for use by client */ UINT16 irpLen; /* Total length of IRP structure */ int result; /* IRP completion result: S_usbHcdLib_xxxx */ IRP_CALLBACK usbdCallback; /* USBD completion callback routine */ IRP_CALLBACK userCallback; /* client's completion callback routine */ UINT16 dataToggle; /* IRP should start with DATA0/DATA1. */ UINT16 flags; /* Defines other IRP processing options */ UINT32 timeout; /* IRP timeout in milliseconds */ UINT16 startFrame; /* Start frame for isoch transfer */ UINT16 dataBlockSize; /* Data granularity for isoch transfer */ UINT32 transferLen; /* Total length of data to be transferred */ UINT16 bfrCount; /* Indicates count of buffers in BfrList */ USB_BFR_LIST bfrList [1]; } USB_IRP, *pUSB_IRP; /* Implementation-specific target definitions */ /* * ERP_CALLBACK */ typedef VOID (*ERP_CALLBACK) (pVOID pErp); /* * USB_ERP * * The USB_ERP is similar to the USB_IRP, except that it applies to data transfers * as viewed from the perspective of a USB device - as opposed to the USB_IRP, which * is used by the USB host. * * Each USB_ERP (USB Endpoint Request Packet) describes a transfer through a device * endpoint. As with USB_IRPs, the USB_ERP carries a bfrList[] which is an array * of USB_BFR_LIST structures - each describing a block of data to be transferred. * * There are certain limitations on the bfrList[]. If the first entry in a bfrList[] * has a PID of USB_PID_SETUP, then there may be only a single bfrList[] entry. * * bfrList[] entries must be all IN or all OUT. A single ERP cannot describe * transfers in both directions. */ typedef struct usb_erp { LINK targLink; /* Link field used internally by usbTargLib */ pVOID targPtr; /* Ptr field for use by usbTargLib */ LINK tcdLink; /* Link field used internally by USB TCD */ pVOID tcdPtr; /* Ptr field for use by USB TCD */ pVOID userPtr; /* Ptr field for use by client */ UINT16 erpLen; /* Total length of ERP structure */ int result; /* ERP completion result: S_usbTcdLib_xxxx */ ERP_CALLBACK targCallback; /* usbTargLib completion callback routine */ ERP_CALLBACK userCallback; /* client's completion callback routine */ pVOID pPipeHandle; /* Pipe handle */ UINT16 transferType; /* Type of ERP: control, bulk, etc. */ UINT16 dataToggle; /* ERP should start with DATA0/DATA1. */ UINT16 bfrCount; /* Indicates count of buffers in BfrList */ USB_BFR_LIST bfrList [1]; UINT16 endpointId; /* device endpoint */ /* Added for complaince with the old stack */ } USB_ERP, *pUSB_ERP; #ifdef __cplusplus } #endif #endif /* __INCusbh */ /* End of file. */