1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <iostream>
16 #include <sstream>
17 #include <map>
18 #include <string>
19 #include <set>
20 #include <thread>
21 #include <ipc_skeleton.h>
22
23 #include "usb_host_manager.h"
24 #include "common_event_data.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "hilog_wrapper.h"
28 #include "hisysevent.h"
29 #include "cJSON.h"
30 #include "usb_serial_reader.h"
31 #include "usb_device.h"
32 #include "usb_config.h"
33 #include "usb_interface.h"
34 #include "usb_errors.h"
35 #include "if_system_ability_manager.h"
36 #include "iservice_registry.h"
37 #include "parameters.h"
38 #include "usbd_bulkcallback_impl.h"
39 #include "usb_descriptor_parser.h"
40 #include "usbd_transfer_callback_impl.h"
41 #include "usb_napi_errors.h"
42 #include "accesstoken_kit.h"
43
44 using namespace OHOS::AAFwk;
45 using namespace OHOS::EventFwk;
46 using namespace OHOS::HiviewDFX;
47 using namespace OHOS::HDI::Usb::V1_2;
48
49 namespace OHOS {
50 namespace USB {
51 constexpr int32_t CLASS_PRINT_LENGTH = 2;
52 constexpr int32_t USAGE_IN_INTERFACE_CLASS = 0;
53 constexpr uint8_t DES_USAGE_IN_INTERFACE = 0x02;
54 constexpr int LAST_FIVE = 5;
55 std::map<int32_t, DeviceClassUsage> deviceUsageMap = {
56 {0x00, {DeviceClassUsage(2, "Use class information in the Interface Descriptors")}},
57 {0x01, {DeviceClassUsage(2, "Audio")}},
58 {0x02, {DeviceClassUsage(3, "Communications and CDC Control")}},
59 {0x03, {DeviceClassUsage(2, "HID(Human Interface Device)")}},
60 {0x05, {DeviceClassUsage(2, "Physical")}},
61 {0x06, {DeviceClassUsage(2, "Image")}},
62 {0x07, {DeviceClassUsage(2, "Printer")}},
63 {0x08, {DeviceClassUsage(2, "Mass Storage")}},
64 {0x09, {DeviceClassUsage(1, "Hub")}},
65 {0x0a, {DeviceClassUsage(2, "CDC-Data")}},
66 {0x0b, {DeviceClassUsage(2, "Smart Card")}},
67 {0x0d, {DeviceClassUsage(2, "Content Security")}},
68 {0x0e, {DeviceClassUsage(2, "Video")}},
69 {0x0f, {DeviceClassUsage(2, "Personal Healthcare")}},
70 {0x10, {DeviceClassUsage(2, "Audio/Video Device")}},
71 {0x11, {DeviceClassUsage(1, "Billboard Device Class")}},
72 {0x12, {DeviceClassUsage(2, "USB Type-C Bridge Class")}}
73 };
74
75 std::map<UsbDeviceType, std::string> interfaceUsageMap = {
76 {{UsbDeviceType(0x03, 0x01, 0x01, 0)}, "KeyBoard"},
77 {{UsbDeviceType(0x03, 0x01, 0x02, 0)}, "Mouse/Table/Touch screen"},
78 };
79 constexpr uint32_t CURSOR_INIT = 18;
80 constexpr int32_t DESCRIPTOR_TYPE_STRING = 3;
81 constexpr int32_t DESCRIPTOR_VALUE_START_OFFSET = 2;
82 constexpr int32_t HALF = 2;
83 constexpr int32_t BIT_SHIFT_4 = 4;
84 constexpr int32_t BIT_HIGH_4 = 0xF0;
85 constexpr int32_t BIT_LOW_4 = 0x0F;
86 constexpr uint32_t MANAGE_INTERFACE_INTERVAL = 100;
87 constexpr uint32_t EDM_SA_MAX_TIME_OUT = 5000;
88 constexpr uint32_t EDM_SYSTEM_ABILITY_ID = 1601;
89 const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
90 constexpr uint32_t WITHOUT_USERID = 0;
91 constexpr uint32_t WITHOUT_ADMIN = 1;
92 constexpr uint32_t EMD_MASK_CODE = 20;
93 constexpr uint32_t DISABLE_USB = 1043;
94 constexpr uint32_t ALLOWED_USB_DEVICES = 1044;
95 constexpr uint32_t USB_STORAGE_DEVICE_ACCESS_POLICY = 1026;
96 constexpr uint32_t USB_DEVICE_ACCESS_POLICY = 1059;
97 constexpr int32_t WHITELIST_POLICY_MAX_DEVICES = 1000;
98 constexpr uint32_t EDM_SA_TIME_OUT_CODE = 9200007;
99 constexpr int32_t BASECLASS_INDEX = 0;
100 constexpr int32_t SUBCLASS_INDEX = 1;
101 constexpr int32_t PROTOCAL_INDEX = 2;
102 constexpr int32_t STORAGE_BASE_CLASS = 8;
103 constexpr int32_t GET_EDM_STORAGE_DISABLE_TYPE = 2;
104 constexpr int32_t RANDOM_VALUE_INDICATE = -1;
105 #ifdef USB_MANAGER_PASS_THROUGH
106 const std::string SERVICE_NAME = "usb_host_interface_service";
107 #endif // USB_MANAGER_PASS_THROUGH
UsbHostManager(SystemAbility * systemAbility)108 UsbHostManager::UsbHostManager(SystemAbility *systemAbility)
109 {
110 systemAbility_ = systemAbility;
111 usbRightManager_ = std::make_shared<UsbRightManager>();
112 #ifndef USB_MANAGER_PASS_THROUGH
113 usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
114 #endif // USB_MANAGER_PASS_THROUGH
115 }
116
~UsbHostManager()117 UsbHostManager::~UsbHostManager()
118 {
119 for (auto &pair : devices_) {
120 delete pair.second;
121 }
122 devices_.clear();
123 }
124
125 #ifdef USB_MANAGER_PASS_THROUGH
InitUsbHostInterface()126 bool UsbHostManager::InitUsbHostInterface()
127 {
128 USB_HILOGI(MODULE_USB_SERVICE, "InitUsbHostInterface in");
129 usbHostInterface_ = HDI::Usb::V2_0::IUsbHostInterface::Get(SERVICE_NAME, true);
130 if (usbHostInterface_ == nullptr) {
131 USB_HILOGE(MODULE_USB_SERVICE, "InitUsbHostInterface get usbHostInterface_ is nullptr");
132 return false;
133 }
134 usbManagerSubscriber_ = new (std::nothrow) UsbManagerSubscriber();
135 if (usbManagerSubscriber_ == nullptr) {
136 USB_HILOGE(MODULE_USB_SERVICE, "usbManagerSubscriber_ is nullptr");
137 return false;
138 }
139 ErrCode ret = usbHostInterface_->BindUsbdHostSubscriber(usbManagerSubscriber_);
140 USB_HILOGI(MODULE_USB_SERVICE, "entry InitUsbHostInterface ret: %{public}d", ret);
141 return SUCCEEDED(ret);
142 }
143
Stop()144 void UsbHostManager::Stop()
145 {
146 if (usbHostInterface_ == nullptr) {
147 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
148 return;
149 }
150 usbHostInterface_->UnbindUsbdHostSubscriber(usbManagerSubscriber_);
151 Memory::MemMgrClient::GetInstance().NotifyProcessStatus(getpid(), 1, 0, USB_SYSTEM_ABILITY_ID);
152 }
153
BindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> & subscriber)154 int32_t UsbHostManager::BindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> &subscriber)
155 {
156 if (usbHostInterface_ == nullptr) {
157 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BindUsbdSubscriber usbHostInterface_ is nullptr");
158 return UEC_SERVICE_INVALID_VALUE;
159 }
160 return usbHostInterface_->BindUsbdHostSubscriber(subscriber);
161 }
162
UnbindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> & subscriber)163 int32_t UsbHostManager::UnbindUsbdSubscriber(const sptr<HDI::Usb::V2_0::IUsbdSubscriber> &subscriber)
164 {
165 if (usbHostInterface_ == nullptr) {
166 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UnbindUsbdSubscriber usbHostInterface_ is nullptr");
167 return UEC_SERVICE_INVALID_VALUE;
168 }
169 return usbHostInterface_->UnbindUsbdHostSubscriber(subscriber);
170 }
171 #endif // USB_MANAGER_PASS_THROUGH
172
173 // LCOV_EXCL_START
OnRemoteDied(const wptr<IRemoteObject> & object)174 void UsbHostManager::UsbSubmitTransferDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
175 {
176 USB_HILOGI(MODULE_USBD, "UsbHostManager UsbSubmitTransferDeathRecipient enter");
177 int32_t ret = service_->UsbCancelTransfer(devInfo_, endpoint_);
178 if (ret == UEC_OK) {
179 USB_HILOGI(MODULE_USBD, "UsbHostManager OnRemoteDied Close.");
180 service_->Close(devInfo_.busNum, devInfo_.devAddr);
181 }
182 }
183 // LCOV_EXCL_STOP
184
ExecuteStrategy(UsbDevice * devInfo)185 void UsbHostManager::ExecuteStrategy(UsbDevice *devInfo)
186 {
187 USB_HILOGI(MODULE_USB_SERVICE, "UsbHostManager::ExecuteStrategy start");
188 if (!IsEdmEnabled()) {
189 USB_HILOGE(MODULE_USB_SERVICE, "edm is not activate, skip");
190 return;
191 }
192 bool isGlobalDisabled = false;
193 std::vector<UsbDeviceType> disableType{};
194 std::vector<UsbDeviceId> trustUsbDeviceIds{};
195
196 int32_t ret = GetUsbPolicy(isGlobalDisabled, disableType, trustUsbDeviceIds);
197 if (ret == UEC_SERVICE_EDM_SA_TIME_OUT_FAILED || ret == UEC_SERVICE_PREPARE_EDM_SA_FAILED) {
198 USB_HILOGE(MODULE_USB_SERVICE, "EDM sa time out or prepare failed, ret = %{public}d", ret);
199 return;
200 }
201
202 if (isGlobalDisabled) {
203 ret = ManageGlobalInterfaceImpl(isGlobalDisabled);
204 if (ret != UEC_OK) {
205 USB_HILOGE(MODULE_USB_SERVICE, "ManageGlobalInterface failed");
206 }
207 return;
208 }
209
210 if (!disableType.empty()) {
211 ret = ExecuteManageInterfaceType(disableType, true);
212 if (ret != UEC_OK) {
213 USB_HILOGE(MODULE_USB_SERVICE, "ExecuteManageInterfaceType failed");
214 }
215 return;
216 }
217
218 if (trustUsbDeviceIds.empty()) {
219 USB_HILOGI(MODULE_USB_SERVICE, "trustUsbDeviceIds is empty, no devices disable");
220 return;
221 }
222 ret = ExecuteManageDevicePolicy(trustUsbDeviceIds);
223 if (ret != UEC_OK) {
224 USB_HILOGE(MODULE_USB_SERVICE, "ExecuteManageDevicePolicy failed");
225 }
226 return;
227 }
228
OpenDevice(uint8_t busNum,uint8_t devAddr)229 int32_t UsbHostManager::OpenDevice(uint8_t busNum, uint8_t devAddr)
230 {
231 #ifdef USB_MANAGER_PASS_THROUGH
232 if (usbHostInterface_ == nullptr) {
233 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::OpenDevice usbHostInterface_ is nullptr");
234 return UEC_SERVICE_INVALID_VALUE;
235 }
236 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
237 return usbHostInterface_->OpenDevice(dev);
238 #else
239 const UsbDev dev = {busNum, devAddr};
240 if (usbd_ == nullptr) {
241 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
242 return UEC_SERVICE_INVALID_VALUE;
243 }
244 return usbd_->OpenDevice(dev);
245 #endif // USB_MANAGER_PASS_THROUGH
246 }
247
Close(uint8_t busNum,uint8_t devAddr)248 int32_t UsbHostManager::Close(uint8_t busNum, uint8_t devAddr)
249 {
250 #ifdef USB_MANAGER_PASS_THROUGH
251 if (usbHostInterface_ == nullptr) {
252 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::Close usbHostInterface_ is nullptr");
253 return UEC_SERVICE_INVALID_VALUE;
254 }
255 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
256 return usbHostInterface_->CloseDevice(dev);
257 #else
258 const UsbDev dev = {busNum, devAddr};
259 if (usbd_ == nullptr) {
260 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
261 return UEC_SERVICE_INVALID_VALUE;
262 }
263 return usbd_->CloseDevice(dev);
264 #endif // USB_MANAGER_PASS_THROUGH
265 }
266
ResetDevice(uint8_t busNum,uint8_t devAddr)267 int32_t UsbHostManager::ResetDevice(uint8_t busNum, uint8_t devAddr)
268 {
269 #ifdef USB_MANAGER_PASS_THROUGH
270 if (usbHostInterface_ == nullptr) {
271 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ResetDevice usbHostInterface_ is nullptr");
272 return UEC_SERVICE_INVALID_VALUE;
273 }
274 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
275 return usbHostInterface_->ResetDevice(dev);
276 #else
277 const UsbDev dev = {busNum, devAddr};
278 if (usbd_ == nullptr) {
279 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
280 return UEC_SERVICE_INVALID_VALUE;
281 }
282 return usbd_->ResetDevice(dev);
283 #endif // USB_MANAGER_PASS_THROUGH
284 }
285
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t force)286 int32_t UsbHostManager::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t force)
287 {
288 #ifdef USB_MANAGER_PASS_THROUGH
289 if (usbHostInterface_ == nullptr) {
290 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ClaimInterface usbHostInterface_ is nullptr");
291 return UEC_SERVICE_INVALID_VALUE;
292 }
293 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
294 return usbHostInterface_->ClaimInterface(dev, interfaceid, force);
295 #else
296 const UsbDev dev = {busNum, devAddr};
297 if (usbd_ == nullptr) {
298 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
299 return UEC_SERVICE_INVALID_VALUE;
300 }
301 return usbd_->ClaimInterface(dev, interfaceid, force);
302 #endif // USB_MANAGER_PASS_THROUGH
303 }
304
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)305 int32_t UsbHostManager::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
306 {
307 #ifdef USB_MANAGER_PASS_THROUGH
308 if (usbHostInterface_ == nullptr) {
309 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::SetInterface usbHostInterface_ is nullptr");
310 return UEC_SERVICE_INVALID_VALUE;
311 }
312 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
313 return usbHostInterface_->SetInterface(dev, interfaceid, altIndex);
314 #else
315 const UsbDev dev = {busNum, devAddr};
316 if (usbd_ == nullptr) {
317 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
318 return UEC_SERVICE_INVALID_VALUE;
319 }
320 return usbd_->SetInterface(dev, interfaceid, altIndex);
321 #endif // USB_MANAGER_PASS_THROUGH
322 }
323
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)324 int32_t UsbHostManager::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
325 {
326 #ifdef USB_MANAGER_PASS_THROUGH
327 if (usbHostInterface_ == nullptr) {
328 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ReleaseInterface usbHostInterface_ is nullptr");
329 return UEC_SERVICE_INVALID_VALUE;
330 }
331 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
332 return usbHostInterface_->ReleaseInterface(dev, interface);
333 #else
334 const UsbDev dev = {busNum, devAddr};
335 if (usbd_ == nullptr) {
336 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
337 return UEC_SERVICE_INVALID_VALUE;
338 }
339 return usbd_->ReleaseInterface(dev, interface);
340 #endif // USB_MANAGER_PASS_THROUGH
341 }
342
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)343 int32_t UsbHostManager::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
344 {
345 #ifdef USB_MANAGER_PASS_THROUGH
346 if (usbHostInterface_ == nullptr) {
347 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::SetActiveConfig usbHostInterface_ is nullptr");
348 return UEC_SERVICE_INVALID_VALUE;
349 }
350 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
351 return usbHostInterface_->SetConfig(dev, configIndex);
352 #else
353 const UsbDev dev = {busNum, devAddr};
354 if (usbd_ == nullptr) {
355 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
356 return UEC_SERVICE_INVALID_VALUE;
357 }
358 return usbd_->SetConfig(dev, configIndex);
359 #endif // USB_MANAGER_PASS_THROUGH
360 }
361
ManageGlobalInterface(bool disable)362 int32_t UsbHostManager::ManageGlobalInterface(bool disable)
363 {
364 return ManageGlobalInterfaceImpl(disable);
365 }
366
ManageDevice(int32_t vendorId,int32_t productId,bool disable)367 int32_t UsbHostManager::ManageDevice(int32_t vendorId, int32_t productId, bool disable)
368 {
369 return ManageDeviceImpl(vendorId, productId, disable);
370 }
371
ManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)372 int32_t UsbHostManager::ManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
373 {
374 return ExecuteManageInterfaceType(disableType, disable);
375 }
376
UsbAttachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid)377 int32_t UsbHostManager::UsbAttachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid)
378 {
379 #ifdef USB_MANAGER_PASS_THROUGH
380 if (usbHostInterface_ == nullptr) {
381 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbAttachKernelDriver usbHostInterface_ is nullptr");
382 return UEC_SERVICE_INVALID_VALUE;
383 }
384 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
385 return usbHostInterface_->ManageInterface(dev, interfaceid, false);
386 #else
387 const UsbDev dev = {busNum, devAddr};
388 if (usbd_ == nullptr) {
389 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
390 return UEC_SERVICE_INVALID_VALUE;
391 }
392
393 return usbd_->ManageInterface(dev, interfaceid, false);
394 #endif // USB_MANAGER_PASS_THROUGH
395 }
396
UsbDetachKernelDriver(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid)397 int32_t UsbHostManager::UsbDetachKernelDriver(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid)
398 {
399 #ifdef USB_MANAGER_PASS_THROUGH
400 if (usbHostInterface_ == nullptr) {
401 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbDetachKernelDriver usbHostInterface_ is nullptr");
402 return UEC_SERVICE_INVALID_VALUE;
403 }
404 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
405 return usbHostInterface_->ManageInterface(dev, interfaceid, true);
406 #else
407 const UsbDev dev = {busNum, devAddr};
408 if (usbd_ == nullptr) {
409 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
410 return UEC_SERVICE_INVALID_VALUE;
411 }
412
413 return usbd_->ManageInterface(dev, interfaceid, true);
414 #endif // USB_MANAGER_PASS_THROUGH
415 }
416
ClearHalt(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)417 int32_t UsbHostManager::ClearHalt(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
418 {
419 #ifdef USB_MANAGER_PASS_THROUGH
420 if (usbHostInterface_ == nullptr) {
421 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ClearHalt usbHostInterface_ is nullptr");
422 return UEC_SERVICE_INVALID_VALUE;
423 }
424 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
425 const HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, endpointId};
426 return usbHostInterface_->ClearHalt(dev, pipe);
427 #else
428 const UsbDev dev = {busNum, devAddr};
429 const UsbPipe pipe = {interfaceId, endpointId};
430 if (usbd_ == nullptr) {
431 USB_HILOGE(MODULE_USB_SERVICE, "ClearHalt: usbd_ is nullptr");
432 return UEC_SERVICE_INVALID_VALUE;
433 }
434 return usbd_->ClearHalt(dev, pipe);
435 #endif // USB_MANAGER_PASS_THROUGH
436 }
437
438
GetDevices(std::vector<UsbDevice> & deviceList)439 int32_t UsbHostManager::GetDevices(std::vector<UsbDevice> &deviceList)
440 {
441 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
442 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
443 if (!(usbRightManager_->IsSystemAppOrSa())) {
444 it->second->SetmSerial("");
445 }
446 deviceList.push_back(*it->second);
447 }
448 return UEC_OK;
449 }
450
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)451 int32_t UsbHostManager::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
452 {
453 const UsbDev uDev = {busNum, devAddr};
454 std::vector<uint8_t> descriptor;
455
456 int32_t res = UEC_OK;
457 int32_t ret = OpenDevice(busNum, devAddr);
458 if (ret != UEC_OK) {
459 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo OpenDevice failed ret=%{public}d", ret);
460 return ret;
461 }
462
463 ret = GetDeviceInfoDescriptor(uDev, descriptor, dev);
464 if (ret != UEC_OK) {
465 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfoDescriptor ret=%{public}d", ret);
466 res = Close(busNum, devAddr);
467 if (res != UEC_OK) {
468 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed res=%{public}d", res);
469 return res;
470 }
471 return ret;
472 }
473 res = GetConfigDescriptor(dev, descriptor);
474 if (res != UEC_OK) {
475 USB_HILOGE(MODULE_USB_SERVICE, "GetConfigDescriptor ret=%{public}d", ret);
476 }
477 ret = Close(busNum, devAddr);
478 if (ret != UEC_OK) {
479 USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed ret=%{public}d", ret);
480 return ret;
481 }
482 return res;
483 }
484
GetDeviceInfoDescriptor(const HDI::Usb::V1_0::UsbDev & uDev,std::vector<uint8_t> & descriptor,UsbDevice & dev)485 int32_t UsbHostManager::GetDeviceInfoDescriptor(const HDI::Usb::V1_0::UsbDev &uDev, std::vector<uint8_t> &descriptor,
486 UsbDevice &dev)
487 {
488 int32_t ret = GetRawDescriptor(uDev.busNum, uDev.devAddr, descriptor);
489 if (ret != UEC_OK) {
490 USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed ret=%{public}d busNum:%{public}d devAddr:%{public}d",
491 ret, uDev.busNum, uDev.devAddr);
492 return ret;
493 }
494 uint8_t *buffer = descriptor.data();
495 uint32_t length = descriptor.size();
496 if ((!buffer) || (length == 0)) {
497 USB_HILOGE(MODULE_USB_SERVICE, "GetRawDescriptor failed len=%{public}d busNum:%{public}d devAddr:%{public}d",
498 length, uDev.busNum, uDev.devAddr);
499 return UEC_SERVICE_INVALID_VALUE;
500 }
501 dev.SetBusNum(uDev.busNum);
502 dev.SetDevAddr(uDev.devAddr);
503 dev.SetName(std::to_string(uDev.busNum) + "-" + std::to_string(uDev.devAddr));
504
505 ret = UsbDescriptorParser::ParseDeviceDescriptor(buffer, length, dev);
506 if (ret != UEC_OK) {
507 USB_HILOGE(MODULE_USB_SERVICE, "ParseDeviceDescriptor failed ret=%{public}d", ret);
508 return ret;
509 }
510 return ret;
511 }
512
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & descriptor)513 int32_t UsbHostManager::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &descriptor)
514 {
515 std::vector<USBConfig> configs;
516 int32_t ret = UsbDescriptorParser::ParseConfigDescriptors(descriptor, CURSOR_INIT, configs);
517 if (ret != UEC_OK) {
518 USB_HILOGE(MODULE_USB_SERVICE, "ParseConfigDescriptors failed ret=%{public}d", ret);
519 return ret;
520 }
521 dev.SetConfigs(configs);
522 ret = FillDevStrings(dev);
523 USB_HILOGI(MODULE_USB_SERVICE, "FillDevStrings ret=%{public}d", ret);
524 return ret;
525 }
526
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)527 int32_t UsbHostManager::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
528 {
529 #ifdef USB_MANAGER_PASS_THROUGH
530 if (usbHostInterface_ == nullptr) {
531 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
532 return UEC_SERVICE_INVALID_VALUE;
533 }
534 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
535 return usbHostInterface_->GetConfig(dev, configIndex);
536 #else
537 const UsbDev dev = {busNum, devAddr};
538 if (usbd_ == nullptr) {
539 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
540 return UEC_SERVICE_INVALID_VALUE;
541 }
542
543 return usbd_->GetConfig(dev, configIndex);
544 #endif // USB_MANAGER_PASS_THROUGH
545 }
546
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)547 int32_t UsbHostManager::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
548 {
549 #ifdef USB_MANAGER_PASS_THROUGH
550 if (usbHostInterface_ == nullptr) {
551 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetRawDescriptor usbHostInterface_ is nullptr");
552 return UEC_SERVICE_INVALID_VALUE;
553 }
554 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
555 return usbHostInterface_->GetRawDescriptor(dev, bufferData);
556 #else
557 const UsbDev dev = {busNum, devAddr};
558 if (usbd_ == nullptr) {
559 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
560 return UEC_SERVICE_INVALID_VALUE;
561 }
562 return usbd_->GetRawDescriptor(dev, bufferData);
563 #endif // USB_MANAGER_PASS_THROUGH
564 }
565
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)566 int32_t UsbHostManager::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
567 {
568 #ifdef USB_MANAGER_PASS_THROUGH
569 if (usbHostInterface_ == nullptr) {
570 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetFileDescriptor usbHostInterface_ is nullptr");
571 return UEC_SERVICE_INVALID_VALUE;
572 }
573 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
574 return usbHostInterface_->GetDeviceFileDescriptor(dev, fd);
575 #else
576 const UsbDev dev = {busNum, devAddr};
577 if (usbd_ == nullptr) {
578 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
579 return UEC_SERVICE_INVALID_VALUE;
580 }
581 return usbd_->GetDeviceFileDescriptor(dev, fd);
582 #endif // USB_MANAGER_PASS_THROUGH
583 }
584
GetDeviceSpeed(uint8_t busNum,uint8_t devAddr,uint8_t & speed)585 int32_t UsbHostManager::GetDeviceSpeed(uint8_t busNum, uint8_t devAddr, uint8_t &speed)
586 {
587 #ifdef USB_MANAGER_PASS_THROUGH
588 if (usbHostInterface_ == nullptr) {
589 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetDeviceSpeed usbHostInterface_ is nullptr");
590 return UEC_SERVICE_INVALID_VALUE;
591 }
592 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
593 return usbHostInterface_->GetDeviceSpeed(dev, speed);
594 #else
595 const UsbDev dev = {busNum, devAddr};
596 if (usbd_ == nullptr) {
597 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
598 return UEC_SERVICE_INVALID_VALUE;
599 }
600 return usbd_->GetDeviceSpeed(dev, speed);
601 #endif // USB_MANAGER_PASS_THROUGH
602 }
603
GetInterfaceActiveStatus(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,bool & unactivated)604 int32_t UsbHostManager::GetInterfaceActiveStatus(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid,
605 bool &unactivated)
606 {
607 #ifdef USB_MANAGER_PASS_THROUGH
608 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
609 if (usbHostInterface_ == nullptr) {
610 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::GetInterfaceActiveStatus usbHostInterface_ is nullptr");
611 return UEC_SERVICE_INVALID_VALUE;
612 }
613 return usbHostInterface_->GetInterfaceActiveStatus(dev, interfaceid, unactivated);
614 #else
615 const UsbDev dev = {busNum, devAddr};
616 if (usbd_ == nullptr) {
617 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
618 return UEC_SERVICE_INVALID_VALUE;
619 }
620 return usbd_->GetInterfaceActiveStatus(dev, interfaceid, unactivated);
621 #endif // USB_MANAGER_PASS_THROUGH
622 }
623
BulkTransferRead(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,std::vector<uint8_t> & bufferData,int32_t timeOut)624 int32_t UsbHostManager::BulkTransferRead(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
625 std::vector<uint8_t> &bufferData, int32_t timeOut)
626 {
627 #ifdef USB_MANAGER_PASS_THROUGH
628 if (usbHostInterface_ == nullptr) {
629 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferRead usbHostInterface_ is nullptr");
630 return UEC_SERVICE_INVALID_VALUE;
631 }
632 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
633 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
634 return usbHostInterface_->BulkTransferRead(usbDev_, usbPipe_, timeOut, bufferData);
635 #else
636 if (usbd_ == nullptr) {
637 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
638 return UEC_SERVICE_INVALID_VALUE;
639 }
640
641 return usbd_->BulkTransferRead(dev, pipe, timeOut, bufferData);
642 #endif // USB_MANAGER_PASS_THROUGH
643 }
644
BulkTransferReadwithLength(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,int32_t length,std::vector<uint8_t> & bufferData,int32_t timeOut)645 int32_t UsbHostManager::BulkTransferReadwithLength(const HDI::Usb::V1_0::UsbDev &dev,
646 const HDI::Usb::V1_0::UsbPipe &pipe, int32_t length, std::vector<uint8_t> &bufferData, int32_t timeOut)
647 {
648 #ifdef USB_MANAGER_PASS_THROUGH
649 if (usbHostInterface_ == nullptr) {
650 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferReadwithLength usbHostInterface_ is nullptr");
651 return UEC_SERVICE_INVALID_VALUE;
652 }
653 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
654 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
655 return usbHostInterface_->BulkTransferReadwithLength(usbDev_, usbPipe_, timeOut, length, bufferData);
656 #else
657 if (usbd_ == nullptr) {
658 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
659 return UEC_SERVICE_INVALID_VALUE;
660 }
661 return usbd_->BulkTransferReadwithLength(dev, pipe, timeOut, length, bufferData);
662 #endif // USB_MANAGER_PASS_THROUGH
663 }
664
BulkTransferWrite(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,const std::vector<uint8_t> & bufferData,int32_t timeOut)665 int32_t UsbHostManager::BulkTransferWrite(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
666 const std::vector<uint8_t> &bufferData, int32_t timeOut)
667 {
668 #ifdef USB_MANAGER_PASS_THROUGH
669 if (usbHostInterface_ == nullptr) {
670 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkTransferWrite usbHostInterface_ is nullptr");
671 return UEC_SERVICE_INVALID_VALUE;
672 }
673 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
674 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
675 return usbHostInterface_->BulkTransferWrite(usbDev_, usbPipe_, timeOut, bufferData);
676 #else
677 if (usbd_ == nullptr) {
678 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
679 return UEC_SERVICE_INVALID_VALUE;
680 }
681 return usbd_->BulkTransferWrite(dev, pipe, timeOut, bufferData);
682 #endif // USB_MANAGER_PASS_THROUGH
683 }
684
ControlTransfer(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbCtrlTransfer & ctrl,std::vector<uint8_t> & bufferData)685 int32_t UsbHostManager::ControlTransfer(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbCtrlTransfer &ctrl,
686 std::vector<uint8_t> &bufferData)
687 {
688 #ifdef USB_MANAGER_PASS_THROUGH
689 if (usbHostInterface_ == nullptr) {
690 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::ControlTransfer usbHostInterface_ is nullptr");
691 return UEC_SERVICE_INVALID_VALUE;
692 }
693 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
694 const HDI::Usb::V2_0::UsbCtrlTransfer &usbCtrl_ = reinterpret_cast<const HDI::Usb::V2_0::UsbCtrlTransfer &>(ctrl);
695 int32_t ret = UEC_SERVICE_INNER_ERR;
696 std::lock_guard<std::mutex> guard(transferMutex_);
697 if (((uint32_t)ctrl.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
698 ret = usbHostInterface_->ControlTransferWrite(usbDev_, usbCtrl_, bufferData);
699 if (ret != UEC_OK) {
700 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransfer ControlTransferWrite error ret:%{public}d", ret);
701 }
702 } else {
703 bufferData.clear();
704 ret = usbHostInterface_->ControlTransferRead(usbDev_, usbCtrl_, bufferData);
705 if (ret != UEC_OK) {
706 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransfer ControlTransferRead error ret:%{public}d", ret);
707 }
708 }
709 return ret;
710 #else
711 if (usbd_ == nullptr) {
712 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
713 return UEC_SERVICE_INVALID_VALUE;
714 }
715 int32_t ret = UEC_SERVICE_INNER_ERR;
716 std::lock_guard<std::mutex> guard(transferMutex_);
717 if (((uint32_t)ctrl.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
718 ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
719 if (ret != UEC_OK) {
720 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
721 }
722 } else {
723 bufferData.clear();
724 ret = usbd_->ControlTransferRead(dev, ctrl, bufferData);
725 if (ret != UEC_OK) {
726 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferRead error ret:%{public}d", ret);
727 }
728 }
729 return ret;
730 #endif // USB_MANAGER_PASS_THROUGH
731 }
732
UsbControlTransfer(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_2::UsbCtrlTransferParams & ctrlParams,std::vector<uint8_t> & bufferData)733 int32_t UsbHostManager::UsbControlTransfer(const HDI::Usb::V1_0::UsbDev &dev,
734 const HDI::Usb::V1_2::UsbCtrlTransferParams &ctrlParams, std::vector<uint8_t> &bufferData)
735 {
736 #ifdef USB_MANAGER_PASS_THROUGH
737 if (usbHostInterface_ == nullptr) {
738 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbControlTransfer usbHostInterface_ is nullptr");
739 return UEC_SERVICE_INVALID_VALUE;
740 }
741 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
742 const HDI::Usb::V2_0::UsbCtrlTransferParams &usbCtrlParams_ =
743 reinterpret_cast<const HDI::Usb::V2_0::UsbCtrlTransferParams &>(ctrlParams);
744 int32_t ret = UEC_SERVICE_INNER_ERR;
745 HDI::Usb::V2_0::UsbCtrlTransfer ctrl = {
746 ctrlParams.requestType, ctrlParams.requestCmd, ctrlParams.value, ctrlParams.index, ctrlParams.timeout};
747
748 std::lock_guard<std::mutex> guard(transferMutex_);
749 if (((uint32_t)ctrlParams.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
750 ret = usbHostInterface_->ControlTransferWrite(usbDev_, ctrl, bufferData);
751 if (ret != UEC_OK) {
752 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite UsbControlTransfer error ret:%{public}d", ret);
753 }
754 } else {
755 bufferData.clear();
756 ret = usbHostInterface_->ControlTransferReadwithLength(usbDev_, usbCtrlParams_, bufferData);
757 if (ret != UEC_OK) {
758 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWritewithLength error ret:%{public}d", ret);
759 }
760 }
761 return ret;
762 #else
763 if (usbd_ == nullptr) {
764 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
765 return UEC_SERVICE_INVALID_VALUE;
766 }
767 int32_t ret = UEC_SERVICE_INNER_ERR;
768 UsbCtrlTransfer ctrl = {
769 ctrlParams.requestType, ctrlParams.requestCmd, ctrlParams.value, ctrlParams.index, ctrlParams.timeout};
770
771 std::lock_guard<std::mutex> guard(transferMutex_);
772 if (((uint32_t)ctrlParams.requestType & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
773 ret = usbd_->ControlTransferWrite(dev, ctrl, bufferData);
774 if (ret != UEC_OK) {
775 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWrite error ret:%{public}d", ret);
776 }
777 } else {
778 bufferData.clear();
779 ret = usbd_->ControlTransferReadwithLength(dev, ctrlParams, bufferData);
780 if (ret != UEC_OK) {
781 USB_HILOGE(MODULE_USB_SERVICE, "ControlTransferWritewithLength error ret:%{public}d", ret);
782 }
783 }
784 return ret;
785 #endif // USB_MANAGER_PASS_THROUGH
786 }
787
RequestQueue(const HDI::Usb::V1_0::UsbDev & dev,const HDI::Usb::V1_0::UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)788 int32_t UsbHostManager::RequestQueue(const HDI::Usb::V1_0::UsbDev &dev, const HDI::Usb::V1_0::UsbPipe &pipe,
789 const std::vector<uint8_t> &clientData, const std::vector<uint8_t> &bufferData)
790 {
791 #ifdef USB_MANAGER_PASS_THROUGH
792 if (usbHostInterface_ == nullptr) {
793 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestQueue usbHostInterface_ is nullptr");
794 return UEC_SERVICE_INVALID_VALUE;
795 }
796 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
797 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
798 return usbHostInterface_->RequestQueue(usbDev_, usbPipe_, clientData, bufferData);
799 #else
800 if (usbd_ == nullptr) {
801 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
802 return UEC_SERVICE_INVALID_VALUE;
803 }
804 return usbd_->RequestQueue(dev, pipe, clientData, bufferData);
805 #endif // USB_MANAGER_PASS_THROUGH
806 }
807
RequestWait(const HDI::Usb::V1_0::UsbDev & dev,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)808 int32_t UsbHostManager::RequestWait(const HDI::Usb::V1_0::UsbDev &dev, int32_t timeOut,
809 std::vector<uint8_t> &clientData, std::vector<uint8_t> &bufferData)
810 {
811 #ifdef USB_MANAGER_PASS_THROUGH
812 if (usbHostInterface_ == nullptr) {
813 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestWait usbHostInterface_ is nullptr");
814 return UEC_SERVICE_INVALID_VALUE;
815 }
816 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
817 return usbHostInterface_->RequestWait(usbDev_, clientData, bufferData, timeOut);
818 #else
819 if (usbd_ == nullptr) {
820 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
821 return UEC_SERVICE_INVALID_VALUE;
822 }
823 return usbd_->RequestWait(dev, clientData, bufferData, timeOut);
824 #endif // USB_MANAGER_PASS_THROUGH
825 }
826
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)827 int32_t UsbHostManager::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
828 {
829 #ifdef USB_MANAGER_PASS_THROUGH
830 if (usbHostInterface_ == nullptr) {
831 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RequestCancel usbHostInterface_ is nullptr");
832 return UEC_SERVICE_INVALID_VALUE;
833 }
834 const HDI::Usb::V2_0::UsbDev dev = {busNum, devAddr};
835 const HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, endpointId};
836 return usbHostInterface_->RequestCancel(dev, pipe);
837 #else
838 const UsbDev dev = {busNum, devAddr};
839 const UsbPipe pipe = {interfaceId, endpointId};
840 if (usbd_ == nullptr) {
841 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
842 return UEC_SERVICE_INVALID_VALUE;
843 }
844
845 return usbd_->RequestCancel(dev, pipe);
846 #endif // USB_MANAGER_PASS_THROUGH
847 }
848
UsbCancelTransfer(const HDI::Usb::V1_0::UsbDev & devInfo,const int32_t & endpoint)849 int32_t UsbHostManager::UsbCancelTransfer(const HDI::Usb::V1_0::UsbDev &devInfo, const int32_t &endpoint)
850 {
851 #ifdef USB_MANAGER_PASS_THROUGH
852 if (usbHostInterface_ == nullptr) {
853 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbCancelTransfer usbHostInterface_ is nullptr");
854 return UEC_SERVICE_INVALID_VALUE;
855 }
856 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
857 return usbHostInterface_->UsbCancelTransfer(usbDev_, endpoint);
858 #else
859 if (usbd_ == nullptr) {
860 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
861 return UEC_SERVICE_INVALID_VALUE;
862 }
863 int32_t ret = usbd_->UsbCancelTransfer(devInfo, endpoint);
864 if (ret != UEC_OK) {
865 USB_HILOGE(MODULE_USB_SERVICE, "UsbCancelTransfer error ret:%{public}d", ret);
866 return ret;
867 }
868 return ret;
869 #endif // USB_MANAGER_PASS_THROUGH
870 }
871
UsbSubmitTransfer(const HDI::Usb::V1_0::UsbDev & devInfo,HDI::Usb::V1_2::USBTransferInfo & info,const sptr<IRemoteObject> & cb,sptr<Ashmem> & ashmem)872 int32_t UsbHostManager::UsbSubmitTransfer(const HDI::Usb::V1_0::UsbDev &devInfo, HDI::Usb::V1_2::USBTransferInfo &info,
873 const sptr<IRemoteObject> &cb, sptr<Ashmem> &ashmem)
874 {
875 int32_t ret = UEC_SERVICE_INVALID_VALUE;
876 #ifdef USB_MANAGER_PASS_THROUGH
877 if (usbHostInterface_ == nullptr) {
878 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbSubmitTransfer usbHostInterface_ is nullptr");
879 return UEC_SERVICE_INVALID_VALUE;
880 }
881 sptr<UsbHostManager::UsbSubmitTransferDeathRecipient> submitRecipient =
882 new UsbSubmitTransferDeathRecipient(devInfo, info.endpoint, this, cb);
883 if (!cb->AddDeathRecipient(submitRecipient)) {
884 USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
885 return UEC_SERVICE_INVALID_VALUE;
886 }
887 sptr<UsbTransferCallbackImpl> callbackImpl = new UsbTransferCallbackImpl(cb);
888 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
889 const HDI::Usb::V2_0::USBTransferInfo &usbInfo = reinterpret_cast<const HDI::Usb::V2_0::USBTransferInfo &>(info);
890 ret = usbHostInterface_->UsbSubmitTransfer(usbDev_, usbInfo, callbackImpl, ashmem);
891 #else
892 if (usbd_ == nullptr) {
893 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UsbSubmitTransfer usbd_ is nullptr");
894 return UEC_SERVICE_INVALID_VALUE;
895 }
896 sptr<UsbHostManager::UsbSubmitTransferDeathRecipient> submitRecipient =
897 new UsbSubmitTransferDeathRecipient(devInfo, info.endpoint, this, cb);
898 if (!cb->AddDeathRecipient(submitRecipient)) {
899 USB_HILOGE(MODULE_USB_SERVICE, "add DeathRecipient failed");
900 return UEC_SERVICE_INVALID_VALUE;
901 }
902 sptr<UsbdTransferCallbackImpl> callbackImpl = new UsbdTransferCallbackImpl(cb);
903 ret = usbd_->UsbSubmitTransfer(devInfo, info, callbackImpl, ashmem);
904 #endif // USB_MANAGER_PASS_THROUGH
905 if (ret != UEC_OK) {
906 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager UsbSubmitTransfer error ret:%{public}d", ret);
907 cb->RemoveDeathRecipient(submitRecipient);
908 submitRecipient.clear();
909 return ret;
910 }
911 return ret;
912 }
913
RegBulkCallback(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,const sptr<IRemoteObject> & cb)914 int32_t UsbHostManager::RegBulkCallback(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
915 const sptr<IRemoteObject> &cb)
916 {
917 if (cb == nullptr) {
918 USB_HILOGE(MODULE_USB_SERVICE, "cb is nullptr");
919 return UEC_SERVICE_INVALID_VALUE;
920 }
921 std::lock_guard<std::mutex> guard(hdiCbMutex_);
922 #ifdef USB_MANAGER_PASS_THROUGH
923 if (usbHostHdiCb_ == nullptr) {
924 usbHostHdiCb_ = new UsbBulkCallbackImpl(cb);
925 }
926 if (usbHostInterface_ == nullptr) {
927 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::RegBulkCallback usbHostInterface_ is nullptr");
928 return UEC_SERVICE_INVALID_VALUE;
929 }
930 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
931 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
932 return usbHostInterface_->RegBulkCallback(usbDev_, usbPipe_, usbHostHdiCb_);
933 #else
934 if (hdiCb_ == nullptr) {
935 hdiCb_ = new UsbdBulkCallbackImpl(cb);
936 }
937 if (usbd_ == nullptr) {
938 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
939 return UEC_SERVICE_INVALID_VALUE;
940 }
941
942 return usbd_->RegBulkCallback(devInfo, pipe, hdiCb_);
943 #endif // USB_MANAGER_PASS_THROUGH
944 }
945
UnRegBulkCallback(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe)946 int32_t UsbHostManager::UnRegBulkCallback(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe)
947 {
948 #ifdef USB_MANAGER_PASS_THROUGH
949 if (usbHostInterface_ == nullptr) {
950 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::UnRegBulkCallback usbHostInterface_ is nullptr");
951 return UEC_SERVICE_INVALID_VALUE;
952 }
953 std::lock_guard<std::mutex> guard(hdiCbMutex_);
954 usbHostHdiCb_ = nullptr;
955 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
956 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
957 return usbHostInterface_->UnRegBulkCallback(usbDev_, usbPipe_);
958 #else
959 if (usbd_ == nullptr) {
960 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
961 return UEC_SERVICE_INVALID_VALUE;
962 }
963
964 std::lock_guard<std::mutex> guard(hdiCbMutex_);
965 hdiCb_ = nullptr;
966 return usbd_->UnRegBulkCallback(devInfo, pipe);
967 #endif // USB_MANAGER_PASS_THROUGH
968 }
969
BulkRead(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,sptr<Ashmem> & ashmem)970 int32_t UsbHostManager::BulkRead(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
971 sptr<Ashmem> &ashmem)
972 {
973 if (ashmem == nullptr) {
974 USB_HILOGE(MODULE_USB_SERVICE, "BulkRead error ashmem");
975 return UEC_SERVICE_INVALID_VALUE;
976 }
977 #ifdef USB_MANAGER_PASS_THROUGH
978 if (usbHostInterface_ == nullptr) {
979 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkRead usbHostInterface_ is nullptr");
980 return UEC_SERVICE_INVALID_VALUE;
981 }
982 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
983 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
984 return usbHostInterface_->BulkRead(usbDev_, usbPipe_, ashmem);
985 #else
986 if (usbd_ == nullptr) {
987 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
988 return UEC_SERVICE_INVALID_VALUE;
989 }
990
991 return usbd_->BulkRead(devInfo, pipe, ashmem);
992 #endif // USB_MANAGER_PASS_THROUGH
993 }
994
BulkWrite(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe,sptr<Ashmem> & ashmem)995 int32_t UsbHostManager::BulkWrite(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe,
996 sptr<Ashmem> &ashmem)
997 {
998 if (ashmem == nullptr) {
999 USB_HILOGE(MODULE_USB_SERVICE, "BulkWrite error ashmem");
1000 return UEC_SERVICE_INVALID_VALUE;
1001 }
1002 #ifdef USB_MANAGER_PASS_THROUGH
1003 if (usbHostInterface_ == nullptr) {
1004 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkWrite usbHostInterface_ is nullptr");
1005 return UEC_SERVICE_INVALID_VALUE;
1006 }
1007 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
1008 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
1009 return usbHostInterface_->BulkWrite(usbDev_, usbPipe_, ashmem);
1010 #else
1011 if (usbd_ == nullptr) {
1012 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1013 return UEC_SERVICE_INVALID_VALUE;
1014 }
1015
1016 return usbd_->BulkWrite(devInfo, pipe, ashmem);
1017 #endif // USB_MANAGER_PASS_THROUGH
1018 }
1019
BulkCancel(const HDI::Usb::V1_0::UsbDev & devInfo,const HDI::Usb::V1_0::UsbPipe & pipe)1020 int32_t UsbHostManager::BulkCancel(const HDI::Usb::V1_0::UsbDev &devInfo, const HDI::Usb::V1_0::UsbPipe &pipe)
1021 {
1022 #ifdef USB_MANAGER_PASS_THROUGH
1023 if (usbHostInterface_ == nullptr) {
1024 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::BulkCancel usbHostInterface_ is nullptr");
1025 return UEC_SERVICE_INVALID_VALUE;
1026 }
1027 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(devInfo);
1028 const HDI::Usb::V2_0::UsbPipe &usbPipe_ = reinterpret_cast<const HDI::Usb::V2_0::UsbPipe &>(pipe);
1029 return usbHostInterface_->BulkCancel(usbDev_, usbPipe_);
1030 #else
1031 if (usbd_ == nullptr) {
1032 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1033 return UEC_SERVICE_INVALID_VALUE;
1034 }
1035
1036 return usbd_->BulkCancel(devInfo, pipe);
1037 #endif // USB_MANAGER_PASS_THROUGH
1038 }
1039
GetDevices(MAP_STR_DEVICE & devices)1040 void UsbHostManager::GetDevices(MAP_STR_DEVICE &devices)
1041 {
1042 devices = devices_;
1043 }
1044
GetProductName(const std::string & deviceName,std::string & productName)1045 bool UsbHostManager::GetProductName(const std::string &deviceName, std::string &productName)
1046 {
1047 auto iter = devices_.find(deviceName);
1048 if (iter == devices_.end()) {
1049 return false;
1050 }
1051
1052 UsbDevice *dev = iter->second;
1053 if (dev == nullptr) {
1054 return false;
1055 }
1056
1057 productName = dev->GetProductName();
1058 return true;
1059 }
1060
DelDevice(uint8_t busNum,uint8_t devNum)1061 bool UsbHostManager::DelDevice(uint8_t busNum, uint8_t devNum)
1062 {
1063 std::string name = std::to_string(busNum) + "-" + std::to_string(devNum);
1064 MAP_STR_DEVICE::iterator iter = devices_.find(name);
1065 if (iter == devices_.end()) {
1066 USB_HILOGF(MODULE_SERVICE, "name:%{public}s bus:%{public}hhu dev:%{public}hhu not exist", name.c_str(), busNum,
1067 devNum);
1068 return false;
1069 }
1070 USB_HILOGI(
1071 MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu erase ", name.c_str(), busNum, devNum);
1072 UsbDevice *devOld = iter->second;
1073 if (devOld == nullptr) {
1074 USB_HILOGE(MODULE_SERVICE, "invalid device");
1075 return false;
1076 }
1077
1078 auto isSuccess = PublishCommonEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_DETACHED, *devOld);
1079 if (!isSuccess) {
1080 USB_HILOGW(MODULE_SERVICE, "send device attached broadcast failed");
1081 }
1082
1083 delete devOld;
1084 devices_.erase(iter);
1085 return true;
1086 }
1087
AddDevice(UsbDevice * dev)1088 bool UsbHostManager::AddDevice(UsbDevice *dev)
1089 {
1090 if (dev == nullptr) {
1091 USB_HILOGF(MODULE_SERVICE, "device is NULL");
1092 return false;
1093 }
1094
1095 auto isSuccess = PublishCommonEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED, *dev);
1096 if (!isSuccess) {
1097 USB_HILOGW(MODULE_SERVICE, "send device attached broadcast failed");
1098 }
1099
1100 uint8_t busNum = dev->GetBusNum();
1101 uint8_t devNum = dev->GetDevAddr();
1102 std::string name = std::to_string(busNum) + "-" + std::to_string(devNum);
1103 MAP_STR_DEVICE::iterator iter = devices_.find(name);
1104 if (iter != devices_.end()) {
1105 USB_HILOGF(MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu already exist", name.c_str(),
1106 busNum, devNum);
1107 UsbDevice *devOld = iter->second;
1108 if (devOld != nullptr && devOld != dev) {
1109 delete devOld;
1110 }
1111 devices_.erase(iter);
1112 }
1113 USB_HILOGI(
1114 MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu insert", name.c_str(), busNum, devNum);
1115 devices_.insert(std::pair<std::string, UsbDevice *>(name, dev));
1116
1117 return true;
1118 }
1119
PublishCommonEvent(const std::string & event,const UsbDevice & dev)1120 bool UsbHostManager::PublishCommonEvent(const std::string &event, const UsbDevice &dev)
1121 {
1122 Want want;
1123 want.SetAction(event);
1124 CommonEventData data(want);
1125 data.SetData(dev.getJsonString().c_str());
1126 CommonEventPublishInfo publishInfo;
1127 USB_HILOGI(MODULE_SERVICE, "send %{public}s broadcast device:%{public}s", event.c_str(),
1128 dev.getJsonString().c_str());
1129 ReportHostPlugSysEvent(event, dev);
1130 return CommonEventManager::PublishCommonEvent(data, publishInfo);
1131 }
1132
Dump(int fd,const std::string & args)1133 bool UsbHostManager::Dump(int fd, const std::string &args)
1134 {
1135 if (args.compare("-a") != 0) {
1136 dprintf(fd, "args is not -a\n");
1137 return false;
1138 }
1139
1140 dprintf(fd, "Usb Host all device list info:\n");
1141 for (const auto &item : devices_) {
1142 dprintf(fd, "usb host list info: %s\n", item.second->getJsonString().c_str());
1143 }
1144 return true;
1145 }
1146
GetDeviceDescription(int32_t baseClass,std::string & description,uint8_t & usage)1147 int32_t UsbHostManager::GetDeviceDescription(int32_t baseClass, std::string &description, uint8_t &usage)
1148 {
1149 auto iter = deviceUsageMap.find(baseClass);
1150 if (iter != deviceUsageMap.end()) {
1151 description = iter->second.description;
1152 usage = iter->second.usage;
1153 } else {
1154 description = "NA";
1155 usage = 1;
1156 }
1157 return UEC_OK;
1158 }
1159
1160
ConcatenateToDescription(const UsbDeviceType & interfaceType,const std::string & str)1161 std::string UsbHostManager::ConcatenateToDescription(const UsbDeviceType &interfaceType, const std::string& str)
1162 {
1163 std::stringstream ss;
1164 ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.baseClass << "_";
1165 ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.subClass << "_";
1166 ss << std::setw(CLASS_PRINT_LENGTH) << std::setfill('0') << std::hex << interfaceType.protocol << ",";
1167 ss << str;
1168 return ss.str();
1169 }
1170
GetInterfaceUsageDescription(const UsbDeviceType & interfaceType)1171 std::string UsbHostManager::GetInterfaceUsageDescription(const UsbDeviceType &interfaceType)
1172 {
1173 std::string infUsageDes = "NA";
1174 auto infUsageIter = interfaceUsageMap.find(interfaceType);
1175 if (infUsageIter != interfaceUsageMap.end()) {
1176 return infUsageIter->second;
1177 }
1178 return infUsageDes;
1179 }
1180
GetInterfaceDescription(const UsbDevice & dev,std::string & description,int32_t & baseClass)1181 int32_t UsbHostManager::GetInterfaceDescription(const UsbDevice &dev, std::string &description, int32_t &baseClass)
1182 {
1183 std::set<UsbDeviceType> useInterfaceType;
1184 for (int32_t i = 0; i < dev.GetConfigCount(); i++) {
1185 USBConfig config;
1186 dev.GetConfig(i, config);
1187 for (uint32_t j = 0; j < config.GetInterfaceCount(); j++) {
1188 if (i != 0 || j != 0) {
1189 description += ";";
1190 }
1191 UsbInterface interface;
1192 config.GetInterface(j, interface);
1193 baseClass = interface.GetClass();
1194 UsbDeviceType interfaceType = {interface.GetClass(),
1195 interface.GetSubClass(), interface.GetProtocol(), 0};
1196 useInterfaceType.insert(interfaceType);
1197 std::string infUsageDes = GetInterfaceUsageDescription(interfaceType);
1198 description += ConcatenateToDescription(interfaceType, infUsageDes);
1199 }
1200 }
1201 return UEC_OK;
1202 }
1203
ReportHostPlugSysEvent(const std::string & event,const UsbDevice & dev)1204 void UsbHostManager::ReportHostPlugSysEvent(const std::string &event, const UsbDevice &dev)
1205 {
1206 std::string deviceUsageDes;
1207 uint8_t deviceUsage = 0;
1208 GetDeviceDescription(dev.GetClass(), deviceUsageDes, deviceUsage);
1209 std::string extUsageDes;
1210 int32_t intfBaseClass = 0;
1211 if (deviceUsage & DES_USAGE_IN_INTERFACE) {
1212 GetInterfaceDescription(dev, extUsageDes, intfBaseClass);
1213 }
1214
1215 if (dev.GetClass() == USAGE_IN_INTERFACE_CLASS) {
1216 GetDeviceDescription(intfBaseClass, deviceUsageDes, deviceUsage);
1217 }
1218 std::string snNum;
1219 if (dev.GetmSerial().length() > LAST_FIVE) {
1220 snNum = dev.GetmSerial().substr(dev.GetmSerial().length() - LAST_FIVE);
1221 }
1222 USB_HILOGI(MODULE_SERVICE, "Host mode Indicates the insertion and removal information");
1223 HiSysEventWrite(HiSysEvent::Domain::USB, "PLUG_IN_OUT_HOST_MODE", HiSysEvent::EventType::BEHAVIOR,
1224 "DEVICE_NAME", dev.GetProductName(), "DEVICE_PROTOCOL", dev.GetProtocol(),
1225 "DEVICE_SUBCLASS", dev.GetSubclass(), "DEVICE_CLASS", dev.GetClass(),
1226 "DEVICE_CLASS_DESCRIPTION", deviceUsageDes, "INTERFACE_CLASS_DESCRIPTION", extUsageDes,
1227 "VENDOR_ID", dev.GetVendorId(), "PRODUCT_ID", dev.GetProductId(),
1228 "VERSION", dev.GetVersion(), "EVENT_NAME", event, "SN_NUM", snNum);
1229 }
1230
BcdToString(const std::vector<uint8_t> & bcd)1231 static std::string BcdToString(const std::vector<uint8_t> &bcd)
1232 {
1233 std::string tstr;
1234 for (uint32_t i = 0; i < bcd.size(); ++i) {
1235 tstr += std::to_string((bcd[i] & BIT_HIGH_4) >> BIT_SHIFT_4);
1236 tstr += std::to_string((bcd[i] & BIT_LOW_4));
1237 }
1238 return tstr;
1239 }
1240
FillDevStrings(UsbDevice & dev)1241 int32_t UsbHostManager::FillDevStrings(UsbDevice &dev)
1242 {
1243 uint8_t busNum;
1244 uint8_t devAddr;
1245 uint8_t offsetValue = 8;
1246
1247 busNum = dev.GetBusNum();
1248 devAddr = dev.GetDevAddr();
1249 uint16_t bcdUsb = dev.GetbcdUSB();
1250 const std::vector<uint8_t> bcdData {(bcdUsb & 0xff), ((bcdUsb >> offsetValue) & 0xff)};
1251 dev.SetVersion(BcdToString(bcdData));
1252 dev.SetManufacturerName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiManufacturer()));
1253 dev.SetProductName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiProduct()));
1254 dev.SetmSerial(GetDevStringValFromIdx(busNum, devAddr, dev.GetiSerialNumber()));
1255 USB_HILOGI(MODULE_USB_SERVICE,
1256 "iSerial:%{public}d Manufactur:%{public}s product:%{public}s "
1257 "version:%{public}s",
1258 dev.GetiSerialNumber(), dev.GetManufacturerName().c_str(), dev.GetProductName().c_str(),
1259 dev.GetVersion().c_str());
1260
1261 std::vector<USBConfig> configs;
1262 configs = dev.GetConfigs();
1263 for (auto it = configs.begin(); it != configs.end(); ++it) {
1264 it->SetName(GetDevStringValFromIdx(busNum, devAddr, it->GetiConfiguration()));
1265 USB_HILOGI(MODULE_USB_SERVICE, "Config:%{public}d %{public}s", it->GetiConfiguration(), it->GetName().c_str());
1266 std::vector<UsbInterface> interfaces = it->GetInterfaces();
1267 for (auto itIF = interfaces.begin(); itIF != interfaces.end(); ++itIF) {
1268 itIF->SetName(GetDevStringValFromIdx(busNum, devAddr, itIF->GetiInterface()));
1269 USB_HILOGI(MODULE_USB_SERVICE, "interface:%{public}hhu %{public}s", itIF->GetiInterface(),
1270 itIF->GetName().c_str());
1271 }
1272 it->SetInterfaces(interfaces);
1273 }
1274 dev.SetConfigs(configs);
1275
1276 return UEC_OK;
1277 }
1278
GetDevStringValFromIdx(uint8_t busNum,uint8_t devAddr,uint8_t idx)1279 std::string UsbHostManager::GetDevStringValFromIdx(uint8_t busNum, uint8_t devAddr, uint8_t idx)
1280 {
1281 const UsbDev dev = {busNum, devAddr};
1282 std::vector<uint8_t> strV;
1283 std::string strDesc = " ";
1284
1285 if (idx == 0) {
1286 return strDesc;
1287 }
1288 #ifdef USB_MANAGER_PASS_THROUGH
1289 if (usbHostInterface_ == nullptr) {
1290 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbHostInterface_ is nullptr");
1291 return nullptr;
1292 }
1293 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
1294 int32_t ret = usbHostInterface_->GetStringDescriptor(usbDev_, idx, strV);
1295 #else
1296 if (usbd_ == nullptr) {
1297 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::usbd_ is nullptr");
1298 return nullptr;
1299 }
1300 int32_t ret = usbd_->GetStringDescriptor(dev, idx, strV);
1301 #endif // USB_MANAGER_PASS_THROUGH
1302 if (ret != UEC_OK) {
1303 USB_HILOGE(MODULE_USB_SERVICE, "get string[%{public}hhu] failed ret:%{public}d", idx, ret);
1304 return strDesc;
1305 }
1306 size_t length = strV.size();
1307 if ((length < DESCRIPTOR_VALUE_START_OFFSET) || (strV[1] != DESCRIPTOR_TYPE_STRING)) {
1308 USB_HILOGI(MODULE_USB_SERVICE, "type or length error, len:%{public}zu", length);
1309 return strDesc;
1310 }
1311
1312 uint16_t *tbuf = new (std::nothrow) uint16_t[length + 1]();
1313 if (tbuf == nullptr) {
1314 USB_HILOGI(MODULE_USB_SERVICE, "new failed");
1315 return strDesc;
1316 }
1317
1318 for (uint32_t i = 0; i < length - DESCRIPTOR_VALUE_START_OFFSET; ++i) {
1319 tbuf[i] = strV[i + DESCRIPTOR_VALUE_START_OFFSET];
1320 }
1321 size_t bufLen = (length - DESCRIPTOR_VALUE_START_OFFSET) / HALF;
1322 size_t wstrLen = wcslen((wchar_t*)tbuf) <= bufLen ? wcslen((wchar_t*)tbuf) : bufLen;
1323 std::wstring wstr(reinterpret_cast<wchar_t *>(tbuf), wstrLen);
1324 strDesc = std::string(wstr.begin(), wstr.end());
1325 USB_HILOGI(MODULE_USB_SERVICE, "getString idx:%{public}d length:%{public}zu, str: %{public}s",
1326 idx, strDesc.length(), strDesc.c_str());
1327 delete[] tbuf;
1328 return strDesc;
1329 }
1330
IsEdmEnabled()1331 bool UsbHostManager::IsEdmEnabled()
1332 {
1333 std::string edmParaValue = OHOS::system::GetParameter("persist.edm.edm_enable", "false");
1334 USB_HILOGI(MODULE_USB_SERVICE, "edmParaValue is %{public}s", edmParaValue.c_str());
1335 return edmParaValue == "true";
1336 }
1337
ExecuteManageDevicePolicy(std::vector<UsbDeviceId> & whiteList)1338 int32_t UsbHostManager::ExecuteManageDevicePolicy(std::vector<UsbDeviceId> &whiteList)
1339 {
1340 int32_t ret = UEC_INTERFACE_NO_MEMORY;
1341 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
1342 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1343 bool inWhiteList = false;
1344 for (auto dev : whiteList) {
1345 if (it->second->GetProductId() == dev.productId && it->second->GetVendorId() == dev.vendorId) {
1346 inWhiteList = true;
1347 break;
1348 }
1349 }
1350 if (inWhiteList) {
1351 ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), false);
1352 } else {
1353 ret = ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), true);
1354 }
1355 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1356 }
1357 if (ret != UEC_OK) {
1358 USB_HILOGI(MODULE_USB_SERVICE, "ManageDevice failed");
1359 return UEC_SERVICE_EXECUTE_POLICY_FAILED;
1360 }
1361 return UEC_OK;
1362 }
1363
ExecuteManageInterfaceType(const std::vector<UsbDeviceType> & disableType,bool disable)1364 int32_t UsbHostManager::ExecuteManageInterfaceType(const std::vector<UsbDeviceType> &disableType, bool disable)
1365 {
1366 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1367 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1368 int32_t ret = OpenDevice(dev.busNum, dev.devAddr);
1369 if (ret != UEC_OK) {
1370 USB_HILOGW(MODULE_USB_SERVICE, "ExecuteManageInterfaceType open fail ret = %{public}d", ret);
1371 }
1372 }
1373 for (const auto &dev : disableType) {
1374 if (!dev.isDeviceType) {
1375 ExecuteManageDeviceType(disableType, disable, g_typeMap, false);
1376 } else {
1377 ExecuteManageDeviceType(disableType, disable, d_typeMap, true);
1378 }
1379 }
1380 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1381 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1382 int32_t ret = Close(dev.busNum, dev.devAddr);
1383 if (ret != UEC_OK) {
1384 USB_HILOGW(MODULE_USB_SERVICE, "ExecuteManageInterfaceType close fail ret = %{public}d", ret);
1385 }
1386 }
1387 return UEC_OK;
1388 }
1389
GetEdmPolicy(bool & IsGlobalDisabled,std::vector<UsbDeviceType> & disableType,std::vector<UsbDeviceId> & trustUsbDeviceIds)1390 int32_t UsbHostManager::GetEdmPolicy(bool &IsGlobalDisabled, std::vector<UsbDeviceType> &disableType,
1391 std::vector<UsbDeviceId> &trustUsbDeviceIds)
1392 {
1393 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1394 if (sm == nullptr) {
1395 USB_HILOGE(MODULE_USB_SERVICE, "fail to get SystemAbilityManager");
1396 return UEC_SERVICE_GET_SYSTEM_ABILITY_MANAGER_FAILED;
1397 }
1398 sptr<IRemoteObject> remote = sm->CheckSystemAbility(EDM_SYSTEM_ABILITY_ID);
1399 if (remote == nullptr) {
1400 USB_HILOGE(MODULE_USB_SERVICE, "Get Edm SystemAbility failed.");
1401 return UEC_SERVICE_GET_EDM_SERVICE_FAILED;
1402 }
1403 int32_t ret = GetEdmGlobalPolicy(remote, IsGlobalDisabled);
1404 if (ret != UEC_OK) {
1405 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmGlobalPolicy failed.");
1406 return ret;
1407 }
1408 ret = GetEdmStroageTypePolicy(remote, disableType);
1409 if (ret != UEC_OK) {
1410 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmStroageTypePolicy failed.");
1411 return ret;
1412 }
1413 ret = GetEdmTypePolicy(remote, disableType);
1414 if (ret != UEC_OK) {
1415 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed.");
1416 return ret;
1417 }
1418 ret = GetEdmWhiteListPolicy(remote, trustUsbDeviceIds);
1419 if (ret != UEC_OK) {
1420 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed.");
1421 return ret;
1422 }
1423 return UEC_OK;
1424 }
1425
GetUsbPolicy(bool & IsGlobalDisabled,std::vector<UsbDeviceType> & disableType,std::vector<UsbDeviceId> & trustUsbDeviceIds)1426 int32_t UsbHostManager::GetUsbPolicy(bool &IsGlobalDisabled, std::vector<UsbDeviceType> &disableType,
1427 std::vector<UsbDeviceId> &trustUsbDeviceIds)
1428 {
1429 auto startTime = std::chrono::steady_clock::now();
1430 bool isPolicyObtained = false;
1431 while (!isPolicyObtained) {
1432 int32_t ret = GetEdmPolicy(IsGlobalDisabled, disableType, trustUsbDeviceIds);
1433 if (ret == UEC_OK) {
1434 USB_HILOGI(MODULE_USB_SERVICE, "GetUsbPolicy succeed");
1435 break;
1436 } else if (ret == EDM_SA_TIME_OUT_CODE) {
1437 auto currentTime = std::chrono::steady_clock::now();
1438 auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startTime).count();
1439 if (elapsedTime >= EDM_SA_MAX_TIME_OUT) {
1440 USB_HILOGE(MODULE_USB_SERVICE, "Time out, exit loop");
1441 return UEC_SERVICE_EDM_SA_TIME_OUT_FAILED;
1442 }
1443 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1444 } else {
1445 USB_HILOGE(MODULE_USB_SERVICE, "EDM sa failed");
1446 return UEC_SERVICE_PREPARE_EDM_SA_FAILED;
1447 }
1448 }
1449 return UEC_OK;
1450 }
1451
GetEdmTypePolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceType> & disableType)1452 int32_t UsbHostManager::GetEdmTypePolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceType> &disableType)
1453 {
1454 if (remote == nullptr) {
1455 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1456 return UEC_SERVICE_INVALID_VALUE;
1457 }
1458 MessageParcel data;
1459 MessageParcel reply;
1460 MessageOption option;
1461 data.WriteInterfaceToken(DESCRIPTOR);
1462 data.WriteInt32(WITHOUT_USERID);
1463 data.WriteString("");
1464 data.WriteInt32(WITHOUT_ADMIN);
1465 uint32_t funcCode = (1 << EMD_MASK_CODE) | USB_DEVICE_ACCESS_POLICY;
1466 int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1467 int32_t ret = ERR_INVALID_VALUE;
1468 bool isSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1469 if (!isSuccess || (sendRet != UEC_OK)) {
1470 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmTypePolicy failed. sendRet = %{public}d, ret = %{public}d",
1471 sendRet, ret);
1472 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1473 }
1474
1475 int32_t size = reply.ReadInt32();
1476 if (size > WHITELIST_POLICY_MAX_DEVICES) {
1477 USB_HILOGE(MODULE_USB_SERVICE, "EdmTypeList size=[%{public}d] is too large", size);
1478 return UEC_SERVICE_EDM_DEVICE_SIZE_EXCEED;
1479 }
1480 USB_HILOGI(MODULE_USB_SERVICE, "GetEdmTypePolicy return size:%{public}d", size);
1481 for (int32_t i = 0; i < size; i++) {
1482 UsbDeviceType usbDeviceType;
1483 usbDeviceType.baseClass = reply.ReadInt32();
1484 usbDeviceType.subClass = reply.ReadInt32();
1485 usbDeviceType.protocol = reply.ReadInt32();
1486 usbDeviceType.isDeviceType = reply.ReadBool();
1487 disableType.emplace_back(usbDeviceType);
1488 }
1489 return UEC_OK;
1490 }
1491
GetEdmGlobalPolicy(sptr<IRemoteObject> remote,bool & IsGlobalDisabled)1492 int32_t UsbHostManager::GetEdmGlobalPolicy(sptr<IRemoteObject> remote, bool &IsGlobalDisabled)
1493 {
1494 if (remote == nullptr) {
1495 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1496 return UEC_SERVICE_INVALID_VALUE;
1497 }
1498 MessageParcel data;
1499 MessageParcel reply;
1500 MessageOption option;
1501 data.WriteInterfaceToken(DESCRIPTOR);
1502 data.WriteInt32(WITHOUT_USERID);
1503 data.WriteString("");
1504 data.WriteInt32(WITHOUT_ADMIN);
1505 uint32_t funcCode = (1 << EMD_MASK_CODE) | DISABLE_USB;
1506 int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1507 int32_t ret = ERR_INVALID_VALUE;
1508 bool isSuccess = reply.ReadInt32(ret) && (ret == UEC_OK);
1509 if (!isSuccess || (sendRet != UEC_OK)) {
1510 USB_HILOGE(MODULE_USB_SERVICE, "GetGlobalPolicy failed. sendRet = %{public}d, ret = %{public}d",
1511 sendRet, ret);
1512 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1513 }
1514
1515 reply.ReadBool(IsGlobalDisabled);
1516 return UEC_OK;
1517 }
1518
GetEdmStroageTypePolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceType> & disableType)1519 int32_t UsbHostManager::GetEdmStroageTypePolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceType> &disableType)
1520 {
1521 if (remote == nullptr) {
1522 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1523 return UEC_SERVICE_INVALID_VALUE;
1524 }
1525 int32_t stroageDisableType = 0;
1526 MessageParcel data;
1527 MessageParcel reply;
1528 MessageOption option;
1529 data.WriteInterfaceToken(DESCRIPTOR);
1530 data.WriteInt32(WITHOUT_USERID);
1531 data.WriteString("");
1532 data.WriteInt32(WITHOUT_ADMIN);
1533 uint32_t funcCode = (1 << EMD_MASK_CODE) | USB_STORAGE_DEVICE_ACCESS_POLICY;
1534 int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1535 int32_t ret = ERR_INVALID_VALUE;
1536 bool isSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1537 if (!isSuccess || (sendRet != UEC_OK)) {
1538 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmStroageTypePolicy failed. sendRet = %{public}d, ret = %{public}d",
1539 sendRet, ret);
1540 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1541 }
1542
1543 reply.ReadInt32(stroageDisableType);
1544 if (stroageDisableType == GET_EDM_STORAGE_DISABLE_TYPE) {
1545 UsbDeviceType usbDeviceType;
1546 usbDeviceType.baseClass = STORAGE_BASE_CLASS;
1547 usbDeviceType.isDeviceType = 0;
1548 disableType.emplace_back(usbDeviceType);
1549 }
1550 return UEC_OK;
1551 }
1552
GetEdmWhiteListPolicy(sptr<IRemoteObject> remote,std::vector<UsbDeviceId> & trustUsbDeviceIds)1553 int32_t UsbHostManager::GetEdmWhiteListPolicy(sptr<IRemoteObject> remote, std::vector<UsbDeviceId> &trustUsbDeviceIds)
1554 {
1555 if (remote == nullptr) {
1556 USB_HILOGE(MODULE_USB_SERVICE, "Remote is nullpter.");
1557 return UEC_SERVICE_INVALID_VALUE;
1558 }
1559 MessageParcel data;
1560 MessageParcel reply;
1561 MessageOption option;
1562 data.WriteInterfaceToken(DESCRIPTOR);
1563 data.WriteInt32(WITHOUT_USERID);
1564 data.WriteString("");
1565 data.WriteInt32(WITHOUT_ADMIN);
1566 uint32_t funcCode = (1 << EMD_MASK_CODE) | ALLOWED_USB_DEVICES;
1567 int32_t sendRet = remote->SendRequest(funcCode, data, reply, option);
1568 int32_t ret = ERR_INVALID_VALUE;
1569 bool IsSuccess = reply.ReadInt32(ret) && (ret == ERR_OK);
1570 if (!IsSuccess || (sendRet != UEC_OK)) {
1571 USB_HILOGE(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy failed. sendRet = %{public}d, ret = %{public}d",
1572 sendRet, ret);
1573 return UEC_SERVICE_EDM_SEND_REQUEST_FAILED;
1574 }
1575
1576 int32_t size = reply.ReadInt32();
1577 if (size > WHITELIST_POLICY_MAX_DEVICES) {
1578 USB_HILOGE(MODULE_USB_SERVICE, "EdmWhiteList size=[%{public}d] is too large", size);
1579 return UEC_SERVICE_EDM_DEVICE_SIZE_EXCEED;
1580 }
1581 USB_HILOGI(MODULE_USB_SERVICE, "GetEdmWhiteListPolicy return size:%{public}d", size);
1582 for (int32_t i = 0; i < size; i++) {
1583 UsbDeviceId usbDeviceId;
1584 usbDeviceId.vendorId = reply.ReadInt32();
1585 usbDeviceId.productId = reply.ReadInt32();
1586 trustUsbDeviceIds.emplace_back(usbDeviceId);
1587 }
1588 return UEC_OK;
1589 }
1590
ManageInterface(const HDI::Usb::V1_0::UsbDev & dev,uint8_t interfaceId,bool disable)1591 int32_t UsbHostManager::ManageInterface(const HDI::Usb::V1_0::UsbDev &dev, uint8_t interfaceId, bool disable)
1592 {
1593 #ifdef USB_MANAGER_PASS_THROUGH
1594 if (usbHostInterface_ == nullptr) {
1595 USB_HILOGE(MODULE_SERVICE, "UsbHostManager::ManageInterface usbHostInterface_ is nullptr");
1596 return UEC_SERVICE_INVALID_VALUE;
1597 }
1598 const HDI::Usb::V2_0::UsbDev &usbDev_ = reinterpret_cast<const HDI::Usb::V2_0::UsbDev &>(dev);
1599 return usbHostInterface_->ManageInterface(usbDev_, interfaceId, disable);
1600 #else
1601 if (usbd_ == nullptr) {
1602 USB_HILOGE(MODULE_USB_SERVICE, "usbd_ is nullptr");
1603 return UEC_SERVICE_INVALID_VALUE;
1604 }
1605 return usbd_->ManageInterface(dev, interfaceId, disable);
1606 #endif // USB_MANAGER_PASS_THROUGH
1607 }
1608
ExecuteManageDeviceType(const std::vector<UsbDeviceType> & disableType,bool disable,const std::unordered_map<InterfaceType,std::vector<int32_t>> & map,bool isDev)1609 void UsbHostManager::ExecuteManageDeviceType(const std::vector<UsbDeviceType> &disableType, bool disable,
1610 const std::unordered_map<InterfaceType, std::vector<int32_t>> &map, bool isDev)
1611 {
1612 std::vector<InterfaceType> interfaceTypes;
1613 for (const auto &dev : disableType) {
1614 bool isMatch = false;
1615 for (auto& [interfaceTypeValues, typeValues] : map) {
1616 if ((typeValues[0] == dev.baseClass) &&
1617 (typeValues[1] == -1 || typeValues[1] == dev.subClass) &&
1618 (typeValues[HALF] == -1 || typeValues[HALF] == dev.protocol)) {
1619 isMatch = true;
1620 interfaceTypes.emplace_back(interfaceTypeValues);
1621 break;
1622 }
1623 }
1624 if (!isMatch) {
1625 USB_HILOGE(MODULE_USB_SERVICE, "is not in the type list, %{public}d, %{public}d, %{public}d",
1626 dev.baseClass, dev.subClass, dev.protocol);
1627 }
1628 }
1629
1630 for (auto& [interfaceTypeValues, typeValues] : map) {
1631 bool canFind = false;
1632 for (auto disallowedValues : interfaceTypes) {
1633 if (interfaceTypeValues == disallowedValues) {
1634 canFind = true;
1635 break;
1636 }
1637 }
1638 if ((!isDev) && canFind) {
1639 ManageInterfaceTypeImpl(interfaceTypeValues, disable);
1640 }
1641 if ((!isDev) && (!canFind)) {
1642 ManageInterfaceTypeImpl(interfaceTypeValues, !disable);
1643 }
1644 if (isDev && canFind) {
1645 ManageDeviceTypeImpl(interfaceTypeValues, disable);
1646 }
1647 if (isDev && !canFind) {
1648 ManageDeviceTypeImpl(interfaceTypeValues, !disable);
1649 }
1650 }
1651 }
1652
ManageGlobalInterfaceImpl(bool disable)1653 int32_t UsbHostManager::ManageGlobalInterfaceImpl(bool disable)
1654 {
1655 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
1656 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1657 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1658 uint8_t configIndex = 0;
1659 if (OpenDevice(dev.busNum, dev.devAddr) != UEC_OK) {
1660 USB_HILOGW(MODULE_USB_SERVICE, "ManageGlobalInterfaceImpl OpenDevice failed");
1661 continue;
1662 }
1663 if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1664 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1665 Close(dev.busNum, dev.devAddr);
1666 continue;
1667 }
1668 USBConfig configs;
1669 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1670 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1671 Close(dev.busNum, dev.devAddr);
1672 continue;
1673 }
1674
1675 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1676 for (uint32_t i = 0; i < interfaces.size(); i++) {
1677 ManageInterface(dev, interfaces[i].GetId(), disable);
1678 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1679 }
1680 if (Close(dev.busNum, dev.devAddr) != UEC_OK) {
1681 USB_HILOGW(MODULE_USB_SERVICE, "ManageGlobalInterfaceImpl CloseDevice fail");
1682 }
1683 }
1684 return UEC_OK;
1685 }
1686
ManageDeviceImpl(int32_t vendorId,int32_t productId,bool disable)1687 int32_t UsbHostManager::ManageDeviceImpl(int32_t vendorId, int32_t productId, bool disable)
1688 {
1689 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu, vId: %{public}d, pId: %{public}d, b: %{public}d",
1690 devices_.size(), vendorId, productId, disable);
1691 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1692 if ((it->second->GetVendorId() == vendorId) && (it->second->GetProductId() == productId)) {
1693 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1694 uint8_t configIndex = 0;
1695 if (OpenDevice(dev.busNum, dev.devAddr) != UEC_OK) {
1696 USB_HILOGW(MODULE_USB_SERVICE, "ManageDeviceImpl open fail");
1697 continue;
1698 }
1699 if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1700 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1701 Close(dev.busNum, dev.devAddr);
1702 continue;
1703 }
1704 USBConfig configs;
1705 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1706 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1707 Close(dev.busNum, dev.devAddr);
1708 continue;
1709 }
1710 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1711 for (uint32_t i = 0; i < interfaces.size(); i++) {
1712 ManageInterface(dev, interfaces[i].GetId(), disable);
1713 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1714 }
1715 if (Close(dev.busNum, dev.devAddr) != UEC_OK) {
1716 USB_HILOGW(MODULE_USB_SERVICE, "ManageDeviceImpl Close fail");
1717 }
1718 }
1719 }
1720 return UEC_OK;
1721 }
1722
ManageInterfaceTypeImpl(InterfaceType interfaceType,bool disable)1723 int32_t UsbHostManager::ManageInterfaceTypeImpl(InterfaceType interfaceType, bool disable)
1724 {
1725 auto iterInterface = g_typeMap.find(interfaceType);
1726 if (iterInterface == g_typeMap.end()) {
1727 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::not find interface type");
1728 return UEC_SERVICE_INVALID_VALUE;
1729 }
1730 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1731 UsbDev dev = {it->second->GetBusNum(), it->second->GetDevAddr()};
1732 uint8_t configIndex = 0;
1733 if (GetActiveConfig(dev.busNum, dev.devAddr, configIndex) || (configIndex < 1)) {
1734 USB_HILOGW(MODULE_USB_SERVICE, "get device active config failed.");
1735 continue;
1736 }
1737 USBConfig configs;
1738 if (it->second->GetConfig(static_cast<uint8_t>(configIndex) - 1, configs)) {
1739 USB_HILOGW(MODULE_USB_SERVICE, "get device config info failed.");
1740 continue;
1741 }
1742 std::vector<UsbInterface> interfaces = configs.GetInterfaces();
1743
1744 for (uint32_t i = 0; i < interfaces.size(); i++) {
1745 // 0 indicate base class, 1 indicate subclass, 2 indicate protocal. -1 indicate any value.
1746 if ((interfaces[i].GetClass() == iterInterface->second[BASECLASS_INDEX]) && (interfaces[i].GetSubClass() ==
1747 iterInterface->second[SUBCLASS_INDEX] || iterInterface->second[SUBCLASS_INDEX] ==
1748 RANDOM_VALUE_INDICATE) && (interfaces[i].GetProtocol() == iterInterface->second[PROTOCAL_INDEX] ||
1749 iterInterface->second[PROTOCAL_INDEX] == RANDOM_VALUE_INDICATE)) {
1750 ManageInterface(dev, interfaces[i].GetId(), disable);
1751 USB_HILOGI(MODULE_USB_SERVICE, "size %{public}zu, interfaceType: %{public}d, disable: %{public}d",
1752 devices_.size(), static_cast<int32_t>(interfaceType), disable);
1753 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1754 }
1755 }
1756 }
1757 return UEC_OK;
1758 }
1759
ManageDeviceTypeImpl(InterfaceType interfaceType,bool disable)1760 int32_t UsbHostManager::ManageDeviceTypeImpl(InterfaceType interfaceType, bool disable)
1761 {
1762 auto iterInterface = g_typeMap.find(interfaceType);
1763 if (iterInterface == g_typeMap.end()) {
1764 USB_HILOGE(MODULE_USB_SERVICE, "UsbHostManager::not find interface type");
1765 return UEC_SERVICE_INVALID_VALUE;
1766 }
1767 for (auto it = devices_.begin(); it != devices_.end(); ++it) {
1768 if ((it->second->GetClass() == iterInterface->second[BASECLASS_INDEX]) && (it->second->GetSubclass() ==
1769 iterInterface->second[SUBCLASS_INDEX] || iterInterface->second[SUBCLASS_INDEX] ==
1770 RANDOM_VALUE_INDICATE) && (it->second->GetProtocol() == iterInterface->second[PROTOCAL_INDEX] ||
1771 iterInterface->second[PROTOCAL_INDEX] == RANDOM_VALUE_INDICATE)) {
1772 ManageDeviceImpl(it->second->GetVendorId(), it->second->GetProductId(), disable);
1773 USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu, interfaceType: %{public}d, disable: %{public}d",
1774 devices_.size(), static_cast<int32_t>(interfaceType), disable);
1775 std::this_thread::sleep_for(std::chrono::milliseconds(MANAGE_INTERFACE_INTERVAL));
1776 }
1777 }
1778 return UEC_OK;
1779 }
1780 } // namespace USB
1781 } // namespace OHOS