89 static constexpr const char* DEFAULT_WINUSB_DEVICE_INTERFACE_GUID =
90 "{4066E5F4-3B02-4B90-9475-12F770A7841B}";
91 static constexpr uint8_t DEFAULT_WINUSB_VENDOR_CODE = 0x20u;
92 enum class WinUsbMsOs20Scope : uint8_t
100 LibXR::USB::WinUsbMsOs20::GUID_MULTI_SZ_UTF16_BYTES>;
103 LibXR::USB::WinUsbMsOs20::GUID_MULTI_SZ_UTF16_BYTES>;
111 const char* interface_string,
const char* webusb_landing_page_url =
nullptr,
112 uint8_t webusb_vendor_code = LibXR::USB::WebUsb::WEBUSB_VENDOR_CODE_DEFAULT,
113 const char* winusb_device_interface_guid = DEFAULT_WINUSB_DEVICE_INTERFACE_GUID,
114 uint8_t winusb_vendor_code = DEFAULT_WINUSB_VENDOR_CODE,
115 WinUsbMsOs20Scope winusb_scope = WinUsbMsOs20Scope::DEVICE)
116 : interface_string_(interface_string),
117 winusb_scope_(winusb_scope),
118 webusb_cap_(webusb_landing_page_url, webusb_vendor_code)
120 InitWinUsbDescriptors(ResolveWinUsbDeviceInterfaceGuid(winusb_device_interface_guid),
126 return (local_interface_index == 0u) ? interface_string_ :
nullptr;
131 return (HasWinUsbBosCapability() ? 1u : 0u) + (webusb_cap_.
Enabled() ? 1u : 0u);
136 if (HasWinUsbBosCapability())
140 return &winusb_msos20_cap_;
142 return (index == 1u && webusb_cap_.
Enabled()) ? &webusb_cap_ :
nullptr;
145 return (index == 0u && webusb_cap_.
Enabled()) ? &webusb_cap_ :
nullptr;
148 uint8_t interface_num_ = 0u;
149 uint8_t current_alt_setting_ = 0u;
150 bool inited_ =
false;
152 void UpdateWinUsbFunctionInterface(uint8_t interface_num,
153 uint8_t configuration_index = 0u)
155 function_winusb_msos20_.SetFirstInterface(interface_num);
156 function_winusb_msos20_.cfg.bConfigurationValue = configuration_index;
157 if (winusb_scope_ == WinUsbMsOs20Scope::FUNCTION)
159 winusb_msos20_cap_.SetDescriptorSet(GetWinUsbMsOs20DescriptorSet());
164 bool HasWinUsbBosCapability()
const {
return winusb_scope_ != WinUsbMsOs20Scope::NONE; }
166 static const char* ResolveWinUsbDeviceInterfaceGuid(
const char* guid)
168 return (guid !=
nullptr && guid[0] !=
'\0') ? guid
169 : DEFAULT_WINUSB_DEVICE_INTERFACE_GUID;
172 ConstRawData GetWinUsbMsOs20DescriptorSet()
const
174 if (winusb_scope_ == WinUsbMsOs20Scope::FUNCTION)
176 return ConstRawData{
reinterpret_cast<const uint8_t*
>(&function_winusb_msos20_),
177 sizeof(function_winusb_msos20_)};
179 if (winusb_scope_ == WinUsbMsOs20Scope::DEVICE)
181 return ConstRawData{
reinterpret_cast<const uint8_t*
>(&device_winusb_msos20_),
182 sizeof(device_winusb_msos20_)};
184 return ConstRawData{
nullptr, 0};
187 void InitWinUsbDescriptors(
const char* guid, uint8_t vendor_code)
189 device_winusb_msos20_.Init(guid);
190 function_winusb_msos20_.Init(0u, 0u, guid);
191 winusb_msos20_cap_.SetVendorCode(vendor_code);
192 winusb_msos20_cap_.SetDescriptorSet(GetWinUsbMsOs20DescriptorSet());
195 const char* interface_string_ =
nullptr;
196 WinUsbMsOs20Scope winusb_scope_ = WinUsbMsOs20Scope::DEVICE;
197 DeviceWinUsbMsOs20DescSet device_winusb_msos20_{};
198 FunctionWinUsbMsOs20DescSet function_winusb_msos20_{};