root / hw / usb / desc.h @ 8e9f18b6
History | View | Annotate | Download (6.4 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 | d3f904ea | Gerd Hoffmann | } u; |
67 | d3f904ea | Gerd Hoffmann | } QEMU_PACKED USBDescriptor; |
68 | d3f904ea | Gerd Hoffmann | |
69 | 37fb59d3 | Gerd Hoffmann | struct USBDescID {
|
70 | 37fb59d3 | Gerd Hoffmann | uint16_t idVendor; |
71 | 37fb59d3 | Gerd Hoffmann | uint16_t idProduct; |
72 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdDevice; |
73 | 37fb59d3 | Gerd Hoffmann | uint8_t iManufacturer; |
74 | 37fb59d3 | Gerd Hoffmann | uint8_t iProduct; |
75 | 37fb59d3 | Gerd Hoffmann | uint8_t iSerialNumber; |
76 | 37fb59d3 | Gerd Hoffmann | }; |
77 | 37fb59d3 | Gerd Hoffmann | |
78 | 37fb59d3 | Gerd Hoffmann | struct USBDescDevice {
|
79 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdUSB; |
80 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceClass; |
81 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceSubClass; |
82 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceProtocol; |
83 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPacketSize0; |
84 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumConfigurations; |
85 | 37fb59d3 | Gerd Hoffmann | |
86 | 37fb59d3 | Gerd Hoffmann | const USBDescConfig *confs;
|
87 | 37fb59d3 | Gerd Hoffmann | }; |
88 | 37fb59d3 | Gerd Hoffmann | |
89 | 37fb59d3 | Gerd Hoffmann | struct USBDescConfig {
|
90 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumInterfaces; |
91 | 37fb59d3 | Gerd Hoffmann | uint8_t bConfigurationValue; |
92 | 37fb59d3 | Gerd Hoffmann | uint8_t iConfiguration; |
93 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
94 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPower; |
95 | 37fb59d3 | Gerd Hoffmann | |
96 | 6e625fc7 | Brad Hards | /* grouped interfaces */
|
97 | 6e625fc7 | Brad Hards | uint8_t nif_groups; |
98 | 6e625fc7 | Brad Hards | const USBDescIfaceAssoc *if_groups;
|
99 | 6e625fc7 | Brad Hards | |
100 | 6e625fc7 | Brad Hards | /* "normal" interfaces */
|
101 | 6e625fc7 | Brad Hards | uint8_t nif; |
102 | 6e625fc7 | Brad Hards | const USBDescIface *ifs;
|
103 | 6e625fc7 | Brad Hards | }; |
104 | 6e625fc7 | Brad Hards | |
105 | 6e625fc7 | Brad Hards | /* conceptually an Interface Association Descriptor, and releated interfaces */
|
106 | 6e625fc7 | Brad Hards | struct USBDescIfaceAssoc {
|
107 | 6e625fc7 | Brad Hards | uint8_t bFirstInterface; |
108 | 6e625fc7 | Brad Hards | uint8_t bInterfaceCount; |
109 | 6e625fc7 | Brad Hards | uint8_t bFunctionClass; |
110 | 6e625fc7 | Brad Hards | uint8_t bFunctionSubClass; |
111 | 6e625fc7 | Brad Hards | uint8_t bFunctionProtocol; |
112 | 6e625fc7 | Brad Hards | uint8_t iFunction; |
113 | 6e625fc7 | Brad Hards | |
114 | 37fb59d3 | Gerd Hoffmann | uint8_t nif; |
115 | 37fb59d3 | Gerd Hoffmann | const USBDescIface *ifs;
|
116 | 37fb59d3 | Gerd Hoffmann | }; |
117 | 37fb59d3 | Gerd Hoffmann | |
118 | 37fb59d3 | Gerd Hoffmann | struct USBDescIface {
|
119 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceNumber; |
120 | 37fb59d3 | Gerd Hoffmann | uint8_t bAlternateSetting; |
121 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumEndpoints; |
122 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceClass; |
123 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceSubClass; |
124 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceProtocol; |
125 | 37fb59d3 | Gerd Hoffmann | uint8_t iInterface; |
126 | 37fb59d3 | Gerd Hoffmann | |
127 | 37fb59d3 | Gerd Hoffmann | uint8_t ndesc; |
128 | 37fb59d3 | Gerd Hoffmann | USBDescOther *descs; |
129 | 37fb59d3 | Gerd Hoffmann | USBDescEndpoint *eps; |
130 | 37fb59d3 | Gerd Hoffmann | }; |
131 | 37fb59d3 | Gerd Hoffmann | |
132 | 37fb59d3 | Gerd Hoffmann | struct USBDescEndpoint {
|
133 | 37fb59d3 | Gerd Hoffmann | uint8_t bEndpointAddress; |
134 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
135 | 37fb59d3 | Gerd Hoffmann | uint16_t wMaxPacketSize; |
136 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterval; |
137 | cc5f1395 | Gerd Hoffmann | uint8_t bRefresh; |
138 | cc5f1395 | Gerd Hoffmann | uint8_t bSynchAddress; |
139 | cc5f1395 | Gerd Hoffmann | |
140 | cc5f1395 | Gerd Hoffmann | uint8_t is_audio; /* has bRefresh + bSynchAddress */
|
141 | cc5f1395 | Gerd Hoffmann | uint8_t *extra; |
142 | 37fb59d3 | Gerd Hoffmann | }; |
143 | 37fb59d3 | Gerd Hoffmann | |
144 | 37fb59d3 | Gerd Hoffmann | struct USBDescOther {
|
145 | 37fb59d3 | Gerd Hoffmann | uint8_t length; |
146 | 97237e0a | Gerd Hoffmann | const uint8_t *data;
|
147 | 37fb59d3 | Gerd Hoffmann | }; |
148 | 37fb59d3 | Gerd Hoffmann | |
149 | 37fb59d3 | Gerd Hoffmann | typedef const char *USBDescStrings[256]; |
150 | 37fb59d3 | Gerd Hoffmann | |
151 | 37fb59d3 | Gerd Hoffmann | struct USBDesc {
|
152 | 37fb59d3 | Gerd Hoffmann | USBDescID id; |
153 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *full;
|
154 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *high;
|
155 | 37fb59d3 | Gerd Hoffmann | const char* const *str; |
156 | 37fb59d3 | Gerd Hoffmann | }; |
157 | 37fb59d3 | Gerd Hoffmann | |
158 | 37fb59d3 | Gerd Hoffmann | /* generate usb packages from structs */
|
159 | 37fb59d3 | Gerd Hoffmann | int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, |
160 | 37fb59d3 | Gerd Hoffmann | uint8_t *dest, size_t len); |
161 | 25620cba | Gerd Hoffmann | int usb_desc_device_qualifier(const USBDescDevice *dev, |
162 | 25620cba | Gerd Hoffmann | uint8_t *dest, size_t len); |
163 | 37fb59d3 | Gerd Hoffmann | int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len); |
164 | 6e625fc7 | Brad Hards | int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, |
165 | 6e625fc7 | Brad Hards | size_t len); |
166 | 37fb59d3 | Gerd Hoffmann | int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len); |
167 | 37fb59d3 | Gerd Hoffmann | int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len); |
168 | 37fb59d3 | Gerd Hoffmann | int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); |
169 | 37fb59d3 | Gerd Hoffmann | |
170 | 37fb59d3 | Gerd Hoffmann | /* control message emulation helpers */
|
171 | a980a065 | Gerd Hoffmann | void usb_desc_init(USBDevice *dev);
|
172 | 32d41919 | Gerd Hoffmann | void usb_desc_attach(USBDevice *dev);
|
173 | 132a3f55 | Gerd Hoffmann | void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str); |
174 | 9d55d1ad | Gerd Hoffmann | void usb_desc_create_serial(USBDevice *dev);
|
175 | 132a3f55 | Gerd Hoffmann | const char *usb_desc_get_string(USBDevice *dev, uint8_t index); |
176 | 132a3f55 | Gerd Hoffmann | int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len); |
177 | 37fb59d3 | Gerd Hoffmann | int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len); |
178 | 007fd62f | Hans de Goede | int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
|
179 | 007fd62f | Hans de Goede | int request, int value, int index, int length, uint8_t *data); |
180 | 37fb59d3 | Gerd Hoffmann | |
181 | 37fb59d3 | Gerd Hoffmann | #endif /* QEMU_HW_USB_DESC_H */ |