summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2012-08-22 20:15:11 +0200
committerVegard Storheil Eriksen <zyp@jvnv.net>2012-08-22 20:15:11 +0200
commitf1713a25598e82e9d00a8e4c40044f590cc2c958 (patch)
tree0aa714a15d8027a1c2f8549e815a962783fd939a
parent8778cf7d9fe5d2658cdd0ca8fb0d0bcbddf1c17f (diff)
Add descriptor classes.
-rw-r--r--usb/descriptor.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/usb/descriptor.h b/usb/descriptor.h
new file mode 100644
index 0000000..f806984
--- /dev/null
+++ b/usb/descriptor.h
@@ -0,0 +1,138 @@
+#ifndef DESCRIPTOR_H
+#define DESCRIPTOR_H
+
+#include <stdint.h>
+
+struct Device_desc {
+ enum {
+ SIZE = 18,
+ };
+
+ 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;
+};
+
+
+struct Configuration_desc {
+ enum {
+ SIZE = 9,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint16_t wTotalLength;
+ uint8_t bNumInterfaces;
+ uint8_t bConfigurationvalue;
+ uint8_t iConfiguration;
+ uint8_t bmAttributes;
+ uint8_t bMaxPower;
+} __attribute__((packed));
+
+struct Interface_desc {
+ enum {
+ SIZE = 9,
+ };
+
+ 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;
+} __attribute__((packed));
+
+struct Endpoint_desc {
+ enum {
+ SIZE = 7,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bEndpointAddress;
+ uint8_t bmAttributes;
+ uint16_t wMaxPacketSize;
+ uint8_t bInterval;
+} __attribute__((packed));
+
+struct CDC_Header_desc {
+ enum {
+ SIZE = 5,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint16_t bcdCDC;
+} __attribute__((packed));
+
+struct CDC_Call_Management_desc {
+ enum {
+ SIZE = 5,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint8_t bmCapabilities;
+ uint8_t bDataInterface;
+} __attribute__((packed));
+
+struct CDC_ACM_desc {
+ enum {
+ SIZE = 4,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint8_t bmCapabilities;
+} __attribute__((packed));
+
+struct CDC_Union_desc {
+ enum {
+ SIZE = 5,
+ };
+
+ uint8_t bLength;
+ uint8_t bDescriptorType;
+ uint8_t bDescriptorSubType;
+ uint8_t bControlInterface;
+ uint8_t bSubordinateInterface0;
+} __attribute__((packed));
+
+template <typename A, typename B>
+struct X {
+ enum {
+ SIZE = A::SIZE + B::SIZE,
+ };
+
+ A a;
+ B b;
+} __attribute__((packed));
+
+template <typename A>
+constexpr A pack(A a) {
+ return a;
+}
+
+template <typename A, typename... R>
+constexpr auto pack(A a, R... r) -> X<A, decltype(pack(r...))> {
+ return {a, pack(r...)};
+}
+
+#endif