summaryrefslogtreecommitdiffstats
path: root/libopencm3/include/libopencm3/usb
diff options
context:
space:
mode:
Diffstat (limited to 'libopencm3/include/libopencm3/usb')
-rw-r--r--libopencm3/include/libopencm3/usb/cdc.h162
-rw-r--r--libopencm3/include/libopencm3/usb/dfu.h102
-rw-r--r--libopencm3/include/libopencm3/usb/doc-usb.h32
-rw-r--r--libopencm3/include/libopencm3/usb/hid.h59
-rw-r--r--libopencm3/include/libopencm3/usb/msc.h93
-rw-r--r--libopencm3/include/libopencm3/usb/usbd.h120
-rw-r--r--libopencm3/include/libopencm3/usb/usbstd.h255
7 files changed, 823 insertions, 0 deletions
diff --git a/libopencm3/include/libopencm3/usb/cdc.h b/libopencm3/include/libopencm3/usb/cdc.h
new file mode 100644
index 0000000..20b7836
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/cdc.h
@@ -0,0 +1,162 @@
+/** @defgroup usb_cdc_defines USB CDC Type Definitions
+
+@brief <b>Defined Constants and Types for the USB CDC Type Definitions</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2010
+Gareth McMullin <gareth@blacksphere.co.nz>
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __CDC_H
+#define __CDC_H
+
+/* Definitions of Communications Device Class from
+ * "Universal Serial Bus Class Definitions for Communications Devices
+ * Revision 1.2"
+ */
+
+/* Table 2: Communications Device Class Code */
+#define USB_CLASS_CDC 0x02
+
+/* Table 4: Class Subclass Code */
+#define USB_CDC_SUBCLASS_DLCM 0x01
+#define USB_CDC_SUBCLASS_ACM 0x02
+/* ... */
+
+/* Table 5 Communications Interface Class Control Protocol Codes */
+#define USB_CDC_PROTOCOL_NONE 0x00
+#define USB_CDC_PROTOCOL_AT 0x01
+/* ... */
+
+/* Table 6: Data Interface Class Code */
+#define USB_CLASS_DATA 0x0A
+
+/* Table 12: Type Values for the bDescriptorType Field */
+#define CS_INTERFACE 0x24
+#define CS_ENDPOINT 0x25
+
+/* Table 13: bDescriptor SubType in Communications Class Functional
+ * Descriptors */
+#define USB_CDC_TYPE_HEADER 0x00
+#define USB_CDC_TYPE_CALL_MANAGEMENT 0x01
+#define USB_CDC_TYPE_ACM 0x02
+/* ... */
+#define USB_CDC_TYPE_UNION 0x06
+/* ... */
+
+/* Table 15: Class-Specific Descriptor Header Format */
+struct usb_cdc_header_descriptor {
+ uint8_t bFunctionLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint16_t bcdCDC;
+} __attribute__((packed));
+
+/* Table 16: Union Interface Functional Descriptor */
+struct usb_cdc_union_descriptor {
+ uint8_t bFunctionLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bControlInterface;
+ uint8_t bSubordinateInterface0;
+ /* ... */
+} __attribute__((packed));
+
+
+/* Definitions for Abstract Control Model devices from:
+ * "Universal Serial Bus Communications Class Subclass Specification for
+ * PSTN Devices"
+ */
+
+/* Table 3: Call Management Functional Descriptor */
+struct usb_cdc_call_management_descriptor {
+ uint8_t bFunctionLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bmCapabilities;
+ uint8_t bDataInterface;
+} __attribute__((packed));
+
+/* Table 4: Abstract Control Management Functional Descriptor */
+struct usb_cdc_acm_descriptor {
+ uint8_t bFunctionLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubtype;
+ uint8_t bmCapabilities;
+} __attribute__((packed));
+
+/* Table 13: Class-Specific Request Codes for PSTN subclasses */
+/* ... */
+#define USB_CDC_REQ_SET_LINE_CODING 0x20
+/* ... */
+#define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22
+/* ... */
+
+/* Table 17: Line Coding Structure */
+struct usb_cdc_line_coding {
+ uint32_t dwDTERate;
+ uint8_t bCharFormat;
+ uint8_t bParityType;
+ uint8_t bDataBits;
+} __attribute__((packed));
+
+enum usb_cdc_line_coding_bCharFormat {
+ USB_CDC_1_STOP_BITS = 0,
+ USB_CDC_1_5_STOP_BITS = 1,
+ USB_CDC_2_STOP_BITS = 2,
+};
+
+enum usb_cdc_line_coding_bParityType {
+ USB_CDC_NO_PARITY = 0,
+ USB_CDC_ODD_PARITY = 1,
+ USB_CDC_EVEN_PARITY = 2,
+ USB_CDC_MARK_PARITY = 3,
+ USB_CDC_SPACE_PARITY = 4,
+};
+
+/* Table 30: Class-Specific Notification Codes for PSTN subclasses */
+/* ... */
+#define USB_CDC_NOTIFY_SERIAL_STATE 0x20
+/* ... */
+
+/* Notification Structure */
+struct usb_cdc_notification {
+ uint8_t bmRequestType;
+ uint8_t bNotification;
+ uint16_t wValue;
+ uint16_t wIndex;
+ uint16_t wLength;
+} __attribute__((packed));
+
+#endif
+
+/**@}*/
+
diff --git a/libopencm3/include/libopencm3/usb/dfu.h b/libopencm3/include/libopencm3/usb/dfu.h
new file mode 100644
index 0000000..b7f028c
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/dfu.h
@@ -0,0 +1,102 @@
+/** @defgroup usb_dfu_defines USB DFU Type Definitions
+
+@brief <b>Defined Constants and Types for the USB DFU Type Definitions</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2010
+Gareth McMullin <gareth@blacksphere.co.nz>
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __DFU_H
+#define __DFU_H
+
+enum dfu_req {
+ DFU_DETACH,
+ DFU_DNLOAD,
+ DFU_UPLOAD,
+ DFU_GETSTATUS,
+ DFU_CLRSTATUS,
+ DFU_GETSTATE,
+ DFU_ABORT,
+};
+
+enum dfu_status {
+ DFU_STATUS_OK,
+ DFU_STATUS_ERR_TARGET,
+ DFU_STATUS_ERR_FILE,
+ DFU_STATUS_ERR_WRITE,
+ DFU_STATUS_ERR_ERASE,
+ DFU_STATUS_ERR_CHECK_ERASED,
+ DFU_STATUS_ERR_PROG,
+ DFU_STATUS_ERR_VERIFY,
+ DFU_STATUS_ERR_ADDRESS,
+ DFU_STATUS_ERR_NOTDONE,
+ DFU_STATUS_ERR_FIRMWARE,
+ DFU_STATUS_ERR_VENDOR,
+ DFU_STATUS_ERR_USBR,
+ DFU_STATUS_ERR_POR,
+ DFU_STATUS_ERR_UNKNOWN,
+ DFU_STATUS_ERR_STALLEDPKT,
+};
+
+enum dfu_state {
+ STATE_APP_IDLE,
+ STATE_APP_DETACH,
+ STATE_DFU_IDLE,
+ STATE_DFU_DNLOAD_SYNC,
+ STATE_DFU_DNBUSY,
+ STATE_DFU_DNLOAD_IDLE,
+ STATE_DFU_MANIFEST_SYNC,
+ STATE_DFU_MANIFEST,
+ STATE_DFU_MANIFEST_WAIT_RESET,
+ STATE_DFU_UPLOAD_IDLE,
+ STATE_DFU_ERROR,
+};
+
+#define DFU_FUNCTIONAL 0x21
+struct usb_dfu_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bmAttributes;
+#define USB_DFU_CAN_DOWNLOAD 0x01
+#define USB_DFU_CAN_UPLOAD 0x02
+#define USB_DFU_MANIFEST_TOLERANT 0x04
+#define USB_DFU_WILL_DETACH 0x08
+
+ uint16_t wDetachTimeout;
+ uint16_t wTransferSize;
+ uint16_t bcdDFUVersion;
+} __attribute__((packed));
+
+#endif
+
+/**@}*/
+
diff --git a/libopencm3/include/libopencm3/usb/doc-usb.h b/libopencm3/include/libopencm3/usb/doc-usb.h
new file mode 100644
index 0000000..faa01b1
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/doc-usb.h
@@ -0,0 +1,32 @@
+/** @mainpage libopencm3 Generic USB
+
+@version 1.0.0
+
+@date 10 March 2013
+
+API documentation for Generic USB.
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/** @defgroup USB Generic USB
+Libraries for Generic USB.
+
+@version 1.0.0
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/** @defgroup USB_defines Generic USB Defines
+
+@brief Defined Constants and Types for Generic USB.
+
+@version 1.0.0
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
diff --git a/libopencm3/include/libopencm3/usb/hid.h b/libopencm3/include/libopencm3/usb/hid.h
new file mode 100644
index 0000000..87f4924
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/hid.h
@@ -0,0 +1,59 @@
+/** @defgroup usb_hid_defines USB HID Type Definitions
+
+@brief <b>Defined Constants and Types for the USB HID Type Definitions</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2010
+Gareth McMullin <gareth@blacksphere.co.nz>
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __HID_H
+#define __HID_H
+
+#include <stdint.h>
+
+#define USB_CLASS_HID 3
+
+#define USB_DT_HID 0x21
+#define USB_DT_REPORT 0x22
+
+struct usb_hid_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t bcdHID;
+ uint8_t bCountryCode;
+ uint8_t bNumDescriptors;
+} __attribute__((packed));
+
+#endif
+
+/**@}*/
+
diff --git a/libopencm3/include/libopencm3/usb/msc.h b/libopencm3/include/libopencm3/usb/msc.h
new file mode 100644
index 0000000..cf9c54a
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/msc.h
@@ -0,0 +1,93 @@
+/** @defgroup usb_msc_defines USB MSC Type Definitions
+
+@brief <b>Defined Constants and Types for the USB MSC Type Definitions</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2013
+Weston Schmidt <weston_schmidt@alumni.purdue.edu>
+Pavol Rusnak <stick@gk2.sk>
+
+@date 27 June 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2013 Weston Schmidt <weston_schmidt@alumni.purdue.edu>
+ * Copyright (C) 2013 Pavol Rusnak <stick@gk2.sk>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __MSC_H
+#define __MSC_H
+
+typedef struct _usbd_mass_storage usbd_mass_storage;
+
+/* Definitions of Mass Storage Class from:
+ *
+ * (A) "Universal Serial Bus Mass Storage Class Bulk-Only Transport
+ * Revision 1.0"
+ *
+ * (B) "Universal Serial Bus Mass Storage Class Specification Overview
+ * Revision 1.0"
+ */
+
+/* (A) Table 4.5: Mass Storage Device Class Code */
+#define USB_CLASS_MSC 0x08
+
+/* (B) Table 2.1: Class Subclass Code */
+#define USB_MSC_SUBCLASS_RBC 0x01
+#define USB_MSC_SUBCLASS_ATAPI 0x02
+#define USB_MSC_SUBCLASS_UFI 0x04
+#define USB_MSC_SUBCLASS_SCSI 0x06
+#define USB_MSC_SUBCLASS_LOCKABLE 0x07
+#define USB_MSC_SUBCLASS_IEEE1667 0x08
+
+/* (B) Table 3.1 Mass Storage Interface Class Control Protocol Codes */
+#define USB_MSC_PROTOCOL_CBI 0x00
+#define USB_MSC_PROTOCOL_CBI_ALT 0x01
+#define USB_MSC_PROTOCOL_BBB 0x50
+
+/* (B) Table 4.1 Mass Storage Request Codes */
+#define USB_MSC_REQ_CODES_ADSC 0x00
+#define USB_MSC_REQ_CODES_GET 0xFC
+#define USB_MSC_REQ_CODES_PUT 0xFD
+#define USB_MSC_REQ_CODES_GML 0xFE
+#define USB_MSC_REQ_CODES_BOMSR 0xFF
+
+/* (A) Table 3.1/3.2 Class-Specific Request Codes */
+#define USB_MSC_REQ_BULK_ONLY_RESET 0xFF
+#define USB_MSC_REQ_GET_MAX_LUN 0xFE
+
+usbd_mass_storage *usb_msc_init(usbd_device *usbd_dev,
+ uint8_t ep_in, uint8_t ep_in_size,
+ uint8_t ep_out, uint8_t ep_out_size,
+ const char *vendor_id,
+ const char *product_id,
+ const char *product_revision_level,
+ const uint32_t block_count,
+ int (*read_block)(uint32_t lba, uint8_t *copy_to),
+ int (*write_block)(uint32_t lba, const uint8_t *copy_from));
+
+#endif
+
+/**@}*/
diff --git a/libopencm3/include/libopencm3/usb/usbd.h b/libopencm3/include/libopencm3/usb/usbd.h
new file mode 100644
index 0000000..b50c65d
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/usbd.h
@@ -0,0 +1,120 @@
+/** @defgroup usb_driver_defines USB Drivers
+
+@brief <b>Defined Constants and Types for the USB Drivers</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2010
+Gareth McMullin <gareth@blacksphere.co.nz>
+
+@date 10 March 2013
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __USBD_H
+#define __USBD_H
+
+#include <libopencm3/usb/usbstd.h>
+
+BEGIN_DECLS
+
+
+enum usbd_request_return_codes {
+ USBD_REQ_NOTSUPP = 0,
+ USBD_REQ_HANDLED = 1,
+ USBD_REQ_NEXT_CALLBACK = 2,
+};
+
+typedef struct _usbd_driver usbd_driver;
+typedef struct _usbd_device usbd_device;
+
+extern const usbd_driver stm32f103_usb_driver;
+extern const usbd_driver stm32f107_usb_driver;
+extern const usbd_driver stm32f207_usb_driver;
+#define otgfs_usb_driver stm32f107_usb_driver
+#define otghs_usb_driver stm32f207_usb_driver
+
+/* <usb.c> */
+extern usbd_device * usbd_init(const usbd_driver *driver,
+ const struct usb_device_descriptor *dev,
+ const struct usb_config_descriptor *conf,
+ const char **strings, int num_strings,
+ uint8_t *control_buffer,
+ uint16_t control_buffer_size);
+
+extern void usbd_register_reset_callback(usbd_device *usbd_dev,
+ void (*callback)(void));
+extern void usbd_register_suspend_callback(usbd_device *usbd_dev,
+ void (*callback)(void));
+extern void usbd_register_resume_callback(usbd_device *usbd_dev,
+ void (*callback)(void));
+extern void usbd_register_sof_callback(usbd_device *usbd_dev,
+ void (*callback)(void));
+
+typedef int (*usbd_control_callback)(usbd_device *usbd_dev,
+ struct usb_setup_data *req, uint8_t **buf, uint16_t *len,
+ void (**complete)(usbd_device *usbd_dev,
+ struct usb_setup_data *req));
+
+/* <usb_control.c> */
+extern int usbd_register_control_callback(usbd_device *usbd_dev, uint8_t type,
+ uint8_t type_mask,
+ usbd_control_callback callback);
+
+/* <usb_standard.c> */
+extern int usbd_register_set_config_callback(usbd_device *usbd_dev,
+ void (*callback)(usbd_device *usbd_dev, uint16_t wValue));
+
+/* Functions to be provided by the hardware abstraction layer */
+extern void usbd_poll(usbd_device *usbd_dev);
+extern void usbd_disconnect(usbd_device *usbd_dev, bool disconnected);
+
+extern void usbd_ep_setup(usbd_device *usbd_dev, uint8_t addr, uint8_t type,
+ uint16_t max_size,
+ void (*callback)(usbd_device *usbd_dev, uint8_t ep));
+
+extern uint16_t usbd_ep_write_packet(usbd_device *usbd_dev, uint8_t addr,
+ const void *buf, uint16_t len);
+
+extern uint16_t usbd_ep_read_packet(usbd_device *usbd_dev, uint8_t addr,
+ void *buf, uint16_t len);
+
+extern void usbd_ep_stall_set(usbd_device *usbd_dev, uint8_t addr,
+ uint8_t stall);
+extern uint8_t usbd_ep_stall_get(usbd_device *usbd_dev, uint8_t addr);
+
+extern void usbd_ep_nak_set(usbd_device *usbd_dev, uint8_t addr, uint8_t nak);
+
+/* Optional */
+extern void usbd_cable_connect(usbd_device *usbd_dev, uint8_t on);
+
+END_DECLS
+
+#endif
+
+/**@}*/
+
diff --git a/libopencm3/include/libopencm3/usb/usbstd.h b/libopencm3/include/libopencm3/usb/usbstd.h
new file mode 100644
index 0000000..f85ec82
--- /dev/null
+++ b/libopencm3/include/libopencm3/usb/usbstd.h
@@ -0,0 +1,255 @@
+/** @defgroup usb_type_defines USB Standard Structure Definitions
+
+@brief <b>Defined Constants and Types for the USB Standard Structure
+Definitions</b>
+
+@ingroup USB_defines
+
+@version 1.0.0
+
+@author @htmlonly &copy; @endhtmlonly 2010
+Gareth McMullin <gareth@blacksphere.co.nz>
+
+@date 10 March 2013
+
+A set of structure definitions for the USB control structures
+defined in chapter 9 of the "Univeral Serial Bus Specification Revision 2.0"
+Available from the USB Implementers Forum - http://www.usb.org/
+
+LGPL License Terms @ref lgpl_license
+*/
+
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**@{*/
+
+#ifndef __USBSTD_H
+#define __USBSTD_H
+
+#include <stdint.h>
+#include <libopencm3/cm3/common.h>
+
+/*
+ * This file contains structure definitions for the USB control structures
+ * defined in chapter 9 of the "Univeral Serial Bus Specification Revision 2.0"
+ * Available from the USB Implementers Forum - http://www.usb.org/
+ */
+
+/* USB Setup Data structure - Table 9-2 */
+struct usb_setup_data {
+ uint8_t bmRequestType;
+ uint8_t bRequest;
+ uint16_t wValue;
+ uint16_t wIndex;
+ uint16_t wLength;
+} __attribute__((packed));
+
+/* Class Definition */
+#define USB_CLASS_VENDOR 0xFF
+
+/* bmRequestType bit definitions */
+#define USB_REQ_TYPE_IN 0x80
+#define USB_REQ_TYPE_STANDARD 0x00
+#define USB_REQ_TYPE_CLASS 0x20
+#define USB_REQ_TYPE_VENDOR 0x40
+#define USB_REQ_TYPE_DEVICE 0x00
+#define USB_REQ_TYPE_INTERFACE 0x01
+#define USB_REQ_TYPE_ENDPOINT 0x02
+
+#define USB_REQ_TYPE_DIRECTION 0x80
+#define USB_REQ_TYPE_TYPE 0x60
+#define USB_REQ_TYPE_RECIPIENT 0x1F
+
+/* USB Standard Request Codes - Table 9-4 */
+#define USB_REQ_GET_STATUS 0
+#define USB_REQ_CLEAR_FEATURE 1
+/* Reserved for future use: 2 */
+#define USB_REQ_SET_FEATURE 3
+/* Reserved for future use: 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_SET_SYNCH_FRAME 12
+
+/* USB Descriptor Types - Table 9-5 */
+#define USB_DT_DEVICE 1
+#define USB_DT_CONFIGURATION 2
+#define USB_DT_STRING 3
+#define USB_DT_INTERFACE 4
+#define USB_DT_ENDPOINT 5
+#define USB_DT_DEVICE_QUALIFIER 6
+#define USB_DT_OTHER_SPEED_CONFIGURATION 7
+#define USB_DT_INTERFACE_POWER 8
+/* From ECNs */
+#define USB_DT_OTG 9
+#define USB_DT_DEBUG 10
+#define USB_DT_INTERFACE_ASSOCIATION 11
+
+/* USB Standard Feature Selectors - Table 9-6 */
+#define USB_FEAT_ENDPOINT_HALT 0
+#define USB_FEAT_DEVICE_REMOTE_WAKEUP 1
+#define USB_FEAT_TEST_MODE 2
+
+/* Information Returned by a GetStatus() Request to a Device - Figure 9-4 */
+#define USB_DEV_STATUS_SELF_POWERED 0x01
+#define USB_DEV_STATUS_REMOTE_WAKEUP 0x02
+
+/* USB Standard Device Descriptor - Table 9-8 */
+struct usb_device_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t bcdUSB;
+ uint8_t bDeviceClass;
+ uint8_t bDeviceSubClass;
+ uint8_t bDeviceProtocol;
+ uint8_t bMaxPacketSize0;
+ uint16_t idVendor;
+ uint16_t idProduct;
+ uint16_t bcdDevice;
+ uint8_t iManufacturer;
+ uint8_t iProduct;
+ uint8_t iSerialNumber;
+ uint8_t bNumConfigurations;
+} __attribute__((packed));
+
+#define USB_DT_DEVICE_SIZE sizeof(struct usb_device_descriptor)
+
+/* USB Device_Qualifier Descriptor - Table 9-9
+ * Not used in this implementation.
+ */
+struct usb_device_qualifier_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t bcdUSB;
+ uint8_t bDeviceClass;
+ uint8_t bDeviceSubClass;
+ uint8_t bDeviceProtocol;
+ uint8_t bMaxPacketSize0;
+ uint8_t bNumConfigurations;
+ uint8_t bReserved;
+} __attribute__((packed));
+
+/* USB Standard Configuration Descriptor - Table 9-10 */
+struct usb_config_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t wTotalLength;
+ uint8_t bNumInterfaces;
+ uint8_t bConfigurationValue;
+ uint8_t iConfiguration;
+ uint8_t bmAttributes;
+ uint8_t bMaxPower;
+
+ /* Descriptor ends here. The following are used internally: */
+ const struct usb_interface {
+ int num_altsetting;
+ const struct usb_iface_assoc_descriptor *iface_assoc;
+ const struct usb_interface_descriptor *altsetting;
+ } *interface;
+} __attribute__((packed));
+#define USB_DT_CONFIGURATION_SIZE 9
+
+/* USB Configuration Descriptor bmAttributes bit definitions */
+#define USB_CONFIG_ATTR_SELF_POWERED 0x40
+#define USB_CONFIG_ATTR_REMOTE_WAKEUP 0x20
+
+/* Other Speed Configuration is the same as Configuration Descriptor.
+ * - Table 9-11
+ */
+
+/* USB Standard Interface Descriptor - Table 9-12 */
+struct usb_interface_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bInterfaceNumber;
+ uint8_t bAlternateSetting;
+ uint8_t bNumEndpoints;
+ uint8_t bInterfaceClass;
+ uint8_t bInterfaceSubClass;
+ uint8_t bInterfaceProtocol;
+ uint8_t iInterface;
+
+ /* Descriptor ends here. The following are used internally: */
+ const struct usb_endpoint_descriptor *endpoint;
+ const void *extra;
+ int extralen;
+} __attribute__((packed));
+#define USB_DT_INTERFACE_SIZE 9
+
+/* USB Standard Endpoint Descriptor - Table 9-13 */
+struct usb_endpoint_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bEndpointAddress;
+ uint8_t bmAttributes;
+ uint16_t wMaxPacketSize;
+ uint8_t bInterval;
+} __attribute__((packed));
+#define USB_DT_ENDPOINT_SIZE sizeof(struct usb_endpoint_descriptor)
+
+/* USB Endpoint Descriptor bmAttributes bit definitions */
+#define USB_ENDPOINT_ATTR_CONTROL 0x00
+#define USB_ENDPOINT_ATTR_ISOCHRONOUS 0x01
+#define USB_ENDPOINT_ATTR_BULK 0x02
+#define USB_ENDPOINT_ATTR_INTERRUPT 0x03
+
+#define USB_ENDPOINT_ATTR_NOSYNC 0x00
+#define USB_ENDPOINT_ATTR_ASYNC 0x04
+#define USB_ENDPOINT_ATTR_ADAPTIVE 0x08
+#define USB_ENDPOINT_ATTR_SYNC 0x0C
+
+#define USB_ENDPOINT_ATTR_DATA 0x00
+#define USB_ENDPOINT_ATTR_FEEDBACK 0x10
+#define USB_ENDPOINT_ATTR_IMPLICIT_FEEDBACK_DATA 0x20
+
+/* Table 9-15 specifies String Descriptor Zero.
+ * Table 9-16 specified UNICODE String Descriptor.
+ */
+struct usb_string_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t wData[];
+} __attribute__((packed));
+
+/* From ECN: Interface Association Descriptors, Table 9-Z */
+struct usb_iface_assoc_descriptor {
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bFirstInterface;
+ uint8_t bInterfaceCount;
+ uint8_t bFunctionClass;
+ uint8_t bFunctionSubClass;
+ uint8_t bFunctionProtocol;
+ uint8_t iFunction;
+} __attribute__((packed));
+#define USB_DT_INTERFACE_ASSOCIATION_SIZE \
+ sizeof(struct usb_iface_assoc_descriptor)
+
+enum usb_language_id {
+ USB_LANGID_ENGLISH_US = 0x409,
+};
+#endif
+
+/**@}*/
+