1 /*
2 * Copyright (c) 2022-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
16 #include "usb_impl.h"
17
18 #include <cerrno>
19 #include <hdf_base.h>
20 #include <hdf_log.h>
21 #include <sys/mman.h>
22 #include <sys/types.h>
23 #include <unistd.h>
24 #include <climits>
25
26 #include "parameter.h"
27 #include "parameters.h"
28 #include "ddk_pnp_listener_mgr.h"
29 #include "ddk_device_manager.h"
30 #include "device_resource_if.h"
31 #include "hdf_slist.h"
32 #include "hisysevent.h"
33 #include "hitrace_meter.h"
34 #include "libusb_adapter.h"
35 #include "osal_mutex.h"
36 #include "usb_ddk_interface.h"
37 #include "usb_ddk_pnp_loader.h"
38 #include "usb_interface_pool.h"
39 #include "usbd_dispatcher.h"
40 #include "usbd_function.h"
41 #include "usbd_accessory.h"
42 #include "usbd_port.h"
43 #include "usbd_ports.h"
44 #include "usbd_wrapper.h"
45 using namespace OHOS::HiviewDFX;
46 constexpr double USB_RECOGNITION_FAIL_RATE_BASE = 100.00;
47 bool g_productFlag = false;
48 #ifndef LIBUSB_ENABLE
49 constexpr uint16_t ENGLISH_US_LANGUAGE_ID = 0x409;
50 #endif
51 constexpr uint32_t FUNCTION_VALUE_MAX_LEN = 32;
52 constexpr uint8_t USB_PARAM_REQTYPE = 128;
53 constexpr uint8_t USB_PARAM_STAND_REQTYPE = 0;
54 int32_t g_usbOpenCount = 0;
55 #ifdef LIBUSB_ENABLE
56 constexpr uint8_t MAX_DEVICE_ADDRESS = 255;
57 constexpr uint8_t MAX_DEVICE_BUSNUM = 255;
58 constexpr uint8_t MAX_ENDPOINT_ID = 158;
59 constexpr uint8_t MAX_CANCEL_ENDPOINT_ID = 255;
60 constexpr uint8_t MAX_INTERFACE_ID = 255;
61 constexpr uint8_t LIBUSB_MAX_INTERFACEID = 0x80;
62 constexpr uint8_t LIBUSB_INTERFACE_ID = 0x80;
63 constexpr uint8_t USB_ENDPOINT_MASK = 0x80;
64 #endif
65 namespace OHOS {
66 namespace HDI {
67 namespace Usb {
68 namespace V1_2 {
69 HdfDevEventlistener UsbImpl::listenerForLoadService_ = {nullptr};
70 UsbdLoadService UsbImpl::loadUsbService_ = {USB_SYSTEM_ABILITY_ID};
71 UsbdLoadService UsbImpl::loadHdfEdm_ = {HDF_EXTERNAL_DEVICE_MANAGER_SA_ID};
72 UsbdSubscriber UsbImpl::subscribers_[MAX_SUBSCRIBER] = {{0}};
73 bool UsbImpl::isGadgetConnected_ = false;
74 uint32_t UsbImpl::attachCount_ = 0;
75 uint32_t UsbImpl::attachFailedCount_ = 0;
76 static const std::map<std::string, uint32_t> configMap = {
77 {HDC_CONFIG_OFF, USB_FUNCTION_NONE},
78 {HDC_CONFIG_HDC, USB_FUNCTION_HDC},
79 {HDC_CONFIG_ON, USB_FUNCTION_HDC},
80 {HDC_CONFIG_RNDIS, USB_FUNCTION_RNDIS},
81 {HDC_CONFIG_STORAGE, USB_FUNCTION_STORAGE},
82 {HDC_CONFIG_RNDIS_HDC, USB_FUNCTION_HDC + USB_FUNCTION_RNDIS},
83 {HDC_CONFIG_STORAGE_HDC, USB_FUNCTION_HDC + USB_FUNCTION_STORAGE},
84 {HDC_CONFIG_MANUFACTURE_HDC, USB_FUNCTION_MANUFACTURE},
85 {HDC_CONFIG_NCM, USB_FUNCTION_NCM},
86 {HDC_CONFIG_NCM_HDC, USB_FUNCTION_HDC + USB_FUNCTION_NCM}
87 };
88
UsbInterfaceImplGetInstance(void)89 extern "C" IUsbInterface *UsbInterfaceImplGetInstance(void)
90 {
91 using OHOS::HDI::Usb::V1_2::UsbImpl;
92 UsbImpl *service = new (std::nothrow) UsbImpl();
93 if (service == nullptr) {
94 return nullptr;
95 }
96 return service;
97 }
98
UsbImpl()99 UsbImpl::UsbImpl() : session_(nullptr), device_(nullptr)
100 {
101 HdfSListInit(&devList_);
102 OsalMutexInit(&lock_);
103 if (OHOS::system::GetBoolParameter("const.security.developermode.state", true)) {
104 loadUsbService_.LoadService();
105 }
106 }
107
~UsbImpl()108 UsbImpl::~UsbImpl()
109 {
110 UsbdReleaseDevices();
111 }
112
FindDevFromService(uint8_t busNum,uint8_t devAddr)113 HostDevice *UsbImpl::FindDevFromService(uint8_t busNum, uint8_t devAddr)
114 {
115 HdfSListIterator it;
116 HostDevice *port = nullptr;
117 bool flag = false;
118
119 OsalMutexLock(&lock_);
120 HdfSListIteratorInit(&it, &devList_);
121 while (HdfSListIteratorHasNext(&it)) {
122 port = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
123 if (port == nullptr) {
124 continue;
125 }
126 if (port->busNum == busNum && port->devAddr == devAddr) {
127 flag = true;
128 break;
129 }
130 }
131 OsalMutexUnlock(&lock_);
132 if (!flag) {
133 return nullptr;
134 }
135 return port;
136 }
137
MakeUsbControlParams(UsbControlParams * controlParams,uint8_t * buffer,uint16_t length,uint16_t value,uint16_t index)138 void UsbImpl::MakeUsbControlParams(
139 UsbControlParams *controlParams, uint8_t *buffer, uint16_t length, uint16_t value, uint16_t index)
140 {
141 if (controlParams == nullptr || buffer == nullptr) {
142 HDF_LOGE("%{public}s: %{public}d controlParams or buffer is nullptr", __func__, __LINE__);
143 return;
144 }
145
146 controlParams->request = USB_DDK_REQ_GET_DESCRIPTOR;
147 controlParams->target = USB_REQUEST_TARGET_DEVICE;
148 controlParams->reqType = USB_PARAM_REQTYPE;
149 controlParams->directon = USB_REQUEST_DIR_FROM_DEVICE;
150 controlParams->value = value;
151 controlParams->index = index;
152 controlParams->data = buffer;
153 controlParams->size = length;
154 }
155
MakeGetActiveUsbControlParams(UsbControlParams * controlParams,uint8_t * buffer,uint16_t length,uint16_t value,uint16_t index)156 void UsbImpl::MakeGetActiveUsbControlParams(
157 UsbControlParams *controlParams, uint8_t *buffer, uint16_t length, uint16_t value, uint16_t index)
158 {
159 if (controlParams == nullptr || buffer == nullptr) {
160 HDF_LOGE("%{public}s: %{public}d controlParams or buffer is nullptr", __func__, __LINE__);
161 return;
162 }
163
164 controlParams->request = USB_DDK_REQ_GET_CONFIGURATION;
165 controlParams->target = USB_REQUEST_TARGET_DEVICE;
166 controlParams->reqType = USB_PARAM_REQTYPE;
167 controlParams->directon = USB_REQUEST_DIR_FROM_DEVICE;
168 controlParams->value = value;
169 controlParams->index = index;
170 controlParams->data = buffer;
171 controlParams->size = length;
172 }
173
UsbControlTransferEx(HostDevice * dev,UsbControlParams * ctrParams,int32_t timeout)174 int32_t UsbImpl::UsbControlTransferEx(HostDevice *dev, UsbControlParams *ctrParams, int32_t timeout)
175 {
176 UsbRequestParams params;
177 if (memset_s(¶ms, sizeof(params), 0, sizeof(params)) != EOK) {
178 HDF_LOGE("%{public}s:memset_s params failed", __func__);
179 return HDF_FAILURE;
180 }
181
182 if (dev == nullptr || dev->ctrDevHandle == nullptr || ctrParams == nullptr) {
183 HDF_LOGE("%{public}s:invalid params", __func__);
184 return HDF_ERR_INVALID_PARAM;
185 }
186
187 UsbRequest *request = nullptr;
188 if (dev->ctrlReq == nullptr) {
189 request = UsbAllocRequest(dev->ctrDevHandle, 0, MAX_CONTROL_BUFF_SIZE);
190 if (request == nullptr) {
191 return HDF_ERR_MALLOC_FAIL;
192 }
193 dev->ctrlReq = request;
194 } else {
195 request = dev->ctrlReq;
196 }
197
198 UsbdDispatcher::UsbRequestParamsInit(¶ms, timeout);
199 int32_t ret = UsbdDispatcher::UsbControlSetUp(ctrParams, ¶ms.ctrlReq);
200 if (ret != HDF_SUCCESS) {
201 return ret;
202 }
203 OsalMutexLock(&dev->lock);
204 do {
205 ret = UsbFillRequest(request, dev->ctrDevHandle, ¶ms);
206 if (ret != HDF_SUCCESS) {
207 HDF_LOGE("%{public}s:UsbFillRequest failed, ret = %{public}d", __func__, ret);
208 break;
209 }
210
211 ret = UsbSubmitRequestSync(request);
212 if (ret != HDF_SUCCESS) {
213 HDF_LOGE("%{public}s:UsbSubmitRequestSync failed, ret=%{public}d", __func__, ret);
214 break;
215 }
216
217 if (ctrParams->directon == USB_REQUEST_DIR_FROM_DEVICE) {
218 ret = memcpy_s(ctrParams->data, ctrParams->size, request->compInfo.buffer, request->compInfo.actualLength);
219 if (ret != EOK) {
220 HDF_LOGE("%{public}s: memcpy_s failed, ret = %{public}d", __func__, ret);
221 break;
222 }
223 ctrParams->size =
224 ctrParams->size < request->compInfo.actualLength ? ctrParams->size : request->compInfo.actualLength;
225 }
226 } while (0);
227
228 OsalMutexUnlock(&dev->lock);
229 return ret;
230 }
231
MakeSetActiveUsbControlParams(UsbControlParams * controlParams,uint8_t * buffer,uint16_t length,uint16_t value,uint16_t index)232 void UsbImpl::MakeSetActiveUsbControlParams(
233 UsbControlParams *controlParams, uint8_t *buffer, uint16_t length, uint16_t value, uint16_t index)
234 {
235 if (controlParams == nullptr || buffer == nullptr) {
236 HDF_LOGE("%{public}s: %{public}d controlParams or buffer is nullptr", __func__, __LINE__);
237 return;
238 }
239
240 controlParams->request = USB_DDK_REQ_SET_CONFIGURATION;
241 controlParams->target = USB_REQUEST_TARGET_DEVICE;
242 controlParams->reqType = USB_PARAM_STAND_REQTYPE;
243 controlParams->directon = USB_REQUEST_DIR_TO_DEVICE;
244 controlParams->value = value;
245 controlParams->index = index;
246 controlParams->data = buffer;
247 controlParams->size = length;
248 }
249
ReOpenDevice(HostDevice * port)250 int32_t UsbImpl::ReOpenDevice(HostDevice *port)
251 {
252 if (port == nullptr) {
253 HDF_LOGE("%{public}s:invalid param port", __func__);
254 return HDF_FAILURE;
255 }
256
257 uint8_t busNum = port->busNum;
258 uint8_t devAddr = port->devAddr;
259 UsbdDispatcher::UsbdRelease(port);
260 port->busNum = busNum;
261 port->devAddr = devAddr;
262 OsalMutexInit(&port->writeLock);
263 OsalMutexInit(&port->readLock);
264 OsalMutexInit(&port->lock);
265 OsalMutexInit(&port->requestLock);
266 OsalMutexInit(&port->reqSyncLock);
267 OsalMutexInit(&port->reqASyncLock);
268 HdfSListInit(&port->requestQueue);
269 HdfSListInit(&port->reqSyncList);
270 HdfSListInit(&port->reqASyncList);
271 int32_t ret = UsbdDispatcher::UsbdInit(port);
272 if (ret != HDF_SUCCESS) {
273 HDF_LOGE("%{public}s:UsbInit failed ret:%{public}d", __func__, ret);
274 UsbdDispatcher::UsbdRelease(port);
275 UsbdDispatcher::RemoveDevFromService(port->service, port);
276 OsalMemFree(port);
277 return ret;
278 }
279
280 DataFifoReset(&port->readFifo);
281 port->initFlag = true;
282 return HDF_SUCCESS;
283 }
284
InterfaceIdToHandle(const HostDevice * dev,uint8_t id)285 UsbInterfaceHandle *UsbImpl::InterfaceIdToHandle(const HostDevice *dev, uint8_t id)
286 {
287 if (dev == nullptr) {
288 HDF_LOGE("%{public}s: invalid param dev is nullptr", __func__);
289 return nullptr;
290 }
291
292 if (id == MAX_INTERFACEID) {
293 return dev->ctrDevHandle;
294 } else if (id < USB_MAX_INTERFACES) {
295 return dev->devHandle[id];
296 }
297 return nullptr;
298 }
299
UsbdRequestSyncReleaseList(HostDevice * port)300 int32_t UsbImpl::UsbdRequestSyncReleaseList(HostDevice *port)
301 {
302 if (port == nullptr) {
303 HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
304 return HDF_ERR_INVALID_PARAM;
305 }
306
307 HdfSListIterator it;
308 OsalMutexLock(&port->reqSyncLock);
309 HdfSListIteratorInit(&it, &port->reqSyncList);
310 while (HdfSListIteratorHasNext(&it)) {
311 UsbdRequestSync *req = reinterpret_cast<UsbdRequestSync *>(HdfSListIteratorNext(&it));
312 if (req == nullptr) {
313 continue;
314 }
315 HdfSListIteratorRemove(&it);
316 int32_t ret = UsbdDispatcher::UsbdRequestSyncRelease(req);
317 if (ret != HDF_SUCCESS) {
318 HDF_LOGE("%{public}s:UsbdRequestSyncRelease failed", __func__);
319 }
320 }
321 OsalMutexUnlock(&port->reqSyncLock);
322
323 return HDF_SUCCESS;
324 }
325
UsbdRequestASyncReleaseList(HostDevice * port)326 int32_t UsbImpl::UsbdRequestASyncReleaseList(HostDevice *port)
327 {
328 if (port == nullptr) {
329 HDF_LOGE("%{public}s:invalid param port", __func__);
330 return HDF_ERR_INVALID_PARAM;
331 }
332
333 HdfSListIterator it;
334 OsalMutexLock(&port->reqASyncLock);
335 HdfSListIteratorInit(&it, &port->reqASyncList);
336 while (HdfSListIteratorHasNext(&it)) {
337 UsbdRequestASync *req = reinterpret_cast<UsbdRequestASync *>(HdfSListIteratorNext(&it));
338 if (req == nullptr) {
339 continue;
340 }
341 HdfSListIteratorRemove(&it);
342 int32_t ret = UsbdDispatcher::UsbdRequestASyncRelease(req);
343 if (ret != HDF_SUCCESS) {
344 HDF_LOGW("%{public}s:UsbdRequestASyncRelease failed", __func__);
345 }
346 }
347 OsalMutexUnlock(&port->reqASyncLock);
348
349 return HDF_SUCCESS;
350 }
351
UsbdBulkASyncListReleasePort(HostDevice * port)352 int32_t UsbImpl::UsbdBulkASyncListReleasePort(HostDevice *port)
353 {
354 if (port == nullptr || port->bulkASyncList == nullptr) {
355 HDF_LOGE("%{public}s: port or port->bulkASyncList is nullptr", __func__);
356 return HDF_SUCCESS;
357 }
358
359 UsbdBulkASyncList *list = nullptr;
360 while (port->bulkASyncList) {
361 list = port->bulkASyncList;
362 port->bulkASyncList = list->next;
363 UsbdDispatcher::UsbdBulkASyncListRelease(list);
364 list = nullptr;
365 }
366 return HDF_SUCCESS;
367 }
368
UsbdFindRequestSyncAndCreat(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr,UsbdRequestSync ** request)369 int32_t UsbImpl::UsbdFindRequestSyncAndCreat(
370 HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr, UsbdRequestSync **request)
371 {
372 if (port == nullptr || request == nullptr) {
373 HDF_LOGE("%{public}s:ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeAddr);
374 return HDF_ERR_INVALID_PARAM;
375 }
376
377 *request = nullptr;
378 UsbdRequestSync *requestSync = UsbdDispatcher::UsbdFindRequestSync(port, interfaceId, pipeAddr);
379 if (requestSync != nullptr) {
380 *request = requestSync;
381 return HDF_SUCCESS;
382 }
383
384 UsbPipeInfo pipe;
385 if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
386 HDF_LOGE("%{public}s:memset_s pipe failed ", __func__);
387 return HDF_FAILURE;
388 }
389
390 int32_t ret = UsbdDispatcher::GetPipe(port, interfaceId, pipeAddr, &pipe);
391 if (ret != HDF_SUCCESS) {
392 HDF_LOGE("%{public}s: get pipe failed ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeAddr);
393 return HDF_FAILURE;
394 }
395
396 UsbInterfaceHandle *ifHandle = InterfaceIdToHandle(port, interfaceId);
397 if (ifHandle == nullptr) {
398 HDF_LOGE("%{public}s:get interface handle failed", __func__);
399 return HDF_ERR_INVALID_PARAM;
400 }
401
402 requestSync = UsbdDispatcher::UsbdRequestSyncAlloc();
403 if (requestSync == nullptr) {
404 HDF_LOGE("%{public}s:fail ifId:%{public}u pipeId:%{public}u", __func__, interfaceId, pipeAddr);
405 return HDF_ERR_MALLOC_FAIL;
406 }
407
408 ret = UsbdDispatcher::UsbdRequestSyncInit(port, ifHandle, &pipe, requestSync);
409 if (ret != HDF_SUCCESS) {
410 HDF_LOGE("%{public}s:UsbdRequestSyncInit failed ret:%{public}d", __func__, ret);
411 int32_t tRet = UsbdDispatcher::UsbdRequestSyncRelease(requestSync);
412 requestSync = nullptr;
413 if (tRet != HDF_SUCCESS) {
414 HDF_LOGE("%{public}s:Release failed ifId:%{public}u pipeId:%{public}u", __func__, interfaceId, pipeAddr);
415 }
416 return ret;
417 }
418 *request = requestSync;
419 return ret;
420 }
421
UsbdFindRequestSyncAndCreatwithLength(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr,int32_t length,UsbdRequestSync ** request)422 int32_t UsbImpl::UsbdFindRequestSyncAndCreatwithLength(HostDevice *port, uint8_t interfaceId,
423 uint8_t pipeAddr, int32_t length, UsbdRequestSync **request)
424 {
425 if (port == nullptr || request == nullptr) {
426 HDF_LOGE("%{public}s:ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeAddr);
427 return HDF_ERR_INVALID_PARAM;
428 }
429
430 *request = nullptr;
431 UsbdRequestSync *requestSync = UsbdDispatcher::UsbdFindRequestSync(port, interfaceId, pipeAddr);
432 if (requestSync != nullptr) {
433 struct UsbIfRequest *requestObj = (struct UsbIfRequest *)requestSync->request;
434 if (requestObj->hostRequest->bufLen >= length) {
435 *request = requestSync;
436 return HDF_SUCCESS;
437 } else {
438 UsbdRequestSyncReleaseList(port);
439 HDF_LOGD("%{public}s:ifId:%{public}u, epId:%{public}u,realloc reqeustsync.",
440 __func__, interfaceId, pipeAddr);
441 }
442 }
443
444 UsbPipeInfo pipe;
445 if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
446 HDF_LOGE("%{public}s:memset_s pipe failed ", __func__);
447 return HDF_FAILURE;
448 }
449
450 int32_t ret = UsbdDispatcher::GetPipe(port, interfaceId, pipeAddr, &pipe);
451 if (ret != HDF_SUCCESS) {
452 HDF_LOGE("%{public}s: get pipe failed ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeAddr);
453 return HDF_FAILURE;
454 }
455
456 UsbInterfaceHandle *ifHandle = InterfaceIdToHandle(port, interfaceId);
457 if (ifHandle == nullptr) {
458 HDF_LOGE("%{public}s:get interface handle failed", __func__);
459 return HDF_ERR_INVALID_PARAM;
460 }
461
462 requestSync = UsbdDispatcher::UsbdRequestSyncAlloc();
463 if (requestSync == nullptr) {
464 HDF_LOGE("%{public}s:fail ifId:%{public}u pipeId:%{public}u", __func__, interfaceId, pipeAddr);
465 return HDF_ERR_MALLOC_FAIL;
466 }
467
468 ret = UsbdDispatcher::UsbdRequestSyncInitwithLength(port, ifHandle, &pipe, length, requestSync);
469 if (ret != HDF_SUCCESS) {
470 HDF_LOGE("%{public}s:UsbdRequestSyncInit failed ret:%{public}d", __func__, ret);
471 UsbdDispatcher::UsbdRequestSyncRelease(requestSync);
472 requestSync = nullptr;
473 return ret;
474 }
475 *request = requestSync;
476 return ret;
477 }
478
UsbdBulkReadSyncBase(int32_t timeout,uint8_t * buffer,uint32_t size,uint32_t * actlength,UsbdRequestSync * requestSync)479 int32_t UsbImpl::UsbdBulkReadSyncBase(
480 int32_t timeout, uint8_t *buffer, uint32_t size, uint32_t *actlength, UsbdRequestSync *requestSync)
481 {
482 if (requestSync == nullptr || requestSync->request == nullptr || buffer == nullptr || actlength == nullptr ||
483 size < 1) {
484 HDF_LOGE("%{public}s:invalid params", __func__);
485 return HDF_ERR_INVALID_PARAM;
486 }
487
488 HITRACE_METER_NAME(HITRACE_TAG_HDF, "UsbdBulkReadSyncBase");
489 int32_t ret = HDF_FAILURE;
490 uint32_t tcur = 0;
491 OsalMutexLock(&requestSync->lock);
492 requestSync->params.timeout = static_cast<uint32_t>(timeout);
493 ret = UsbFillRequest(requestSync->request, requestSync->ifHandle, &requestSync->params);
494 if (ret != HDF_SUCCESS) {
495 HDF_LOGE("%{public}s: UsbFillRequest failed, ret=%{public}d ", __func__, ret);
496 OsalMutexUnlock(&requestSync->lock);
497 return HDF_FAILURE;
498 }
499
500 struct UsbIfRequest* requestObj = (struct UsbIfRequest *)requestSync->request;
501 struct UsbHostRequest* hostRequest = requestObj->hostRequest;
502 hostRequest->length = size;
503
504 ret = UsbSubmitRequestSync(requestSync->request);
505 if (ret == HDF_SUCCESS) {
506 ret = memcpy_s(buffer + tcur, size - tcur, requestSync->request->compInfo.buffer,
507 requestSync->request->compInfo.actualLength);
508 if (ret != HDF_SUCCESS) {
509 HDF_LOGE("%{public}s: memcpy_s failed, ret = %{public}d", __func__, ret);
510 OsalMutexUnlock(&requestSync->lock);
511 return HDF_FAILURE;
512 }
513 tcur += requestSync->request->compInfo.actualLength;
514 }
515 OsalMutexUnlock(&requestSync->lock);
516
517 *actlength = tcur;
518 return ret;
519 }
520
UsbdBulkWriteSyncBase(HostDevice * port,UsbdRequestSync * requestSync,const uint8_t * buffer,uint32_t length,int32_t timeout)521 int32_t UsbImpl::UsbdBulkWriteSyncBase(
522 HostDevice *port, UsbdRequestSync *requestSync, const uint8_t *buffer, uint32_t length, int32_t timeout)
523 {
524 if (port == nullptr || requestSync == nullptr || buffer == nullptr || length < 1) {
525 HDF_LOGE("%{public}s:invalid param", __func__);
526 return HDF_ERR_INVALID_PARAM;
527 }
528
529 HITRACE_METER_NAME(HITRACE_TAG_HDF, "UsbdBulkWriteSyncBase");
530 int32_t ret = HDF_FAILURE;
531 OsalMutexLock(&requestSync->lock);
532 uint32_t initTimeout = timeout < 0 ? 0 : static_cast<uint32_t>(timeout);
533 requestSync->params.timeout = initTimeout;
534 requestSync->params.userData = port;
535 uint32_t tcur = 0;
536 uint32_t msize = static_cast<uint32_t>(requestSync->pipe.maxPacketSize);
537 while (tcur < length) {
538 uint32_t tsize = (length - tcur) < msize ? (length - tcur) : msize;
539 requestSync->params.dataReq.buffer = static_cast<unsigned char *>(const_cast<uint8_t *>(buffer) + tcur);
540 requestSync->params.dataReq.length = tsize;
541 tcur += tsize;
542 ret = UsbFillRequest(requestSync->request, requestSync->ifHandle, &requestSync->params);
543 if (ret != HDF_SUCCESS) {
544 HDF_LOGE("%{public}s:UsbFillRequest failed, ret:%{public}d, tcur:%{public}u, length:%{public}u", __func__,
545 ret, tcur, length);
546 break;
547 }
548 ret = UsbSubmitRequestSync(requestSync->request);
549 if (ret != HDF_SUCCESS) {
550 HDF_LOGE("%{public}s:UsbSubmitRequestSync failed, ret:%{public}d tcur:%{public}u length:%{public}u",
551 __func__, ret, tcur, length);
552 break;
553 }
554 }
555 OsalMutexUnlock(&requestSync->lock);
556 return ret;
557 }
558
UsbdFindRequestASync(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr)559 UsbdRequestASync *UsbImpl::UsbdFindRequestASync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
560 {
561 if (port == nullptr) {
562 HDF_LOGE("%{public}s:invalid param port", __func__);
563 return nullptr;
564 }
565
566 UsbdRequestASync *req = nullptr;
567 HdfSListIterator it;
568 uint8_t reqnum = 0;
569 uint8_t usenum = 0;
570 bool flag = false;
571 OsalMutexLock(&port->reqASyncLock);
572 HdfSListIteratorInit(&it, &port->reqASyncList);
573 while (HdfSListIteratorHasNext(&it)) {
574 req = reinterpret_cast<UsbdRequestASync *>(HdfSListIteratorNext(&it));
575 if (req == nullptr) {
576 continue;
577 }
578 if (req->pipe.interfaceId == interfaceId && ((req->pipe.pipeAddress | req->pipe.pipeDirection) == pipeAddr)) {
579 reqnum++;
580 if (req->status) {
581 usenum++;
582 } else {
583 flag = true;
584 break;
585 }
586 }
587 }
588 OsalMutexUnlock(&port->reqASyncLock);
589
590 if (flag) {
591 if (req) {
592 OsalMutexLock(&req->lock);
593 req->status = 1;
594 OsalMutexUnlock(&req->lock);
595 }
596 return req;
597 } else {
598 if (reqnum < MAX_REQUESTASYNC_NUM) {
599 req = UsbdDispatcher::UsbdRequestASyncCreatAndInsert(port, interfaceId, pipeAddr);
600 if (req) {
601 OsalMutexLock(&req->lock);
602 req->status = 1;
603 OsalMutexUnlock(&req->lock);
604 }
605 return req;
606 }
607 }
608 return nullptr;
609 }
610
FunRequestQueueFillAndSubmit(HostDevice * port,UsbdRequestASync * reqAsync,const uint8_t * buffer,uint32_t length)611 int32_t UsbImpl::FunRequestQueueFillAndSubmit(
612 HostDevice *port, UsbdRequestASync *reqAsync, const uint8_t *buffer, uint32_t length)
613 {
614 if (port == nullptr || reqAsync == nullptr) {
615 HDF_LOGE("%{public}s:invalid param port or reqAsync", __func__);
616 return HDF_ERR_INVALID_PARAM;
617 }
618
619 UsbdDispatcher::FillReqAyncParams(reqAsync, &reqAsync->pipe, &reqAsync->params, buffer, length);
620 int32_t ret = UsbFillRequest(reqAsync->reqMsg.request, reqAsync->ifHandle, &reqAsync->params);
621 if (ret != HDF_SUCCESS) {
622 HDF_LOGE("%{public}s:UsbFillRequest failed, ret:%{public}d", __func__, ret);
623 OsalMutexLock(&reqAsync->lock);
624 reqAsync->reqMsg.clientData = nullptr;
625 reqAsync->reqMsg.clientLength = 0;
626 reqAsync->params.dataReq.buffer = nullptr;
627 reqAsync->params.dataReq.length = 0;
628 reqAsync->status = 0;
629 OsalMutexUnlock(&reqAsync->lock);
630 return ret;
631 }
632
633 UsbIfRequest *requestConvertVal = reinterpret_cast<UsbIfRequest *>(reqAsync->reqMsg.request);
634 OsalSemInit(&requestConvertVal->hostRequest->sem, 0);
635 ret = UsbSubmitRequestAsync(reqAsync->reqMsg.request);
636 if (ret == HDF_SUCCESS) {
637 OsalMutexLock(&port->requestLock);
638 HdfSListAddTail(&port->requestQueue, &reqAsync->qNode);
639 OsalMutexUnlock(&port->requestLock);
640 } else {
641 HDF_LOGE("%{public}s:UsbSubmitRequestAsync failed, ret:%{public}d", __func__, ret);
642 OsalMutexLock(&reqAsync->lock);
643 reqAsync->status = 0;
644 reqAsync->reqMsg.clientData = nullptr;
645 reqAsync->reqMsg.clientLength = 0;
646 reqAsync->params.dataReq.buffer = nullptr;
647 reqAsync->params.dataReq.length = 0;
648 OsalMutexUnlock(&reqAsync->lock);
649 }
650 return ret;
651 }
652
GetRequestMsgFromQueue(HostDevice * port,UsbdRequestASync ** reqMsg)653 int32_t UsbImpl::GetRequestMsgFromQueue(HostDevice *port, UsbdRequestASync **reqMsg)
654 {
655 if (port == nullptr || reqMsg == nullptr) {
656 HDF_LOGE("%{public}s: port or reqMsg is nullptr", __func__);
657 return HDF_ERR_INVALID_PARAM;
658 }
659
660 HdfSListNode *requestNode = nullptr;
661 OsalMutexLock(&port->requestLock);
662 if (!HdfSListIsEmpty(&port->requestQueue)) {
663 requestNode = HdfSListPop(&port->requestQueue);
664 }
665 OsalMutexUnlock(&port->requestLock);
666 if (requestNode == nullptr) {
667 HDF_LOGE("%{public}s:requestNode is nullptr", __func__);
668 return HDF_FAILURE;
669 }
670 *reqMsg = HDF_SLIST_CONTAINER_OF(HdfSListNode, requestNode, UsbdRequestASync, qNode);
671 if (*reqMsg == nullptr) {
672 HDF_LOGE("%{public}s:request msg is nullptr", __func__);
673 return HDF_FAILURE;
674 }
675 return HDF_SUCCESS;
676 }
677
GetRequestMsgData(HostDevice * port,UsbdRequestASync * reqMsg,int32_t timeout,uint8_t ** buffer,uint32_t * length)678 int32_t UsbImpl::GetRequestMsgData(
679 HostDevice *port, UsbdRequestASync *reqMsg, int32_t timeout, uint8_t **buffer, uint32_t *length)
680 {
681 if (port == nullptr || reqMsg == nullptr || reqMsg->reqMsg.request == nullptr) {
682 HDF_LOGE("%{public}s: invalid param", __func__);
683 return HDF_ERR_INVALID_PARAM;
684 }
685
686 int32_t ret = HDF_SUCCESS;
687 UsbIfRequest *reqValue = reinterpret_cast<UsbIfRequest *>(reqMsg->reqMsg.request);
688 if (static_cast<int32_t>(reqMsg->reqMsg.request->compInfo.status) == -1) {
689 ret = OsalSemWait(&reqValue->hostRequest->sem, timeout);
690 if (ret != HDF_SUCCESS) {
691 HDF_LOGE("%{public}s:OsalSemWait failed, ret:%{public}d", __func__, ret);
692 OsalMutexLock(&port->requestLock);
693 HdfSListAdd(&port->requestQueue, &reqMsg->qNode);
694 OsalMutexUnlock(&port->requestLock);
695 return ret;
696 }
697 }
698
699 OsalMutexLock(&reqMsg->lock);
700 *length = reqMsg->reqMsg.length;
701 *buffer = static_cast<uint8_t *>(reqMsg->reqMsg.buffer);
702 reqMsg->reqMsg.buffer = nullptr;
703 reqMsg->reqMsg.length = 0;
704 reqMsg->status = 0;
705 OsalMutexUnlock(&reqMsg->lock);
706 return ret;
707 }
708
UsbdRequestASyncReleaseData(UsbdRequestASync * request)709 int32_t UsbImpl::UsbdRequestASyncReleaseData(UsbdRequestASync *request)
710 {
711 if (request == nullptr) {
712 HDF_LOGE("%{public}s: invalid param request is nullptr", __func__);
713 return HDF_ERR_INVALID_PARAM;
714 }
715
716 if (request->reqMsg.buffer != nullptr) {
717 HDF_LOGI("%{public}s:free buffer", __func__);
718 OsalMemFree(request->reqMsg.buffer);
719 request->reqMsg.buffer = nullptr;
720 }
721 request->reqMsg.length = 0;
722 if (request->reqMsg.clientData) {
723 HDF_LOGI("%{public}s:free clientData", __func__);
724 OsalMemFree(request->reqMsg.clientData);
725 request->reqMsg.clientData = nullptr;
726 }
727 request->reqMsg.clientLength = 0;
728 request->status = 0;
729 return HDF_SUCCESS;
730 }
731
UsbdBulkASyncListFind(HostDevice * port,uint8_t ifId,uint8_t epId)732 UsbdBulkASyncList *UsbImpl::UsbdBulkASyncListFind(HostDevice *port, uint8_t ifId, uint8_t epId)
733 {
734 if (port == nullptr) {
735 HDF_LOGE("%{public}s:invalid param port", __func__);
736 return nullptr;
737 }
738
739 UsbdBulkASyncList *list = port->bulkASyncList;
740 while (list) {
741 if (list->epId == epId && list->ifId == ifId) {
742 return list;
743 }
744 list = list->next;
745 }
746 return nullptr;
747 }
748
UsbdBulkASyncListInit(HostDevice * port,uint8_t ifId,uint8_t epId)749 UsbdBulkASyncList *UsbImpl::UsbdBulkASyncListInit(HostDevice *port, uint8_t ifId, uint8_t epId)
750 {
751 UsbdBulkASyncList *list = UsbdBulkASyncListFind(port, ifId, epId);
752 if (list == nullptr) {
753 list = UsbdDispatcher::UsbdBulkASyncListAlloc(port, ifId, epId);
754 if (list != nullptr) {
755 list->next = port->bulkASyncList;
756 port->bulkASyncList = list;
757 }
758 }
759 return list;
760 }
761
InitAsmBufferHandle(UsbdBufferHandle * handle,int32_t fd,int32_t size)762 int32_t UsbImpl::InitAsmBufferHandle(UsbdBufferHandle *handle, int32_t fd, int32_t size)
763 {
764 if (handle == nullptr) {
765 HDF_LOGE("%{public}s:invalid param handle", __func__);
766 return HDF_ERR_INVALID_PARAM;
767 }
768 ReleaseAsmBufferHandle(handle);
769
770 if (fd < 0 || size < 0) {
771 HDF_LOGE("%{public}s:invalid param fd or size", __func__);
772 return HDF_ERR_INVALID_PARAM;
773 }
774 handle->fd = fd;
775 handle->size = static_cast<uint32_t>(size);
776 handle->cur = 0;
777 handle->rcur = 0;
778 handle->cbflg = 0;
779 lseek(fd, 0, SEEK_SET);
780 handle->starAddr = static_cast<uint8_t *>(mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
781 close(fd);
782 if (handle->starAddr == nullptr) {
783 handle->fd = -1;
784 handle->size = 0;
785 HDF_LOGE("%{public}s:mmap error:%{public}s", __func__, strerror(errno));
786 return HDF_ERR_MALLOC_FAIL;
787 }
788 return HDF_SUCCESS;
789 }
790
UsbdBulkReadASyncSubmitStart(UsbdBulkASyncList * list)791 int32_t UsbImpl::UsbdBulkReadASyncSubmitStart(UsbdBulkASyncList *list)
792 {
793 if (list == nullptr) {
794 HDF_LOGE("%{public}s:invalid param list", __func__);
795 return HDF_ERR_INVALID_PARAM;
796 }
797
798 uint32_t i = 0;
799 int32_t ret = HDF_SUCCESS;
800 do {
801 UsbdBulkASyncReqNode *req = UsbdDispatcher::UsbdBulkASyncReqGetENode(&list->rList);
802 if (req == nullptr) {
803 HDF_LOGE("%{public}s:UsbdBulkASyncReqGetENode failed", __func__);
804 ret = HDF_ERR_DEVICE_BUSY;
805 break;
806 } else {
807 ret = UsbdDispatcher::UsbdBulkASyncReqReadSubmit(req);
808 if (ret != HDF_SUCCESS) {
809 HDF_LOGE("%{public}s:UsbdBulkASyncReqReadSubmit failed", __func__);
810 break;
811 }
812 }
813 if (++i > USBD_BULKASYNCREQ_NUM_MAX) {
814 break;
815 }
816 } while (!DListIsEmpty(&list->rList.eList));
817 return ret;
818 }
819
UsbdBulkASyncWriteSubmitStart(UsbdBulkASyncList * list)820 int32_t UsbImpl::UsbdBulkASyncWriteSubmitStart(UsbdBulkASyncList *list)
821 {
822 if (list == nullptr) {
823 HDF_LOGE("%{public}s:invalid param list", __func__);
824 return HDF_ERR_INVALID_PARAM;
825 }
826
827 uint32_t i = 0;
828 int32_t ret = HDF_SUCCESS;
829 do {
830 UsbdBulkASyncReqNode *req = UsbdDispatcher::UsbdBulkASyncReqGetENode(&list->rList);
831 if (req == nullptr) {
832 HDF_LOGE("%{public}s:UsbdBulkASyncReqGetENode failed", __func__);
833 ret = HDF_ERR_DEVICE_BUSY;
834 break;
835 } else {
836 ret = UsbdDispatcher::UsbdBulkASyncReqWriteSubmit(req);
837 if (ret != HDF_SUCCESS) {
838 HDF_LOGE("%{public}s:UsbdBulkASyncReqWriteSubmit failed", __func__);
839 break;
840 }
841 }
842 if (++i > USBD_BULKASYNCREQ_NUM_MAX) {
843 break;
844 }
845 } while (!DListIsEmpty(&list->rList.eList));
846 return ret;
847 }
848
ReleaseAsmBufferHandle(UsbdBufferHandle * handle)849 void UsbImpl::ReleaseAsmBufferHandle(UsbdBufferHandle *handle)
850 {
851 if (handle == nullptr) {
852 HDF_LOGE("%{public}s:invalid param handle", __func__);
853 return;
854 }
855
856 if (handle->size > 0) {
857 OsalMutexLock(&handle->lock);
858 handle->cur = 0;
859 handle->rcur = 0;
860 handle->fd = -1;
861 handle->cbflg = 0;
862 munmap(handle->starAddr, handle->size);
863 OsalMutexUnlock(&handle->lock);
864 }
865
866 handle->fd = -1;
867 handle->cur = 0;
868 handle->rcur = 0;
869 handle->size = 0;
870 handle->cbflg = 0;
871 handle->starAddr = nullptr;
872 }
873
BulkRequestCancel(UsbdBulkASyncList * list)874 int32_t UsbImpl::BulkRequestCancel(UsbdBulkASyncList *list)
875 {
876 if (list == nullptr) {
877 HDF_LOGE("%{public}s:invalid param list", __func__);
878 return HDF_ERR_INVALID_PARAM;
879 }
880
881 for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
882 if (list->rList.node[i].use == USBD_REQNODE_USE || list->rList.node[i].use == USBD_REQNODE_OTHER) {
883 int32_t ret = UsbCancelRequest(list->rList.node[i].request);
884 if (ret != HDF_SUCCESS) {
885 HDF_LOGE("%{public}s: UsbCancelRequest failed, ret=%{public}d ", __func__, ret);
886 return ret;
887 }
888 }
889 }
890 OsalMSleep(USB_BULK_CANCEL_SLEEP_TIME);
891
892 for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
893 list->rList.node[i].request->compInfo.status = UsbRequestStatus::USB_REQUEST_COMPLETED;
894 if (list->rList.node[i].use == USBD_REQNODE_USE || list->rList.node[i].use == USBD_REQNODE_OTHER) {
895 list->rList.node[i].request->compInfo.status = UsbRequestStatus::USB_REQUEST_COMPLETED;
896 UsbdDispatcher::UsbdBulkASyncReqNodeSetNoUse(&list->rList.node[i]);
897 }
898 }
899 return HDF_SUCCESS;
900 }
901
ReportUsbdSysEvent(int32_t code,UsbPnpNotifyMatchInfoTable * infoTable,const std::string & operationType)902 void UsbImpl::ReportUsbdSysEvent(int32_t code, UsbPnpNotifyMatchInfoTable *infoTable, const std::string &operationType)
903 {
904 if (code == HDF_SUCCESS) {
905 HDF_LOGI("%{public}s: UsbdDeviceCreateAndAttach successed", __func__);
906 attachCount_++;
907 } else if (code != HDF_ERR_DEVICE_BUSY) {
908 attachFailedCount_++;
909 attachCount_++;
910 HDF_LOGI("%{public}s: UsbdDeviceCreateAndAttach failed", __func__);
911 HiSysEventWrite(HiSysEvent::Domain::HDF_USB, "RECOGNITION_FAIL", HiSysEvent::EventType::FAULT, "OPERATION_TYPE",
912 operationType, "DEVICE_NAME", std::to_string(infoTable->busNum) + "-" + std::to_string(infoTable->devNum),
913 "DEVICE_PROTOCOL", infoTable->deviceInfo.deviceProtocol, "DEVICE_CLASS", infoTable->deviceInfo.deviceClass,
914 "VENDOR_ID", infoTable->deviceInfo.vendorId, "PRODUCT_ID", infoTable->deviceInfo.productId,
915 "VERSION", "1.0.0", "FAIL_REASON", 0, "FAIL_INFO", "USB device recognition failed");
916 HiSysEventWrite(HiSysEvent::Domain::HDF_USB, "RECOGNITION_FAIL_STATISTICS", HiSysEvent::EventType::FAULT,
917 "EXCEPTION_CNT", attachFailedCount_, "TOTAL_CNT", attachCount_, "FAIL_RATE",
918 (static_cast<double>(attachFailedCount_)) /
919 (static_cast<double>(attachCount_) * USB_RECOGNITION_FAIL_RATE_BASE),
920 "QUALITY_STATISTICAL", "Failure rate statistics");
921 } else {
922 HDF_LOGI("%{public}s:device already add", __func__);
923 }
924 }
925
UsbdCloseFd(UsbImpl * super,UsbPnpNotifyMatchInfoTable * infoTable)926 void UsbImpl::UsbdCloseFd(UsbImpl *super, UsbPnpNotifyMatchInfoTable *infoTable)
927 {
928 std::lock_guard<std::mutex> lock(super->openedFdsMutex_);
929 auto iter = super->openedFds_.find({infoTable->busNum, infoTable->devNum});
930 if (iter != super->openedFds_.end()) {
931 int32_t fd = iter->second;
932 int res = close(fd);
933 HDF_LOGI("%{public}s:%{public}d close %{public}d ret = %{public}d",
934 __func__, __LINE__, iter->second, res);
935 super->openedFds_.erase(iter);
936 } else {
937 HDF_LOGI("%{public}s:%{public}d not opened", __func__, __LINE__);
938 }
939 }
940
UsbdPnpNotifyAddAndRemoveDevice(HdfSBuf * data,UsbdSubscriber * usbdSubscriber,uint32_t id)941 int32_t UsbImpl::UsbdPnpNotifyAddAndRemoveDevice(HdfSBuf *data, UsbdSubscriber *usbdSubscriber, uint32_t id)
942 {
943 if (data == nullptr) {
944 HDF_LOGE("%{public}s: data is nullptr", __func__);
945 return HDF_ERR_INVALID_PARAM;
946 }
947 sptr<UsbImpl> super = static_cast<UsbImpl *>(usbdSubscriber->impl);
948 if (super == nullptr) {
949 HDF_LOGE("%{public}s super is nullptr", __func__);
950 return HDF_ERR_INVALID_PARAM;
951 }
952 const sptr<IUsbdSubscriber> subscriber = usbdSubscriber->subscriber;
953
954 uint32_t infoSize;
955 UsbPnpNotifyMatchInfoTable *infoTable = nullptr;
956 bool flag = HdfSbufReadBuffer(data, (const void **)(&infoTable), &infoSize);
957 if (!flag || infoTable == nullptr) {
958 HDF_LOGE("%{public}s: HdfSbufReadBuffer failed, flag=%{public}d", __func__, flag);
959 return HDF_ERR_INVALID_PARAM;
960 }
961
962 if (infoTable->deviceInfo.deviceClass == BASE_CLASS_HUB) {
963 HDF_LOGI("%{public}s:hub device", __func__);
964 if (id == USB_PNP_NOTIFY_REMOVE_DEVICE) {
965 HDF_LOGI("%{public}s:UsbdRemoveBusDev busNum:%{public}d", __func__, infoTable->busNum);
966 UsbdDispatcher::UsbdRemoveBusDev(super, infoTable->busNum, subscriber);
967 }
968 return HDF_SUCCESS;
969 }
970
971 int32_t ret = HDF_SUCCESS;
972 if (id == USB_PNP_NOTIFY_ADD_DEVICE) {
973 ret = UsbdDispatcher::UsbdDeviceCreateAndAttach(super, infoTable->busNum, infoTable->devNum);
974 ReportUsbdSysEvent(ret, infoTable, "UsbdPnpNotifyAddAndRemoveDevice");
975 USBDeviceInfo info = {ACT_DEVUP, infoTable->busNum, infoTable->devNum};
976 if (subscriber == nullptr) {
977 HDF_LOGE("%{public}s: subscriber is nullptr, %{public}d", __func__, __LINE__);
978 return HDF_FAILURE;
979 }
980 ret = subscriber->DeviceEvent(info);
981 } else if (id == USB_PNP_NOTIFY_REMOVE_DEVICE) {
982 UsbImpl::UsbdCloseFd(super, infoTable);
983 UsbdDispatcher::UsbdDeviceDettach(super, infoTable->busNum, infoTable->devNum);
984 USBDeviceInfo info = {ACT_DEVDOWN, infoTable->busNum, infoTable->devNum};
985 if (subscriber == nullptr) {
986 HDF_LOGE("%{public}s: subscriber is nullptr, %{public}d", __func__, __LINE__);
987 return HDF_FAILURE;
988 }
989 ret = subscriber->DeviceEvent(info);
990 }
991 return ret;
992 }
993
UpdatePort(uint32_t mode,const sptr<IUsbdSubscriber> subscriber)994 int32_t UpdatePort(uint32_t mode, const sptr<IUsbdSubscriber> subscriber)
995 {
996 if (g_productFlag) {
997 return UsbdPorts::GetInstance().UpdatePort(mode, subscriber);
998 }
999 return UsbdPort::GetInstance().UpdatePort(mode, subscriber);
1000 }
1001
UsbdPnpLoaderEventReceived(void * priv,uint32_t id,HdfSBuf * data)1002 int32_t UsbImpl::UsbdPnpLoaderEventReceived(void *priv, uint32_t id, HdfSBuf *data)
1003 {
1004 UsbdSubscriber *usbdSubscriber = static_cast<UsbdSubscriber *>(priv);
1005 const sptr<IUsbdSubscriber> subscriber = usbdSubscriber->subscriber;
1006
1007 if (id == USB_PNP_DRIVER_GADGET_ADD) {
1008 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_PNP_DRIVER_GADGET_ADD");
1009 isGadgetConnected_ = true;
1010 USBDeviceInfo info = {ACT_UPDEVICE, 0, 0};
1011 if (subscriber == nullptr) {
1012 HDF_LOGE("%{public}s: subscriber is nullptr, %{public}d", __func__, __LINE__);
1013 return HDF_FAILURE;
1014 }
1015 return subscriber->DeviceEvent(info);
1016 } else if (id == USB_PNP_DRIVER_GADGET_REMOVE) {
1017 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_PNP_DRIVER_GADGET_REMOVE");
1018 isGadgetConnected_ = false;
1019 USBDeviceInfo info = {ACT_DOWNDEVICE, 0, 0};
1020 if (subscriber == nullptr) {
1021 HDF_LOGE("%{public}s: subscriber is nullptr, %{public}d", __func__, __LINE__);
1022 return HDF_FAILURE;
1023 }
1024 UsbdAccessory::GetInstance().HandleEvent(ACT_DOWNDEVICE);
1025 return subscriber->DeviceEvent(info);
1026 } else if (id == USB_PNP_DRIVER_PORT_HOST) {
1027 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_PNP_DRIVER_PORT_HOST");
1028 return UpdatePort(PORT_MODE_HOST, subscriber);
1029 } else if (id == USB_PNP_DRIVER_PORT_DEVICE) {
1030 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_PNP_DRIVER_PORT_DEVICE");
1031 return UpdatePort(PORT_MODE_DEVICE, subscriber);
1032 } else if (id == USB_ACCESSORY_START) {
1033 if (subscriber == nullptr) {
1034 HDF_LOGE("%{public}s: subscriber is nullptr, %{public}d", __func__, __LINE__);
1035 return HDF_FAILURE;
1036 }
1037 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_ACCESSORY_START");
1038 USBDeviceInfo info = {ACT_ACCESSORYUP, 0, 0};
1039 return subscriber->DeviceEvent(info);
1040 } else if (id == USB_ACCESSORY_SEND) {
1041 if (subscriber == nullptr) {
1042 HDF_LOGE("%{public}s: subsciber is nullptr, %{public}d", __func__, __LINE__);
1043 return HDF_FAILURE;
1044 }
1045 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_ACCESSORY_SEND");
1046 USBDeviceInfo info = {ACT_ACCESSORYSEND, 0, 0};
1047 return subscriber->DeviceEvent(info);
1048 }
1049 HITRACE_METER_NAME(HITRACE_TAG_HDF, "USB_PNP_NOTIFY_ADD_OR_REMOVE_DEVICE");
1050 return UsbdPnpNotifyAddAndRemoveDevice(data, usbdSubscriber, id);
1051 }
1052
UsbdLoadServiceCallback(void * priv,uint32_t id,HdfSBuf * data)1053 int32_t UsbImpl::UsbdLoadServiceCallback(void *priv, uint32_t id, HdfSBuf *data)
1054 {
1055 (void)priv;
1056 (void)data;
1057 if (id == USB_PNP_DRIVER_GADGET_ADD || id == USB_PNP_NOTIFY_ADD_DEVICE) {
1058 if (loadUsbService_.LoadService() != 0) {
1059 HDF_LOGE("loadUsbService_ LoadService error");
1060 return HDF_FAILURE;
1061 }
1062 if (id == USB_PNP_NOTIFY_ADD_DEVICE) {
1063 if (loadHdfEdm_.LoadService() != 0) {
1064 HDF_LOGE("loadHdfEdm_ LoadService error");
1065 return HDF_FAILURE;
1066 }
1067 }
1068 }
1069 return HDF_SUCCESS;
1070 }
1071
UpdateFunctionStatus()1072 void UsbImpl::UpdateFunctionStatus()
1073 {
1074 char cFunctionValue[FUNCTION_VALUE_MAX_LEN] = {0};
1075 int32_t ret = GetParameter(PERSIST_SYS_USB_CONFIG, "invalid", cFunctionValue, FUNCTION_VALUE_MAX_LEN);
1076 if (ret <= 0) {
1077 HDF_LOGE("%{public}s: GetParameter failed", __func__);
1078 }
1079
1080 std::string functionValue(cFunctionValue);
1081 auto it = configMap.find(functionValue);
1082 if (it != configMap.end()) {
1083 HDF_LOGI("Function is %{public}s", functionValue.c_str());
1084 ret = UsbdFunction::UsbdUpdateFunction(it->second);
1085 if (ret != HDF_SUCCESS) {
1086 HDF_LOGE("%{public}s: UsbdUpdateFunction failed", __func__);
1087 }
1088 }
1089 }
1090
UsbdEventHandle(const sptr<UsbImpl> & inst)1091 int32_t UsbImpl::UsbdEventHandle(const sptr<UsbImpl> &inst)
1092 {
1093 UsbImpl::UpdateFunctionStatus();
1094 inst->parsePortPath();
1095 listenerForLoadService_.callBack = UsbdLoadServiceCallback;
1096 if (DdkListenerMgrAdd(&listenerForLoadService_) != HDF_SUCCESS) {
1097 HDF_LOGE("%{public}s: register listerer failed", __func__);
1098 return HDF_FAILURE;
1099 }
1100 return HDF_SUCCESS;
1101 }
1102
UsbdEventHandleRelease(void)1103 int32_t UsbImpl::UsbdEventHandleRelease(void)
1104 {
1105 int32_t ret = DdkListenerMgrRemove(&listenerForLoadService_);
1106 if (ret != HDF_SUCCESS) {
1107 HDF_LOGE("%{public}s: DdkListenerMgrRemove failed", __func__);
1108 }
1109 listenerForLoadService_.callBack = nullptr;
1110 listenerForLoadService_.priv = nullptr;
1111 return ret;
1112 }
1113
UsbdReleaseDevices()1114 int32_t UsbImpl::UsbdReleaseDevices()
1115 {
1116 OsalMutexLock(&lock_);
1117 while (!HdfSListIsEmpty(&devList_)) {
1118 HostDevice *port = reinterpret_cast<HostDevice *>(HdfSListPop(&devList_));
1119 if (port != nullptr) {
1120 UsbdDispatcher::UsbdRelease(port);
1121 OsalMemFree(port);
1122 }
1123 }
1124 OsalMutexUnlock(&lock_);
1125 return HDF_SUCCESS;
1126 }
1127
OpenDevice(const UsbDev & dev)1128 int32_t UsbImpl::OpenDevice(const UsbDev &dev)
1129 {
1130 #ifndef LIBUSB_ENABLE
1131 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1132 if (port == nullptr) {
1133 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1134 return HDF_DEV_ERR_NO_DEVICE;
1135 }
1136 if (g_usbOpenCount >= INT_MAX) {
1137 HDF_LOGE("%{public}s: OpenDevice too many times ", __func__);
1138 return HDF_FAILURE;
1139 }
1140 OsalMutexLock(&lock_);
1141 g_usbOpenCount++;
1142 port->initFlag = true;
1143 if (port->ctrDevHandle == nullptr && port->ctrIface != nullptr) {
1144 HDF_LOGD("%{public}s:start openInterface, busNum: %{public}d, devAddr: %{public}d ",
1145 __func__, dev.busNum, dev.devAddr);
1146 port->ctrDevHandle = UsbOpenInterface(port->ctrIface);
1147 if (port->ctrDevHandle == nullptr) {
1148 OsalMutexUnlock(&lock_);
1149 HDF_LOGE("%{public}s:ctrDevHandle UsbOpenInterface nullptr", __func__);
1150 return HDF_FAILURE;
1151 }
1152 }
1153 OsalMutexUnlock(&lock_);
1154 return HDF_SUCCESS;
1155 #else
1156 return LibusbAdapter::GetInstance()->OpenDevice(dev);
1157 #endif // LIBUSB_ENABLE
1158 }
1159
CloseDevice(const UsbDev & dev)1160 int32_t UsbImpl::CloseDevice(const UsbDev &dev)
1161 {
1162 #ifndef LIBUSB_ENABLE
1163 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1164 if (port == nullptr) {
1165 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1166 return HDF_DEV_ERR_NO_DEVICE;
1167 }
1168 if (!port->initFlag) {
1169 HDF_LOGE("%{public}s: openPort failed", __func__);
1170 return HDF_DEV_ERR_DEV_INIT_FAIL;
1171 }
1172 OsalMutexLock(&lock_);
1173 g_usbOpenCount--;
1174 int32_t ret = 0;
1175 if (port->ctrDevHandle != nullptr && g_usbOpenCount == 0) {
1176 for (uint8_t interfaceId = 0; interfaceId < USB_MAX_INTERFACES; ++interfaceId) {
1177 if (port->iface[interfaceId] != nullptr) {
1178 ReleaseInterfaceByPort(port, interfaceId);
1179 }
1180 port->iface[interfaceId] = nullptr;
1181 }
1182 RawUsbCloseCtlProcess(port->ctrDevHandle);
1183 ret = UsbCloseInterface(port->ctrDevHandle, true);
1184 if (ret != HDF_SUCCESS) {
1185 OsalMutexUnlock(&lock_);
1186 HDF_LOGE("%{public}s:usbCloseInterface ctrDevHandle failed.", __func__);
1187 return HDF_FAILURE;
1188 }
1189 port->ctrDevHandle = nullptr;
1190 port->initFlag = false;
1191 }
1192 OsalMutexUnlock(&lock_);
1193 return HDF_SUCCESS;
1194 #else
1195 return LibusbAdapter::GetInstance()->CloseDevice(dev);
1196 #endif // LIBUSB_ENABLE
1197 }
1198
ResetDevice(const UsbDev & dev)1199 int32_t UsbImpl::ResetDevice(const UsbDev &dev)
1200 {
1201 #ifndef LIBUSB_ENABLE
1202 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1203 if (port == nullptr) {
1204 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1205 return HDF_DEV_ERR_NO_DEVICE;
1206 }
1207 if (port->ctrDevHandle == nullptr && port->ctrIface != nullptr) {
1208 HDF_LOGD("%{public}s:start resetDevice, busNum: %{public}d, devAddr: %{public}d ",
1209 __func__, dev.busNum, dev.devAddr);
1210 port->ctrDevHandle = UsbResetDevice(port->ctrIface);
1211 if (port->ctrDevHandle == nullptr) {
1212 HDF_LOGE("%{public}s:UsbResetDevice failed", __func__);
1213 return HDF_FAILURE;
1214 }
1215 }
1216 return HDF_SUCCESS;
1217 #else
1218 return LibusbAdapter::GetInstance()->ResetDevice(dev);
1219 #endif // LIBUSB_ENABLE
1220 }
1221
GetDeviceDescriptor(const UsbDev & dev,std::vector<uint8_t> & descriptor)1222 int32_t UsbImpl::GetDeviceDescriptor(const UsbDev &dev, std::vector<uint8_t> &descriptor)
1223 {
1224 #ifndef LIBUSB_ENABLE
1225 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1226 if (port == nullptr) {
1227 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1228 return HDF_DEV_ERR_NO_DEVICE;
1229 }
1230
1231 uint16_t length = USB_MAX_DESCRIPTOR_SIZE;
1232 uint8_t buffer[USB_MAX_DESCRIPTOR_SIZE] = {0};
1233 UsbControlParams controlParams = {0};
1234 MakeUsbControlParams(&controlParams, buffer, length, static_cast<int32_t>(USB_DDK_DT_DEVICE) << TYPE_OFFSET_8, 0);
1235 int32_t ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1236 if (ret != HDF_SUCCESS) {
1237 HDF_LOGE("%{public}s:UsbControlTransferEx failed, ret:%{public}d", __func__, ret);
1238 return ret;
1239 }
1240 descriptor.resize(USB_MAX_DESCRIPTOR_SIZE);
1241 std::copy(buffer, buffer + USB_MAX_DESCRIPTOR_SIZE, descriptor.begin());
1242 return HDF_SUCCESS;
1243 #else
1244 return LibusbAdapter::GetInstance()->GetDeviceDescriptor(dev, descriptor);
1245 #endif // LIBUSB_ENABLE
1246 }
1247
GetStringDescriptor(const UsbDev & dev,uint8_t descId,std::vector<uint8_t> & descriptor)1248 int32_t UsbImpl::GetStringDescriptor(const UsbDev &dev, uint8_t descId, std::vector<uint8_t> &descriptor)
1249 {
1250 #ifndef LIBUSB_ENABLE
1251 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1252 if (port == nullptr) {
1253 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1254 return HDF_DEV_ERR_NO_DEVICE;
1255 }
1256
1257 uint16_t length = USB_MAX_DESCRIPTOR_SIZE;
1258 uint8_t buffer[USB_MAX_DESCRIPTOR_SIZE] = {0};
1259 UsbControlParams controlParams = {0};
1260 MakeUsbControlParams(
1261 &controlParams, buffer, length,
1262 (static_cast<int32_t>(USB_DDK_DT_STRING) << TYPE_OFFSET_8) + descId, ENGLISH_US_LANGUAGE_ID);
1263 int32_t ret = UsbControlTransferEx(port, &controlParams, GET_STRING_SET_TIMEOUT);
1264 if (ret != HDF_SUCCESS) {
1265 HDF_LOGE("%{public}s:UsbControlTransferEx failed ret=%{public}d", __func__, ret);
1266 return ret;
1267 }
1268
1269 descriptor.resize(USB_MAX_DESCRIPTOR_SIZE);
1270 std::copy(buffer, buffer + USB_MAX_DESCRIPTOR_SIZE, descriptor.begin());
1271 return HDF_SUCCESS;
1272 #else
1273 return LibusbAdapter::GetInstance()->GetStringDescriptor(dev, descId, descriptor);
1274 #endif // LIBUSB_ENABLE
1275 }
1276
GetConfigDescriptor(const UsbDev & dev,uint8_t descId,std::vector<uint8_t> & descriptor)1277 int32_t UsbImpl::GetConfigDescriptor(const UsbDev &dev, uint8_t descId, std::vector<uint8_t> &descriptor)
1278 {
1279 #ifndef LIBUSB_ENABLE
1280 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1281 if (port == nullptr) {
1282 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1283 return HDF_DEV_ERR_NO_DEVICE;
1284 }
1285
1286 uint16_t length = USB_MAX_DESCRIPTOR_SIZE;
1287 uint8_t buffer[USB_MAX_DESCRIPTOR_SIZE] = {0};
1288 UsbControlParams controlParams = {0};
1289 MakeUsbControlParams(
1290 &controlParams, buffer, length, (static_cast<int32_t>(USB_DDK_DT_CONFIG) << TYPE_OFFSET_8) + descId, 0);
1291 int32_t ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1292 if (ret != HDF_SUCCESS) {
1293 HDF_LOGE("%{public}s:UsbControlTransferEx failed ret=%{public}d", __func__, ret);
1294 return ret;
1295 }
1296
1297 descriptor.resize(USB_MAX_DESCRIPTOR_SIZE);
1298 std::copy(buffer, buffer + USB_MAX_DESCRIPTOR_SIZE, descriptor.begin());
1299 return HDF_SUCCESS;
1300 #else
1301 return LibusbAdapter::GetInstance()->GetConfigDescriptor(dev, descId, descriptor);
1302 #endif // LIBUSB_ENABLE
1303 }
1304
GetRawDescriptor(const UsbDev & dev,std::vector<uint8_t> & descriptor)1305 int32_t UsbImpl::GetRawDescriptor(const UsbDev &dev, std::vector<uint8_t> &descriptor)
1306 {
1307 #ifndef LIBUSB_ENABLE
1308 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1309 if (port == nullptr || port->ctrDevHandle == nullptr) {
1310 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1311 return HDF_DEV_ERR_NO_DEVICE;
1312 }
1313
1314 UsbInterfaceHandleEntity *handle = reinterpret_cast<UsbInterfaceHandleEntity *>(port->ctrDevHandle);
1315 OsalMutexLock(&handle->devHandle->lock);
1316 uint8_t *ptr = static_cast<uint8_t *>(handle->devHandle->dev->descriptors);
1317 uint32_t length = handle->devHandle->dev->descriptorsLength;
1318 descriptor.resize(length);
1319 std::copy(ptr, ptr + length, descriptor.begin());
1320 OsalMutexUnlock(&handle->devHandle->lock);
1321 return HDF_SUCCESS;
1322 #else
1323 return LibusbAdapter::GetInstance()->GetRawDescriptor(dev, descriptor);
1324 #endif // LIBUSB_ENABLE
1325 }
1326
GetFileDescriptor(const UsbDev & dev,int32_t & fd)1327 int32_t UsbImpl::GetFileDescriptor(const UsbDev &dev, int32_t &fd)
1328 {
1329 #ifndef LIBUSB_ENABLE
1330 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1331 if (port == nullptr || port->ctrDevHandle == nullptr) {
1332 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1333 return HDF_DEV_ERR_NO_DEVICE;
1334 }
1335
1336 UsbInterfaceHandleEntity *handle = reinterpret_cast<UsbInterfaceHandleEntity *>(port->ctrDevHandle);
1337 OsalMutexLock(&handle->devHandle->lock);
1338 fd = handle->devHandle->fd;
1339 OsalMutexUnlock(&handle->devHandle->lock);
1340 return HDF_SUCCESS;
1341 #else
1342 return LibusbAdapter::GetInstance()->GetFileDescriptor(dev, fd);
1343 #endif // LIBUSB_ENABLE
1344 }
1345
GetDeviceFileDescriptor(const UsbDev & dev,int32_t & fd)1346 int32_t UsbImpl::GetDeviceFileDescriptor(const UsbDev &dev, int32_t &fd)
1347 {
1348 #ifndef LIBUSB_ENABLE
1349 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1350 if (port == nullptr || port->ctrDevHandle == nullptr) {
1351 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1352 return HDF_DEV_ERR_NO_DEVICE;
1353 }
1354
1355 UsbInterfaceHandleEntity *handle = reinterpret_cast<UsbInterfaceHandleEntity *>(port->ctrDevHandle);
1356 OsalMutexLock(&handle->devHandle->lock);
1357 fd = GetDeviceFd(handle->devHandle->dev, O_RDWR);
1358 if (fd <= 0) {
1359 fd = handle->devHandle->fd;
1360 HDF_LOGW("%{public}s:open fd failed, fall back to default", __func__);
1361 } else {
1362 std::lock_guard<std::mutex> lock(openedFdsMutex_);
1363 auto iter = openedFds_.find({dev.busNum, dev.devAddr});
1364 if (iter != openedFds_.end()) {
1365 int32_t oldFd = iter->second;
1366 int res = close(oldFd);
1367 HDF_LOGI("%{public}s:%{public}d close old %{public}d ret = %{public}d",
1368 __func__, __LINE__, iter->second, res);
1369 } else {
1370 HDF_LOGI("%{public}s:%{public}d first time get fd", __func__, __LINE__);
1371 }
1372 openedFds_[{dev.busNum, dev.devAddr}] = fd;
1373 HDF_LOGI("%{public}s:%{public}d opened %{public}d", __func__, __LINE__, fd);
1374 }
1375 OsalMutexUnlock(&handle->devHandle->lock);
1376 return HDF_SUCCESS;
1377 #else
1378 return LibusbAdapter::GetInstance()->GetDeviceFileDescriptor(dev, fd);
1379 #endif // LIBUSB_ENABLE
1380 }
1381
IfConfigIndex(const uint8_t configIndex,HostDevice * port,int32_t & ret)1382 int32_t UsbImpl::IfConfigIndex(const uint8_t configIndex, HostDevice *port, int32_t &ret)
1383 {
1384 if (configIndex != 0) {
1385 ret = ReOpenDevice(port);
1386 if (ret != HDF_SUCCESS) {
1387 HDF_LOGE("%{public}s:ReOpenDevice failed ret:%{public}d", __func__, ret);
1388 return ret;
1389 }
1390 }
1391 return ret;
1392 }
1393
SetConfig(const UsbDev & dev,uint8_t configIndex)1394 int32_t UsbImpl::SetConfig(const UsbDev &dev, uint8_t configIndex)
1395 {
1396 #ifndef LIBUSB_ENABLE
1397 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1398 if (port == nullptr) {
1399 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1400 return HDF_DEV_ERR_NO_DEVICE;
1401 }
1402 if (!port->initFlag) {
1403 HDF_LOGE("%{public}s: openPort failed", __func__);
1404 return HDF_DEV_ERR_DEV_INIT_FAIL;
1405 }
1406
1407 uint8_t configIdOld = 0;
1408 uint8_t configIdNew = 0;
1409 uint16_t length = 1;
1410 UsbControlParams controlParams;
1411 MakeGetActiveUsbControlParams(&controlParams, &configIdOld, length, 0, 0);
1412 int32_t ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1413 if (ret != HDF_SUCCESS) {
1414 HDF_LOGE("%{public}s:setConfiguration failed ret:%{public}d", __func__, ret);
1415 return HDF_ERR_INVALID_PARAM;
1416 }
1417 if (configIndex == configIdOld) {
1418 HDF_LOGE("%{public}s:setConfiguration success, configIndex:%{public}d configIdOld:%{public}d", __func__,
1419 configIndex, configIdOld);
1420 return HDF_SUCCESS;
1421 }
1422
1423 length = 0;
1424 MakeSetActiveUsbControlParams(&controlParams, &configIndex, length, static_cast<int32_t>(configIndex), 0);
1425 ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1426 if (ret != HDF_SUCCESS) {
1427 HDF_LOGE("%{public}s:setConfiguration failed ret:%{public}d", __func__, ret);
1428 return HDF_ERR_IO;
1429 }
1430
1431 length = 1;
1432 MakeGetActiveUsbControlParams(&controlParams, &configIdNew, length, 0, 0);
1433 ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1434 if (ret != HDF_SUCCESS || configIndex != configIdNew) {
1435 HDF_LOGE("%{public}s:getConfiguration failed ret:%{public}d", __func__, ret);
1436 HDF_LOGE("%{public}s:setConfiguration failed, IdSet:%{public}d,IdOld:%{public}d,IdNew:%{public}d",
1437 __func__, configIndex, configIdOld, configIdNew);
1438 return HDF_ERR_IO;
1439 }
1440 return IfConfigIndex(configIndex, port, ret);
1441 #else
1442 return LibusbAdapter::GetInstance()->SetConfig(dev, configIndex);
1443 #endif // LIBUSB_ENABLE
1444 }
1445
GetConfig(const UsbDev & dev,uint8_t & configIndex)1446 int32_t UsbImpl::GetConfig(const UsbDev &dev, uint8_t &configIndex)
1447 {
1448 #ifndef LIBUSB_ENABLE
1449 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1450 if (port == nullptr) {
1451 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1452 return HDF_DEV_ERR_NO_DEVICE;
1453 }
1454
1455 uint16_t length = 1;
1456 UsbControlParams controlParams;
1457 MakeGetActiveUsbControlParams(&controlParams, &configIndex, length, 0, 0);
1458 int32_t ret = UsbControlTransferEx(port, &controlParams, USB_CTRL_SET_TIMEOUT);
1459 if (ret != HDF_SUCCESS) {
1460 HDF_LOGE("%{public}s:UsbControlTransferEx failed", __func__);
1461 return HDF_ERR_IO;
1462 }
1463 return HDF_SUCCESS;
1464 #else
1465 return LibusbAdapter::GetInstance()->GetConfig(dev, configIndex);
1466 #endif // LIBUSB_ENABLE
1467 }
1468
ClaimInterface(const UsbDev & dev,uint8_t interfaceId,uint8_t force)1469 int32_t UsbImpl::ClaimInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t force)
1470 {
1471 #ifndef LIBUSB_ENABLE
1472 HDF_LOGI("%{public}s:%{public}d start", __func__, __LINE__);
1473 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1474 if (port == nullptr) {
1475 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1476 return HDF_DEV_ERR_NO_DEVICE;
1477 }
1478 if (!port->initFlag) {
1479 HDF_LOGE("%{public}s: openPort failed", __func__);
1480 return HDF_DEV_ERR_DEV_INIT_FAIL;
1481 }
1482 if (interfaceId >= USB_MAX_INTERFACES) {
1483 HDF_LOGE("%{public}s:interfaceId larger than max num", __func__);
1484 return HDF_ERR_INVALID_PARAM;
1485 }
1486
1487 if (port->iface[interfaceId] == nullptr) {
1488 if (force) {
1489 port->iface[interfaceId] =
1490 UsbClaimInterface(port->service->session_, port->busNum, port->devAddr, interfaceId);
1491 } else {
1492 port->iface[interfaceId] =
1493 UsbClaimInterfaceUnforce(port->service->session_, port->busNum, port->devAddr, interfaceId);
1494 }
1495 if (port->iface[interfaceId] == nullptr) {
1496 HDF_LOGE("%{public}s:UsbClaimInterface failed, busNum=%{public}u, devAddr=%{public}u", __func__,
1497 port->busNum, port->devAddr);
1498 return HDF_FAILURE;
1499 }
1500 }
1501 if (port->devHandle[interfaceId] == nullptr) {
1502 port->devHandle[interfaceId] = UsbOpenInterface(port->iface[interfaceId]);
1503 if (port->devHandle[interfaceId] == nullptr) {
1504 HDF_LOGE("%{public}s:UsbOpenInterface failed.", __func__);
1505 return HDF_FAILURE;
1506 }
1507 } else {
1508 HDF_LOGW("%{public}s:the interface has been claimed.", __func__);
1509 }
1510 HDF_LOGI("%{public}s:%{public}d end", __func__, __LINE__);
1511 return HDF_SUCCESS;
1512 #else
1513 return LibusbAdapter::GetInstance()->ClaimInterface(dev, interfaceId, force);
1514 #endif // LIBUSB_ENABLE
1515 }
1516
ManageInterface(const UsbDev & dev,uint8_t interfaceId,bool disable)1517 int32_t UsbImpl::ManageInterface(const UsbDev &dev, uint8_t interfaceId, bool disable)
1518 {
1519 #ifndef LIBUSB_ENABLE
1520 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1521 if (port == nullptr) {
1522 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1523 return HDF_DEV_ERR_NO_DEVICE;
1524 }
1525 if (interfaceId >= USB_MAX_INTERFACES) {
1526 HDF_LOGE("%{public}s:interfaceId larger then max num", __func__);
1527 return HDF_ERR_INVALID_PARAM;
1528 }
1529
1530 port->iface[interfaceId] =
1531 UsbManageInterface(port->service->session_, port->busNum, port->devAddr, interfaceId, disable);
1532 if (port->iface[interfaceId] == nullptr) {
1533 HDF_LOGE("%{public}s: ManageInterface failed, busNum=%{public}u, devAddr=%{public}u", __func__,
1534 port->busNum, port->devAddr);
1535 return HDF_FAILURE;
1536 }
1537 return HDF_SUCCESS;
1538 #else
1539 return LibusbAdapter::GetInstance()->ManageInterface(dev, interfaceId, disable);
1540 #endif // LIBUSB_ENABLE
1541 }
1542
ReleaseInterface(const UsbDev & dev,uint8_t interfaceId)1543 int32_t UsbImpl::ReleaseInterface(const UsbDev &dev, uint8_t interfaceId)
1544 {
1545 #ifndef LIBUSB_ENABLE
1546 HDF_LOGI("%{public}s:%{public}d start", __func__, __LINE__);
1547 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1548 if (port == nullptr) {
1549 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1550 return HDF_DEV_ERR_NO_DEVICE;
1551 }
1552 if (!port->initFlag) {
1553 HDF_LOGE("%{public}s: openPort failed", __func__);
1554 return HDF_DEV_ERR_DEV_INIT_FAIL;
1555 }
1556
1557 if (interfaceId < USB_MAX_INTERFACES) {
1558 if (port->devHandle[interfaceId] == nullptr || port->iface[interfaceId] == nullptr) {
1559 HDF_LOGE("%{public}s: UsbOpenInterface or UsbClaimInterface failed", __func__);
1560 return HDF_DEV_ERR_OP;
1561 }
1562 if (HdfSListCount(&port->reqSyncList) > 0) {
1563 UsbdRequestSyncReleaseList(port);
1564 HDF_LOGD("%{public}s:release sync list", __func__);
1565 }
1566 if (HdfSListCount(&port->reqASyncList) > 0) {
1567 UsbdRequestASyncReleaseList(port);
1568 HDF_LOGD("%{public}s:release async list", __func__);
1569 }
1570 int32_t ret = UsbdBulkASyncListReleasePort(port);
1571 if (ret != HDF_SUCCESS) {
1572 HDF_LOGW("%{public}s:release bulk async list failed", __func__);
1573 }
1574 UsbCloseInterface(port->devHandle[interfaceId], false);
1575 port->devHandle[interfaceId] = nullptr;
1576 UsbReleaseInterface(port->iface[interfaceId]);
1577 port->iface[interfaceId] = nullptr;
1578 HDF_LOGI("%{public}s:%{public}d end", __func__, __LINE__);
1579 return HDF_SUCCESS;
1580 } else {
1581 HDF_LOGE("%{public}s:interfaceId failed busNum:%{public}u devAddr:%{public}u interfaceId:%{public}u", __func__,
1582 port->busNum, port->devAddr, interfaceId);
1583 return HDF_FAILURE;
1584 }
1585
1586 return HDF_SUCCESS;
1587 #else
1588 return LibusbAdapter::GetInstance()->ReleaseInterface(dev, interfaceId);
1589 #endif // LIBUSB_ENABLE
1590 }
1591
ReleaseInterfaceByPort(HostDevice * port,uint8_t interfaceId)1592 int32_t UsbImpl::ReleaseInterfaceByPort(HostDevice *port, uint8_t interfaceId)
1593 {
1594 if (port == nullptr) {
1595 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1596 return HDF_DEV_ERR_NO_DEVICE;
1597 }
1598 if (!port->initFlag) {
1599 HDF_LOGE("%{public}s: openPort failed", __func__);
1600 return HDF_DEV_ERR_DEV_INIT_FAIL;
1601 }
1602
1603 if (interfaceId < USB_MAX_INTERFACES) {
1604 if (port->devHandle[interfaceId] == nullptr || port->iface[interfaceId] == nullptr) {
1605 HDF_LOGE("%{public}s: UsbOpenInterface or UsbClaimInterface failed", __func__);
1606 return HDF_DEV_ERR_OP;
1607 }
1608 if (HdfSListCount(&port->reqSyncList) > 0) {
1609 UsbdRequestSyncReleaseList(port);
1610 HDF_LOGD("%{public}s:release sync list", __func__);
1611 }
1612 if (HdfSListCount(&port->reqASyncList) > 0) {
1613 UsbdRequestASyncReleaseList(port);
1614 HDF_LOGD("%{public}s:release async list", __func__);
1615 }
1616 int32_t ret = UsbdBulkASyncListReleasePort(port);
1617 if (ret != HDF_SUCCESS) {
1618 HDF_LOGW("%{public}s:release bulk async list failed", __func__);
1619 }
1620 UsbCloseInterface(port->devHandle[interfaceId], false);
1621 port->devHandle[interfaceId] = nullptr;
1622 UsbReleaseInterface(port->iface[interfaceId]);
1623 port->iface[interfaceId] = nullptr;
1624 return HDF_SUCCESS;
1625 } else {
1626 HDF_LOGE("%{public}s:interfaceId failed busNum:%{public}u devAddr:%{public}u interfaceId:%{public}u", __func__,
1627 port->busNum, port->devAddr, interfaceId);
1628 return HDF_FAILURE;
1629 }
1630
1631 return HDF_SUCCESS;
1632 }
1633
SetInterface(const UsbDev & dev,uint8_t interfaceId,uint8_t altIndex)1634 int32_t UsbImpl::SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex)
1635 {
1636 #ifndef LIBUSB_ENABLE
1637 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1638 if (port == nullptr) {
1639 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1640 return HDF_DEV_ERR_NO_DEVICE;
1641 }
1642 if (!port->initFlag) {
1643 HDF_LOGE("%{public}s: openPort failed", __func__);
1644 return HDF_DEV_ERR_DEV_INIT_FAIL;
1645 }
1646
1647 UsbInterfaceHandle *interfaceHandle = InterfaceIdToHandle(port, interfaceId);
1648 if (interfaceHandle == nullptr || interfaceId >= USB_MAX_INTERFACES) {
1649 HDF_LOGE("%{public}s:interfaceId failed busNum:%{public}u devAddr:%{public}u interfaceId:%{public}u", __func__,
1650 port->busNum, port->devAddr, interfaceId);
1651 return HDF_FAILURE;
1652 }
1653
1654 int32_t ret = UsbSelectInterfaceSetting(interfaceHandle, altIndex, &port->iface[interfaceId]);
1655 if (ret == HDF_SUCCESS) {
1656 UsbdRequestSyncReleaseList(port);
1657 UsbdRequestASyncReleaseList(port);
1658 UsbdBulkASyncListReleasePort(port);
1659 }
1660 return ret;
1661 #else
1662 return LibusbAdapter::GetInstance()->SetInterface(dev, interfaceId, altIndex);
1663 #endif // LIBUSB_ENABLE
1664 }
1665
BulkTransferRead(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,std::vector<uint8_t> & data)1666 int32_t UsbImpl::BulkTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, std::vector<uint8_t> &data)
1667 {
1668 #ifndef LIBUSB_ENABLE
1669 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1670 if (port == nullptr) {
1671 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1672 return HDF_DEV_ERR_NO_DEVICE;
1673 }
1674
1675 uint8_t tbuf[READ_BUF_SIZE] = {0};
1676 uint32_t tsize = READ_BUF_SIZE;
1677 uint32_t actlength = 0;
1678 UsbdRequestSync *requestSync = nullptr;
1679 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
1680 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1681 HDF_LOGE("%{public}s:UsbdFindRequestSyncAndCreat failed.", __func__);
1682 return ret;
1683 }
1684 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_IN ||
1685 (requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK && requestSync->pipe.pipeType != USB_PIPE_TYPE_INTERRUPT)) {
1686 HDF_LOGE("%{public}s:invalid param", __func__);
1687 return HDF_ERR_INVALID_PARAM;
1688 }
1689 ret = UsbdBulkReadSyncBase(timeout, tbuf, tsize, &actlength, requestSync);
1690 if (ret != HDF_SUCCESS) {
1691 HDF_LOGW("%{public}s:UsbdBulkReadSyncBase ret:%{public}d, actlength:%{public}u", __func__, ret, actlength);
1692 }
1693
1694 if (actlength > 0) {
1695 data.assign(tbuf, tbuf + actlength);
1696 ret = HDF_SUCCESS;
1697 }
1698 return ret;
1699 #else
1700 return LibusbAdapter::GetInstance()->BulkTransferRead(dev, pipe, timeout, data);
1701 #endif // LIBUSB_ENABLE
1702 }
1703
BulkTransferReadwithLength(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,int32_t length,std::vector<uint8_t> & data)1704 int32_t UsbImpl::BulkTransferReadwithLength(const UsbDev &dev,
1705 const UsbPipe &pipe, int32_t timeout, int32_t length, std::vector<uint8_t> &data)
1706 {
1707 #ifndef LIBUSB_ENABLE
1708 if (length<= 0) {
1709 HDF_LOGE("%{public}s:invalid length param, length: %{public}d.", __func__, length);
1710 return HDF_ERR_INVALID_PARAM;
1711 }
1712 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1713 if (port == nullptr) {
1714 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1715 return HDF_DEV_ERR_NO_DEVICE;
1716 }
1717
1718 uint8_t* tbuf = (uint8_t *)malloc(length);
1719 if (tbuf == nullptr) {
1720 HDF_LOGE("%{public}s:malloc failed", __func__);
1721 return HDF_FAILURE;
1722 }
1723 memset_s(tbuf, length, 0, length);
1724 uint32_t tsize = static_cast<uint32_t>(length);
1725 uint32_t actlength = 0;
1726 UsbdRequestSync *requestSync = nullptr;
1727 int32_t ret = UsbdFindRequestSyncAndCreatwithLength(port, pipe.intfId, pipe.endpointId, length, &requestSync);
1728 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1729 HDF_LOGE("%{public}s:UsbdFindRequestSyncAndCreat failed.", __func__);
1730 free(tbuf);
1731 tbuf = nullptr;
1732 return ret;
1733 }
1734 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_IN ||
1735 (requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK && requestSync->pipe.pipeType != USB_PIPE_TYPE_INTERRUPT)) {
1736 HDF_LOGE("%{public}s:invalid param", __func__);
1737 free(tbuf);
1738 tbuf = nullptr;
1739 return HDF_ERR_INVALID_PARAM;
1740 }
1741 ret = UsbdBulkReadSyncBase(timeout, tbuf, tsize, &actlength, requestSync);
1742 if (ret != HDF_SUCCESS) {
1743 HDF_LOGW("%{public}s:UsbdBulkReadSyncBase ret:%{public}d, actlength:%{public}u", __func__, ret, actlength);
1744 }
1745
1746 if (actlength > 0) {
1747 data.assign(tbuf, tbuf + actlength);
1748 ret = HDF_SUCCESS;
1749 }
1750 free(tbuf);
1751 tbuf = nullptr;
1752 return ret;
1753 #else
1754 return LibusbAdapter::GetInstance()->BulkTransferReadwithLength(dev, pipe, timeout, length, data);
1755 #endif // LIBUSB_ENABLE
1756 }
1757
BulkTransferWrite(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,const std::vector<uint8_t> & data)1758 int32_t UsbImpl::BulkTransferWrite(
1759 const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, const std::vector<uint8_t> &data)
1760 {
1761 #ifndef LIBUSB_ENABLE
1762 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1763 if (port == nullptr) {
1764 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1765 return HDF_DEV_ERR_NO_DEVICE;
1766 }
1767
1768 UsbdRequestSync *requestSync = nullptr;
1769 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
1770 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1771 HDF_LOGE("%{public}s:read timeout error", __func__);
1772 return ret;
1773 }
1774 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_OUT ||
1775 (requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK && requestSync->pipe.pipeType != USB_PIPE_TYPE_INTERRUPT)) {
1776 HDF_LOGE("%{public}s:invalid param", __func__);
1777 return HDF_ERR_INVALID_PARAM;
1778 }
1779 ret = UsbdBulkWriteSyncBase(port, requestSync, data.data(), data.size(), timeout);
1780 return ret;
1781 #else
1782 return LibusbAdapter::GetInstance()->BulkTransferWrite(dev, pipe, timeout, data);
1783 #endif // LIBUSB_ENABLE
1784 }
1785
ControlTransferRead(const UsbDev & dev,const UsbCtrlTransfer & ctrl,std::vector<uint8_t> & data)1786 int32_t UsbImpl::ControlTransferRead(const UsbDev &dev, const UsbCtrlTransfer &ctrl, std::vector<uint8_t> &data)
1787 {
1788 #ifndef LIBUSB_ENABLE
1789 if ((static_cast<uint32_t>(ctrl.requestType) & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
1790 HDF_LOGE("%{public}s: this function is read, not write", __func__);
1791 return HDF_FAILURE;
1792 }
1793
1794 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1795 if (port == nullptr || port->ctrDevHandle == nullptr) {
1796 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1797 return HDF_DEV_ERR_NO_DEVICE;
1798 }
1799
1800 UsbControlParams controlParams;
1801 if (memset_s(&controlParams, sizeof(controlParams), 0, sizeof(controlParams)) != EOK) {
1802 HDF_LOGE("%{public}s:memset_s failed ", __func__);
1803 return HDF_FAILURE;
1804 }
1805 controlParams.request = static_cast<uint8_t>(ctrl.requestCmd);
1806 controlParams.value = ctrl.value;
1807 controlParams.index = ctrl.index;
1808 controlParams.target = (UsbRequestTargetType)(static_cast<uint32_t>(ctrl.requestType) & USB_RECIP_MASK);
1809 controlParams.directon = (UsbRequestDirection)(((static_cast<uint32_t>(ctrl.requestType)) >> DIRECTION_OFFSET_7) &
1810 ENDPOINT_DIRECTION_MASK);
1811 controlParams.reqType = static_cast<uint32_t>(ctrl.requestType);
1812 controlParams.size = MAX_CONTROL_BUFF_SIZE;
1813 controlParams.data = static_cast<void *>(OsalMemCalloc(controlParams.size));
1814 if (controlParams.data == nullptr) {
1815 HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
1816 return HDF_ERR_MALLOC_FAIL;
1817 }
1818 int32_t ret = UsbControlTransferEx(port, &controlParams, ctrl.timeout);
1819 if (ret != HDF_SUCCESS) {
1820 HDF_LOGE("%{public}s:%{public}d UsbControlTransfer failed ret:%{public}d", __func__, __LINE__, ret);
1821 }
1822
1823 uint8_t *dataValue = static_cast<uint8_t *>(controlParams.data);
1824 data.assign(dataValue, dataValue + controlParams.size);
1825 OsalMemFree(controlParams.data);
1826 return ret;
1827 #else
1828 return LibusbAdapter::GetInstance()->ControlTransferRead(dev, ctrl, data);
1829 #endif // LIBUSB_ENABLE
1830 }
1831
ControlTransferWrite(const UsbDev & dev,const UsbCtrlTransfer & ctrl,const std::vector<uint8_t> & data)1832 int32_t UsbImpl::ControlTransferWrite(const UsbDev &dev, const UsbCtrlTransfer &ctrl, const std::vector<uint8_t> &data)
1833 {
1834 #ifndef LIBUSB_ENABLE
1835 if ((static_cast<uint32_t>(ctrl.requestType) & USB_ENDPOINT_DIR_MASK) != USB_ENDPOINT_DIR_OUT) {
1836 HDF_LOGE("%{public}s: this function is write, not read", __func__);
1837 return HDF_FAILURE;
1838 }
1839
1840 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1841 if (port == nullptr || port->ctrDevHandle == nullptr) {
1842 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1843 return HDF_DEV_ERR_NO_DEVICE;
1844 }
1845
1846 UsbControlParams controlParams;
1847 if (memset_s(&controlParams, sizeof(controlParams), 0, sizeof(controlParams)) != EOK) {
1848 HDF_LOGE("%{public}s:memset_s failed ", __func__);
1849 return HDF_FAILURE;
1850 }
1851 controlParams.request = static_cast<uint8_t>(ctrl.requestCmd);
1852 controlParams.value = ctrl.value;
1853 controlParams.index = ctrl.index;
1854 controlParams.target = (UsbRequestTargetType)(static_cast<uint32_t>(ctrl.requestType) & USB_RECIP_MASK);
1855 controlParams.directon = (UsbRequestDirection)(((static_cast<uint32_t>(ctrl.requestType)) >> DIRECTION_OFFSET_7) &
1856 ENDPOINT_DIRECTION_MASK);
1857 controlParams.reqType = static_cast<uint32_t>(ctrl.requestType);
1858 controlParams.size = data.size();
1859 controlParams.data = static_cast<void *>(const_cast<uint8_t *>(data.data()));
1860 int32_t ret = UsbControlTransferEx(port, &controlParams, ctrl.timeout);
1861 if (ret != HDF_SUCCESS) {
1862 HDF_LOGE("%{public}s:%{public}d UsbControlTransfer failed ret:%{public}d", __func__, __LINE__, ret);
1863 }
1864 return ret;
1865 #else
1866 return LibusbAdapter::GetInstance()->ControlTransferWrite(dev, ctrl, data);
1867 #endif // LIBUSB_ENABLE
1868 }
1869
ControlTransferReadwithLength(const UsbDev & dev,const UsbCtrlTransferParams & ctrlParams,std::vector<uint8_t> & data)1870 int32_t UsbImpl::ControlTransferReadwithLength(
1871 const UsbDev &dev, const UsbCtrlTransferParams &ctrlParams, std::vector<uint8_t> &data)
1872 {
1873 #ifndef LIBUSB_ENABLE
1874 if ((static_cast<uint32_t>(ctrlParams.requestType) & USB_ENDPOINT_DIR_MASK) == USB_ENDPOINT_DIR_OUT) {
1875 HDF_LOGE("%{public}s: this function is read, not write", __func__);
1876 return HDF_FAILURE;
1877 }
1878
1879 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1880 if (port == nullptr || port->ctrDevHandle == nullptr) {
1881 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1882 return HDF_DEV_ERR_NO_DEVICE;
1883 }
1884
1885 UsbControlParams controlParams;
1886 if (memset_s(&controlParams, sizeof(controlParams), 0, sizeof(controlParams)) != EOK) {
1887 HDF_LOGE("%{public}s:memset_s failed ", __func__);
1888 return HDF_FAILURE;
1889 }
1890 controlParams.request = static_cast<uint8_t>(ctrlParams.requestCmd);
1891 controlParams.value = ctrlParams.value;
1892 controlParams.index = ctrlParams.index;
1893 controlParams.target = (UsbRequestTargetType)(static_cast<uint32_t>(ctrlParams.requestType) & USB_RECIP_MASK);
1894 controlParams.directon = (UsbRequestDirection)(((static_cast<uint32_t>(ctrlParams.requestType))
1895 >> DIRECTION_OFFSET_7) & ENDPOINT_DIRECTION_MASK);
1896 controlParams.reqType = static_cast<uint32_t>(ctrlParams.requestType);
1897 controlParams.size = (ctrlParams.length <= 0 || ctrlParams.length > MAX_CONTROL_BUFF_SIZE)
1898 ? MAX_CONTROL_BUFF_SIZE : ctrlParams.length;
1899 controlParams.data = static_cast<void *>(OsalMemCalloc(controlParams.size));
1900 if (controlParams.data == nullptr) {
1901 HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
1902 return HDF_ERR_MALLOC_FAIL;
1903 }
1904 int32_t ret = UsbControlTransferEx(port, &controlParams, ctrlParams.timeout);
1905 if (ret != HDF_SUCCESS) {
1906 HDF_LOGE("%{public}s:%{public}d UsbControlTransfer failed ret:%{public}d", __func__, __LINE__, ret);
1907 }
1908
1909 uint8_t *dataValue = static_cast<uint8_t *>(controlParams.data);
1910 data.assign(dataValue, dataValue + controlParams.size);
1911 OsalMemFree(controlParams.data);
1912 return ret;
1913 #else
1914 return LibusbAdapter::GetInstance()->ControlTransferReadwithLength(dev, ctrlParams, data);
1915 #endif // LIBUSB_ENABLE
1916 }
1917
InterruptTransferRead(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,std::vector<uint8_t> & data)1918 int32_t UsbImpl::InterruptTransferRead(
1919 const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, std::vector<uint8_t> &data)
1920 {
1921 #ifndef LIBUSB_ENABLE
1922 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1923 if (port == nullptr) {
1924 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1925 return HDF_DEV_ERR_NO_DEVICE;
1926 }
1927
1928 uint8_t tbuf[READ_BUF_SIZE] = {0};
1929 uint32_t tsize = READ_BUF_SIZE;
1930 uint32_t actlength = 0;
1931 UsbdRequestSync *requestSync = nullptr;
1932 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
1933 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1934 HDF_LOGE("%{public}s:read timeout error", __func__);
1935 return ret;
1936 }
1937 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_IN || requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK) {
1938 HDF_LOGE("%{public}s:invalid param", __func__);
1939 return HDF_ERR_INVALID_PARAM;
1940 }
1941 ret = UsbdBulkReadSyncBase(timeout, tbuf, tsize, &actlength, requestSync);
1942 if (ret != HDF_SUCCESS) {
1943 HDF_LOGW("%{public}s:UsbdBulkReadSyncBase ret:%{public}d, actlength:%{public}u", __func__, ret, actlength);
1944 }
1945
1946 if (actlength > 0) {
1947 data.assign(tbuf, tbuf + actlength);
1948 ret = HDF_SUCCESS;
1949 }
1950 return ret;
1951 #else
1952 return LibusbAdapter::GetInstance()->InterruptTransferRead(dev, pipe, timeout, data);
1953 #endif // LIBUSB_ENABLE
1954 }
1955
InterruptTransferWrite(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,const std::vector<uint8_t> & data)1956 int32_t UsbImpl::InterruptTransferWrite(
1957 const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, const std::vector<uint8_t> &data)
1958 {
1959 #ifndef LIBUSB_ENABLE
1960 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1961 if (port == nullptr) {
1962 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1963 return HDF_DEV_ERR_NO_DEVICE;
1964 }
1965
1966 UsbdRequestSync *requestSync = nullptr;
1967 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
1968 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1969 HDF_LOGE("%{public}s:read timeout error", __func__);
1970 return ret;
1971 }
1972 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_OUT || requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK) {
1973 HDF_LOGE("%{public}s:invalid param", __func__);
1974 return HDF_ERR_INVALID_PARAM;
1975 }
1976 ret = UsbdBulkWriteSyncBase(port, requestSync, data.data(), data.size(), timeout);
1977 return ret;
1978 #else
1979 return LibusbAdapter::GetInstance()->InterruptTransferWrite(dev, pipe, timeout, data);
1980 #endif // LIBUSB_ENABLE
1981 }
1982
IsoTransferRead(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,std::vector<uint8_t> & data)1983 int32_t UsbImpl::IsoTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, std::vector<uint8_t> &data)
1984 {
1985 #ifndef LIBUSB_ENABLE
1986 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
1987 if (port == nullptr) {
1988 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
1989 return HDF_DEV_ERR_NO_DEVICE;
1990 }
1991
1992 uint8_t tbuf[READ_BUF_SIZE] = {0};
1993 uint32_t tsize = READ_BUF_SIZE;
1994 uint32_t actlength = 0;
1995 UsbdRequestSync *requestSync = nullptr;
1996 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
1997 if (ret != HDF_SUCCESS || requestSync == nullptr) {
1998 HDF_LOGE("%{public}s:UsbdFindRequestSyncAndCreat failed of requestSync is nullptr", __func__);
1999 return ret;
2000 }
2001
2002 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_IN || requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK) {
2003 HDF_LOGE("%{public}s:invalid param", __func__);
2004 return HDF_ERR_INVALID_PARAM;
2005 }
2006
2007 ret = UsbdBulkReadSyncBase(timeout, tbuf, tsize, &actlength, requestSync);
2008 if (ret != HDF_SUCCESS) {
2009 HDF_LOGW("%{public}s:UsbdBulkReadSyncBase failed, ret:%{public}d, len:%{public}u", __func__, ret, actlength);
2010 }
2011
2012 if (actlength > 0) {
2013 data.assign(tbuf, tbuf + actlength);
2014 ret = HDF_SUCCESS;
2015 }
2016 return ret;
2017 #else
2018 return LibusbAdapter::GetInstance()->IsoTransferRead(dev, pipe, timeout, data);
2019 #endif // LIBUSB_ENABLE
2020 }
2021
IsoTransferWrite(const UsbDev & dev,const UsbPipe & pipe,int32_t timeout,const std::vector<uint8_t> & data)2022 int32_t UsbImpl::IsoTransferWrite(
2023 const UsbDev &dev, const UsbPipe &pipe, int32_t timeout, const std::vector<uint8_t> &data)
2024 {
2025 #ifndef LIBUSB_ENABLE
2026 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2027 if (port == nullptr) {
2028 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2029 return HDF_DEV_ERR_NO_DEVICE;
2030 }
2031
2032 UsbdRequestSync *requestSync = nullptr;
2033 int32_t ret = UsbdFindRequestSyncAndCreat(port, pipe.intfId, pipe.endpointId, &requestSync);
2034 if (ret != HDF_SUCCESS || requestSync == nullptr) {
2035 HDF_LOGE("%{public}s:read timeout error", __func__);
2036 return ret;
2037 }
2038
2039 if (requestSync->pipe.pipeDirection != USB_PIPE_DIRECTION_OUT || requestSync->pipe.pipeType != USB_PIPE_TYPE_BULK) {
2040 HDF_LOGE("%{public}s:invalid param", __func__);
2041 return HDF_ERR_INVALID_PARAM;
2042 }
2043
2044 ret = UsbdBulkWriteSyncBase(port, requestSync, data.data(), data.size(), timeout);
2045 return ret;
2046 #else
2047 return LibusbAdapter::GetInstance()->IsoTransferWrite(dev, pipe, timeout, data);
2048 #endif // LIBUSB_ENABLE
2049 }
2050
RequestQueue(const UsbDev & dev,const UsbPipe & pipe,const std::vector<uint8_t> & clientData,const std::vector<uint8_t> & buffer)2051 int32_t UsbImpl::RequestQueue(
2052 const UsbDev &dev, const UsbPipe &pipe, const std::vector<uint8_t> &clientData, const std::vector<uint8_t> &buffer)
2053 {
2054 #ifndef LIBUSB_ENABLE
2055 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2056 if (port == nullptr) {
2057 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2058 return HDF_DEV_ERR_NO_DEVICE;
2059 }
2060
2061 UsbdRequestASync *reqAsync = UsbdFindRequestASync(port, pipe.intfId, pipe.endpointId);
2062 if (reqAsync == nullptr) {
2063 HDF_LOGE("%{public}s:UsbdFindRequestASync failed", __func__);
2064 return HDF_ERR_DEVICE_BUSY;
2065 }
2066
2067 uint8_t *clientDataAddr = nullptr;
2068 int32_t ret = UsbdDispatcher::UsbdMallocAndFill(clientDataAddr, clientData);
2069 if (ret != HDF_SUCCESS) {
2070 HDF_LOGE("%{public}s:clientDataAddr UsbdMallocAndFill failed", __func__);
2071 return HDF_FAILURE;
2072 }
2073
2074 uint8_t *bufferAddr = nullptr;
2075 ret = UsbdDispatcher::UsbdMallocAndFill(bufferAddr, buffer);
2076 if (ret != HDF_SUCCESS) {
2077 OsalMemFree(clientDataAddr);
2078 clientDataAddr = nullptr;
2079 HDF_LOGE("%{public}s:bufferAddr UsbdMallocAndFill failed", __func__);
2080 return HDF_FAILURE;
2081 }
2082
2083 reqAsync->reqMsg.clientData = static_cast<void *>(clientDataAddr);
2084 reqAsync->reqMsg.clientLength = sizeof(uint8_t) * clientData.size();
2085 ret = FunRequestQueueFillAndSubmit(port, reqAsync, bufferAddr, sizeof(uint8_t) * buffer.size());
2086 if (ret != HDF_SUCCESS) {
2087 HDF_LOGE("%{public}s:FunRequestQueueFillAndSubmit failed:%{public}d", __func__, ret);
2088 OsalMemFree(clientDataAddr);
2089 clientDataAddr = nullptr;
2090 }
2091
2092 OsalMemFree(bufferAddr);
2093 bufferAddr = nullptr;
2094 return ret;
2095 #else
2096 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2097 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID)) {
2098 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2099 return HDF_ERR_INVALID_PARAM;
2100 }
2101 return HDF_SUCCESS;
2102 #endif // LIBUSB_ENABLE
2103 }
2104
RequestWait(const UsbDev & dev,std::vector<uint8_t> & clientData,std::vector<uint8_t> & buffer,int32_t timeout)2105 int32_t UsbImpl::RequestWait(
2106 const UsbDev &dev, std::vector<uint8_t> &clientData, std::vector<uint8_t> &buffer, int32_t timeout)
2107 {
2108 #ifndef LIBUSB_ENABLE
2109 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2110 if (port == nullptr) {
2111 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2112 return HDF_DEV_ERR_NO_DEVICE;
2113 }
2114
2115 UsbdRequestASync *reqMsg = nullptr;
2116 int32_t ret = GetRequestMsgFromQueue(port, &reqMsg);
2117 if (ret != HDF_SUCCESS || reqMsg == nullptr || reqMsg->reqMsg.request == nullptr) {
2118 HDF_LOGE("%{public}s:GetRequestMsgFromQueue error:%{public}d", __func__, ret);
2119 return ret;
2120 }
2121
2122 UsbIfRequest *reqValue = reinterpret_cast<UsbIfRequest *>(reqMsg->reqMsg.request);
2123 if (static_cast<int32_t>(reqMsg->reqMsg.request->compInfo.status) == -1) {
2124 ret = OsalSemWait(&reqValue->hostRequest->sem, timeout);
2125 if (ret != HDF_SUCCESS) {
2126 HDF_LOGE("%{public}s:OsalSemWait failed, ret=%{public}d", __func__, ret);
2127 OsalMutexLock(&port->requestLock);
2128 HdfSListAdd(&port->requestQueue, &reqMsg->qNode);
2129 OsalMutexUnlock(&port->requestLock);
2130 return ret;
2131 }
2132 }
2133
2134 uint32_t length = 0;
2135 uint8_t *buf = nullptr;
2136 ret = GetRequestMsgData(port, reqMsg, timeout, &buf, &length);
2137 if (ret != HDF_SUCCESS) {
2138 HDF_LOGE("%{public}s:GetRequestMsgData failed:%{public}d", __func__, ret);
2139 return ret;
2140 }
2141
2142 uint8_t *clientDataAddr = static_cast<uint8_t *>(reqMsg->reqMsg.clientData);
2143 uint8_t *bufferAddr = static_cast<uint8_t *>(reqMsg->reqMsg.request->compInfo.buffer);
2144 clientData.assign(clientDataAddr, clientDataAddr + reqMsg->reqMsg.clientLength);
2145 buffer.assign(bufferAddr, bufferAddr + reqMsg->reqMsg.request->compInfo.length);
2146 UsbdRequestASyncReleaseData(reqMsg);
2147 return ret;
2148 #else
2149 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS)) {
2150 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2151 return HDF_ERR_INVALID_PARAM;
2152 }
2153 return HDF_SUCCESS;
2154 #endif // LIBUSB_ENABLE
2155 }
2156
RequestCancel(const UsbDev & dev,const UsbPipe & pipe)2157 int32_t UsbImpl::RequestCancel(const UsbDev &dev, const UsbPipe &pipe)
2158 {
2159 #ifndef LIBUSB_ENABLE
2160 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2161 if (port == nullptr) {
2162 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2163 return HDF_DEV_ERR_NO_DEVICE;
2164 }
2165
2166 UsbdRequestASync *reqMsg = nullptr;
2167 while (GetRequestMsgFromQueue(port, &reqMsg) == HDF_SUCCESS) {
2168 if (reqMsg) {
2169 int32_t ret = UsbCancelRequest(reqMsg->reqMsg.request);
2170 if (ret != HDF_SUCCESS) {
2171 HDF_LOGW("%{public}s:request cancel failed = %{public}d", __func__, ret);
2172 }
2173 OsalMutexLock(&reqMsg->lock);
2174 UsbdRequestASyncReleaseData(reqMsg);
2175 reqMsg->status = 0;
2176 OsalMutexUnlock(&reqMsg->lock);
2177 }
2178 }
2179 return HDF_SUCCESS;
2180 #else
2181 if ((dev.devAddr == MAX_DEVICE_ADDRESS) && (dev.busNum == MAX_DEVICE_BUSNUM) &&
2182 (pipe.endpointId == MAX_CANCEL_ENDPOINT_ID) && (pipe.intfId == MAX_INTERFACE_ID)) {
2183 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2184 return HDF_ERR_INVALID_PARAM;
2185 }
2186 if (pipe.intfId == MAX_INTERFACE_ID && pipe.endpointId == MAX_ENDPOINT_ID) {
2187 HDF_LOGW("%{public}s: intfId = %{public}d, endpointId = %{public}d",
2188 __func__, pipe.intfId, pipe.endpointId);
2189 return HDF_SUCCESS;
2190 }
2191 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2192 (pipe.endpointId > MAX_CANCEL_ENDPOINT_ID) || (pipe.intfId > LIBUSB_INTERFACE_ID)) {
2193 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2194 return HDF_ERR_INVALID_PARAM;
2195 }
2196 return HDF_SUCCESS;
2197 #endif // LIBUSB_ENABLE
2198 }
2199
GetCurrentFunctions(int32_t & funcs)2200 int32_t UsbImpl::GetCurrentFunctions(int32_t &funcs)
2201 {
2202 funcs = UsbdFunction::UsbdGetFunction();
2203 return HDF_SUCCESS;
2204 }
2205
SetCurrentFunctions(int32_t funcs)2206 int32_t UsbImpl::SetCurrentFunctions(int32_t funcs)
2207 {
2208 int32_t ret = UsbdFunction::UsbdSetFunction(funcs);
2209 if (ret != HDF_SUCCESS) {
2210 HDF_LOGE("%{public}s:UsbdSetFunction failed, ret:%{public}d", __func__, ret);
2211 return ret;
2212 }
2213 return HDF_SUCCESS;
2214 }
2215
parsePortPath()2216 void UsbImpl::parsePortPath()
2217 {
2218 const char *path_ = nullptr;
2219 const char *pathDef_ = nullptr;
2220 struct DeviceResourceIface *iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
2221 if (iface == nullptr) {
2222 HDF_LOGE("%{public}s: DeviceResourceGetIfaceInstance failed", __func__);
2223 return;
2224 }
2225
2226 if (device_ == nullptr) {
2227 HDF_LOGE("%{public}s: device_ is empty", __func__);
2228 return;
2229 }
2230 if (iface->GetString(device_->property, "port_file_path", &path_, pathDef_) != HDF_SUCCESS) {
2231 HDF_LOGE("%{public}s: read port_file_path failed", __func__);
2232 return;
2233 }
2234
2235 if (strcmp(path_, "/sys/class/dual_role_pd/") == 0) {
2236 g_productFlag = true;
2237 UsbdPorts::GetInstance().setPortPath(path_);
2238 return;
2239 }
2240
2241 g_productFlag = false;
2242 UsbdPort::GetInstance().setPortPath(path_);
2243 return;
2244 }
2245
SetPortRole(int32_t portId,int32_t powerRole,int32_t dataRole)2246 int32_t UsbImpl::SetPortRole(int32_t portId, int32_t powerRole, int32_t dataRole)
2247 {
2248 int32_t ret = 0;
2249 if (g_productFlag) {
2250 ret = UsbdPorts::GetInstance().SetPort(portId, powerRole, dataRole, subscribers_, MAX_SUBSCRIBER);
2251 } else {
2252 ret = UsbdPort::GetInstance().SetPort(portId, powerRole, dataRole, subscribers_, MAX_SUBSCRIBER);
2253 }
2254
2255 if (ret != HDF_SUCCESS) {
2256 HDF_LOGE("%{public}s:FunSetRole failed, ret:%{public}d", __func__, ret);
2257 return ret;
2258 }
2259
2260 return HDF_SUCCESS;
2261 }
2262
QueryPort(int32_t & portId,int32_t & powerRole,int32_t & dataRole,int32_t & mode)2263 int32_t UsbImpl::QueryPort(int32_t &portId, int32_t &powerRole, int32_t &dataRole, int32_t &mode)
2264 {
2265 int32_t ret = 0;
2266 if (g_productFlag) {
2267 ret = UsbdPorts::GetInstance().QueryPort(portId, powerRole, dataRole, mode);
2268 } else {
2269 ret = UsbdPort::GetInstance().QueryPort(portId, powerRole, dataRole, mode);
2270 }
2271
2272 if (ret != HDF_SUCCESS) {
2273 HDF_LOGE("%{public}s:QueryPort failed, ret:%{public}d", __func__, ret);
2274 return ret;
2275 }
2276
2277 return HDF_SUCCESS;
2278 }
2279
BindUsbdSubscriber(const sptr<IUsbdSubscriber> & subscriber)2280 int32_t UsbImpl::BindUsbdSubscriber(const sptr<IUsbdSubscriber> &subscriber)
2281 {
2282 int32_t i;
2283 if (subscriber == nullptr) {
2284 HDF_LOGE("%{public}s:subscriber is null", __func__);
2285 return HDF_ERR_INVALID_PARAM;
2286 }
2287 const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<IUsbdSubscriber>(subscriber);
2288 for (i = 0; i < MAX_SUBSCRIBER; i++) {
2289 if (subscribers_[i].remote == remote) {
2290 break;
2291 }
2292 }
2293 if (i < MAX_SUBSCRIBER) {
2294 HDF_LOGI("%{public}s: current subscriber was bind", __func__);
2295 return HDF_SUCCESS;
2296 }
2297 for (i = 0; i < MAX_SUBSCRIBER; i++) {
2298 if (subscribers_[i].subscriber == nullptr) {
2299 subscribers_[i].subscriber = subscriber;
2300 subscribers_[i].impl = this;
2301 subscribers_[i].usbPnpListener.callBack = UsbdPnpLoaderEventReceived;
2302 subscribers_[i].usbPnpListener.priv = &subscribers_[i];
2303 subscribers_[i].remote = remote;
2304 subscribers_[i].deathRecipient = new UsbImpl::UsbDeathRecipient(subscriber);
2305 if (subscribers_[i].deathRecipient == nullptr) {
2306 HDF_LOGE("%{public}s: new deathRecipient failed", __func__);
2307 return HDF_FAILURE;
2308 }
2309 bool result = subscribers_[i].remote->AddDeathRecipient(
2310 static_cast<UsbDeathRecipient *>(subscribers_[i].deathRecipient));
2311 if (!result) {
2312 HDF_LOGE("%{public}s:AddUsbDeathRecipient failed", __func__);
2313 return HDF_FAILURE;
2314 }
2315
2316 HDF_LOGI("%{public}s: index = %{public}d", __func__, i);
2317 break;
2318 }
2319 }
2320 if (i == MAX_SUBSCRIBER) {
2321 HDF_LOGE("%{public}s: too many listeners", __func__);
2322 return HDF_ERR_OUT_OF_RANGE;
2323 }
2324
2325 if (DdkListenerMgrAdd(&subscribers_[i].usbPnpListener) != HDF_SUCCESS) {
2326 HDF_LOGE("%{public}s: register listerer failed", __func__);
2327 return HDF_FAILURE;
2328 }
2329 return HDF_SUCCESS;
2330 }
2331
UnbindUsbdSubscriber(const sptr<IUsbdSubscriber> & subscriber)2332 int32_t UsbImpl::UnbindUsbdSubscriber(const sptr<IUsbdSubscriber> &subscriber)
2333 {
2334 if (subscriber == nullptr) {
2335 HDF_LOGE("%{public}s:subscriber is null", __func__);
2336 return HDF_ERR_INVALID_PARAM;
2337 }
2338 int32_t i;
2339 const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<IUsbdSubscriber>(subscriber);
2340 for (i = 0; i < MAX_SUBSCRIBER; i++) {
2341 if (subscribers_[i].remote == remote) {
2342 break;
2343 }
2344 }
2345 if (i == MAX_SUBSCRIBER) {
2346 HDF_LOGE("%{public}s: current subscriber not bind", __func__);
2347 return HDF_DEV_ERR_NO_DEVICE;
2348 }
2349 bool result = remote->RemoveDeathRecipient(static_cast<UsbDeathRecipient *>(subscribers_[i].deathRecipient));
2350 if (!result) {
2351 HDF_LOGE("%{public}s:RemoveUsbDeathRecipient failed", __func__);
2352 return HDF_FAILURE;
2353 }
2354
2355 subscribers_[i].subscriber = nullptr;
2356 subscribers_[i].remote = nullptr;
2357 subscribers_[i].deathRecipient = nullptr;
2358 if (DdkListenerMgrRemove(&subscribers_[i].usbPnpListener) != HDF_SUCCESS) {
2359 HDF_LOGE("%{public}s: remove listerer failed", __func__);
2360 return HDF_FAILURE;
2361 }
2362 return HDF_SUCCESS;
2363 }
2364
OnRemoteDied(const wptr<IRemoteObject> & object)2365 void UsbImpl::UsbDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
2366 {
2367 int32_t i;
2368 for (i = 0; i < MAX_SUBSCRIBER; i++) {
2369 if (UsbImpl::subscribers_[i].subscriber == deathSubscriber_) {
2370 break;
2371 }
2372 }
2373 if (i == MAX_SUBSCRIBER) {
2374 HDF_LOGE("%{public}s: current subscriber not bind", __func__);
2375 return;
2376 }
2377 UsbImpl::subscribers_[i].subscriber = nullptr;
2378 subscribers_[i].remote = nullptr;
2379 subscribers_[i].deathRecipient = nullptr;
2380 if (DdkListenerMgrRemove(&UsbImpl::subscribers_[i].usbPnpListener) != HDF_SUCCESS) {
2381 HDF_LOGE("%{public}s: remove listerer failed", __func__);
2382 }
2383 }
2384
RegBulkCallback(const UsbDev & dev,const UsbPipe & pipe,const sptr<IUsbdBulkCallback> & cb)2385 int32_t UsbImpl::RegBulkCallback(const UsbDev &dev, const UsbPipe &pipe, const sptr<IUsbdBulkCallback> &cb)
2386 {
2387 #ifndef LIBUSB_ENABLE
2388 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2389 if (port == nullptr) {
2390 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2391 return HDF_DEV_ERR_NO_DEVICE;
2392 }
2393
2394 UsbdBulkASyncList *list = UsbdBulkASyncListInit(port, pipe.intfId, pipe.endpointId);
2395 if (list == nullptr) {
2396 HDF_LOGE("%{public}s:UsbdBulkASyncListFind failed", __func__);
2397 return HDF_ERR_MALLOC_FAIL;
2398 }
2399 list->cb = cb;
2400 if (list->cb == nullptr) {
2401 HDF_LOGE("%{public}s:get callback error", __func__);
2402 return HDF_ERR_IO;
2403 }
2404
2405 return HDF_SUCCESS;
2406 #else
2407 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2408 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID) || (cb == nullptr)) {
2409 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2410 return HDF_ERR_INVALID_PARAM;
2411 }
2412 return HDF_SUCCESS;
2413 #endif // LIBUSB_ENABLE
2414 }
2415
UnRegBulkCallback(const UsbDev & dev,const UsbPipe & pipe)2416 int32_t UsbImpl::UnRegBulkCallback(const UsbDev &dev, const UsbPipe &pipe)
2417 {
2418 #ifndef LIBUSB_ENABLE
2419 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2420 if (port == nullptr) {
2421 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2422 return HDF_DEV_ERR_NO_DEVICE;
2423 }
2424
2425 UsbdBulkASyncList *list = UsbdBulkASyncListFind(port, pipe.intfId, pipe.endpointId);
2426 if (list == nullptr) {
2427 HDF_LOGE("%{public}s:UsbdBulkASyncListFind failed", __func__);
2428 return HDF_FAILURE;
2429 }
2430 list->cb = nullptr;
2431 return HDF_SUCCESS;
2432 #else
2433 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2434 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID)) {
2435 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2436 return HDF_ERR_INVALID_PARAM;
2437 }
2438 return HDF_SUCCESS;
2439 #endif // LIBUSB_ENABLE
2440 }
2441
BulkRead(const UsbDev & dev,const UsbPipe & pipe,const sptr<Ashmem> & ashmem)2442 int32_t UsbImpl::BulkRead(const UsbDev &dev, const UsbPipe &pipe, const sptr<Ashmem> &ashmem)
2443 {
2444 #ifndef LIBUSB_ENABLE
2445 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2446 if (port == nullptr) {
2447 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2448 return HDF_DEV_ERR_NO_DEVICE;
2449 }
2450
2451 UsbdBulkASyncList *list = UsbdBulkASyncListInit(port, pipe.intfId, pipe.endpointId);
2452 if (list == nullptr) {
2453 HDF_LOGE("%{public}s:UsbdBulkASyncListInit failed.", __func__);
2454 return HDF_ERR_MALLOC_FAIL;
2455 }
2456
2457 int32_t ret = InitAsmBufferHandle(&list->asmHandle, ashmem->GetAshmemFd(), ashmem->GetAshmemSize());
2458 if (ret != HDF_SUCCESS) {
2459 HDF_LOGE("%{public}s:InitAsmBufferHandle failed ret:%{public}d ashmem fd:%{public}d size:%{public}d", __func__,
2460 ret, ashmem->GetAshmemFd(), ashmem->GetAshmemSize());
2461 return ret;
2462 }
2463
2464 ret = UsbdBulkReadASyncSubmitStart(list);
2465 if (ret == HDF_DEV_ERR_NODATA || ret == HDF_DEV_ERR_NO_MEMORY || ret == HDF_ERR_DEVICE_BUSY) {
2466 ret = HDF_SUCCESS;
2467 }
2468 if (ret != HDF_SUCCESS) {
2469 HDF_LOGE("%{public}s:UsbdBulkReadASyncSubmitStart error ret:%{public}d", __func__, ret);
2470 return ret;
2471 }
2472
2473 return ret;
2474 #else
2475 if ((pipe.endpointId & USB_ENDPOINT_MASK) != USB_ENDPOINT_MASK) {
2476 HDF_LOGE("%{public}s:EndpointId is invalid", __func__);
2477 return HDF_ERR_INVALID_PARAM;
2478 }
2479
2480 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2481 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID)) {
2482 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2483 return HDF_ERR_INVALID_PARAM;
2484 }
2485 return HDF_SUCCESS;
2486 #endif // LIBUSB_ENABLE
2487 }
2488
BulkWrite(const UsbDev & dev,const UsbPipe & pipe,const sptr<Ashmem> & ashmem)2489 int32_t UsbImpl::BulkWrite(const UsbDev &dev, const UsbPipe &pipe, const sptr<Ashmem> &ashmem)
2490 {
2491 #ifndef LIBUSB_ENABLE
2492 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2493 if (port == nullptr) {
2494 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2495 return HDF_DEV_ERR_NO_DEVICE;
2496 }
2497
2498 UsbdBulkASyncList *list = UsbdBulkASyncListInit(port, pipe.intfId, pipe.endpointId);
2499 if (list == nullptr) {
2500 HDF_LOGE("%{public}s:UsbdBulkASyncListInit failed.", __func__);
2501 return HDF_ERR_MALLOC_FAIL;
2502 }
2503
2504 int32_t ret = InitAsmBufferHandle(&list->asmHandle, ashmem->GetAshmemFd(), ashmem->GetAshmemSize());
2505 if (ret != HDF_SUCCESS) {
2506 HDF_LOGE("%{public}s:InitAsmBufferHandle failed ret:%{public}d ashmem fd:%{public}d size:%{public}d", __func__,
2507 ret, ashmem->GetAshmemFd(), ashmem->GetAshmemSize());
2508 return ret;
2509 }
2510
2511 ret = UsbdBulkASyncWriteSubmitStart(list);
2512 if (ret == HDF_DEV_ERR_NODATA || ret == HDF_DEV_ERR_NO_MEMORY || ret == HDF_ERR_DEVICE_BUSY) {
2513 ret = HDF_SUCCESS;
2514 }
2515 if (ret != HDF_SUCCESS) {
2516 HDF_LOGE("%{public}s:UsbdBulkASyncWriteSubmitStart error ret:%{public}d", __func__, ret);
2517 return ret;
2518 }
2519
2520 return ret;
2521 #else
2522 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2523 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID)) {
2524 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2525 return HDF_ERR_INVALID_PARAM;
2526 }
2527 return HDF_SUCCESS;
2528 #endif // LIBUSB_ENABLE
2529 }
2530
BulkCancel(const UsbDev & dev,const UsbPipe & pipe)2531 int32_t UsbImpl::BulkCancel(const UsbDev &dev, const UsbPipe &pipe)
2532 {
2533 #ifndef LIBUSB_ENABLE
2534 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2535 if (port == nullptr) {
2536 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2537 return HDF_DEV_ERR_NO_DEVICE;
2538 }
2539
2540 UsbdBulkASyncList *list = UsbdBulkASyncListFind(port, pipe.intfId, pipe.endpointId);
2541 if (list == nullptr) {
2542 HDF_LOGW("%{public}s:UsbdBulkASyncListFind failed interfaceId:%{public}u endpointId:%{public}u", __func__,
2543 pipe.intfId, pipe.endpointId);
2544 return HDF_FAILURE;
2545 }
2546 sptr<IUsbdBulkCallback> tcb = list->cb;
2547 list->cb = nullptr;
2548 ReleaseAsmBufferHandle(&list->asmHandle);
2549 BulkRequestCancel(list);
2550 list->cb = tcb;
2551 return HDF_SUCCESS;
2552 #else
2553 if ((dev.devAddr >= MAX_DEVICE_ADDRESS) || (dev.busNum >= MAX_DEVICE_ADDRESS) ||
2554 (pipe.endpointId >= MAX_ENDPOINT_ID) || (pipe.intfId >= LIBUSB_MAX_INTERFACEID)) {
2555 HDF_LOGE("%{public}s:Invalid parameter", __func__);
2556 return HDF_ERR_INVALID_PARAM;
2557 }
2558 return HDF_SUCCESS;
2559 #endif // LIBUSB_ENABLE
2560 }
2561
ClearHalt(const UsbDev & dev,const UsbPipe & pipe)2562 int32_t UsbImpl::ClearHalt(const UsbDev &dev, const UsbPipe &pipe)
2563 {
2564 #ifndef LIBUSB_ENABLE
2565 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2566 if (port == nullptr) {
2567 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2568 return HDF_DEV_ERR_NO_DEVICE;
2569 }
2570 if (pipe.intfId >= USB_MAX_INTERFACES) {
2571 HDF_LOGE("%{public}s:interfaceId larger then max num", __func__);
2572 return HDF_ERR_INVALID_PARAM;
2573 }
2574 int32_t ret = UsbClearInterfaceHalt(port->devHandle[pipe.intfId], pipe.endpointId);
2575 if (ret != HDF_SUCCESS) {
2576 HDF_LOGE("%{public}s:ClearHalt error ret:%{public}d", __func__, ret);
2577 }
2578 return ret;
2579 #else
2580 return LibusbAdapter::GetInstance()->ClearHalt(dev, pipe);
2581 #endif // LIBUSB_ENABLE
2582 }
2583
GetInterfaceActiveStatus(const UsbDev & dev,uint8_t interfaceId,bool & unactivated)2584 int32_t UsbImpl::GetInterfaceActiveStatus(const UsbDev &dev, uint8_t interfaceId, bool &unactivated)
2585 {
2586 #ifndef LIBUSB_ENABLE
2587 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2588 if (port == nullptr) {
2589 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2590 return HDF_DEV_ERR_NO_DEVICE;
2591 }
2592 if (interfaceId >= USB_MAX_INTERFACES) {
2593 HDF_LOGE("%{public}s:interfaceId larger then max num", __func__);
2594 return HDF_ERR_INVALID_PARAM;
2595 }
2596
2597 unactivated = UsbGetInterfaceActiveStatus(port->service->session_, port->busNum, port->devAddr, interfaceId);
2598 return HDF_SUCCESS;
2599 #else
2600 return LibusbAdapter::GetInstance()->GetInterfaceActiveStatus(dev, interfaceId, unactivated);
2601 #endif // LIBUSB_ENABLE
2602 }
2603
GetDeviceSpeed(const UsbDev & dev,uint8_t & speed)2604 int32_t UsbImpl::GetDeviceSpeed(const UsbDev &dev, uint8_t &speed)
2605 {
2606 #ifndef LIBUSB_ENABLE
2607 HostDevice *port = FindDevFromService(dev.busNum, dev.devAddr);
2608 if (port == nullptr) {
2609 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
2610 return HDF_DEV_ERR_NO_DEVICE;
2611 }
2612 UsbInterfaceHandleEntity *handle = reinterpret_cast<UsbInterfaceHandleEntity *>(port->ctrDevHandle);
2613 int32_t ret = RawUsbGetUsbSpeed(handle->devHandle);
2614 speed = (uint8_t)ret;
2615 HDF_LOGE("%{public}s:GetDeviceSpeed, speed=%{public}u", __func__, speed);
2616 return HDF_SUCCESS;
2617 #else
2618 return LibusbAdapter::GetInstance()->GetDeviceSpeed(dev, speed);
2619 #endif // LIBUSB_ENABLE
2620 }
2621
GetAccessoryInfo(std::vector<std::string> & accessoryInfo)2622 int32_t UsbImpl::GetAccessoryInfo(std::vector<std::string> &accessoryInfo)
2623 {
2624 return UsbdAccessory::GetInstance().GetAccessoryInfo(accessoryInfo);
2625 }
2626
OpenAccessory(int32_t & fd)2627 int32_t UsbImpl::OpenAccessory(int32_t &fd)
2628 {
2629 return UsbdAccessory::GetInstance().OpenAccessory(fd);
2630 }
2631
CloseAccessory(int32_t fd)2632 int32_t UsbImpl::CloseAccessory(int32_t fd)
2633 {
2634 return UsbdAccessory::GetInstance().CloseAccessory(fd);
2635 }
2636
OnRemoteDied(const wptr<IRemoteObject> & object)2637 void UsbImpl::UsbAsyncTransferDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
2638 {
2639 HDF_LOGI("%{public}s: UsbImpl UsbAsyncTransferDeathRecipient enter", __func__);
2640 int32_t ret = usbImpl_->UsbCancelTransfer(dev_, endpoint_);
2641 if (ret == HDF_SUCCESS) {
2642 HDF_LOGI("%{public}s: UsbImpl OnRemoteDied close", __func__);
2643 usbImpl_->CloseDevice(dev_);
2644 }
2645 }
2646
UsbSubmitTransfer(const UsbDev & dev,const OHOS::HDI::Usb::V1_2::USBTransferInfo & info,const sptr<OHOS::HDI::Usb::V1_2::IUsbdTransferCallback> & cb,const sptr<Ashmem> & ashmem)2647 int32_t UsbImpl::UsbSubmitTransfer(const UsbDev &dev, const OHOS::HDI::Usb::V1_2::USBTransferInfo &info,
2648 const sptr<OHOS::HDI::Usb::V1_2::IUsbdTransferCallback> &cb, const sptr<Ashmem> &ashmem)
2649 {
2650 #ifndef LIBUSB_ENABLE
2651 HDF_LOGE("%{public}s: libusb is not enabled, please define macro LIBUSB_ENABLE.", __func__);
2652 return LIBUSB_ERROR_NOT_SUPPORTED;
2653 #else
2654 HDF_LOGI("%{public}s: UsbImpl UsbSubmitTransfer", __func__);
2655 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<OHOS::HDI::Usb::V1_2::IUsbdTransferCallback>(cb);
2656 sptr<UsbImpl::UsbAsyncTransferDeathRecipient> asyncRecipient =
2657 new UsbAsyncTransferDeathRecipient(dev, info.endpoint, this, remote);
2658 if (!remote->AddDeathRecipient(asyncRecipient)) {
2659 HDF_LOGE("%{public}s: add DeathRecipient failed", __func__);
2660 return HDF_ERR_INVALID_PARAM;
2661 }
2662 int32_t ret = LibusbAdapter::GetInstance()->AsyncSubmitTransfer(dev, info, cb, ashmem);
2663 if (ret < 0) {
2664 remote->RemoveDeathRecipient(asyncRecipient);
2665 asyncRecipient.clear();
2666 }
2667 return ret;
2668 #endif // LIBUSB_ENABLE
2669 }
2670
UsbCancelTransfer(const UsbDev & dev,const int32_t endpoint)2671 int32_t UsbImpl::UsbCancelTransfer(const UsbDev &dev, const int32_t endpoint)
2672 {
2673 #ifndef LIBUSB_ENABLE
2674 HDF_LOGE("%{public}s: libusb is not enabled, please define macro LIBUSB_ENABLE.", __func__);
2675 return LIBUSB_ERROR_NOT_SUPPORTED;
2676 #else
2677 HDF_LOGI("%{public}s: UsbImpl UsbCancelTransfer", __func__);
2678 return LibusbAdapter::GetInstance()->AsyncCancelTransfer(dev, endpoint);
2679 #endif // LIBUSB_ENABLE
2680 }
2681
2682 } // namespace V1_2
2683 } // namespace Usb
2684 } // namespace HDI
2685 } // namespace OHOS
2686