|
|
1.1 ! root 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: } u; ! 67: } QEMU_PACKED USBDescriptor; ! 68: ! 69: struct USBDescID { ! 70: uint16_t idVendor; ! 71: uint16_t idProduct; ! 72: uint16_t bcdDevice; ! 73: uint8_t iManufacturer; ! 74: uint8_t iProduct; ! 75: uint8_t iSerialNumber; ! 76: }; ! 77: ! 78: struct USBDescDevice { ! 79: uint16_t bcdUSB; ! 80: uint8_t bDeviceClass; ! 81: uint8_t bDeviceSubClass; ! 82: uint8_t bDeviceProtocol; ! 83: uint8_t bMaxPacketSize0; ! 84: uint8_t bNumConfigurations; ! 85: ! 86: const USBDescConfig *confs; ! 87: }; ! 88: ! 89: struct USBDescConfig { ! 90: uint8_t bNumInterfaces; ! 91: uint8_t bConfigurationValue; ! 92: uint8_t iConfiguration; ! 93: uint8_t bmAttributes; ! 94: uint8_t bMaxPower; ! 95: ! 96: /* grouped interfaces */ ! 97: uint8_t nif_groups; ! 98: const USBDescIfaceAssoc *if_groups; ! 99: ! 100: /* "normal" interfaces */ ! 101: uint8_t nif; ! 102: const USBDescIface *ifs; ! 103: }; ! 104: ! 105: /* conceptually an Interface Association Descriptor, and releated interfaces */ ! 106: struct USBDescIfaceAssoc { ! 107: uint8_t bFirstInterface; ! 108: uint8_t bInterfaceCount; ! 109: uint8_t bFunctionClass; ! 110: uint8_t bFunctionSubClass; ! 111: uint8_t bFunctionProtocol; ! 112: uint8_t iFunction; ! 113: ! 114: uint8_t nif; ! 115: const USBDescIface *ifs; ! 116: }; ! 117: ! 118: struct USBDescIface { ! 119: uint8_t bInterfaceNumber; ! 120: uint8_t bAlternateSetting; ! 121: uint8_t bNumEndpoints; ! 122: uint8_t bInterfaceClass; ! 123: uint8_t bInterfaceSubClass; ! 124: uint8_t bInterfaceProtocol; ! 125: uint8_t iInterface; ! 126: ! 127: uint8_t ndesc; ! 128: USBDescOther *descs; ! 129: USBDescEndpoint *eps; ! 130: }; ! 131: ! 132: struct USBDescEndpoint { ! 133: uint8_t bEndpointAddress; ! 134: uint8_t bmAttributes; ! 135: uint16_t wMaxPacketSize; ! 136: uint8_t bInterval; ! 137: uint8_t bRefresh; ! 138: uint8_t bSynchAddress; ! 139: ! 140: uint8_t is_audio; /* has bRefresh + bSynchAddress */ ! 141: uint8_t *extra; ! 142: }; ! 143: ! 144: struct USBDescOther { ! 145: uint8_t length; ! 146: const uint8_t *data; ! 147: }; ! 148: ! 149: typedef const char *USBDescStrings[256]; ! 150: ! 151: struct USBDesc { ! 152: USBDescID id; ! 153: const USBDescDevice *full; ! 154: const USBDescDevice *high; ! 155: const char* const *str; ! 156: }; ! 157: ! 158: /* generate usb packages from structs */ ! 159: int usb_desc_device(const USBDescID *id, const USBDescDevice *dev, ! 160: uint8_t *dest, size_t len); ! 161: int usb_desc_device_qualifier(const USBDescDevice *dev, ! 162: uint8_t *dest, size_t len); ! 163: int usb_desc_config(const USBDescConfig *conf, uint8_t *dest, size_t len); ! 164: int usb_desc_iface_group(const USBDescIfaceAssoc *iad, uint8_t *dest, ! 165: size_t len); ! 166: int usb_desc_iface(const USBDescIface *iface, uint8_t *dest, size_t len); ! 167: int usb_desc_endpoint(const USBDescEndpoint *ep, uint8_t *dest, size_t len); ! 168: int usb_desc_other(const USBDescOther *desc, uint8_t *dest, size_t len); ! 169: ! 170: /* control message emulation helpers */ ! 171: void usb_desc_init(USBDevice *dev); ! 172: void usb_desc_attach(USBDevice *dev); ! 173: void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str); ! 174: void usb_desc_create_serial(USBDevice *dev); ! 175: const char *usb_desc_get_string(USBDevice *dev, uint8_t index); ! 176: int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len); ! 177: int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len); ! 178: int usb_desc_handle_control(USBDevice *dev, USBPacket *p, ! 179: int request, int value, int index, int length, uint8_t *data); ! 180: ! 181: #endif /* QEMU_HW_USB_DESC_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.