usb_descriptors.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_
  5. #define SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_
  6. #include <stdint.h>
  7. #include <map>
  8. #include <memory>
  9. #include <string>
  10. #include <vector>
  11. #include "base/callback_forward.h"
  12. #include "base/memory/ref_counted.h"
  13. #include "services/device/public/mojom/usb_device.mojom.h"
  14. namespace device {
  15. class UsbDeviceHandle;
  16. struct CombinedInterfaceInfo {
  17. CombinedInterfaceInfo() = default;
  18. CombinedInterfaceInfo(const mojom::UsbInterfaceInfo* interface,
  19. const mojom::UsbAlternateInterfaceInfo* alternate);
  20. bool IsValid() const;
  21. const mojom::UsbInterfaceInfo* interface = nullptr;
  22. const mojom::UsbAlternateInterfaceInfo* alternate = nullptr;
  23. };
  24. struct UsbDeviceDescriptor {
  25. UsbDeviceDescriptor();
  26. UsbDeviceDescriptor(const UsbDeviceDescriptor& other) = delete;
  27. ~UsbDeviceDescriptor();
  28. // Parses |buffer| for USB descriptors. Any configuration descriptors found
  29. // will be added to |configurations|. If a device descriptor is found it will
  30. // be used to populate this struct's fields. This function may be called more
  31. // than once (i.e. for multiple buffers containing a configuration descriptor
  32. // each).
  33. bool Parse(base::span<const uint8_t> buffer);
  34. uint8_t i_manufacturer = 0;
  35. uint8_t i_product = 0;
  36. uint8_t i_serial_number = 0;
  37. uint8_t num_configurations = 0;
  38. mojom::UsbDeviceInfoPtr device_info;
  39. };
  40. void ReadUsbDescriptors(
  41. scoped_refptr<UsbDeviceHandle> device_handle,
  42. base::OnceCallback<void(std::unique_ptr<UsbDeviceDescriptor>)> callback);
  43. bool ParseUsbStringDescriptor(const std::vector<uint8_t>& descriptor,
  44. std::u16string* output);
  45. void ReadUsbStringDescriptors(
  46. scoped_refptr<UsbDeviceHandle> device_handle,
  47. std::unique_ptr<std::map<uint8_t, std::u16string>> index_map,
  48. base::OnceCallback<void(std::unique_ptr<std::map<uint8_t, std::u16string>>)>
  49. callback);
  50. mojom::UsbEndpointInfoPtr BuildUsbEndpointInfoPtr(const uint8_t* data);
  51. mojom::UsbEndpointInfoPtr BuildUsbEndpointInfoPtr(uint8_t address,
  52. uint8_t attributes,
  53. uint16_t maximum_packet_size,
  54. uint8_t polling_interval);
  55. mojom::UsbInterfaceInfoPtr BuildUsbInterfaceInfoPtr(const uint8_t* data);
  56. mojom::UsbInterfaceInfoPtr BuildUsbInterfaceInfoPtr(uint8_t interface_number,
  57. uint8_t alternate_setting,
  58. uint8_t interface_class,
  59. uint8_t interface_subclass,
  60. uint8_t interface_protocol);
  61. void AggregateInterfacesForConfig(mojom::UsbConfigurationInfo* config);
  62. CombinedInterfaceInfo FindInterfaceInfoFromConfig(
  63. const mojom::UsbConfigurationInfo* config,
  64. uint8_t interface_number,
  65. uint8_t alternate_setting);
  66. mojom::UsbConfigurationInfoPtr BuildUsbConfigurationInfoPtr(
  67. const uint8_t* data);
  68. mojom::UsbConfigurationInfoPtr BuildUsbConfigurationInfoPtr(
  69. uint8_t configuration_value,
  70. bool self_powered,
  71. bool remote_wakeup,
  72. uint8_t maximum_power);
  73. void AssignFirstInterfaceNumbers(mojom::UsbConfigurationInfo* config);
  74. } // namespace device
  75. #endif // SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_