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