nuttx/include/nuttx/usb.h
patacongo 75be6467e0 Added macro for LE 32-bit values
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1030 42af7a65-404d-4744-a932-0658087f49c3
2008-10-11 19:35:55 +00:00

336 lines
13 KiB
C

/************************************************************************************
* include/nuttx/usb.h
*
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************************************/
#ifndef __NUTTX_USB_H
#define __NUTTX_USB_H
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
/************************************************************************************
* Definitions
************************************************************************************/
/* All 16-bit values must be little-endian */
#define MSBYTE(u16) ((u16) >> 8) /* Get MS byte from uint16 */
#define LSBYTE(u16) ((u16) & 0xff) /* Get LS byte from uint16 */
#define GETUINT16(p) (((uint16)p[1]<<8)|(uint16)p[0])
#define GETUINT32(p) (((uint32)p[3]<<24)|((uint32)p[2]<<16)|\
((uint32)p[1]<<8)|(uint32)p[0])
/* USB directions (in endpoint addresses) */
#define USB_DIR_OUT (0x00) /* host-to-device */
#define USB_DIR_IN (0x80) /* device-to-host */
#define USB_EPNO(addr) ((addr)&0x7f)
#define USB_EPOUT(addr) ((addr)|USB_DIR_OUT)
#define USB_EPIN(addr) ((addr)|USB_DIR_IN)
/* Control Setup Packet. Byte 0=Request */
#define USB_REQ_DIR_IN (0x80) /* Bit 7=1: IN */
#define USB_REQ_TYPE_MASK (0x60) /* Bits 5:6: Request type */
#define USB_REQ_TYPE_STANDARD (0x00)
#define USB_REQ_TYPE_CLASS (0x20)
#define USB_REQ_TYPE_VENDOR (0x40)
#define USB_REQ_RECIPIENT_MASK (0x1f) /* Bits 0:4: Recipient */
#define USB_REQ_RECIPIENT_DEVICE (0x00)
#define USB_REQ_RECIPIENT_INTERFACE (0x01)
#define USB_REQ_RECIPIENT_ENDPOINT (0x02)
#define USB_REQ_RECIPIENT_OTHER (0x03)
/* Control Setup Packet. Byte 1=Standard Request Codes */
#define USB_REQ_GETSTATUS (0x00)
#define USB_REQ_CLEARFEATURE (0x01)
#define USB_REQ_SETFEATURE (0x03)
#define USB_REQ_SETADDRESS (0x05)
#define USB_REQ_GETDESCRIPTOR (0x06)
#define USB_REQ_SETDESCRIPTOR (0x07)
#define USB_REQ_GETCONFIGURATION (0x08)
#define USB_REQ_SETCONFIGURATION (0x09)
#define USB_REQ_GETINTERFACE (0x0a)
#define USB_REQ_SETINTERFACE (0x0b)
#define USB_REQ_SYNCHFRAME (0x0c)
#define USB_REQ_SETENCRYPTION (0x0d) /* Wireless USB */
#define USB_REQ_GETENCRYPTION (0x0e)
#define USB_REQ_SETHANDSHAKE (0x0f)
#define USB_REQ_GETHANDSHAKE (0x10)
#define USB_REQ_SETCONNECTION (0x11)
#define USB_REQ_SETSECURITYDATA (0x12)
#define USB_REQ_GETSECURITYDATA (0x13)
#define USB_REQ_SETWUSBDATA (0x14)
#define USB_REQ_LOOPBACKDATAWRITE (0x15)
#define USB_REQ_LOOPBACKDATAREAD (0x16)
#define USB_REQ_SETINTERFACEDS (0x17)
/* USB feature values */
#define USB_FEATURE_ENDPOINTHALT 0
#define USB_FEATURE_SELFPOWERED 0
#define USB_FEATURE_REMOTEWAKEUP 1
#define USB_FEATURE_TESTMODE 2
#define USB_FEATURE_BATTERY 2
#define USB_FEATURE_BHNPENABLE 3
#define USB_FEATURE_WUSBDEVICE 3
#define USB_FEATURE_AHNPSUPPORT 4
#define USB_FEATURE_AALTHNPSUPPORT 5
#define USB_FEATURE_DEBUGMODE 6
/* Generic descriptor header offsets */
#define USB_DESC_DESCLENOFFSET 0
#define USB_DESC_DESCTYPEOFFSET 1
/* Descriptor types */
#define USB_DESC_TYPE_DEVICE (0x01)
#define USB_DESC_TYPE_CONFIG (0x02)
#define USB_DESC_TYPE_STRING (0x03)
#define USB_DESC_TYPE_INTERFACE (0x04)
#define USB_DESC_TYPE_ENDPOINT (0x05)
#define USB_DESC_TYPE_DEVICEQUALIFIER (0x06)
#define USB_DESC_TYPE_OTHERSPEEDCONFIG (0x07)
#define USB_DESC_TYPE_INTERFACEPOWER (0x08)
#define USB_DESC_TYPE_OTG (0x09)
#define USB_DESC_TYPE_DEBUG (0x0a)
#define USB_DESC_TYPE_INTERFACEASSOCIATION (0x0b)
#define USB_DESC_TYPE_SECURITY (0x0c)
#define USB_DESC_TYPE_KEY (0x0d)
#define USB_DESC_TYPE_ENCRYPTION_TYPE (0x0e)
#define USB_DESC_TYPE_BOS (0x0f)
#define USB_DESC_TYPE_DEVICECAPABILITY (0x10)
#define USB_DESC_TYPE_WIRELESS_ENDPOINTCOMP (0x11)
#define USB_DESC_TYPE_CSDEVICE (0x21)
#define USB_DESC_TYPE_CSCONFIG (0x22)
#define USB_DESC_TYPE_CSSTRING (0x23)
#define USB_DESC_TYPE_CSINTERFACE (0x24)
#define USB_DESC_TYPE_CSENDPOINT (0x25)
/* Device and interface descriptor class codes */
#define USB_CLASS_PER_INTERFACE (0x00)
#define USB_CLASS_AUDIO (0x01)
#define USB_CLASS_COMM (0x02)
#define USB_CLASS_HID (0x03)
#define USB_CLASS_PHYSICAL (0x05)
#define USB_CLASS_STILL_IMAGE (0x06)
#define USB_CLASS_PRINTER (0x07)
#define USB_CLASS_MASS_STORAGE (0x08)
#define USB_CLASS_HUB (0x09)
#define USB_CLASS_CDC_DATA (0x0a)
#define USB_CLASS_CSCID (0x0b)
#define USB_CLASS_CONTENT_SEC (0x0d)
#define USB_CLASS_VIDEO (0x0e)
#define USB_CLASS_WIRELESS_CONTROLLER (0xe0)
#define USB_CLASS_APP_SPEC (0xfe)
#define USB_CLASS_VENDOR_SPEC (0xff)
/* Values for configuration descriptor attributes */
#define USB_CONFIG_ATTR_BATTERY (0x10) /* Battery powered */
#define USB_CONFIG_ATTR_WAKEUP (0x20) /* Remote wakeup */
#define USB_CONFIG_ATTR_SELFPOWER (0x40) /* Self-powered */
#define USB_CONFIG_ATTR_ONE (0x80) /* Must be one */
/* Endpoint descriptor address */
#define USB_EP_ADDR_NUMBER_MASK (0x0f)
#define USB_EP_ADDR_DIR_MASK (0x80)
/* Endpoint descriptor attributes */
#define USB_EP_ATTR_XFERTYPE_MASK (0x03)
#define USB_EP_ATTR_XFER_CONTROL (0x00)
#define USB_EP_ATTR_XFER_ISOC (0x01)
#define USB_EP_ATTR_XFER_BULK (0x02)
#define USB_EP_ATTR_XFER_INT (0x03)
#define USB_EP_ATTR_MAX_ADJUSTABLE (0x80)
/************************************************************************************
* Public Types
************************************************************************************/
/* This structure is used to send control requests to a USB device. */
struct usb_ctrlreq_s
{
ubyte type; /* Matches request type */
ubyte req; /* Matches request field */
ubyte value[2];
ubyte index[2];
ubyte len[2];
};
#define USB_SIZEOF_CTRLREQ 8
/* Generic descriptor */
struct usb_desc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
};
/* Device descriptor */
struct usb_devdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte usb[2]; /* USB version */
ubyte class; /* Device class */
ubyte subclass; /* Device sub-class */
ubyte protocol; /* Device protocol */
ubyte mxpacketsize; /* Max packet size (ep0) */
ubyte vender[2]; /* Vendor ID */
ubyte product[2]; /* Product ID */
ubyte device[2]; /* Device ID */
ubyte imfgr; /* Manufacturer */
ubyte iproduct; /* Product */
ubyte serno; /* Serial number */
ubyte nconfigs; /* Number of configurations */
};
#define USB_SIZEOF_DEVDESC 18
/* Configuration descriptor */
struct usb_cfgdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte totallen[2]; /* Total length */
ubyte ninterfaces; /* Number of interfaces */
ubyte cfgvalue; /* Configuration value */
ubyte icfg; /* Configuration */
ubyte attr; /* Attributes */
ubyte mxpower; /* Max power (mA/2) */
};
#define USB_SIZEOF_CFGDESC 9
struct usb_otherspeedconfigdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte totallen[2]; /* Total length */
ubyte ninterfaces; /* Number of interfaces */
ubyte cfgvalue; /* Configuration value */
ubyte icfg; /* Configuration */
ubyte attr; /* Attributes */
ubyte mxpower; /* Max power (mA/2) */
};
#define USB_SIZEOF_OTHERSPEEDCONFIGDESC 9
/* String descriptor */
struct usb_strdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte data[2];
};
/* Interface descriptor */
struct usb_ifdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte ifno; /* Interface number */
ubyte alt; /* Alternate setting */
ubyte neps; /* Number of endpoints */
ubyte class; /* Interface class */
ubyte subclass; /* Interface sub-class */
ubyte protocol; /* Interface protocol */
ubyte iif; /* iInterface */
};
#define USB_SIZEOF_IFDESC 9
/* Endpoint descriptor */
struct usb_epdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte addr; /* Endpoint address */
ubyte attr; /* Endpoint attributes */
ubyte mxpacketsize[2]; /* Maximum packet size */
ubyte interval; /* Interval */
};
#define USB_SIZEOF_EPDESC 7
struct usb_audioepdesc_s
{
struct usb_epdesc_s ep;
ubyte refresh;
ubyte synchaddr;
};
#define USB_SIZEOF_AUDIOEPDESC 9
/* Device qualifier descriptor */
struct usb_qualdesc_s
{
ubyte len; /* Descriptor length */
ubyte type; /* Descriptor type */
ubyte usb[2]; /* USB version */
ubyte class; /* Qualifier class */
ubyte subclass; /* Qualifier sub-class */
ubyte protocol; /* Qualifier protocol */
ubyte mxpacketsize; /* Max packet size (ep0) */
ubyte nconfigs; /* Number of configurations */
ubyte reserved;
};
#define USB_SIZEOF_QUALDESC 10
/************************************************************************************
* Public Data
************************************************************************************/
/************************************************************************************
* Public Functions
************************************************************************************/
#endif // __NUTTX_USB_H