]> git.proxmox.com Git - mirror_qemu.git/blob - hw/usb/desc.h
usb: add USBDescriptor, use for device descriptors.
[mirror_qemu.git] / hw / usb / desc.h
1 #ifndef QEMU_HW_USB_DESC_H
2 #define QEMU_HW_USB_DESC_H
3
4 #include <inttypes.h>
5
6 /* binary representation */
7 typedef struct USBDescriptor {
8 uint8_t bLength;
9 uint8_t bDescriptorType;
10 union {
11 struct {
12 uint8_t bcdUSB_lo;
13 uint8_t bcdUSB_hi;
14 uint8_t bDeviceClass;
15 uint8_t bDeviceSubClass;
16 uint8_t bDeviceProtocol;
17 uint8_t bMaxPacketSize0;
18 uint8_t idVendor_lo;
19 uint8_t idVendor_hi;
20 uint8_t idProduct_lo;
21 uint8_t idProduct_hi;
22 uint8_t bcdDevice_lo;
23 uint8_t bcdDevice_hi;
24 uint8_t iManufacturer;
25 uint8_t iProduct;
26 uint8_t iSerialNumber;
27 uint8_t bNumConfigurations;
28 } device;
29 } u;
30 } QEMU_PACKED USBDescriptor;
31
32 struct USBDescID {
33 uint16_t idVendor;
34 uint16_t idProduct;
35 uint16_t bcdDevice;
36 uint8_t iManufacturer;
37 uint8_t iProduct;
38 uint8_t iSerialNumber;
39 };
40
41 struct USBDescDevice {
42 uint16_t bcdUSB;
43 uint8_t bDeviceClass;
44 uint8_t bDeviceSubClass;
45 uint8_t bDeviceProtocol;
46 uint8_t bMaxPacketSize0;
47 uint8_t bNumConfigurations;
48
49 const USBDescConfig *confs;
50 };
51
52 struct USBDescConfig {
53 uint8_t bNumInterfaces;
54 uint8_t bConfigurationValue;
55 uint8_t iConfiguration;
56 uint8_t bmAttributes;
57 uint8_t bMaxPower;
58
59 /* grouped interfaces */
60 uint8_t nif_groups;
61 const USBDescIfaceAssoc *if_groups;
62
63 /* "normal" interfaces */
64 uint8_t nif;
65 const USBDescIface *ifs;
66 };
67
68 /* conceptually an Interface Association Descriptor, and releated interfaces */
69 struct USBDescIfaceAssoc {
70 uint8_t bFirstInterface;
71 uint8_t bInterfaceCount;
72 uint8_t bFunctionClass;
73 uint8_t bFunctionSubClass;
74 uint8_t bFunctionProtocol;
75 uint8_t iFunction;
76
77 uint8_t nif;
78 const USBDescIface *ifs;
79 };
80
81 struct USBDescIface {
82 uint8_t bInterfaceNumber;
83 uint8_t bAlternateSetting;
84 uint8_t bNumEndpoints;
85 uint8_t bInterfaceClass;
86 uint8_t bInterfaceSubClass;
87 uint8_t bInterfaceProtocol;
88 uint8_t iInterface;
89
90 uint8_t ndesc;
91 USBDescOther *descs;
92 USBDescEndpoint *eps;
93 };
94
95 struct USBDescEndpoint {
96 uint8_t bEndpointAddress;
97 uint8_t bmAttributes;
98 uint16_t wMaxPacketSize;
99 uint8_t bInterval;
100 uint8_t bRefresh;
101 uint8_t bSynchAddress;
102
103 uint8_t is_audio; /* has bRefresh + bSynchAddress */
104 uint8_t *extra;
105 };
106
107 struct USBDescOther {
108 uint8_t length;
109 const uint8_t *data;
110 };
111
112 typedef const char *USBDescStrings[256];
113
114 struct USBDesc {
115 USBDescID id;
116 const USBDescDevice *full;
117 const USBDescDevice *high;
118 const char* const *str;
119 };
120
121 /* generate usb packages from structs */
122 int usb_desc_device(const USBDescID *id, const USBDescDevice *dev,
123 uint8_t *dest, size_t len);
124 int usb_desc_device_qualifier(const USBDescDevice *dev,
125 uint8_t *dest, size_t len);
126 int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len);
127 int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest,
128 size_t len);
129 int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len);
130 int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len);
131 int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
132
133 /* control message emulation helpers */
134 void usb_desc_init(USBDevice *dev);
135 void usb_desc_attach(USBDevice *dev);
136 void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
137 const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
138 int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
139 int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len);
140 int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
141 int request, int value, int index, int length, uint8_t *data);
142
143 #endif /* QEMU_HW_USB_DESC_H */