Loading...
Searching...
No Matches
descriptor.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018 Koen Zandberg <koen@bergzand.net>
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser General
5 * Public License v2.1. See the file LICENSE in the top level directory for
6 * more details.
7 */
8
9#pragma once
10
22
23#include <stdint.h>
24#include <stdbool.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
34#define USB_SETUP_REQ_GET_STATUS 0x00
35#define USB_SETUP_REQ_CLEAR_FEATURE 0x01
36#define USB_SETUP_REQ_SET_FEATURE 0x03
37#define USB_SETUP_REQ_SET_ADDRESS 0x05
38#define USB_SETUP_REQ_GET_DESCRIPTOR 0x06
39#define USB_SETUP_REQ_SET_DESCRIPTOR 0x07
40#define USB_SETUP_REQ_GET_CONFIGURATION 0x08
41#define USB_SETUP_REQ_SET_CONFIGURATION 0x09
42#define USB_SETUP_REQ_GET_INTERFACE 0x0a
43#define USB_SETUP_REQ_SET_INTERFACE 0x0b
44#define USB_SETUP_REQ_SYNCH_FRAME 0x0c
46
51#define USB_TYPE_DESCRIPTOR_DEVICE 0x01
52#define USB_TYPE_DESCRIPTOR_CONFIGURATION 0x02
53#define USB_TYPE_DESCRIPTOR_STRING 0x03
54#define USB_TYPE_DESCRIPTOR_INTERFACE 0x04
55#define USB_TYPE_DESCRIPTOR_ENDPOINT 0x05
56#define USB_TYPE_DESCRIPTOR_DEV_QUALIFIER 0x06
57#define USB_TYPE_DESCRIPTOR_SPEED_CONFIG 0x07
58#define USB_TYPE_DESCRIPTOR_IFACE_POWER 0x08
59#define USB_TYPE_DESCRIPTOR_INTERFACE_ASSOC 0x0b
61
66#define USB_FEATURE_ENDPOINT_HALT 0x00
67#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 0x01
68#define USB_FEATURE_TEST_MODE 0x02
70
76#define USB_CONF_ATTR_RESERVED 0x80
77#define USB_CONF_ATTR_SELF_POWERED 0x40
78#define USB_CONF_ATTR_REM_WAKEUP 0x20
80
85#define USB_SETUP_REQUEST_DEVICE2HOST 0x80
88
89#define USB_SETUP_REQUEST_RECIPIENT_MASK 0x1f
90#define USB_SETUP_REQUEST_RECIPIENT_DEVICE 0x00
91#define USB_SETUP_REQUEST_RECIPIENT_INTERFACE 0x01
92#define USB_SETUP_REQUEST_RECIPIENT_ENDPOINT 0x02
93#define USB_SETUP_REQUEST_RECIPIENT_OTHER 0x03
94
95#define USB_SETUP_REQUEST_TYPE_MASK 0x60
96#define USB_SETUP_REQUEST_TYPE_STANDARD 0x00
97#define USB_SETUP_REQUEST_TYPE_CLASS 0x20
98#define USB_SETUP_REQUEST_TYPE_VENDOR 0x40
100
104#define USB_ENDPOINT_DESCRIPTOR_INTERVAL_ISOCHRONOUS 1
105
110#define USB_CLASS_AUDIO 0x01
111#define USB_CLASS_CDC_CONTROL 0x02
112#define USB_CLASS_HID 0x03
113#define USB_CLASS_PHYSICAL 0x05
114#define USB_CLASS_IMAGE 0x06
115#define USB_CLASS_PRINTER 0x07
116#define USB_CLASS_MASS_STORAGE 0x08
117#define USB_CLASS_CDC_DATA 0x0a
118#define USB_CLASS_VENDOR 0xff
120
124typedef struct __attribute__((packed)) {
125 uint8_t length;
126 uint8_t type;
127 uint16_t bcd_usb;
128 uint8_t class;
129 uint8_t subclass;
130 uint8_t protocol;
132 uint16_t vendor_id;
133 uint16_t product_id;
134 uint16_t bcd_device;
136 uint8_t product_idx;
137 uint8_t serial_idx;
140
144typedef struct __attribute__((packed)) {
145 uint8_t length;
146 uint8_t type;
147 uint16_t total_length;
149 uint8_t val;
150 uint8_t idx;
151 uint8_t attributes;
152 uint8_t max_power;
154
158typedef struct __attribute__((packed)) {
159 uint8_t length;
160 uint8_t type;
164 uint8_t class;
165 uint8_t subclass;
166 uint8_t protocol;
167 uint8_t idx;
169
173typedef struct __attribute__((packed)) {
174 uint8_t length;
175 uint8_t type;
176 uint8_t address;
177 uint8_t attributes;
179 uint8_t interval;
181
185typedef struct __attribute__((packed)) {
186 uint8_t length;
187 uint8_t type;
189
194typedef struct __attribute__((packed)) {
195 uint8_t length;
196 uint8_t type;
199 uint8_t class;
200 uint8_t subclass;
201 uint8_t protocol;
202 uint8_t idx;
204
208typedef struct __attribute__((packed)) {
209 uint8_t type;
210 uint8_t request;
211 uint16_t value;
212 uint16_t index;
213 uint16_t length;
215
224static inline bool usb_setup_is_read(usb_setup_t *pkt)
225{
227}
228
229#ifdef __cplusplus
230}
231#endif
232
#define USB_SETUP_REQUEST_DEVICE2HOST
Request direction From device to host if the bit is set.
Definition descriptor.h:85
static bool usb_setup_is_read(usb_setup_t *pkt)
getter for setup packet direction
Definition descriptor.h:224
USB configuration descriptor (USB 2.0 spec table 9-10)
Definition descriptor.h:144
uint16_t total_length
Total length of the configuration.
Definition descriptor.h:147
uint8_t idx
Configuration descriptor string index.
Definition descriptor.h:150
uint8_t attributes
Configuration attributes (USB_CONF_ATTR)
Definition descriptor.h:151
uint8_t max_power
Maximum power consumption in 2mA steps.
Definition descriptor.h:152
uint8_t num_interfaces
Number of interfaces supported by this configuration.
Definition descriptor.h:148
uint8_t length
Size of this descriptor.
Definition descriptor.h:145
uint8_t type
Descriptor type (USB_TYPE_DESCRIPTOR_CONFIGURATION)
Definition descriptor.h:146
uint8_t val
Value to select this configuration by.
Definition descriptor.h:149
USB device descriptor (USB 2.0 spec table 9-8)
Definition descriptor.h:124
uint8_t subclass
Device subclass code.
Definition descriptor.h:129
uint8_t num_configurations
Number of possible configurations.
Definition descriptor.h:138
uint8_t length
Size of this descriptor.
Definition descriptor.h:125
uint8_t max_packet_size
EP0 max packet size (8, 16, 32 or 64 bytes)
Definition descriptor.h:131
uint16_t vendor_id
Vendor ID (as assigned by the USB-IF)
Definition descriptor.h:132
uint8_t serial_idx
Device serial number string index number.
Definition descriptor.h:137
uint16_t product_id
Product ID.
Definition descriptor.h:133
uint8_t manufacturer_idx
Manufacturer string index number.
Definition descriptor.h:135
uint8_t product_idx
Product string index number.
Definition descriptor.h:136
uint16_t bcd_usb
Binary-coded decimal USB release specification.
Definition descriptor.h:127
uint16_t bcd_device
Binary-coded decimal device release.
Definition descriptor.h:134
uint8_t protocol
Device protocol code.
Definition descriptor.h:130
uint8_t type
Descriptor type (USB_TYPE_DESCRIPTOR_DEVICE)
Definition descriptor.h:126
USB endpoint descriptor (USB 2.0 spec table 9-13)
Definition descriptor.h:173
uint8_t interval
Polling interval for the endpoint.
Definition descriptor.h:179
uint8_t address
Address of the endpoint.
Definition descriptor.h:176
uint8_t type
Descriptor type (USB_TYPE_DESCRIPTOR_ENDPOINT)
Definition descriptor.h:175
uint16_t max_packet_size
Maximum packet size of the endpoint.
Definition descriptor.h:178
uint8_t length
Size of this descriptor.
Definition descriptor.h:174
uint8_t attributes
Attributes of the endpoint.
Definition descriptor.h:177
USB interface association descriptor (Interface Association Descriptors table 9-Z)
Definition descriptor.h:194
uint8_t first_interface
Index of the first associated interface.
Definition descriptor.h:197
uint8_t length
Size of this descriptor.
Definition descriptor.h:195
uint8_t type
Descriptor type (USB_TYPE_DESCRIPTOR_INTERFACE_ASSOC)
Definition descriptor.h:196
uint8_t idx
Descriptor string index.
Definition descriptor.h:202
uint8_t interface_count
Number of associated interfaces.
Definition descriptor.h:198
USB interface descriptor (USB 2.0 spec table 9-12)
Definition descriptor.h:158
uint8_t length
Size of this descriptor.
Definition descriptor.h:159
uint8_t interface_num
Interface number.
Definition descriptor.h:161
uint8_t type
Descriptor type (USB_TYPE_DESCRIPTOR_INTERFACE)
Definition descriptor.h:160
uint8_t num_endpoints
Number of endpoints used by this interface.
Definition descriptor.h:163
uint8_t alternate_setting
Alternate setting index.
Definition descriptor.h:162
uint8_t protocol
Protocol code.
Definition descriptor.h:166
uint8_t idx
Interface descriptor string index.
Definition descriptor.h:167
uint8_t subclass
Subclass code as assigned by the USB-IF.
Definition descriptor.h:165
USB string descriptor (USB 2.0 spec table 9-16)
Definition descriptor.h:185
uint8_t length
Size of this descriptor.
Definition descriptor.h:186
uint8_t type
String descriptor type.
Definition descriptor.h:187
USB setup packet (USB 2.0 spec table 9-2)
Definition descriptor.h:208
uint16_t value
Value word.
Definition descriptor.h:211
uint8_t type
Request type.
Definition descriptor.h:209
uint16_t index
Index/offset word.
Definition descriptor.h:212
uint16_t length
Length of the data stage.
Definition descriptor.h:213
uint8_t request
Specific request.
Definition descriptor.h:210