1 #ifndef QEMU_HW_USB_DESC_H
2 #define QEMU_HW_USB_DESC_H
7 /* binary representation */
8 typedef struct USBDescriptor {
10 uint8_t bDescriptorType;
16 uint8_t bDeviceSubClass;
17 uint8_t bDeviceProtocol;
18 uint8_t bMaxPacketSize0;
25 uint8_t iManufacturer;
27 uint8_t iSerialNumber;
28 uint8_t bNumConfigurations;
34 uint8_t bDeviceSubClass;
35 uint8_t bDeviceProtocol;
36 uint8_t bMaxPacketSize0;
37 uint8_t bNumConfigurations;
41 uint8_t wTotalLength_lo;
42 uint8_t wTotalLength_hi;
43 uint8_t bNumInterfaces;
44 uint8_t bConfigurationValue;
45 uint8_t iConfiguration;
50 uint8_t bInterfaceNumber;
51 uint8_t bAlternateSetting;
52 uint8_t bNumEndpoints;
53 uint8_t bInterfaceClass;
54 uint8_t bInterfaceSubClass;
55 uint8_t bInterfaceProtocol;
59 uint8_t bEndpointAddress;
61 uint8_t wMaxPacketSize_lo;
62 uint8_t wMaxPacketSize_hi;
64 uint8_t bRefresh; /* only audio ep */
65 uint8_t bSynchAddress; /* only audio ep */
70 uint8_t wBytesPerInterval_lo;
71 uint8_t wBytesPerInterval_hi;
74 uint8_t wTotalLength_lo;
75 uint8_t wTotalLength_hi;
76 uint8_t bNumDeviceCaps;
79 uint8_t bDevCapabilityType;
82 uint8_t bmAttributes_1;
83 uint8_t bmAttributes_2;
84 uint8_t bmAttributes_3;
85 uint8_t bmAttributes_4;
89 uint8_t wSpeedsSupported_lo;
90 uint8_t wSpeedsSupported_hi;
91 uint8_t bFunctionalitySupport;
92 uint8_t bU1DevExitLat;
93 uint8_t wU2DevExitLat_lo;
94 uint8_t wU2DevExitLat_hi;
99 } QEMU_PACKED USBDescriptor;
105 uint8_t iManufacturer;
107 uint8_t iSerialNumber;
110 struct USBDescDevice {
112 uint8_t bDeviceClass;
113 uint8_t bDeviceSubClass;
114 uint8_t bDeviceProtocol;
115 uint8_t bMaxPacketSize0;
116 uint8_t bNumConfigurations;
118 const USBDescConfig *confs;
121 struct USBDescConfig {
122 uint8_t bNumInterfaces;
123 uint8_t bConfigurationValue;
124 uint8_t iConfiguration;
125 uint8_t bmAttributes;
128 /* grouped interfaces */
130 const USBDescIfaceAssoc *if_groups;
132 /* "normal" interfaces */
134 const USBDescIface *ifs;
137 /* conceptually an Interface Association Descriptor, and releated interfaces */
138 struct USBDescIfaceAssoc {
139 uint8_t bFirstInterface;
140 uint8_t bInterfaceCount;
141 uint8_t bFunctionClass;
142 uint8_t bFunctionSubClass;
143 uint8_t bFunctionProtocol;
147 const USBDescIface *ifs;
150 struct USBDescIface {
151 uint8_t bInterfaceNumber;
152 uint8_t bAlternateSetting;
153 uint8_t bNumEndpoints;
154 uint8_t bInterfaceClass;
155 uint8_t bInterfaceSubClass;
156 uint8_t bInterfaceProtocol;
161 USBDescEndpoint *eps;
164 struct USBDescEndpoint {
165 uint8_t bEndpointAddress;
166 uint8_t bmAttributes;
167 uint16_t wMaxPacketSize;
170 uint8_t bSynchAddress;
172 uint8_t is_audio; /* has bRefresh + bSynchAddress */
175 /* superspeed endpoint companion */
177 uint8_t bmAttributes_super;
178 uint16_t wBytesPerInterval;
181 struct USBDescOther {
187 const char *CompatibleID;
188 const wchar_t *Label;
189 bool SelectiveSuspendEnabled;
192 typedef const char *USBDescStrings[256];
196 const USBDescDevice *full;
197 const USBDescDevice *high;
198 const USBDescDevice *super;
199 const char* const *str;
200 const USBDescMSOS *msos;
203 #define USB_DESC_FLAG_SUPER (1 << 1)
206 static inline uint8_t usb_lo(uint16_t val)
211 static inline uint8_t usb_hi(uint16_t val)
213 return (val >> 8) & 0xff;
216 /* generate usb packages from structs */
217 int usb_desc_device(const USBDescID *id, const USBDescDevice *dev,
218 bool msos, uint8_t *dest, size_t len);
219 int usb_desc_device_qualifier(const USBDescDevice *dev,
220 uint8_t *dest, size_t len);
221 int usb_desc_config(const USBDescConfig *conf, int flags,
222 uint8_t *dest, size_t len);
223 int usb_desc_iface_group(const USBDescIfaceAssoc *iad, int flags,
224 uint8_t *dest, size_t len);
225 int usb_desc_iface(const USBDescIface *iface, int flags,
226 uint8_t *dest, size_t len);
227 int usb_desc_endpoint(const USBDescEndpoint *ep, int flags,
228 uint8_t *dest, size_t len);
229 int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
230 int usb_desc_msos(const USBDesc *desc, USBPacket *p,
231 int index, uint8_t *dest, size_t len);
233 /* control message emulation helpers */
234 void usb_desc_init(USBDevice *dev);
235 void usb_desc_attach(USBDevice *dev);
236 void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
237 void usb_desc_create_serial(USBDevice *dev);
238 const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
239 int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
240 int usb_desc_get_descriptor(USBDevice *dev, USBPacket *p,
241 int value, uint8_t *dest, size_t len);
242 int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
243 int request, int value, int index, int length, uint8_t *data);
245 #endif /* QEMU_HW_USB_DESC_H */