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 struct { 30 uint8_t bcdUSB_lo; 31 uint8_t bcdUSB_hi; 32 uint8_t bDeviceClass; 33 uint8_t bDeviceSubClass; 34 uint8_t bDeviceProtocol; 35 uint8_t bMaxPacketSize0; 36 uint8_t bNumConfigurations; 37 uint8_t bReserved; 38 } device_qualifier; 39 struct { 40 uint8_t wTotalLength_lo; 41 uint8_t wTotalLength_hi; 42 uint8_t bNumInterfaces; 43 uint8_t bConfigurationValue; 44 uint8_t iConfiguration; 45 uint8_t bmAttributes; 46 uint8_t bMaxPower; 47 } config; 48 struct { 49 uint8_t bInterfaceNumber; 50 uint8_t bAlternateSetting; 51 uint8_t bNumEndpoints; 52 uint8_t bInterfaceClass; 53 uint8_t bInterfaceSubClass; 54 uint8_t bInterfaceProtocol; 55 uint8_t iInterface; 56 } interface; 57 struct { 58 uint8_t bEndpointAddress; 59 uint8_t bmAttributes; 60 uint8_t wMaxPacketSize_lo; 61 uint8_t wMaxPacketSize_hi; 62 uint8_t bInterval; 63 uint8_t bRefresh; /* only audio ep */ 64 uint8_t bSynchAddress; /* only audio ep */ 65 } endpoint; 66 struct { 67 uint8_t bMaxBurst; 68 uint8_t bmAttributes; 69 uint8_t wBytesPerInterval_lo; 70 uint8_t wBytesPerInterval_hi; 71 } super_endpoint; 72 } u; 73 } QEMU_PACKED USBDescriptor; 74 75 struct USBDescID { 76 uint16_t idVendor; 77 uint16_t idProduct; 78 uint16_t bcdDevice; 79 uint8_t iManufacturer; 80 uint8_t iProduct; 81 uint8_t iSerialNumber; 82 }; 83 84 struct USBDescDevice { 85 uint16_t bcdUSB; 86 uint8_t bDeviceClass; 87 uint8_t bDeviceSubClass; 88 uint8_t bDeviceProtocol; 89 uint8_t bMaxPacketSize0; 90 uint8_t bNumConfigurations; 91 92 const USBDescConfig *confs; 93 }; 94 95 struct USBDescConfig { 96 uint8_t bNumInterfaces; 97 uint8_t bConfigurationValue; 98 uint8_t iConfiguration; 99 uint8_t bmAttributes; 100 uint8_t bMaxPower; 101 102 /* grouped interfaces */ 103 uint8_t nif_groups; 104 const USBDescIfaceAssoc *if_groups; 105 106 /* "normal" interfaces */ 107 uint8_t nif; 108 const USBDescIface *ifs; 109 }; 110 111 /* conceptually an Interface Association Descriptor, and releated interfaces */ 112 struct USBDescIfaceAssoc { 113 uint8_t bFirstInterface; 114 uint8_t bInterfaceCount; 115 uint8_t bFunctionClass; 116 uint8_t bFunctionSubClass; 117 uint8_t bFunctionProtocol; 118 uint8_t iFunction; 119 120 uint8_t nif; 121 const USBDescIface *ifs; 122 }; 123 124 struct USBDescIface { 125 uint8_t bInterfaceNumber; 126 uint8_t bAlternateSetting; 127 uint8_t bNumEndpoints; 128 uint8_t bInterfaceClass; 129 uint8_t bInterfaceSubClass; 130 uint8_t bInterfaceProtocol; 131 uint8_t iInterface; 132 133 uint8_t ndesc; 134 USBDescOther *descs; 135 USBDescEndpoint *eps; 136 }; 137 138 struct USBDescEndpoint { 139 uint8_t bEndpointAddress; 140 uint8_t bmAttributes; 141 uint16_t wMaxPacketSize; 142 uint8_t bInterval; 143 uint8_t bRefresh; 144 uint8_t bSynchAddress; 145 146 uint8_t is_audio; /* has bRefresh + bSynchAddress */ 147 uint8_t *extra; 148 149 /* superspeed endpoint companion */ 150 uint8_t bMaxBurst; 151 uint8_t bmAttributes_super; 152 uint16_t wBytesPerInterval; 153 }; 154 155 struct USBDescOther { 156 uint8_t length; 157 const uint8_t *data; 158 }; 159 160 typedef const char *USBDescStrings[256]; 161 162 struct USBDesc { 163 USBDescID id; 164 const USBDescDevice *full; 165 const USBDescDevice *high; 166 const USBDescDevice *super; 167 const char* const *str; 168 }; 169 170 #define USB_DESC_FLAG_SUPER (1 << 1) 171 172 /* generate usb packages from structs */ 173 int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, 174 uint8_t *dest, size_t len); 175 int usb_desc_device_qualifier(const USBDescDevice *dev, 176 uint8_t *dest, size_t len); 177 int usb_desc_config(const USBDescConfig *conf, int flags, 178 uint8_t *dest, size_t len); 179 int usb_desc_iface_group(const USBDescIfaceAssoc *iad, int flags, 180 uint8_t *dest, size_t len); 181 int usb_desc_iface(const USBDescIface *iface, int flags, 182 uint8_t *dest, size_t len); 183 int usb_desc_endpoint(const USBDescEndpoint *ep, int flags, 184 uint8_t *dest, size_t len); 185 int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); 186 187 /* control message emulation helpers */ 188 void usb_desc_init(USBDevice *dev); 189 void usb_desc_attach(USBDevice *dev); 190 void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str); 191 void usb_desc_create_serial(USBDevice *dev); 192 const char *usb_desc_get_string(USBDevice *dev, uint8_t index); 193 int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len); 194 int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len); 195 int usb_desc_handle_control(USBDevice *dev, USBPacket *p, 196 int request, int value, int index, int length, uint8_t *data); 197 198 #endif /* QEMU_HW_USB_DESC_H */ 199