summaryrefslogtreecommitdiff
path: root/usb/descriptor.h
diff options
context:
space:
mode:
Diffstat (limited to 'usb/descriptor.h')
-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