usb-desc.h 3.8 KB

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