1 /*
2 * Copyright (c) 2021 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
16 #include "usb_service.h"
17 #include <cstdio>
18 #include <iostream>
19 #include <ipc_skeleton.h>
20 #include <sstream>
21 #include <string>
22 #include <unistd.h>
23 #include "bundle_mgr_interface.h"
24 #include "bundle_mgr_proxy.h"
25 #include "file_ex.h"
26 #include "if_system_ability_manager.h"
27 #include "iservice_registry.h"
28 #include "iusb_srv.h"
29 #include "securec.h"
30 #include "system_ability_definition.h"
31 #include "usb_common.h"
32 #include "usb_descriptor_parser.h"
33 #include "usb_errors.h"
34 #include "usb_port_manager.h"
35 #include "usb_right_manager.h"
36
37 namespace OHOS {
38 namespace USB {
39 namespace {
40 const std::string USB_SERVICE_NAME = "UsbService";
41 constexpr int32_t COMMEVENT_REGISTER_RETRY_TIMES = 10;
42 constexpr int32_t COMMEVENT_REGISTER_WAIT_DELAY_US = 20000;
43 const uint32_t CURSOR_INIT = 18;
44 const int32_t DESCRIPTOR_TYPE_STRING = 3;
45 const int32_t DESCRIPTOR_VALUE_START_OFFSET = 2;
46 const int32_t HALF = 2;
47 const int32_t BIT_SHIFT_4 = 4;
48 const int32_t BIT_HIGH_4 = 0xF0;
49 const int32_t BIT_LOW_4 = 0x0F;
50 const int32_t SERVICE_STARTUP_MAX_TIME = 30;
51 } // namespace
52
53 auto pms = DelayedSpSingleton<UsbService>::GetInstance();
54 const bool G_REGISTER_RESULT =
55 SystemAbility::MakeAndRegisterAbility(DelayedSpSingleton<UsbService>::GetInstance().GetRefPtr());
56
UsbService()57 UsbService::UsbService() : SystemAbility(USB_SYSTEM_ABILITY_ID, true)
58 {
59 usbHostManger_ = std::make_shared<UsbHostManager>(nullptr);
60 usbRightManager_ = std::make_shared<UsbRightManager>();
61 usbPortManager_ = std::make_shared<UsbPortManager>();
62 }
~UsbService()63 UsbService::~UsbService() {}
64
OnStart()65 void UsbService::OnStart()
66 {
67 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d usb_service OnStart enter", __func__, __LINE__);
68 if (ready_) {
69 USB_HILOGE(MODULE_USB_SERVICE, "OnStart is ready, nothing to do");
70 return;
71 }
72
73 if (!(Init())) {
74 USB_HILOGE(MODULE_USB_SERVICE, "OnStart call init fail");
75 return;
76 }
77
78 // wait for the usbd service to start and bind usb service and usbd service
79 int32_t retryTimes = 0;
80 while (retryTimes < SERVICE_STARTUP_MAX_TIME) {
81 if (InitUsbd() != 0) {
82 break;
83 }
84 sleep(1);
85 retryTimes++;
86
87 if (retryTimes == SERVICE_STARTUP_MAX_TIME) {
88 USB_HILOGE(MODULE_USB_SERVICE, "OnStart call initUsbd fail");
89 return;
90 }
91 }
92
93 usbPortManager_->Init();
94 ready_ = true;
95 USB_HILOGE(MODULE_USB_SERVICE, "OnStart and add system ability success");
96 }
97
Init()98 bool UsbService::Init()
99 {
100 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d usb_service Init enter", __func__, __LINE__);
101 if (!eventRunner_) {
102 eventRunner_ = AppExecFwk::EventRunner::Create(USB_SERVICE_NAME);
103 if (eventRunner_ == nullptr) {
104 USB_HILOGE(MODULE_USB_SERVICE, "Init failed due to create EventRunner");
105 return false;
106 }
107 }
108 if (!handler_) {
109 handler_ = std::make_shared<UsbServerEventHandler>(eventRunner_, pms);
110 if (handler_ == nullptr) {
111 USB_HILOGE(MODULE_USB_SERVICE, "Init failed due to create handler error");
112 return false;
113 }
114 if (!Publish(pms)) {
115 USB_HILOGE(MODULE_USB_SERVICE, "OnStart register to system ability manager failed.");
116 return false;
117 }
118 }
119 while (commEventRetryTimes_ <= COMMEVENT_REGISTER_RETRY_TIMES) {
120 if (!IsCommonEventServiceAbilityExist()) {
121 ++commEventRetryTimes_;
122 usleep(COMMEVENT_REGISTER_WAIT_DELAY_US);
123 } else {
124 commEventRetryTimes_ = 0;
125 break;
126 }
127 }
128 USB_HILOGE(MODULE_USB_SERVICE, "Init success");
129 return true;
130 }
131
InitUsbd()132 bool UsbService::InitUsbd()
133 {
134 usbdSubscriber_ = new UsbServiceSubscriber();
135 ErrCode ret = UsbdClient::GetInstance().BindUsbdSubscriber(usbdSubscriber_);
136 USB_HILOGE(MODULE_USB_SERVICE, " entry InitUsbd ret: %{public}d", ret);
137 return SUCCEEDED(ret);
138 }
139
OnStop()140 void UsbService::OnStop()
141 {
142 USB_HILOGE(MODULE_USB_SERVICE, " entry stop service %{public}d", ready_);
143 if (!ready_) {
144 return;
145 }
146 eventRunner_.reset();
147 handler_.reset();
148 ready_ = false;
149 UsbdClient::GetInstance().UnbindUsbdSubscriber(usbdSubscriber_);
150 }
151
IsCommonEventServiceAbilityExist()152 bool UsbService::IsCommonEventServiceAbilityExist()
153 {
154 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
155 if (!sm) {
156 USB_HILOGE(MODULE_USB_SERVICE,
157 "IsCommonEventServiceAbilityExist Get ISystemAbilityManager "
158 "failed, no SystemAbilityManager");
159 return false;
160 }
161 sptr<IRemoteObject> remote = sm->CheckSystemAbility(COMMON_EVENT_SERVICE_ABILITY_ID);
162 if (!remote) {
163 USB_HILOGE(MODULE_USB_SERVICE, "No CesServiceAbility");
164 return false;
165 }
166 return true;
167 }
OpenDevice(uint8_t busNum,uint8_t devAddr)168 int32_t UsbService::OpenDevice(uint8_t busNum, uint8_t devAddr)
169 {
170 std::string name = std::to_string(busNum) + "-" + std::to_string(devAddr);
171 int32_t ret = UsbService::HasRight(name);
172 if (UEC_OK == ret) {
173 const UsbDev dev = {busNum, devAddr};
174 ret = UsbdClient::GetInstance().OpenDevice(dev);
175 if (UEC_OK != ret) {
176 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d OpenDevice failed ret:%{public}d", __func__, __LINE__,
177 ret);
178 }
179 } else {
180 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d No permission ret:%{public}d", __func__, __LINE__, ret);
181 ret = UEC_SERVICE_PERMISSION_DENIED;
182 }
183 return ret;
184 }
HasRight(std::string deviceName)185 int32_t UsbService::HasRight(std::string deviceName)
186 {
187 USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager HasRight");
188 std::string bundleName;
189 if (GetBundleName(bundleName)) {
190 USB_HILOGI(MODULE_USB_SERVICE, "HasRight bundleName = %{public}s", bundleName.c_str());
191 return usbRightManager_->HasRight(deviceName, bundleName);
192 }
193 USB_HILOGE(MODULE_USB_SERVICE, "HasRight GetBundleName false");
194 return UEC_SERVICE_INNER_ERR;
195 }
196
RequestRight(std::string deviceName)197 int32_t UsbService::RequestRight(std::string deviceName)
198 {
199 USB_HILOGI(MODULE_USB_SERVICE, "calling usbRightManager RequestRight");
200 std::string bundleName;
201 if (GetBundleName(bundleName)) {
202 USB_HILOGI(MODULE_USB_SERVICE, "RequestRight bundleName = %{public}s", bundleName.c_str());
203 return usbRightManager_->RequestRight(deviceName, bundleName);
204 }
205 USB_HILOGI(MODULE_USB_SERVICE, "RequestRight GetBundleName false");
206 return UEC_SERVICE_INNER_ERR;
207 }
208
RemoveRight(std::string deviceName)209 int32_t UsbService::RemoveRight(std::string deviceName)
210 {
211 if (usbRightManager_->RemoveDeviceRight(deviceName)) {
212 return UEC_OK;
213 }
214 return UEC_SERVICE_INNER_ERR;
215 }
216
GetDevices(std::vector<UsbDevice> & deviceList)217 int32_t UsbService::GetDevices(std::vector<UsbDevice> &deviceList)
218 {
219 std::map<std::string, UsbDevice *> devices;
220 usbHostManger_->GetDevices(devices);
221 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s list size %{public}d", __func__, devices.size());
222 for (auto it = devices.begin(); it != devices.end(); ++it) {
223 deviceList.push_back(*it->second);
224 }
225 return UEC_OK;
226 }
227
GetCurrentFunctions(int32_t & funcs)228 int32_t UsbService::GetCurrentFunctions(int32_t &funcs)
229 {
230 return UsbdClient::GetInstance().GetCurrentFunctions(funcs);
231 }
232
SetCurrentFunctions(int32_t funcs)233 int32_t UsbService::SetCurrentFunctions(int32_t funcs)
234 {
235 USB_HILOGI(MODULE_USB_SERVICE, "func = %{public}d", funcs);
236 return UsbdClient::GetInstance().SetCurrentFunctions(funcs);
237 }
238
UsbFunctionsFromString(std::string funcs)239 int32_t UsbService::UsbFunctionsFromString(std::string funcs)
240 {
241 USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsFromString");
242 return UsbFunctionManager::FromStringFunctions(funcs);
243 }
244
UsbFunctionsToString(int32_t funcs)245 std::string UsbService::UsbFunctionsToString(int32_t funcs)
246 {
247 USB_HILOGI(MODULE_USB_SERVICE, "calling UsbFunctionsToString");
248 return UsbFunctionManager::ToStringFunctions(funcs);
249 }
250
GetPorts(std::vector<UsbPort> & ports)251 int32_t UsbService::GetPorts(std::vector<UsbPort> &ports)
252 {
253 USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getPorts");
254 return usbPortManager_->GetPorts(ports);
255 }
256
GetSupportedModes(int32_t portId,int32_t & supportedModes)257 int32_t UsbService::GetSupportedModes(int32_t portId, int32_t &supportedModes)
258 {
259 USB_HILOGI(MODULE_USB_SERVICE, "calling usbPortManager getSupportedModes");
260 return usbPortManager_->GetSupportedModes(portId, supportedModes);
261 }
262
SetPortRole(int32_t portId,int32_t powerRole,int32_t dataRole)263 int32_t UsbService::SetPortRole(int32_t portId, int32_t powerRole, int32_t dataRole)
264 {
265 USB_HILOGI(MODULE_USB_SERVICE, "calling usbd getPorts");
266 return UsbdClient::GetInstance().SetPortRole(portId, powerRole, dataRole);
267 }
268
ClaimInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface,uint8_t force)269 int32_t UsbService::ClaimInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface, uint8_t force)
270 {
271 const UsbDev dev = {busNum, devAddr};
272 return UsbdClient::GetInstance().ClaimInterface(dev, interface, force);
273 }
ReleaseInterface(uint8_t busNum,uint8_t devAddr,uint8_t interface)274 int32_t UsbService::ReleaseInterface(uint8_t busNum, uint8_t devAddr, uint8_t interface)
275 {
276 const UsbDev dev = {busNum, devAddr};
277 return UsbdClient::GetInstance().ReleaseInterface(dev, interface);
278 }
BulkTransferRead(const UsbDev & devInfo,const UsbPipe & pipe,std::vector<uint8_t> & bufferData,int32_t timeOut)279 int32_t UsbService::BulkTransferRead(const UsbDev &devInfo, const UsbPipe &pipe, std::vector<uint8_t> &bufferData,
280 int32_t timeOut)
281 {
282 int32_t ret = UsbdClient::GetInstance().BulkTransferRead(devInfo, pipe, timeOut, bufferData);
283 if (UEC_OK != ret) {
284 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkTransferRead error ret:%{public}d", __func__,
285 __LINE__, ret);
286 }
287 return ret;
288 }
BulkTransferWrite(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & bufferData,int32_t timeOut)289 int32_t UsbService::BulkTransferWrite(const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &bufferData,
290 int32_t timeOut)
291 {
292 int32_t ret = UsbdClient::GetInstance().BulkTransferWrite(dev, pipe, timeOut, bufferData);
293 if (UEC_OK != ret) {
294 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkTransferWrite error ret:%{public}d", __func__,
295 __LINE__, ret);
296 }
297 return ret;
298 }
ControlTransfer(const UsbDev & dev,const UsbCtrlTransfer & ctrl,std::vector<uint8_t> & bufferData)299 int32_t UsbService::ControlTransfer(const UsbDev &dev, const UsbCtrlTransfer &ctrl, std::vector<uint8_t> &bufferData)
300 {
301 int32_t ret = UsbdClient::GetInstance().ControlTransfer(dev, ctrl, bufferData);
302 if (UEC_OK != ret) {
303 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
304 }
305 return ret;
306 }
SetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t configIndex)307 int32_t UsbService::SetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t configIndex)
308 {
309 const UsbDev dev = {busNum, devAddr};
310 return UsbdClient::GetInstance().SetConfig(dev, configIndex);
311 }
GetActiveConfig(uint8_t busNum,uint8_t devAddr,uint8_t & configIndex)312 int32_t UsbService::GetActiveConfig(uint8_t busNum, uint8_t devAddr, uint8_t &configIndex)
313 {
314 const UsbDev dev = {busNum, devAddr};
315 return UsbdClient::GetInstance().GetConfig(dev, configIndex);
316 }
SetInterface(uint8_t busNum,uint8_t devAddr,uint8_t interfaceid,uint8_t altIndex)317 int32_t UsbService::SetInterface(uint8_t busNum, uint8_t devAddr, uint8_t interfaceid, uint8_t altIndex)
318 {
319 const UsbDev dev = {busNum, devAddr};
320 return UsbdClient::GetInstance().SetInterface(dev, interfaceid, altIndex);
321 }
GetRawDescriptor(uint8_t busNum,uint8_t devAddr,std::vector<uint8_t> & bufferData)322 int32_t UsbService::GetRawDescriptor(uint8_t busNum, uint8_t devAddr, std::vector<uint8_t> &bufferData)
323 {
324 const UsbDev dev = {busNum, devAddr};
325 int32_t ret = UsbdClient::GetInstance().GetRawDescriptor(dev, bufferData);
326 if (UEC_OK != ret) {
327 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
328 }
329 return ret;
330 }
GetFileDescriptor(uint8_t busNum,uint8_t devAddr,int32_t & fd)331 int32_t UsbService::GetFileDescriptor(uint8_t busNum, uint8_t devAddr, int32_t &fd)
332 {
333 const UsbDev dev = {busNum, devAddr};
334 int32_t ret = UsbdClient::GetInstance().GetFileDescriptor(dev, fd);
335 if (UEC_OK != ret) {
336 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
337 }
338 return ret;
339 }
340
RequestQueue(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & bufferData)341 int32_t UsbService::RequestQueue(const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &clientData,
342 const std::vector<uint8_t> &bufferData)
343 {
344 int32_t ret = UsbdClient::GetInstance().RequestQueue(dev, pipe, clientData, bufferData);
345 if (UEC_OK != ret) {
346 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
347 }
348 return ret;
349 }
RequestWait(const UsbDev & dev,int32_t timeOut,std::vector<uint8_t> & clientData,std::vector<uint8_t> & bufferData)350 int32_t UsbService::RequestWait(const UsbDev &dev, int32_t timeOut, std::vector<uint8_t> &clientData,
351 std::vector<uint8_t> &bufferData)
352 {
353 int32_t ret = UsbdClient::GetInstance().RequestWait(dev, clientData, bufferData, timeOut);
354 if (UEC_OK != ret) {
355 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d error ret:%{public}d", __func__, __LINE__, ret);
356 }
357 return ret;
358 }
359
RequestCancel(uint8_t busNum,uint8_t devAddr,uint8_t interfaceId,uint8_t endpointId)360 int32_t UsbService::RequestCancel(uint8_t busNum, uint8_t devAddr, uint8_t interfaceId, uint8_t endpointId)
361 {
362 const UsbDev dev = {busNum, devAddr};
363 const UsbPipe pipe = {interfaceId, endpointId};
364 return UsbdClient::GetInstance().RequestCancel(dev, pipe);
365 }
366
Close(uint8_t busNum,uint8_t devAddr)367 int32_t UsbService::Close(uint8_t busNum, uint8_t devAddr)
368 {
369 const UsbDev dev = {busNum, devAddr};
370 return UsbdClient::GetInstance().CloseDevice(dev);
371 }
372
GetDevStringValFromIdx(uint8_t busNum,uint8_t devAddr,uint8_t idx)373 static std::string GetDevStringValFromIdx(uint8_t busNum, uint8_t devAddr, uint8_t idx)
374 {
375 const UsbDev dev = {busNum, devAddr};
376 std::vector<uint8_t> strV;
377 std::string string = " ";
378
379 if (idx == 0) {
380 return string;
381 }
382
383 int32_t ret = UsbdClient::GetInstance().GetStringDescriptor(dev, idx, strV);
384 if (ret != UEC_OK) {
385 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d get string[%{public}d] failed ret:%{public}d", __func__,
386 __LINE__, idx, ret);
387 return string;
388 }
389 uint32_t length = strV.size();
390 if ((length < DESCRIPTOR_VALUE_START_OFFSET) || (strV[1] != DESCRIPTOR_TYPE_STRING)) {
391 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d type or length error, len:%{public}d", __func__, __LINE__,
392 length);
393 return string;
394 }
395 uint16_t *tbuf = new uint16_t[length + 1]();
396 for (uint32_t i = 0; i < length - DESCRIPTOR_VALUE_START_OFFSET; ++i) {
397 tbuf[i] = strV[i + DESCRIPTOR_VALUE_START_OFFSET];
398 }
399 std::wstring wstr((wchar_t *)(tbuf), (length - DESCRIPTOR_VALUE_START_OFFSET) / HALF);
400 string = std::string(wstr.begin(), wstr.end());
401 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d getString idx:%{public}d String:%{public}s length:%{public}d",
402 __func__, __LINE__, idx, string.c_str(), length);
403 delete[] tbuf;
404 return string;
405 }
406
BcdToString(const std::vector<uint8_t> & bcd)407 static std::string BcdToString(const std::vector<uint8_t> &bcd)
408 {
409 std::string tstr;
410 for (uint32_t i = 0; i < bcd.size(); ++i) {
411 tstr += std::to_string((bcd[i] & BIT_HIGH_4) >> BIT_SHIFT_4);
412 tstr += std::to_string((bcd[i] & BIT_LOW_4));
413 }
414 return tstr;
415 }
416
FillDevStrings(UsbDevice & dev)417 static int32_t FillDevStrings(UsbDevice &dev)
418 {
419 uint8_t busNum;
420 uint8_t devAddr;
421 uint8_t offsetValue = 8;
422
423 busNum = dev.GetBusNum();
424 devAddr = dev.GetDevAddr();
425 uint16_t bcdDevice = dev.GetbcdDevice();
426 const std::vector<uint8_t> bcdData {(bcdDevice & 0xff), ((bcdDevice >> offsetValue) & 0xff)};
427 dev.SetVersion(BcdToString(bcdData));
428 dev.SetManufacturerName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiManufacturer()));
429 dev.SetProductName(GetDevStringValFromIdx(busNum, devAddr, dev.GetiProduct()));
430 dev.SetmSerial(GetDevStringValFromIdx(busNum, devAddr, dev.GetiSerialNumber()));
431 USB_HILOGI(MODULE_USB_SERVICE,
432 "%{public}s:%{public}d iSerial:%{public}d mSerial:%{public}s Manufactur:%{public}s product:%{public}s "
433 "version:%{public}s",
434 __func__, __LINE__, dev.GetiSerialNumber(), dev.GetmSerial().c_str(), dev.GetManufacturerName().c_str(),
435 dev.GetProductName().c_str(), dev.GetVersion().c_str());
436
437 std::vector<USBConfig> configs;
438 configs = dev.GetConfigs();
439 for (auto it = configs.begin(); it != configs.end(); ++it) {
440 it->SetName(GetDevStringValFromIdx(busNum, devAddr, it->GetiConfiguration()));
441 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d Config:%{public}d %{public}s", __func__, __LINE__,
442 it->GetiConfiguration(), it->GetName().c_str());
443 std::vector<UsbInterface> interfaces = it->GetInterfaces();
444 for (auto itIF = interfaces.begin(); itIF != interfaces.end(); ++itIF) {
445 itIF->SetName(GetDevStringValFromIdx(busNum, devAddr, itIF->GetiInterface()));
446 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d interface:%{public}d %{public}s", __func__, __LINE__,
447 itIF->GetiInterface(), itIF->GetName().c_str());
448 }
449 it->SetInterfaces(interfaces);
450 }
451 dev.SetConfigs(configs);
452
453 return UEC_OK;
454 }
455
GetDeviceInfoDescriptor(const UsbDev & uDev,std::vector<uint8_t> & decriptor,UsbDevice & dev)456 int32_t UsbService::GetDeviceInfoDescriptor(const UsbDev &uDev, std::vector<uint8_t> &decriptor, UsbDevice &dev)
457 {
458 int32_t ret = UsbdClient::GetInstance().GetRawDescriptor(uDev, decriptor);
459 if (ret != UEC_OK) {
460 UsbdClient::GetInstance().CloseDevice(uDev);
461 USB_HILOGE(MODULE_USB_SERVICE,
462 "%{public}s:%{public}d GetRawDescriptor failed ret=%{public}d busNum:%{public}d "
463 "devAddr:%{public}d",
464 __func__, __LINE__, ret, uDev.busNum, uDev.devAddr);
465 return ret;
466 }
467 uint8_t *buffer = decriptor.data();
468 uint32_t length = decriptor.size();
469 if ((!buffer) || (length == 0)) {
470 USB_HILOGE(MODULE_USB_SERVICE,
471 "%{public}s:%{public}d GetRawDescriptor failed len=%{public}d busNum:%{public}d "
472 "devAddr:%{public}d",
473 __func__, __LINE__, length, uDev.busNum, uDev.devAddr);
474 return UEC_SERVICE_INVALID_VALUE;
475 }
476 dev.SetBusNum(uDev.busNum);
477 dev.SetDevAddr(uDev.devAddr);
478 dev.SetName(std::to_string(uDev.busNum) + "-" + std::to_string(uDev.devAddr));
479
480 ret = UsbDescriptorParser::ParseDeviceDescriptor(buffer, length, dev);
481 if (ret != UEC_OK) {
482 UsbdClient::GetInstance().CloseDevice(uDev);
483 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s ParseDeviceDescriptor failed ret=%{public}d", __func__, ret);
484 return ret;
485 }
486 return ret;
487 }
488
GetConfigDescriptor(UsbDevice & dev,std::vector<uint8_t> & decriptor)489 int32_t UsbService::GetConfigDescriptor(UsbDevice &dev, std::vector<uint8_t> &decriptor)
490 {
491 std::vector<USBConfig> configs;
492 uint8_t *buffer = decriptor.data();
493 uint32_t length = decriptor.size();
494 uint32_t cursor = CURSOR_INIT;
495 int32_t ret = UEC_OK;
496 for (uint8_t i = 0; i < dev.GetDescConfigCount(); ++i) {
497 if (length <= cursor) {
498 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetConfigDescriptor[%{public}d] length=%{public}d",
499 __func__, __LINE__, i, length);
500 break;
501 }
502 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s GetConfigDescriptor length=%{public}d", __func__, length);
503 uint32_t configCursor = 0;
504 USBConfig config;
505 ret = UsbDescriptorParser::ParseConfigDescriptor(buffer + cursor, length - cursor, configCursor, config);
506 cursor += configCursor;
507 configs.push_back(config);
508 }
509 dev.SetConfigs(configs);
510 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d SetConfigs ret=%{public}d", __func__, __LINE__, ret);
511 ret = FillDevStrings(dev);
512 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d FillDevStrings ret=%{public}d", __func__, __LINE__, ret);
513 return ret;
514 }
515
GetDeviceInfo(uint8_t busNum,uint8_t devAddr,UsbDevice & dev)516 int32_t UsbService::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
517 {
518 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d busNum:%{public}d devAddr:%{public}d", __func__, __LINE__,
519 busNum, devAddr);
520 const UsbDev uDev = {busNum, devAddr};
521 std::vector<uint8_t> decriptor;
522
523 int32_t ret = UsbdClient::GetInstance().OpenDevice(uDev);
524 if (ret != UEC_OK) {
525 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s OpenDevice failed ret=%{public}d", __func__, ret);
526 return ret;
527 }
528
529 ret = GetDeviceInfoDescriptor(uDev, decriptor, dev);
530 if (ret != UEC_OK) {
531 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetDeviceInfoDescriptor ret=%{public}d", __func__,
532 __LINE__, ret);
533 }
534 ret = GetConfigDescriptor(dev, decriptor);
535 if (ret != UEC_OK) {
536 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d GetConfigDescriptor ret=%{public}d", __func__, __LINE__,
537 ret);
538 return ret;
539 }
540
541 UsbdClient::GetInstance().CloseDevice(uDev);
542 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s CloseDevice=%{public}s", __func__, dev.ToString().c_str());
543
544 return UEC_OK;
545 }
546
AddDevice(uint8_t busNum,uint8_t devAddr)547 bool UsbService::AddDevice(uint8_t busNum, uint8_t devAddr)
548 {
549 UsbDevice *devInfo = new UsbDevice();
550 memset_s(devInfo, sizeof(UsbDevice), 0, sizeof(UsbDevice));
551 int32_t ret = GetDeviceInfo(busNum, devAddr, *devInfo);
552 USB_HILOGI(MODULE_USB_SERVICE, "%{public}s:%{public}d GetDeviceInfo ret=%{public}d", __func__, __LINE__, ret);
553 if (ret == UEC_OK) {
554 usbHostManger_->AddDevice(devInfo);
555 return true;
556 }
557 delete devInfo;
558 return false;
559 }
DelDevice(uint8_t busNum,uint8_t devAddr)560 bool UsbService::DelDevice(uint8_t busNum, uint8_t devAddr)
561 {
562 USB_HILOGI(MODULE_USBD, "%{public}s:%{public}d entry", __func__, __LINE__);
563 int32_t ret = Close(busNum, devAddr);
564 if (ret != UEC_OK) {
565 USB_HILOGE(MODULE_USBD, "%{public}s:%{public}d Close device failed width ret = %{public}d", __func__, __LINE__,
566 ret);
567 }
568 return usbHostManger_->DelDevice(busNum, devAddr);
569 }
570
UpdateUsbPort(int32_t portId,int32_t powerRole,int32_t dataRole,int32_t mode)571 void UsbService::UpdateUsbPort(int32_t portId, int32_t powerRole, int32_t dataRole, int32_t mode)
572 {
573 usbPortManager_->UpdatePort(portId, powerRole, dataRole, mode);
574 }
575
GetBundleName(std::string & bundleName)576 bool UsbService::GetBundleName(std::string &bundleName)
577 {
578 #ifdef USB_RIGHT_TEST
579 bundleName = "com.usb.right";
580 return true;
581 #endif
582 pid_t uid = GetCallingUid();
583 sptr<ISystemAbilityManager> systemAbilityManager =
584 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
585 if (systemAbilityManager == nullptr) {
586 return false;
587 }
588 sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
589 if (remoteObject == nullptr) {
590 return false;
591 }
592
593 sptr<AppExecFwk::IBundleMgr> bundleMgr(new AppExecFwk::BundleMgrProxy(remoteObject));
594 if (bundleMgr == nullptr) {
595 return false;
596 }
597 bundleMgr->GetBundleNameForUid(uid, bundleName);
598 return true;
599 }
600
RegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe,const sptr<IRemoteObject> & cb)601 int32_t UsbService::RegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe, const sptr<IRemoteObject> &cb)
602 {
603 int32_t ret = UsbdClient::GetInstance().RegBulkCallback(devInfo, pipe, cb);
604 if (UEC_OK != ret) {
605 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d RegBulkCallback error ret:%{public}d", __func__, __LINE__,
606 ret);
607 }
608 return ret;
609 }
610
UnRegBulkCallback(const UsbDev & devInfo,const UsbPipe & pipe)611 int32_t UsbService::UnRegBulkCallback(const UsbDev &devInfo, const UsbPipe &pipe)
612 {
613 int32_t ret = UsbdClient::GetInstance().UnRegBulkCallback(devInfo, pipe);
614 if (UEC_OK != ret) {
615 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d UnRegBulkCallback error ret:%{public}d", __func__,
616 __LINE__, ret);
617 }
618 return ret;
619 }
620
BulkRead(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)621 int32_t UsbService::BulkRead(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
622 {
623 if (ashmem == nullptr) {
624 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkRead error ashmem", __func__, __LINE__);
625 return UEC_SERVICE_INVALID_VALUE;
626 }
627 int32_t ret = UsbdClient::GetInstance().BulkRead(devInfo, pipe, ashmem);
628 if (UEC_OK != ret) {
629 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkRead error ret:%{public}d", __func__, __LINE__, ret);
630 }
631 return ret;
632 }
633
BulkWrite(const UsbDev & devInfo,const UsbPipe & pipe,sptr<Ashmem> & ashmem)634 int32_t UsbService::BulkWrite(const UsbDev &devInfo, const UsbPipe &pipe, sptr<Ashmem> &ashmem)
635 {
636 if (ashmem == nullptr) {
637 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkWrite error ashmem", __func__, __LINE__);
638 return UEC_SERVICE_INVALID_VALUE;
639 }
640 int32_t ret = UsbdClient::GetInstance().BulkWrite(devInfo, pipe, ashmem);
641 if (UEC_OK != ret) {
642 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkWrite error ret:%{public}d", __func__, __LINE__, ret);
643 }
644 return ret;
645 }
646
BulkCancel(const UsbDev & devInfo,const UsbPipe & pipe)647 int32_t UsbService::BulkCancel(const UsbDev &devInfo, const UsbPipe &pipe)
648 {
649 int32_t ret = UsbdClient::GetInstance().BulkCancel(devInfo, pipe);
650 if (UEC_OK != ret) {
651 USB_HILOGE(MODULE_USB_SERVICE, "%{public}s:%{public}d BulkCancel error ret:%{public}d", __func__, __LINE__,
652 ret);
653 }
654 return ret;
655 }
656 } // namespace USB
657 } // namespace OHOS
658