• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&params, 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(&params, timeout);
199     int32_t ret = UsbdDispatcher::UsbControlSetUp(ctrParams, &params.ctrlReq);
200     if (ret != HDF_SUCCESS) {
201         return ret;
202     }
203     OsalMutexLock(&dev->lock);
204     do {
205         ret = UsbFillRequest(request, dev->ctrDevHandle, &params);
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