Initialize
[sdk/emulator/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 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     uint8_t                   nif;
34     const USBDescIface        *ifs;
35 };
36
37 struct USBDescIface {
38     uint8_t                   bInterfaceNumber;
39     uint8_t                   bAlternateSetting;
40     uint8_t                   bNumEndpoints;
41     uint8_t                   bInterfaceClass;
42     uint8_t                   bInterfaceSubClass;
43     uint8_t                   bInterfaceProtocol;
44     uint8_t                   iInterface;
45
46     uint8_t                   ndesc;
47     USBDescOther              *descs;
48     USBDescEndpoint           *eps;
49 };
50
51 struct USBDescEndpoint {
52     uint8_t                   bEndpointAddress;
53     uint8_t                   bmAttributes;
54     uint16_t                  wMaxPacketSize;
55     uint8_t                   bInterval;
56 };
57
58 struct USBDescOther {
59     uint8_t                   length;
60     uint8_t                   *data;
61 };
62
63 typedef const char *USBDescStrings[256];
64
65 struct USBDesc {
66     USBDescID                 id;
67     const USBDescDevice       *full;
68     const USBDescDevice       *high;
69     const char* const         *str;
70 };
71
72 /* generate usb packages from structs */
73 int usb_desc_device(const USBDescID *id, const USBDescDevice *dev,
74                     uint8_t *dest, size_t len);
75 int usb_desc_device_qualifier(const USBDescDevice *dev,
76                               uint8_t *dest, size_t len);
77 int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len);
78 int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len);
79 int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len);
80 int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len);
81
82 /* control message emulation helpers */
83 void usb_desc_init(USBDevice *dev);
84 void usb_desc_attach(USBDevice *dev);
85 void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
86 const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
87 int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
88 int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len);
89 int usb_desc_handle_control(USBDevice *dev, int request, int value,
90                             int index, int length, uint8_t *data);
91
92 #endif /* QEMU_HW_USB_DESC_H */