root / hw / usb-desc.h @ 8656954a
History | View | Annotate | Download (3.8 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 | 37fb59d3 | Gerd Hoffmann | struct USBDescID {
|
7 | 37fb59d3 | Gerd Hoffmann | uint16_t idVendor; |
8 | 37fb59d3 | Gerd Hoffmann | uint16_t idProduct; |
9 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdDevice; |
10 | 37fb59d3 | Gerd Hoffmann | uint8_t iManufacturer; |
11 | 37fb59d3 | Gerd Hoffmann | uint8_t iProduct; |
12 | 37fb59d3 | Gerd Hoffmann | uint8_t iSerialNumber; |
13 | 37fb59d3 | Gerd Hoffmann | }; |
14 | 37fb59d3 | Gerd Hoffmann | |
15 | 37fb59d3 | Gerd Hoffmann | struct USBDescDevice {
|
16 | 37fb59d3 | Gerd Hoffmann | uint16_t bcdUSB; |
17 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceClass; |
18 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceSubClass; |
19 | 37fb59d3 | Gerd Hoffmann | uint8_t bDeviceProtocol; |
20 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPacketSize0; |
21 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumConfigurations; |
22 | 37fb59d3 | Gerd Hoffmann | |
23 | 37fb59d3 | Gerd Hoffmann | const USBDescConfig *confs;
|
24 | 37fb59d3 | Gerd Hoffmann | }; |
25 | 37fb59d3 | Gerd Hoffmann | |
26 | 37fb59d3 | Gerd Hoffmann | struct USBDescConfig {
|
27 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumInterfaces; |
28 | 37fb59d3 | Gerd Hoffmann | uint8_t bConfigurationValue; |
29 | 37fb59d3 | Gerd Hoffmann | uint8_t iConfiguration; |
30 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
31 | 37fb59d3 | Gerd Hoffmann | uint8_t bMaxPower; |
32 | 37fb59d3 | Gerd Hoffmann | |
33 | 6e625fc7 | Brad Hards | /* grouped interfaces */
|
34 | 6e625fc7 | Brad Hards | uint8_t nif_groups; |
35 | 6e625fc7 | Brad Hards | const USBDescIfaceAssoc *if_groups;
|
36 | 6e625fc7 | Brad Hards | |
37 | 6e625fc7 | Brad Hards | /* "normal" interfaces */
|
38 | 6e625fc7 | Brad Hards | uint8_t nif; |
39 | 6e625fc7 | Brad Hards | const USBDescIface *ifs;
|
40 | 6e625fc7 | Brad Hards | }; |
41 | 6e625fc7 | Brad Hards | |
42 | 6e625fc7 | Brad Hards | /* conceptually an Interface Association Descriptor, and releated interfaces */
|
43 | 6e625fc7 | Brad Hards | struct USBDescIfaceAssoc {
|
44 | 6e625fc7 | Brad Hards | uint8_t bFirstInterface; |
45 | 6e625fc7 | Brad Hards | uint8_t bInterfaceCount; |
46 | 6e625fc7 | Brad Hards | uint8_t bFunctionClass; |
47 | 6e625fc7 | Brad Hards | uint8_t bFunctionSubClass; |
48 | 6e625fc7 | Brad Hards | uint8_t bFunctionProtocol; |
49 | 6e625fc7 | Brad Hards | uint8_t iFunction; |
50 | 6e625fc7 | Brad Hards | |
51 | 37fb59d3 | Gerd Hoffmann | uint8_t nif; |
52 | 37fb59d3 | Gerd Hoffmann | const USBDescIface *ifs;
|
53 | 37fb59d3 | Gerd Hoffmann | }; |
54 | 37fb59d3 | Gerd Hoffmann | |
55 | 37fb59d3 | Gerd Hoffmann | struct USBDescIface {
|
56 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceNumber; |
57 | 37fb59d3 | Gerd Hoffmann | uint8_t bAlternateSetting; |
58 | 37fb59d3 | Gerd Hoffmann | uint8_t bNumEndpoints; |
59 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceClass; |
60 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceSubClass; |
61 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterfaceProtocol; |
62 | 37fb59d3 | Gerd Hoffmann | uint8_t iInterface; |
63 | 37fb59d3 | Gerd Hoffmann | |
64 | 37fb59d3 | Gerd Hoffmann | uint8_t ndesc; |
65 | 37fb59d3 | Gerd Hoffmann | USBDescOther *descs; |
66 | 37fb59d3 | Gerd Hoffmann | USBDescEndpoint *eps; |
67 | 37fb59d3 | Gerd Hoffmann | }; |
68 | 37fb59d3 | Gerd Hoffmann | |
69 | 37fb59d3 | Gerd Hoffmann | struct USBDescEndpoint {
|
70 | 37fb59d3 | Gerd Hoffmann | uint8_t bEndpointAddress; |
71 | 37fb59d3 | Gerd Hoffmann | uint8_t bmAttributes; |
72 | 37fb59d3 | Gerd Hoffmann | uint16_t wMaxPacketSize; |
73 | 37fb59d3 | Gerd Hoffmann | uint8_t bInterval; |
74 | 37fb59d3 | Gerd Hoffmann | }; |
75 | 37fb59d3 | Gerd Hoffmann | |
76 | 37fb59d3 | Gerd Hoffmann | struct USBDescOther {
|
77 | 37fb59d3 | Gerd Hoffmann | uint8_t length; |
78 | 37fb59d3 | Gerd Hoffmann | uint8_t *data; |
79 | 37fb59d3 | Gerd Hoffmann | }; |
80 | 37fb59d3 | Gerd Hoffmann | |
81 | 37fb59d3 | Gerd Hoffmann | typedef const char *USBDescStrings[256]; |
82 | 37fb59d3 | Gerd Hoffmann | |
83 | 37fb59d3 | Gerd Hoffmann | struct USBDesc {
|
84 | 37fb59d3 | Gerd Hoffmann | USBDescID id; |
85 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *full;
|
86 | 37fb59d3 | Gerd Hoffmann | const USBDescDevice *high;
|
87 | 37fb59d3 | Gerd Hoffmann | const char* const *str; |
88 | 37fb59d3 | Gerd Hoffmann | }; |
89 | 37fb59d3 | Gerd Hoffmann | |
90 | 37fb59d3 | Gerd Hoffmann | /* generate usb packages from structs */
|
91 | 37fb59d3 | Gerd Hoffmann | int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, |
92 | 37fb59d3 | Gerd Hoffmann | uint8_t *dest, size_t len); |
93 | 25620cba | Gerd Hoffmann | int usb_desc_device_qualifier(const USBDescDevice *dev, |
94 | 25620cba | Gerd Hoffmann | uint8_t *dest, size_t len); |
95 | 37fb59d3 | Gerd Hoffmann | int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len); |
96 | 6e625fc7 | Brad Hards | int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, |
97 | 6e625fc7 | Brad Hards | size_t len); |
98 | 37fb59d3 | Gerd Hoffmann | int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len); |
99 | 37fb59d3 | Gerd Hoffmann | int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len); |
100 | 37fb59d3 | Gerd Hoffmann | int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); |
101 | 37fb59d3 | Gerd Hoffmann | |
102 | 37fb59d3 | Gerd Hoffmann | /* control message emulation helpers */
|
103 | a980a065 | Gerd Hoffmann | void usb_desc_init(USBDevice *dev);
|
104 | 32d41919 | Gerd Hoffmann | void usb_desc_attach(USBDevice *dev);
|
105 | 132a3f55 | Gerd Hoffmann | void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str); |
106 | 132a3f55 | Gerd Hoffmann | const char *usb_desc_get_string(USBDevice *dev, uint8_t index); |
107 | 132a3f55 | Gerd Hoffmann | int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len); |
108 | 37fb59d3 | Gerd Hoffmann | int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len); |
109 | 37fb59d3 | Gerd Hoffmann | int usb_desc_handle_control(USBDevice *dev, int request, int value, |
110 | 37fb59d3 | Gerd Hoffmann | int index, int length, uint8_t *data); |
111 | 37fb59d3 | Gerd Hoffmann | |
112 | 37fb59d3 | Gerd Hoffmann | #endif /* QEMU_HW_USB_DESC_H */ |