root / hw / usb / desc.h @ 8c43a6f0
History | View | Annotate | Download (7.9 kB)
1 | 37fb59d3 | Gerd Hoffmann | #ifndef QEMU_HW_USB_DESC_H
|
---|---|---|---|
2 | 37fb59d3 | Gerd Hoffmann | #define QEMU_HW_USB_DESC_H
|
3 | 37fb59d3 | Gerd Hoffmann | |
4 | 37fb59d3 | Gerd Hoffmann | #include <inttypes.h> |
5 | 37fb59d3 | Gerd Hoffmann | |
6 | d3f904ea | Gerd Hoffmann | /* binary representation */
|
7 | d3f904ea | Gerd Hoffmann | typedef struct USBDescriptor { |
8 | d3f904ea | Gerd Hoffmann | uint8_t bLength; |
9 | d3f904ea | Gerd Hoffmann | uint8_t bDescriptorType; |
10 | d3f904ea | Gerd Hoffmann | union {
|
11 | d3f904ea | Gerd Hoffmann | struct {
|
12 | d3f904ea | Gerd Hoffmann | uint8_t bcdUSB_lo; |
13 | d3f904ea | Gerd Hoffmann | uint8_t bcdUSB_hi; |
14 | d3f904ea | Gerd Hoffmann | uint8_t bDeviceClass; |
15 | d3f904ea | Gerd Hoffmann | uint8_t bDeviceSubClass; |
16 | d3f904ea | Gerd Hoffmann | uint8_t bDeviceProtocol; |
17 | d3f904ea | Gerd Hoffmann | uint8_t bMaxPacketSize0; |
18 | d3f904ea | Gerd Hoffmann | uint8_t idVendor_lo; |
19 | d3f904ea | Gerd Hoffmann | uint8_t idVendor_hi; |
20 | d3f904ea | Gerd Hoffmann | uint8_t idProduct_lo; |
21 | d3f904ea | Gerd Hoffmann | uint8_t idProduct_hi; |
22 | d3f904ea | Gerd Hoffmann | uint8_t bcdDevice_lo; |
23 | d3f904ea | Gerd Hoffmann | uint8_t bcdDevice_hi; |
24 | d3f904ea | Gerd Hoffmann | uint8_t iManufacturer; |
25 | d3f904ea | Gerd Hoffmann | uint8_t iProduct; |
26 | d3f904ea | Gerd Hoffmann | uint8_t iSerialNumber; |
27 | d3f904ea | Gerd Hoffmann | uint8_t bNumConfigurations; |
28 | d3f904ea | Gerd Hoffmann | } device; |
29 | 3cfeee61 | Gerd Hoffmann | struct {
|
30 | 3cfeee61 | Gerd Hoffmann | uint8_t bcdUSB_lo; |
31 | 3cfeee61 | Gerd Hoffmann | uint8_t bcdUSB_hi; |
32 | 3cfeee61 | Gerd Hoffmann | uint8_t bDeviceClass; |
33 | 3cfeee61 | Gerd Hoffmann | uint8_t bDeviceSubClass; |
34 | 3cfeee61 | Gerd Hoffmann | uint8_t bDeviceProtocol; |
35 | 3cfeee61 | Gerd Hoffmann | uint8_t bMaxPacketSize0; |
36 | 3cfeee61 | Gerd Hoffmann | uint8_t bNumConfigurations; |
37 | 3cfeee61 | Gerd Hoffmann | uint8_t bReserved; |
38 | 3cfeee61 | Gerd Hoffmann | } device_qualifier; |
39 | 0a263db1 | Gerd Hoffmann | struct {
|
40 | 0a263db1 | Gerd Hoffmann | uint8_t wTotalLength_lo; |
41 | 0a263db1 | Gerd Hoffmann | uint8_t wTotalLength_hi; |
42 | 0a263db1 | Gerd Hoffmann | uint8_t bNumInterfaces; |
43 | 0a263db1 | Gerd Hoffmann | uint8_t bConfigurationValue; |
44 | 0a263db1 | Gerd Hoffmann | uint8_t iConfiguration; |
45 | 0a263db1 | Gerd Hoffmann | uint8_t bmAttributes; |
46 | 0a263db1 | Gerd Hoffmann | uint8_t bMaxPower; |
47 | 0a263db1 | Gerd Hoffmann | } config; |
48 | feafd797 | Gerd Hoffmann | struct {
|
49 | feafd797 | Gerd Hoffmann | uint8_t bInterfaceNumber; |
50 | feafd797 | Gerd Hoffmann | uint8_t bAlternateSetting; |
51 | feafd797 | Gerd Hoffmann | uint8_t bNumEndpoints; |
52 | feafd797 | Gerd Hoffmann | uint8_t bInterfaceClass; |
53 | feafd797 | Gerd Hoffmann | uint8_t bInterfaceSubClass; |
54 | feafd797 | Gerd Hoffmann | uint8_t bInterfaceProtocol; |
55 | feafd797 | Gerd Hoffmann | uint8_t iInterface; |
56 | feafd797 | Gerd Hoffmann | } interface; |
57 | e36a20d3 | Gerd Hoffmann | struct {
|
58 | e36a20d3 | Gerd Hoffmann | uint8_t bEndpointAddress; |
59 | e36a20d3 | Gerd Hoffmann | uint8_t bmAttributes; |
60 | e36a20d3 | Gerd Hoffmann | uint8_t wMaxPacketSize_lo; |
61 | e36a20d3 | Gerd Hoffmann | uint8_t wMaxPacketSize_hi; |
62 | e36a20d3 | Gerd Hoffmann | uint8_t bInterval; |
63 | e36a20d3 | Gerd Hoffmann | uint8_t bRefresh; /* only audio ep */
|
64 | e36a20d3 | Gerd Hoffmann | uint8_t bSynchAddress; /* only audio ep */
|
65 | e36a20d3 | Gerd Hoffmann | } endpoint; |
66 | b43a2851 | Gerd Hoffmann | struct {
|
67 | b43a2851 | Gerd Hoffmann | uint8_t bMaxBurst; |
68 | b43a2851 | Gerd Hoffmann | uint8_t bmAttributes; |
69 | b43a2851 | Gerd Hoffmann | uint8_t wBytesPerInterval_lo; |
70 | b43a2851 | Gerd Hoffmann | uint8_t wBytesPerInterval_hi; |
71 | b43a2851 | Gerd Hoffmann | } super_endpoint; |
72 | 2077469b | Gerd Hoffmann | struct {
|
73 | 2077469b | Gerd Hoffmann | uint8_t wTotalLength_lo; |
74 | 2077469b | Gerd Hoffmann | uint8_t wTotalLength_hi; |
75 | 2077469b | Gerd Hoffmann | uint8_t bNumDeviceCaps; |
76 | 2077469b | Gerd Hoffmann | } bos; |
77 | 2077469b | Gerd Hoffmann | struct {
|
78 | 2077469b | Gerd Hoffmann | uint8_t bDevCapabilityType; |
79 | 2077469b | Gerd Hoffmann | union {
|
80 | 2077469b | Gerd Hoffmann | struct {
|
81 | 2077469b | Gerd Hoffmann | uint8_t bmAttributes_1; |
82 | 2077469b | Gerd Hoffmann | uint8_t bmAttributes_2; |
83 | 2077469b | Gerd Hoffmann | uint8_t bmAttributes_3; |
84 | 2077469b | Gerd Hoffmann | uint8_t bmAttributes_4; |
85 | 2077469b | Gerd Hoffmann | } usb2_ext; |
86 | 2077469b | Gerd Hoffmann | struct {
|
87 | 2077469b | Gerd Hoffmann | uint8_t bmAttributes; |
88 | 2077469b | Gerd Hoffmann | uint8_t wSpeedsSupported_lo; |
89 | 2077469b | Gerd Hoffmann | uint8_t wSpeedsSupported_hi; |
90 | 2077469b | Gerd Hoffmann | uint8_t bFunctionalitySupport; |
91 | 2077469b | Gerd Hoffmann | uint8_t bU1DevExitLat; |
92 | 2077469b | Gerd Hoffmann | uint8_t wU2DevExitLat_lo; |
93 | 2077469b | Gerd Hoffmann | uint8_t wU2DevExitLat_hi; |
94 | 2077469b | Gerd Hoffmann | } super; |
95 | 2077469b | Gerd Hoffmann | } u; |
96 | 2077469b | Gerd Hoffmann | } cap; |
97 | d3f904ea | Gerd Hoffmann | } u; |
98 | d3f904ea | Gerd Hoffmann | } QEMU_PACKED USBDescriptor; |
99 | d3f904ea | Gerd Hoffmann | |
100 | 37fb59d3 | Gerd Hoffmann | struct USBDescID {
|
101 | 37fb59d3 | Gerd Hoffmann | uint16_t idVendor; |
102 | 37fb59d3 | Gerd Hoffmann | uint16_t idProduct; |
103 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdDevice; |
104 | 37fb59d3 | Gerd Hoffmann | uint8_t iManufacturer; |
105 | 37fb59d3 | Gerd Hoffmann | uint8_t iProduct; |
106 | 37fb59d3 | Gerd Hoffmann | uint8_t iSerialNumber; |
107 | 37fb59d3 | Gerd Hoffmann | }; |
108 | 37fb59d3 | Gerd Hoffmann | |
109 | 37fb59d3 | Gerd Hoffmann | struct USBDescDevice {
|
110 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdUSB; |
111 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceClass; |
112 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceSubClass; |
113 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceProtocol; |
114 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPacketSize0; |
115 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumConfigurations; |
116 | 37fb59d3 | Gerd Hoffmann | |
117 | 37fb59d3 | Gerd Hoffmann | const USBDescConfig *confs;
|
118 | 37fb59d3 | Gerd Hoffmann | }; |
119 | 37fb59d3 | Gerd Hoffmann | |
120 | 37fb59d3 | Gerd Hoffmann | struct USBDescConfig {
|
121 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumInterfaces; |
122 | 37fb59d3 | Gerd Hoffmann | uint8_t bConfigurationValue; |
123 | 37fb59d3 | Gerd Hoffmann | uint8_t iConfiguration; |
124 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
125 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPower; |
126 | 37fb59d3 | Gerd Hoffmann | |
127 | 6e625fc7 | Brad Hards | /* grouped interfaces */
|
128 | 6e625fc7 | Brad Hards | uint8_t nif_groups; |
129 | 6e625fc7 | Brad Hards | const USBDescIfaceAssoc *if_groups;
|
130 | 6e625fc7 | Brad Hards | |
131 | 6e625fc7 | Brad Hards | /* "normal" interfaces */
|
132 | 6e625fc7 | Brad Hards | uint8_t nif; |
133 | 6e625fc7 | Brad Hards | const USBDescIface *ifs;
|
134 | 6e625fc7 | Brad Hards | }; |
135 | 6e625fc7 | Brad Hards | |
136 | 6e625fc7 | Brad Hards | /* conceptually an Interface Association Descriptor, and releated interfaces */
|
137 | 6e625fc7 | Brad Hards | struct USBDescIfaceAssoc {
|
138 | 6e625fc7 | Brad Hards | uint8_t bFirstInterface; |
139 | 6e625fc7 | Brad Hards | uint8_t bInterfaceCount; |
140 | 6e625fc7 | Brad Hards | uint8_t bFunctionClass; |
141 | 6e625fc7 | Brad Hards | uint8_t bFunctionSubClass; |
142 | 6e625fc7 | Brad Hards | uint8_t bFunctionProtocol; |
143 | 6e625fc7 | Brad Hards | uint8_t iFunction; |
144 | 6e625fc7 | Brad Hards | |
145 | 37fb59d3 | Gerd Hoffmann | uint8_t nif; |
146 | 37fb59d3 | Gerd Hoffmann | const USBDescIface *ifs;
|
147 | 37fb59d3 | Gerd Hoffmann | }; |
148 | 37fb59d3 | Gerd Hoffmann | |
149 | 37fb59d3 | Gerd Hoffmann | struct USBDescIface {
|
150 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceNumber; |
151 | 37fb59d3 | Gerd Hoffmann | uint8_t bAlternateSetting; |
152 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumEndpoints; |
153 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceClass; |
154 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceSubClass; |
155 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceProtocol; |
156 | 37fb59d3 | Gerd Hoffmann | uint8_t iInterface; |
157 | 37fb59d3 | Gerd Hoffmann | |
158 | 37fb59d3 | Gerd Hoffmann | uint8_t ndesc; |
159 | 37fb59d3 | Gerd Hoffmann | USBDescOther *descs; |
160 | 37fb59d3 | Gerd Hoffmann | USBDescEndpoint *eps; |
161 | 37fb59d3 | Gerd Hoffmann | }; |
162 | 37fb59d3 | Gerd Hoffmann | |
163 | 37fb59d3 | Gerd Hoffmann | struct USBDescEndpoint {
|
164 | 37fb59d3 | Gerd Hoffmann | uint8_t bEndpointAddress; |
165 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
166 | 37fb59d3 | Gerd Hoffmann | uint16_t wMaxPacketSize; |
167 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterval; |
168 | cc5f1395 | Gerd Hoffmann | uint8_t bRefresh; |
169 | cc5f1395 | Gerd Hoffmann | uint8_t bSynchAddress; |
170 | cc5f1395 | Gerd Hoffmann | |
171 | cc5f1395 | Gerd Hoffmann | uint8_t is_audio; /* has bRefresh + bSynchAddress */
|
172 | cc5f1395 | Gerd Hoffmann | uint8_t *extra; |
173 | b43a2851 | Gerd Hoffmann | |
174 | b43a2851 | Gerd Hoffmann | /* superspeed endpoint companion */
|
175 | b43a2851 | Gerd Hoffmann | uint8_t bMaxBurst; |
176 | b43a2851 | Gerd Hoffmann | uint8_t bmAttributes_super; |
177 | b43a2851 | Gerd Hoffmann | uint16_t wBytesPerInterval; |
178 | 37fb59d3 | Gerd Hoffmann | }; |
179 | 37fb59d3 | Gerd Hoffmann | |
180 | 37fb59d3 | Gerd Hoffmann | struct USBDescOther {
|
181 | 37fb59d3 | Gerd Hoffmann | uint8_t length; |
182 | 97237e0a | Gerd Hoffmann | const uint8_t *data;
|
183 | 37fb59d3 | Gerd Hoffmann | }; |
184 | 37fb59d3 | Gerd Hoffmann | |
185 | 37fb59d3 | Gerd Hoffmann | typedef const char *USBDescStrings[256]; |
186 | 37fb59d3 | Gerd Hoffmann | |
187 | 37fb59d3 | Gerd Hoffmann | struct USBDesc {
|
188 | 37fb59d3 | Gerd Hoffmann | USBDescID id; |
189 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *full;
|
190 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *high;
|
191 | 6d51b2bb | Gerd Hoffmann | const USBDescDevice *super;
|
192 | 37fb59d3 | Gerd Hoffmann | const char* const *str; |
193 | 37fb59d3 | Gerd Hoffmann | }; |
194 | 37fb59d3 | Gerd Hoffmann | |
195 | b43a2851 | Gerd Hoffmann | #define USB_DESC_FLAG_SUPER (1 << 1) |
196 | b43a2851 | Gerd Hoffmann | |
197 | 37fb59d3 | Gerd Hoffmann | /* generate usb packages from structs */
|
198 | 37fb59d3 | Gerd Hoffmann | int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, |
199 | 37fb59d3 | Gerd Hoffmann | uint8_t *dest, size_t len); |
200 | 25620cba | Gerd Hoffmann | int usb_desc_device_qualifier(const USBDescDevice *dev, |
201 | 25620cba | Gerd Hoffmann | uint8_t *dest, size_t len); |
202 | b43a2851 | Gerd Hoffmann | int usb_desc_config(const USBDescConfig *conf, int flags, |
203 | b43a2851 | Gerd Hoffmann | uint8_t *dest, size_t len); |
204 | b43a2851 | Gerd Hoffmann | int usb_desc_iface_group(const USBDescIfaceAssoc *iad, int flags, |
205 | b43a2851 | Gerd Hoffmann | uint8_t *dest, size_t len); |
206 | b43a2851 | Gerd Hoffmann | int usb_desc_iface(const USBDescIface *iface, int flags, |
207 | b43a2851 | Gerd Hoffmann | uint8_t *dest, size_t len); |
208 | b43a2851 | Gerd Hoffmann | int usb_desc_endpoint(const USBDescEndpoint *ep, int flags, |
209 | b43a2851 | Gerd Hoffmann | uint8_t *dest, size_t len); |
210 | 37fb59d3 | Gerd Hoffmann | int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); |
211 | 37fb59d3 | Gerd Hoffmann | |
212 | 37fb59d3 | Gerd Hoffmann | /* control message emulation helpers */
|
213 | a980a065 | Gerd Hoffmann | void usb_desc_init(USBDevice *dev);
|
214 | 32d41919 | Gerd Hoffmann | void usb_desc_attach(USBDevice *dev);
|
215 | 132a3f55 | Gerd Hoffmann | void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str); |
216 | 9d55d1ad | Gerd Hoffmann | void usb_desc_create_serial(USBDevice *dev);
|
217 | 132a3f55 | Gerd Hoffmann | const char *usb_desc_get_string(USBDevice *dev, uint8_t index); |
218 | 132a3f55 | Gerd Hoffmann | int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len); |
219 | 9a77a0f5 | Hans de Goede | int usb_desc_get_descriptor(USBDevice *dev, USBPacket *p,
|
220 | 9a77a0f5 | Hans de Goede | int value, uint8_t *dest, size_t len);
|
221 | 007fd62f | Hans de Goede | int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
|
222 | 007fd62f | Hans de Goede | int request, int value, int index, int length, uint8_t *data); |
223 | 37fb59d3 | Gerd Hoffmann | |
224 | 37fb59d3 | Gerd Hoffmann | #endif /* QEMU_HW_USB_DESC_H */ |