diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2012-08-22 20:15:11 +0200 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2012-08-22 20:15:11 +0200 |
commit | f1713a25598e82e9d00a8e4c40044f590cc2c958 (patch) | |
tree | 0aa714a15d8027a1c2f8549e815a962783fd939a | |
parent | 8778cf7d9fe5d2658cdd0ca8fb0d0bcbddf1c17f (diff) |
Add descriptor classes.
-rw-r--r-- | usb/descriptor.h | 138 |
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 |