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 "usbd_dispatcher.h"
17 #include "hdf_slist.h"
18 #include "osal_mutex.h"
19 #include "usb_ddk.h"
20 #include "usb_impl.h"
21 #include "usb_interface_pool.h"
22 #include "v1_0/iusbd_subscriber.h"
23 #include "usbd_wrapper.h"
24
25 namespace OHOS {
26 namespace HDI {
27 namespace Usb {
28 namespace V1_2 {
UsbdAllocFifo(DataFifo * fifo,uint32_t size)29 int32_t UsbdDispatcher::UsbdAllocFifo(DataFifo *fifo, uint32_t size)
30 {
31 if (fifo == nullptr) {
32 HDF_LOGE("%{public}s:fifo is nullptr", __func__);
33 return HDF_FAILURE;
34 }
35 if (!DataFifoIsInitialized(fifo)) {
36 void *data = OsalMemAlloc(size);
37 if (data == nullptr) {
38 HDF_LOGE("%{public}s:OsalMemAlloc failed", __func__);
39 return HDF_ERR_MALLOC_FAIL;
40 }
41 DataFifoInit(fifo, size, data);
42 }
43 return HDF_SUCCESS;
44 }
45
UsbdFreeFifo(DataFifo * fifo)46 void UsbdDispatcher::UsbdFreeFifo(DataFifo *fifo)
47 {
48 if (fifo == nullptr) {
49 HDF_LOGE("%{public}s:fifo is nullptr", __func__);
50 return;
51 }
52
53 OsalMemFree(fifo->data);
54 fifo->data = nullptr;
55 DataFifoInit(fifo, 0, nullptr);
56 }
57
UsbdReadCallback(UsbRequest * req)58 void UsbdDispatcher::UsbdReadCallback(UsbRequest *req)
59 {
60 if (req == nullptr) {
61 HDF_LOGE("%{public}s:req is nullptr!", __func__);
62 return;
63 }
64
65 UsbIfRequest *reqObj = reinterpret_cast<UsbIfRequest *>(req);
66 UsbdRequestASync *dev = static_cast<UsbdRequestASync *>(req->compInfo.userData);
67 if (dev == nullptr) {
68 HDF_LOGE("%{public}s:invalid param dev is nullptr!", __func__);
69 OsalSemPost(&reqObj->hostRequest->sem);
70 }
71 }
72
UsbdWriteCallback(UsbRequest * req)73 void UsbdDispatcher::UsbdWriteCallback(UsbRequest *req)
74 {
75 if (req == nullptr) {
76 HDF_LOGE("%{public}s:invalid param req is nullptr!", __func__);
77 return;
78 }
79
80 int32_t status = req->compInfo.status;
81 HDF_LOGI("%{public}s:status is %{public}d!", __func__, status);
82 }
83
UsbControlSetUp(UsbControlParams * controlParams,UsbControlRequest * controlReq)84 int32_t UsbdDispatcher::UsbControlSetUp(UsbControlParams *controlParams, UsbControlRequest *controlReq)
85 {
86 if (controlParams == nullptr || controlReq == nullptr) {
87 HDF_LOGE("%{public}s:controlParams or controlReq is nullptr", __func__);
88 return HDF_ERR_INVALID_PARAM;
89 }
90
91 controlReq->target = controlParams->target;
92 controlReq->reqType = controlParams->reqType;
93 controlReq->directon = controlParams->directon;
94 controlReq->request = controlParams->request;
95 controlReq->value = controlParams->value;
96 controlReq->index = controlParams->index;
97 controlReq->buffer = controlParams->data;
98 controlReq->length = static_cast<uint32_t>(controlParams->size);
99 return HDF_SUCCESS;
100 }
101
GetUsbInterfaceById(const HostDevice * dev,uint8_t interfaceIndex)102 UsbInterface *UsbdDispatcher::GetUsbInterfaceById(const HostDevice *dev, uint8_t interfaceIndex)
103 {
104 if (dev == nullptr || dev->service == nullptr) {
105 HDF_LOGE("%{public}s:idx:%{public}u service is nullptr", __func__, interfaceIndex);
106 return nullptr;
107 }
108
109 UsbInterface *tmpIf = UsbClaimInterface(dev->service->session_, dev->busNum, dev->devAddr, interfaceIndex);
110 if (tmpIf == nullptr) {
111 HDF_LOGE("%{public}s: UsbClaimInterface failed", __func__);
112 }
113 return tmpIf;
114 }
115
GetInterfacePipe(const HostDevice * dev,UsbInterface * interface,uint8_t pipeAddr,UsbPipeInfo * pipe)116 int32_t UsbdDispatcher::GetInterfacePipe(
117 const HostDevice *dev, UsbInterface *interface, uint8_t pipeAddr, UsbPipeInfo *pipe)
118 {
119 UsbPipeInfo pipeTmp;
120 if (memset_s(&pipeTmp, sizeof(pipeTmp), 0, sizeof(pipeTmp)) != EOK) {
121 HDF_LOGE("%{public}s:memset_s failed ", __func__);
122 return HDF_FAILURE;
123 }
124
125 if (dev == nullptr || interface == nullptr || pipe == nullptr) {
126 HDF_LOGE("%{public}s:invalid params", __func__);
127 return HDF_ERR_INVALID_PARAM;
128 }
129
130 UsbInterfaceInfo *info = &interface->info;
131 if (info == nullptr) {
132 HDF_LOGE("%{public}s:invalid interface", __func__);
133 return HDF_FAILURE;
134 }
135
136 UsbInterfaceHandle *interfaceHandle = UsbImpl::InterfaceIdToHandle(dev, info->interfaceIndex);
137 if (interfaceHandle == nullptr) {
138 HDF_LOGE("%{public}s:invalid interface handle", __func__);
139 return HDF_FAILURE;
140 }
141
142 int32_t ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, pipeAddr, &pipeTmp);
143 if (ret == HDF_SUCCESS && ((pipeTmp.pipeAddress | static_cast<uint8_t>(pipeTmp.pipeDirection)) == pipeAddr)) {
144 if (pipe) {
145 *pipe = pipeTmp;
146 }
147 return HDF_SUCCESS;
148 }
149 return HDF_FAILURE;
150 }
151
GetPipe(const HostDevice * dev,uint8_t interfaceId,uint8_t pipeId,UsbPipeInfo * pipe)152 int32_t UsbdDispatcher::GetPipe(const HostDevice *dev, uint8_t interfaceId, uint8_t pipeId, UsbPipeInfo *pipe)
153 {
154 if (dev == nullptr || pipe == nullptr) {
155 HDF_LOGE("%{public}s:dev or pipe is nullptr, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
156 return HDF_ERR_INVALID_PARAM;
157 }
158
159 if (interfaceId >= USB_MAX_INTERFACES) {
160 HDF_LOGE("%{public}s:interfaceId invalid, ifId:%{public}u epId:%{public}u", __func__, interfaceId, pipeId);
161 return HDF_ERR_INVALID_PARAM;
162 }
163
164 UsbInterface *interface = dev->iface[interfaceId];
165 if (interface == nullptr) {
166 HDF_LOGE("%{public}s:interface is nullptr ifId:%{public}u, epId:%{public}u", __func__, interfaceId, pipeId);
167 return HDF_FAILURE;
168 }
169
170 int32_t ret = GetInterfacePipe(dev, interface, pipeId, pipe);
171 return ret;
172 }
173
UsbdFreeCtrlPipe(HostDevice * dev)174 void UsbdDispatcher::UsbdFreeCtrlPipe(HostDevice *dev)
175 {
176 if (dev == nullptr) {
177 HDF_LOGE("%{public}s:params dev is nullptr", __func__);
178 return;
179 }
180
181 OsalMemFree(dev->ctrPipe);
182 dev->ctrPipe = nullptr;
183 }
184
UsbdGetCtrlPipe(HostDevice * dev)185 int32_t UsbdDispatcher::UsbdGetCtrlPipe(HostDevice *dev)
186 {
187 UsbPipeInfo *pipe = static_cast<UsbPipeInfo *>(OsalMemCalloc(sizeof(UsbPipeInfo)));
188 if (pipe == nullptr) {
189 HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
190 return HDF_ERR_MALLOC_FAIL;
191 }
192
193 int32_t ret = UsbGetPipeInfo(dev->ctrDevHandle, dev->ctrIface->info.curAltSetting, 0, pipe);
194 if (ret != HDF_SUCCESS) {
195 HDF_LOGE("%{public}s:get pipe failed ret:%{public}d", __func__, ret);
196 OsalMemFree(pipe);
197 pipe = nullptr;
198 return HDF_FAILURE;
199 }
200
201 dev->ctrPipe = pipe;
202 return HDF_SUCCESS;
203 }
204
UsbdFindRequestSync(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr)205 UsbdRequestSync *UsbdDispatcher::UsbdFindRequestSync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
206 {
207 if (port == nullptr) {
208 HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
209 return nullptr;
210 }
211
212 UsbdRequestSync *req = nullptr;
213 HdfSListIterator it;
214 bool flag = false;
215 OsalMutexLock(&port->reqSyncLock);
216 HdfSListIteratorInit(&it, &port->reqSyncList);
217 while (HdfSListIteratorHasNext(&it)) {
218 req = reinterpret_cast<UsbdRequestSync *>(HdfSListIteratorNext(&it));
219 if (req == nullptr) {
220 continue;
221 }
222 if (req->pipe.interfaceId == interfaceId && ((req->pipe.pipeAddress | req->pipe.pipeDirection) == pipeAddr)) {
223 flag = true;
224 break;
225 }
226 }
227 OsalMutexUnlock(&port->reqSyncLock);
228
229 if (flag) {
230 return req;
231 }
232 return nullptr;
233 }
234
UsbdRequestSyncAlloc(void)235 UsbdRequestSync *UsbdDispatcher::UsbdRequestSyncAlloc(void)
236 {
237 UsbdRequestSync *req = static_cast<UsbdRequestSync *>(OsalMemCalloc(sizeof(UsbdRequestSync)));
238 if (req == nullptr) {
239 HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
240 return req;
241 }
242
243 req->request = nullptr;
244 req->endPointAddr = 0;
245 req->ifHandle = nullptr;
246 OsalMutexInit(&req->lock);
247 return req;
248 }
249
UsbRequestParamsWSyncInit(UsbRequestParams * params,int32_t timeout,const UsbPipeInfo * pipe)250 void UsbdDispatcher::UsbRequestParamsWSyncInit(UsbRequestParams *params, int32_t timeout, const UsbPipeInfo *pipe)
251 {
252 if (params == nullptr || pipe == nullptr) {
253 HDF_LOGE("%{public}s: params or pipe is nullptr", __func__);
254 return;
255 }
256
257 params->interfaceId = pipe->interfaceId;
258 params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
259 params->pipeId = pipe->pipeId;
260 params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
261 params->timeout = static_cast<uint32_t>(timeout);
262 params->dataReq.numIsoPackets = 0;
263 params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_DIR_OFFSET) & 0x1);
264 params->dataReq.length = pipe->maxPacketSize;
265 }
266
UsbdRequestSyncInit(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,UsbdRequestSync * requestSync)267 int32_t UsbdDispatcher::UsbdRequestSyncInit(
268 HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestSync *requestSync)
269 {
270 if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
271 HDF_LOGE("%{public}s:invalid params", __func__);
272 return HDF_ERR_INVALID_PARAM;
273 }
274
275 int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
276 if (ret != EOK) {
277 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
278 return ret;
279 }
280
281 requestSync->ifHandle = ifHandle;
282 requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, requestSync->pipe.maxPacketSize);
283 if (requestSync->request == nullptr) {
284 HDF_LOGE("%{public}s:alloc request failed", __func__);
285 return HDF_ERR_MALLOC_FAIL;
286 }
287 UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
288 requestSync->params.userData = port;
289 OsalMutexLock(&port->reqSyncLock);
290 HdfSListAdd(&port->reqSyncList, &requestSync->node);
291 OsalMutexUnlock(&port->reqSyncLock);
292 return HDF_SUCCESS;
293 }
294
UsbdRequestSyncInitwithLength(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,int32_t length,UsbdRequestSync * requestSync)295 int32_t UsbdDispatcher::UsbdRequestSyncInitwithLength(HostDevice *port, UsbInterfaceHandle *ifHandle,
296 UsbPipeInfo *pipe, int32_t length, UsbdRequestSync *requestSync)
297 {
298 if (port == nullptr || requestSync == nullptr || ifHandle == nullptr || pipe == nullptr) {
299 HDF_LOGE("%{public}s:invalid params", __func__);
300 return HDF_ERR_INVALID_PARAM;
301 }
302
303 int32_t ret = memcpy_s(&requestSync->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
304 if (ret != EOK) {
305 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
306 return ret;
307 }
308
309 requestSync->ifHandle = ifHandle;
310 requestSync->request = UsbAllocRequest(requestSync->ifHandle, 0, length);
311 if (requestSync->request == nullptr) {
312 HDF_LOGE("%{public}s:alloc request failed", __func__);
313 return HDF_ERR_MALLOC_FAIL;
314 }
315 UsbRequestParamsWSyncInit(&requestSync->params, USB_CTRL_SET_TIMEOUT, &requestSync->pipe);
316 requestSync->params.userData = port;
317 OsalMutexLock(&port->reqSyncLock);
318 HdfSListAdd(&port->reqSyncList, &requestSync->node);
319 OsalMutexUnlock(&port->reqSyncLock);
320 return HDF_SUCCESS;
321 }
322
UsbdRequestSyncRelease(UsbdRequestSync * requestSync)323 int32_t UsbdDispatcher::UsbdRequestSyncRelease(UsbdRequestSync *requestSync)
324 {
325 int32_t ret = HDF_SUCCESS;
326 if (requestSync != nullptr) {
327 OsalMutexLock(&requestSync->lock);
328 if (requestSync->request != nullptr) {
329 ret = UsbFreeRequest(requestSync->request);
330 if (ret != HDF_SUCCESS) {
331 HDF_LOGW("%{public}s:UsbFreeRequest failed", __func__);
332 }
333 requestSync->request = nullptr;
334 }
335 OsalMutexUnlock(&requestSync->lock);
336 OsalMemFree(requestSync);
337 }
338 return ret;
339 }
340
UsbRequestParamsInit(UsbRequestParams * params,int32_t timeout)341 void UsbdDispatcher::UsbRequestParamsInit(UsbRequestParams *params, int32_t timeout)
342 {
343 if (params == nullptr) {
344 HDF_LOGE("%{public}s:params is nullptr", __func__);
345 return;
346 }
347
348 params->interfaceId = USB_CTRL_INTERFACE_ID;
349 params->pipeAddress = 0;
350 params->pipeId = 0;
351 params->requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
352 params->timeout = static_cast<uint32_t>(timeout);
353 }
354
CtrlTranParamGetReqType(HdfSBuf * data,UsbControlParams * pCtrParams,uint32_t requestType)355 int32_t UsbdDispatcher::CtrlTranParamGetReqType(HdfSBuf *data, UsbControlParams *pCtrParams, uint32_t requestType)
356 {
357 if (data == nullptr || pCtrParams == nullptr) {
358 HDF_LOGE("%{public}s:param failed", __func__);
359 return HDF_ERR_INVALID_PARAM;
360 }
361
362 uint8_t *buffer = nullptr;
363 uint32_t length = 0;
364 int32_t target = requestType & USB_RECIP_MASK;
365 int32_t direction = (requestType >> DIRECTION_OFFSET_7) & ENDPOINT_DIRECTION_MASK;
366 int32_t cmdType = (requestType >> CMD_OFFSET_5) & CMD_TYPE_MASK;
367 if (direction == USB_REQUEST_DIR_TO_DEVICE) {
368 if (!HdfSbufReadBuffer(data, (const void **)(&buffer), &length)) {
369 HDF_LOGE("%{public}s:hdf sbuf Read failed", __func__);
370 return HDF_FAILURE;
371 }
372 } else {
373 length = MAX_CONTROL_BUFF_SIZE;
374 buffer = static_cast<uint8_t *>(OsalMemCalloc(length));
375 if (buffer == nullptr) {
376 HDF_LOGE("%{public}s:OsalMemCalloc failed length = %{public}u", __func__, length);
377 return HDF_ERR_MALLOC_FAIL;
378 }
379 }
380 pCtrParams->target = static_cast<UsbRequestTargetType>(target);
381 pCtrParams->directon = static_cast<UsbRequestDirection>(direction);
382 pCtrParams->reqType = static_cast<UsbControlRequestType>(cmdType);
383 pCtrParams->size = length;
384 pCtrParams->data = buffer;
385 return HDF_SUCCESS;
386 }
387
CtrlTransferParamInit(HdfSBuf * data,UsbControlParams * pCtrParams,int32_t * timeout)388 int32_t UsbdDispatcher::CtrlTransferParamInit(HdfSBuf *data, UsbControlParams *pCtrParams, int32_t *timeout)
389 {
390 if (data == nullptr || pCtrParams == nullptr) {
391 HDF_LOGE("%{public}s:data or pCtrParams is nullptr", __func__);
392 return HDF_ERR_INVALID_PARAM;
393 }
394
395 int32_t requestType;
396 if (!HdfSbufReadInt32(data, &requestType)) {
397 HDF_LOGE("%{public}s:failed to read the requestType from data", __func__);
398 return HDF_ERR_IO;
399 }
400
401 int32_t requestCmd;
402 if (!HdfSbufReadInt32(data, &requestCmd)) {
403 HDF_LOGE("%{public}s:Failed to read the requestCmd from data", __func__);
404 return HDF_ERR_IO;
405 }
406
407 int32_t value;
408 if (!HdfSbufReadInt32(data, &value)) {
409 HDF_LOGE("%{public}s:Failed to read the value from data", __func__);
410 return HDF_ERR_IO;
411 }
412
413 int32_t index;
414 if (!HdfSbufReadInt32(data, &index)) {
415 HDF_LOGE("%{public}s:Failed to read the index from data", __func__);
416 return HDF_ERR_IO;
417 }
418
419 if (!HdfSbufReadInt32(data, timeout)) {
420 HDF_LOGE("%{public}s:Failed to read the timeout from data", __func__);
421 return HDF_ERR_IO;
422 }
423
424 pCtrParams->request = static_cast<uint8_t>(requestCmd);
425 pCtrParams->value = value;
426 pCtrParams->index = index;
427 int32_t ret = CtrlTranParamGetReqType(data, pCtrParams, requestType);
428 if (ret != HDF_SUCCESS) {
429 HDF_LOGE("%{public}s:CtrlTransferParamInit failed:%{public}d", __func__, ret);
430 OsalMemFree(pCtrParams->data);
431 pCtrParams->data = nullptr;
432 }
433 return ret;
434 }
435
UsbdReleaseInterfaces(HostDevice * dev)436 void UsbdDispatcher::UsbdReleaseInterfaces(HostDevice *dev)
437 {
438 if (dev == nullptr) {
439 HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
440 return;
441 }
442
443 for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
444 if (dev->iface[i] != nullptr) {
445 UsbReleaseInterface(dev->iface[i]);
446 dev->iface[i] = nullptr;
447 }
448 }
449 if (dev->ctrIface != nullptr) {
450 UsbReleaseInterface(dev->ctrIface);
451 dev->ctrIface = nullptr;
452 }
453 }
454
UsbdCloseInterfaces(HostDevice * dev)455 void UsbdDispatcher::UsbdCloseInterfaces(HostDevice *dev)
456 {
457 if (dev == nullptr) {
458 HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
459 return;
460 }
461
462 for (int32_t i = 0; i < USB_MAX_INTERFACES; ++i) {
463 if (dev->devHandle[i] != nullptr) {
464 UsbCloseInterface(dev->devHandle[i], false);
465 dev->devHandle[i] = nullptr;
466 }
467 }
468 if (dev->ctrDevHandle != nullptr) {
469 UsbCloseInterface(dev->ctrDevHandle, false);
470 dev->ctrDevHandle = nullptr;
471 }
472 }
473
UsbdOpenInterfaces(HostDevice * dev)474 int32_t UsbdDispatcher::UsbdOpenInterfaces(HostDevice *dev)
475 {
476 if (dev == nullptr) {
477 HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
478 return HDF_ERR_INVALID_PARAM;
479 }
480
481 int32_t ret =
482 memset_s(dev->devHandle, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES);
483 if (ret != EOK) {
484 HDF_LOGE("%{public}s:memset_s failed ", __func__);
485 return HDF_FAILURE;
486 }
487 dev->ctrDevHandle = UsbOpenInterface(dev->ctrIface);
488 if (dev->ctrDevHandle == nullptr) {
489 HDF_LOGE("%{public}s:ctrDevHandle UsbOpenInterface nullptr", __func__);
490 UsbdCloseInterfaces(dev);
491 return HDF_FAILURE;
492 }
493 return HDF_SUCCESS;
494 }
495
RemoveDevFromService(UsbImpl * service,HostDevice * port)496 void UsbdDispatcher::RemoveDevFromService(UsbImpl *service, HostDevice *port)
497 {
498 if (service == nullptr || port == nullptr) {
499 HDF_LOGE("%{public}s: service or port is nullptr", __func__);
500 return;
501 }
502
503 HdfSListIterator it;
504 HostDevice *tempPort = nullptr;
505 OsalMutexLock(&service->lock_);
506 HdfSListIteratorInit(&it, &service->devList_);
507 while (HdfSListIteratorHasNext(&it)) {
508 tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
509 if (tempPort == nullptr) {
510 continue;
511 }
512 if (tempPort->busNum == port->busNum && tempPort->devAddr == port->devAddr) {
513 HdfSListIteratorRemove(&it);
514 break;
515 }
516 }
517 OsalMutexUnlock(&service->lock_);
518 }
519
UsbdClaimInterfaces(HostDevice * dev)520 int32_t UsbdDispatcher::UsbdClaimInterfaces(HostDevice *dev)
521 {
522 if (dev == nullptr) {
523 HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
524 return HDF_ERR_INVALID_PARAM;
525 }
526
527 if (memset_s(dev->iface, sizeof(uint8_t) * USB_MAX_INTERFACES, 0, sizeof(uint8_t) * USB_MAX_INTERFACES) != EOK) {
528 HDF_LOGE("%{public}s:memset_s failed", __func__);
529 return HDF_FAILURE;
530 }
531
532 dev->ctrIface = GetUsbInterfaceById(const_cast<const HostDevice *>(dev), USB_CTRL_INTERFACE_ID);
533 if (dev->ctrIface == nullptr) {
534 HDF_LOGE("%{public}s:GetUsbInterfaceById nullptr", __func__);
535 UsbdReleaseInterfaces(dev);
536 return HDF_FAILURE;
537 }
538
539 return HDF_SUCCESS;
540 }
541
ReturnGetPipes(int32_t ret,HostDevice * dev)542 int32_t UsbdDispatcher::ReturnGetPipes(int32_t ret, HostDevice *dev)
543 {
544 UsbdCloseInterfaces(dev);
545 UsbdReleaseInterfaces(dev);
546 dev->service->session_ = nullptr;
547 return ret;
548 }
549
ReturnOpenInterfaces(int32_t ret,HostDevice * dev)550 int32_t UsbdDispatcher::ReturnOpenInterfaces(int32_t ret, HostDevice *dev)
551 {
552 UsbdReleaseInterfaces(dev);
553 dev->service->session_ = nullptr;
554 return ret;
555 }
556
ReturnClainInterfaces(int32_t ret,HostDevice * dev)557 int32_t UsbdDispatcher::ReturnClainInterfaces(int32_t ret, HostDevice *dev)
558 {
559 dev->service->session_ = nullptr;
560 return ret;
561 }
562
UsbdInit(HostDevice * dev)563 int32_t UsbdDispatcher::UsbdInit(HostDevice *dev)
564 {
565 if (dev == nullptr) {
566 HDF_LOGE("%{public}s:invalid param dev", __func__);
567 return HDF_ERR_INVALID_PARAM;
568 }
569
570 if (dev->initFlag) {
571 HDF_LOGE("%{public}s:initFlag is true", __func__);
572 return HDF_SUCCESS;
573 }
574
575 int32_t ret = UsbInitHostSdk(nullptr);
576 if (ret != HDF_SUCCESS) {
577 HDF_LOGE("%{public}s:UsbInitHostSdk failed", __func__);
578 return HDF_FAILURE;
579 }
580
581 if (dev->service == nullptr) {
582 HDF_LOGE("%{public}s:dev->service is nullptr", __func__);
583 return HDF_FAILURE;
584 }
585
586 dev->service->session_ = nullptr;
587
588 ret = UsbdClaimInterfaces(dev);
589 if (ret != HDF_SUCCESS) {
590 HDF_LOGE("%{public}s:UsbdClaimInterfaces failed ret:%{public}d", __func__, ret);
591 return ReturnClainInterfaces(ret, dev);
592 }
593
594 ret = UsbdOpenInterfaces(dev);
595 if (ret != HDF_SUCCESS) {
596 HDF_LOGE("%{public}s:UsbdOpenInterfaces failed ret:%{public}d", __func__, ret);
597 return ReturnOpenInterfaces(ret, dev);
598 }
599
600 ret = UsbdGetCtrlPipe(dev);
601 if (ret != HDF_SUCCESS) {
602 HDF_LOGE("%{public}s:UsbdGetPipes failed ret:%{public}d", __func__, ret);
603 return ReturnGetPipes(ret, dev);
604 }
605 return HDF_SUCCESS;
606 }
607
UsbdRequestASyncRelease(UsbdRequestASync * request)608 int32_t UsbdDispatcher::UsbdRequestASyncRelease(UsbdRequestASync *request)
609 {
610 if (request == nullptr) {
611 HDF_LOGE("%{public}s:request is nullptr.", __func__);
612 return HDF_ERR_INVALID_PARAM;
613 }
614
615 int32_t ret = HDF_SUCCESS;
616 OsalMutexLock(&request->lock);
617 UsbImpl::UsbdRequestASyncReleaseData(request);
618 if (request->reqMsg.request != nullptr) {
619 ret = UsbFreeRequest(request->reqMsg.request);
620 request->reqMsg.request = nullptr;
621 if (ret != HDF_SUCCESS) {
622 HDF_LOGE("%{public}s:UsbFreeRequest failed", __func__);
623 }
624 }
625 OsalMutexUnlock(&request->lock);
626 OsalMemFree(request);
627 return ret;
628 }
629
UsbdBulkASyncReqRelease(UsbdBulkASyncReqList * list)630 int32_t UsbdDispatcher::UsbdBulkASyncReqRelease(UsbdBulkASyncReqList *list)
631 {
632 for (int32_t i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
633 UsbFreeRequest(list->node[i].request);
634 list->node[i].request = nullptr;
635 }
636 DListHeadInit(&list->eList);
637 DListHeadInit(&list->uList);
638 OsalMutexDestroy(&list->elock);
639 OsalMutexDestroy(&list->ulock);
640 return HDF_SUCCESS;
641 }
642
UsbdBulkASyncListRelease(UsbdBulkASyncList * list)643 int32_t UsbdDispatcher::UsbdBulkASyncListRelease(UsbdBulkASyncList *list)
644 {
645 UsbdBulkASyncReqRelease(&list->rList);
646 OsalMutexDestroy(&list->asmHandle.lock);
647 OsalMemFree(list);
648 return HDF_SUCCESS;
649 }
650
UsbdRelease(HostDevice * dev)651 void UsbdDispatcher::UsbdRelease(HostDevice *dev)
652 {
653 if (dev == nullptr) {
654 HDF_LOGE("%{public}s: %{public}d invalid param dev is nullptr", __func__, __LINE__);
655 return;
656 }
657
658 UsbdCloseInterfaces(dev);
659 UsbdReleaseInterfaces(dev);
660 UsbdFreeCtrlPipe(dev);
661 UsbImpl::UsbdRequestSyncReleaseList(dev);
662 UsbImpl::UsbdRequestASyncReleaseList(dev);
663 UsbImpl::UsbdBulkASyncListReleasePort(dev);
664
665 if (dev->ctrlReq != nullptr) {
666 UsbFreeRequest(dev->ctrlReq);
667 dev->ctrlReq = nullptr;
668 }
669 UsbExitHostSdk(dev->service->session_);
670 dev->service->session_ = nullptr;
671 OsalMutexDestroy(&dev->writeLock);
672 OsalMutexDestroy(&dev->readLock);
673 OsalMutexDestroy(&dev->lock);
674 OsalMutexDestroy(&dev->requestLock);
675 OsalMutexDestroy(&dev->reqSyncLock);
676 OsalMutexDestroy(&dev->reqASyncLock);
677 dev->busNum = 0;
678 dev->devAddr = 0;
679 dev->initFlag = false;
680 }
681
UsbdMallocAndFill(uint8_t * & dataAddr,const std::vector<uint8_t> & data)682 int32_t UsbdDispatcher::UsbdMallocAndFill(uint8_t *&dataAddr, const std::vector<uint8_t> &data)
683 {
684 uint32_t length = sizeof(uint8_t) * data.size();
685 if (length == 0) {
686 HDF_LOGI("%{public}s: data is empty", __func__);
687 return HDF_SUCCESS;
688 }
689
690 dataAddr = static_cast<uint8_t *>(OsalMemCalloc(length));
691 if (dataAddr == nullptr) {
692 HDF_LOGE("%{public}s: OsalMemAlloc failed", __func__);
693 return HDF_FAILURE;
694 }
695
696 void *dataAddrCovert = static_cast<void *>(dataAddr);
697 int32_t err = memcpy_s(dataAddrCovert, length, data.data(), length);
698 if (err != EOK) {
699 HDF_LOGE("%{public}s: memcpy_s failed", __func__);
700 OsalMemFree(dataAddr);
701 dataAddr = nullptr;
702 return HDF_FAILURE;
703 }
704 return HDF_SUCCESS;
705 }
706
FillReqAyncParams(UsbdRequestASync * userData,UsbPipeInfo * pipe,UsbRequestParams * params,const uint8_t * buffer,uint32_t length)707 int32_t UsbdDispatcher::FillReqAyncParams(
708 UsbdRequestASync *userData, UsbPipeInfo *pipe, UsbRequestParams *params, const uint8_t *buffer, uint32_t length)
709 {
710 if (userData == nullptr || pipe == nullptr || params == nullptr) {
711 HDF_LOGE("%{public}s:invalid param", __func__);
712 return HDF_ERR_INVALID_PARAM;
713 }
714
715 bool bWrite = (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT);
716 params->interfaceId = pipe->interfaceId;
717 params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
718 params->pipeId = pipe->pipeId;
719 params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
720 params->timeout = USB_CTRL_SET_TIMEOUT;
721 params->dataReq.numIsoPackets = 0;
722 params->userData = static_cast<void *>(userData);
723 params->dataReq.length = length;
724 params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
725 if (bWrite) {
726 params->callback = UsbdWriteCallback;
727 params->dataReq.buffer = const_cast<uint8_t *>(buffer);
728 } else {
729 params->callback = UsbdReadCallback;
730 params->dataReq.length = length;
731 }
732 return HDF_SUCCESS;
733 }
734
UsbdRequestASyncAlloc(void)735 UsbdRequestASync *UsbdDispatcher::UsbdRequestASyncAlloc(void)
736 {
737 UsbdRequestASync *req = static_cast<UsbdRequestASync *>(OsalMemCalloc(sizeof(UsbdRequestASync)));
738 if (req == nullptr) {
739 HDF_LOGE("%{public}s: OsalMemCalloc failed", __func__);
740 return req;
741 }
742
743 req->reqMsg.request = nullptr;
744 req->endPointAddr = 0;
745 req->ifHandle = nullptr;
746 req->status = 0;
747 OsalMutexInit(&req->lock);
748 return req;
749 }
750
UsbdRequestASyncInit(HostDevice * port,UsbInterfaceHandle * ifHandle,UsbPipeInfo * pipe,UsbdRequestASync * request)751 int32_t UsbdDispatcher::UsbdRequestASyncInit(
752 HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestASync *request)
753 {
754 if (port == nullptr || request == nullptr || ifHandle == nullptr || pipe == nullptr) {
755 HDF_LOGE("%{public}s:invalid param", __func__);
756 return HDF_ERR_INVALID_PARAM;
757 }
758
759 int32_t ret = memcpy_s(&request->pipe, sizeof(UsbPipeInfo), pipe, sizeof(UsbPipeInfo));
760 if (ret != EOK) {
761 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
762 return ret;
763 }
764
765 request->ifHandle = ifHandle;
766 request->reqMsg.request = UsbAllocRequest(request->ifHandle, 0, request->pipe.maxPacketSize);
767 if (request->reqMsg.request == nullptr) {
768 HDF_LOGE("%{public}s:alloc request failed", __func__);
769 return HDF_ERR_MALLOC_FAIL;
770 }
771 FillReqAyncParams(request, &request->pipe, &request->params, nullptr, 0);
772 OsalMutexLock(&port->reqASyncLock);
773 HdfSListAddTail(&port->reqASyncList, &request->node);
774 OsalMutexUnlock(&port->reqASyncLock);
775 return HDF_SUCCESS;
776 }
777
UsbdRequestASyncCreatAndInsert(HostDevice * port,uint8_t interfaceId,uint8_t pipeAddr)778 UsbdRequestASync *UsbdDispatcher::UsbdRequestASyncCreatAndInsert(
779 HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr)
780 {
781 UsbPipeInfo pipe;
782 if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
783 HDF_LOGE("%{public}s:memset_s failed", __func__);
784 return nullptr;
785 }
786
787 int32_t ret = GetPipe(port, interfaceId, pipeAddr, &pipe);
788 if (ret != HDF_SUCCESS) {
789 HDF_LOGE("%{public}s: get pipe info failed interfaceId=%{public}d, pipeAddr=%{public}d", __func__, interfaceId,
790 pipeAddr);
791 return nullptr;
792 }
793
794 UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, interfaceId);
795 if (ifHandle == nullptr) {
796 HDF_LOGE("%{public}s:get interface handle failed", __func__);
797 return nullptr;
798 }
799
800 UsbdRequestASync *req = UsbdRequestASyncAlloc();
801 if (req == nullptr) {
802 HDF_LOGE("%{public}s: UsbdRequestASyncAlloc failed", __func__);
803 return req;
804 }
805 ret = UsbdRequestASyncInit(port, ifHandle, &pipe, req);
806 if (ret != HDF_SUCCESS) {
807 HDF_LOGE("%{public}s:UsbdRequestASyncInit failed:%{public}d", __func__, ret);
808 UsbdRequestASyncRelease(req);
809 req = nullptr;
810 return req;
811 }
812 return req;
813 }
814
HostDeviceInit(HostDevice * port)815 int32_t UsbdDispatcher::HostDeviceInit(HostDevice *port)
816 {
817 if (port == nullptr) {
818 HDF_LOGE("%{public}s:port is nullptr", __func__);
819 return HDF_ERR_INVALID_OBJECT;
820 }
821
822 port->busNum = 0;
823 port->devAddr = 0;
824 port->initFlag = false;
825 port->interfaceCnt = 0;
826 if (OsalMutexInit(&port->lock) != HDF_SUCCESS) {
827 HDF_LOGE("%{public}s:init lock failed!", __func__);
828 return HDF_FAILURE;
829 }
830
831 if (OsalMutexInit(&port->requestLock) != HDF_SUCCESS) {
832 HDF_LOGE("%{public}s:init requestLock failed!", __func__);
833 return HDF_FAILURE;
834 }
835
836 if (OsalMutexInit(&port->writeLock) != HDF_SUCCESS) {
837 HDF_LOGE("%{public}s:init writeLock failed!", __func__);
838 return HDF_FAILURE;
839 }
840
841 if (OsalMutexInit(&port->readLock) != HDF_SUCCESS) {
842 HDF_LOGE("%{public}s:init readLock failed!", __func__);
843 return HDF_FAILURE;
844 }
845
846 if (OsalMutexInit(&port->reqSyncLock) != HDF_SUCCESS) {
847 HDF_LOGE("%{public}s:init reqSyncLock failed!", __func__);
848 return HDF_FAILURE;
849 }
850
851 if (OsalMutexInit(&port->reqASyncLock) != HDF_SUCCESS) {
852 HDF_LOGE("%{public}s:init reqASyncLock failed!", __func__);
853 return HDF_FAILURE;
854 }
855
856 HdfSListInit(&port->requestQueue);
857 HdfSListInit(&port->reqSyncList);
858 HdfSListInit(&port->reqASyncList);
859 return HDF_SUCCESS;
860 }
861
HostDeviceCreate(HostDevice ** port)862 int32_t UsbdDispatcher::HostDeviceCreate(HostDevice **port)
863 {
864 if (port == nullptr) {
865 HDF_LOGE("%{public}s:invalid param port is nullptr", __func__);
866 return HDF_ERR_INVALID_OBJECT;
867 }
868
869 HostDevice *tmp = static_cast<HostDevice *>(OsalMemCalloc(sizeof(HostDevice)));
870 if (tmp == nullptr) {
871 HDF_LOGE("%{public}s:OsalMemCalloc failed", __func__);
872 return HDF_ERR_MALLOC_FAIL;
873 }
874
875 int32_t ret = HostDeviceInit(tmp);
876 if (ret != HDF_SUCCESS) {
877 HDF_LOGE("%{public}s:HostDeviceInit failed!", __func__);
878 OsalMemFree(tmp);
879 tmp = nullptr;
880 return ret;
881 }
882
883 tmp->initFlag = false;
884 *port = tmp;
885 return HDF_SUCCESS;
886 }
887
FunAttachDevice(HostDevice * port,HdfSBuf * data,HdfSBuf * reply)888 int32_t UsbdDispatcher::FunAttachDevice(HostDevice *port, HdfSBuf *data, HdfSBuf *reply)
889 {
890 if (port == nullptr) {
891 HDF_LOGE("%{public}s:mangf invalid param", __func__);
892 return HDF_ERR_INVALID_PARAM;
893 }
894 if (port->initFlag) {
895 HDF_LOGD("%{public}s:device is already on flag:%{public}d bus:%{public}d dev:%{public}d", __func__,
896 port->initFlag, port->busNum, port->devAddr);
897 return HDF_SUCCESS;
898 }
899
900 int32_t ret = HDF_SUCCESS;
901 do {
902 ret = UsbdInit(port);
903 if (ret != HDF_SUCCESS) {
904 HDF_LOGE("%{public}s:UsbInit failed ret:%{public}d", __func__, ret);
905 RemoveDevFromService(port->service, port);
906 UsbdRelease(port);
907 OsalMemFree(port);
908 return ret;
909 }
910 ret = UsbdAllocFifo(&port->readFifo, READ_BUF_SIZE);
911 if (ret != HDF_SUCCESS) {
912 HDF_LOGE("%{public}s:UsbAllocFifo failed ret:%{public}d", __func__, ret);
913 ret = HDF_ERR_INVALID_PARAM;
914 break;
915 }
916 if (ret == HDF_SUCCESS) {
917 port->initFlag = true;
918 HDF_LOGI("%{public}s:UsbOpen success", __func__);
919 } else {
920 HDF_LOGE("%{public}s:UsbOpen fail:%{public}d", __func__, ret);
921 }
922 return ret;
923 } while (0);
924
925 UsbdFreeFifo(&port->readFifo);
926 UsbdRelease(port);
927 RemoveDevFromService(port->service, port);
928 OsalMemFree(port);
929 return ret;
930 }
931
UsbdDeviceCreateAndAttach(const sptr<UsbImpl> & service,uint8_t busNum,uint8_t devAddr)932 int32_t UsbdDispatcher::UsbdDeviceCreateAndAttach(const sptr<UsbImpl> &service, uint8_t busNum, uint8_t devAddr)
933 {
934 HostDevice *port = service->FindDevFromService(busNum, devAddr);
935 if (port != nullptr) {
936 HDF_LOGI("%{public}s:device already add", __func__);
937 return HDF_ERR_DEVICE_BUSY;
938 }
939 int32_t ret = HostDeviceCreate(&port);
940 if (ret == HDF_SUCCESS) {
941 port->busNum = busNum;
942 port->devAddr = devAddr;
943 port->service = service;
944 OsalMutexLock(&service->lock_);
945 HdfSListAdd(&service->devList_, &port->node);
946 OsalMutexUnlock(&service->lock_);
947 ret = FunAttachDevice(port, nullptr, nullptr);
948 if (ret != HDF_SUCCESS) {
949 HDF_LOGW("%{public}s:FunAttachDevice error ret:%{public}d", __func__, ret);
950 }
951 port = nullptr;
952 } else {
953 HDF_LOGE("%{public}s:createdevice error ret:%{public}d", __func__, ret);
954 }
955 return ret;
956 }
957
FunDetachDevice(HostDevice * port,HdfSBuf * data)958 int32_t UsbdDispatcher::FunDetachDevice(HostDevice *port, HdfSBuf *data)
959 {
960 if (port == nullptr) {
961 HDF_LOGE("%{public}s:invalid param port", __func__);
962 return HDF_ERR_INVALID_PARAM;
963 }
964
965 RemoveDevFromService(port->service, port);
966 UsbdRelease(port);
967 UsbdFreeFifo(&port->readFifo);
968 OsalMemFree(port);
969 return HDF_SUCCESS;
970 }
971
UsbdDeviceDettach(UsbImpl * service,uint8_t busNum,uint8_t devAddr)972 int32_t UsbdDispatcher::UsbdDeviceDettach(UsbImpl *service, uint8_t busNum, uint8_t devAddr)
973 {
974 if (service == nullptr) {
975 HDF_LOGE("%{public}s:invalid param service!", __func__);
976 return HDF_ERR_INVALID_PARAM;
977 }
978
979 HostDevice *port = service->FindDevFromService(busNum, devAddr);
980 if (port == nullptr) {
981 HDF_LOGE("%{public}s:FindDevFromService failed", __func__);
982 return HDF_DEV_ERR_NO_DEVICE;
983 }
984
985 int32_t ret = FunDetachDevice(port, nullptr);
986 if (ret != HDF_SUCCESS) {
987 HDF_LOGE("%{public}s: %{public}d FunDetachDevice failed", __func__, ret);
988 return HDF_FAILURE;
989 }
990
991 return HDF_SUCCESS;
992 }
993
UsbdFindDevForBusNum(UsbImpl * service,uint8_t busNum)994 HostDevice *UsbdDispatcher::UsbdFindDevForBusNum(UsbImpl *service, uint8_t busNum)
995 {
996 if (service == nullptr) {
997 HDF_LOGE("%{public}s: service is nullptr", __func__);
998 return nullptr;
999 }
1000
1001 uint8_t flag = false;
1002 HdfSListIterator it;
1003 HostDevice *tempPort = nullptr;
1004 OsalMutexLock(&service->lock_);
1005 HdfSListIteratorInit(&it, &service->devList_);
1006 while (HdfSListIteratorHasNext(&it)) {
1007 tempPort = reinterpret_cast<HostDevice *>(HdfSListIteratorNext(&it));
1008 if (!tempPort) {
1009 continue;
1010 }
1011 if (tempPort->busNum == busNum) {
1012 HdfSListIteratorRemove(&it);
1013 flag = true;
1014 break;
1015 }
1016 }
1017 OsalMutexUnlock(&service->lock_);
1018 if (flag) {
1019 return tempPort;
1020 }
1021 return nullptr;
1022 }
1023
UsbdRemoveBusDev(UsbImpl * service,uint8_t busNum,const sptr<IUsbdSubscriber> & subscriber)1024 int32_t UsbdDispatcher::UsbdRemoveBusDev(UsbImpl *service, uint8_t busNum, const sptr<IUsbdSubscriber> &subscriber)
1025 {
1026 HostDevice *tempPort = nullptr;
1027 USBDeviceInfo info;
1028 int32_t ret = HDF_FAILURE;
1029
1030 while (1) {
1031 tempPort = UsbdDispatcher::UsbdFindDevForBusNum(service, busNum);
1032 if (!tempPort) {
1033 break;
1034 }
1035 info = {ACT_DEVDOWN, tempPort->busNum, tempPort->devAddr};
1036 ret = subscriber->DeviceEvent(info);
1037 if (ret != HDF_SUCCESS) {
1038 HDF_LOGE("%{public}s failed to notify subscriber, ret: %{public}d", __func__, ret);
1039 return ret;
1040 }
1041 UsbdRelease(tempPort);
1042 UsbdFreeFifo(&tempPort->readFifo);
1043 OsalMemFree(tempPort);
1044 }
1045 return ret;
1046 }
1047
UsbdBulkASyncReqInit(UsbdBulkASyncReqList * list,UsbdBulkASyncList * pList)1048 int32_t UsbdDispatcher::UsbdBulkASyncReqInit(UsbdBulkASyncReqList *list, UsbdBulkASyncList *pList)
1049 {
1050 int32_t ret = HDF_SUCCESS;
1051 int32_t i = 0;
1052 DListHeadInit(&list->eList);
1053 DListHeadInit(&list->uList);
1054 OsalMutexInit(&list->elock);
1055 OsalMutexInit(&list->ulock);
1056 for (i = 0; i < USBD_BULKASYNCREQ_NUM_MAX; ++i) {
1057 list->node[i].request = UsbAllocRequest(pList->ifHandle, 0, pList->pipe.maxPacketSize);
1058 if (!list->node[i].request) {
1059 HDF_LOGE("%{public}s:alloc request failed i:%{public}d", __func__, i);
1060 ret = HDF_ERR_MALLOC_FAIL;
1061 break;
1062 }
1063 list->node[i].list = list;
1064 list->node[i].id = i;
1065 DListInsertTail(&list->node[i].node, &list->eList);
1066 pList->params.userData = static_cast<void *>(&list->node[i]);
1067 }
1068
1069 if (i != USBD_BULKASYNCREQ_NUM_MAX) {
1070 for (; i >= 0; --i) {
1071 UsbFreeRequest(list->node[i].request);
1072 list->node[i].request = nullptr;
1073 }
1074 DListHeadInit(&list->eList);
1075 DListHeadInit(&list->uList);
1076 OsalMutexDestroy(&list->elock);
1077 OsalMutexDestroy(&list->ulock);
1078 }
1079 list->pList = pList;
1080 return ret;
1081 }
1082
UsbdBulkASyncListAlloc(HostDevice * port,uint8_t ifId,uint8_t epId)1083 UsbdBulkASyncList *UsbdDispatcher::UsbdBulkASyncListAlloc(HostDevice *port, uint8_t ifId, uint8_t epId)
1084 {
1085 UsbPipeInfo pipe;
1086 if (memset_s(&pipe, sizeof(UsbPipeInfo), 0, sizeof(UsbPipeInfo)) != EOK) {
1087 HDF_LOGE("%{public}s:memset_s failed", __func__);
1088 return nullptr;
1089 }
1090
1091 int32_t ret = GetPipe(port, ifId, epId, &pipe);
1092 if (ret != HDF_SUCCESS) {
1093 HDF_LOGE("%{public}s:GetPipe failed, ret:%{public}d", __func__, ret);
1094 return nullptr;
1095 }
1096
1097 UsbInterfaceHandle *ifHandle = UsbImpl::InterfaceIdToHandle(port, ifId);
1098 if (ifHandle == nullptr) {
1099 HDF_LOGE("%{public}s:get interface handle failed", __func__);
1100 return nullptr;
1101 }
1102
1103 UsbdBulkASyncList *bulkAsyncList = reinterpret_cast<UsbdBulkASyncList *>(OsalMemCalloc(sizeof(UsbdBulkASyncList)));
1104 if (bulkAsyncList == nullptr) {
1105 HDF_LOGE("%{public}s:malloc failed!", __func__);
1106 return nullptr;
1107 }
1108 bulkAsyncList->ifId = ifId;
1109 bulkAsyncList->epId = epId;
1110 bulkAsyncList->instance = port;
1111 OsalMutexInit(&bulkAsyncList->asmHandle.lock);
1112 bulkAsyncList->pipe = pipe;
1113 bulkAsyncList->ifHandle = ifHandle;
1114 UsbdBulkASyncReqFillParams(&bulkAsyncList->pipe, &bulkAsyncList->params, nullptr);
1115 ret = UsbdBulkASyncReqInit(&bulkAsyncList->rList, bulkAsyncList);
1116 if (ret != HDF_SUCCESS) {
1117 HDF_LOGE("%{public}s: UsbdBulkASyncReqInit failed ret:%{public}d", __func__, ret);
1118 UsbdBulkASyncListRelease(bulkAsyncList);
1119 bulkAsyncList = nullptr;
1120 return bulkAsyncList;
1121 }
1122
1123 return bulkAsyncList;
1124 }
1125
UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode * db)1126 int32_t UsbdDispatcher::UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode *db)
1127 {
1128 OsalMutexLock(&db->list->elock);
1129 db->use = USBD_REQNODE_NOUSE;
1130 DListInsertTail(&db->node, &db->list->eList);
1131 OsalMutexUnlock(&db->list->elock);
1132 return HDF_SUCCESS;
1133 }
1134
UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList * list)1135 UsbdBulkASyncReqNode *UsbdDispatcher::UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList *list)
1136 {
1137 OsalMutexLock(&list->elock);
1138 if (DListIsEmpty(&list->eList)) {
1139 OsalMutexUnlock(&list->elock);
1140 HDF_LOGE("%{public}s:invalid param", __func__);
1141 return nullptr;
1142 }
1143 UsbdBulkASyncReqNode *ptr = DLIST_FIRST_ENTRY(&list->eList, UsbdBulkASyncReqNode, node);
1144 if (ptr != nullptr) {
1145 ptr->use = USBD_REQNODE_OTHER;
1146 if (ptr->node.prev != NULL && ptr->node.next != NULL) {
1147 DListRemove(&ptr->node);
1148 } else {
1149 HDF_LOGE("%{public}s: The node prev or next is NULL", __func__);
1150 }
1151 }
1152 OsalMutexUnlock(&list->elock);
1153 return ptr;
1154 }
1155
UsbdBulkReadRemoteCallback(const sptr<IUsbdBulkCallback> & service,int32_t status,UsbdBufferHandle * handle)1156 int32_t UsbdDispatcher::UsbdBulkReadRemoteCallback(
1157 const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1158 {
1159 if (service == nullptr || handle == nullptr) {
1160 HDF_LOGE("%{public}s:invalid param", __func__);
1161 return HDF_ERR_INVALID_PARAM;
1162 }
1163
1164 OsalMutexLock(&handle->lock);
1165 uint8_t flag = handle->cbflg;
1166 handle->cbflg = 1;
1167 int32_t actLength = static_cast<int32_t>(handle->rcur);
1168 OsalMutexUnlock(&handle->lock);
1169 if (flag) {
1170 return HDF_SUCCESS;
1171 }
1172 int32_t ret = service->OnBulkReadCallback(status, actLength);
1173 if (ret != HDF_SUCCESS) {
1174 HDF_LOGE("%{public}s:OnBulkReadCallback failed, ret=%{public}d", __func__, ret);
1175 }
1176 return ret;
1177 }
1178
UsbdBulkWriteRemoteCallback(const sptr<IUsbdBulkCallback> & service,int32_t status,UsbdBufferHandle * handle)1179 int32_t UsbdDispatcher::UsbdBulkWriteRemoteCallback(
1180 const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle)
1181 {
1182 if (service == nullptr || handle == nullptr) {
1183 HDF_LOGE("%{public}s:invalid param", __func__);
1184 return HDF_ERR_INVALID_PARAM;
1185 }
1186
1187 OsalMutexLock(&handle->lock);
1188 uint8_t flag = handle->cbflg;
1189 handle->cbflg = 1;
1190 int32_t actLength = static_cast<int32_t>(handle->cur);
1191 OsalMutexUnlock(&handle->lock);
1192 if (flag) {
1193 return HDF_SUCCESS;
1194 }
1195
1196 int32_t ret = service->OnBulkWriteCallback(status, actLength);
1197 if (ret != HDF_SUCCESS) {
1198 HDF_LOGE("%{public}s:OnBulkWriteCallback failed, ret=%{public}d", __func__, ret);
1199 }
1200 return ret;
1201 }
1202
UsbdBulkASyncPutAsmData(UsbdBufferHandle * handle,uint8_t * buffer,uint32_t len)1203 int32_t UsbdDispatcher::UsbdBulkASyncPutAsmData(UsbdBufferHandle *handle, uint8_t *buffer, uint32_t len)
1204 {
1205 if (handle == nullptr || buffer == nullptr || len < 1) {
1206 HDF_LOGE("%{public}s:invalid param len:%{public}d", __func__, len);
1207 return HDF_ERR_INVALID_PARAM;
1208 }
1209
1210 int32_t ret = HDF_SUCCESS;
1211 OsalMutexLock(&handle->lock);
1212 do {
1213 if (handle->fd < 1) {
1214 HDF_LOGE("%{public}s:fd error, handle->fd:%{public}d", __func__, handle->fd);
1215 ret = HDF_ERR_BAD_FD;
1216 break;
1217 }
1218 uint32_t tlen = (handle->size > handle->rcur) ? (handle->size - handle->rcur) : 0;
1219 tlen = tlen < len ? tlen : len;
1220 if (tlen > 0) {
1221 ret = memcpy_s(handle->starAddr + handle->rcur, tlen, buffer, len);
1222 if (ret != EOK) {
1223 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1224 OsalMutexUnlock(&handle->lock);
1225 return ret;
1226 }
1227
1228 handle->rcur += tlen;
1229 }
1230 } while (0);
1231 OsalMutexUnlock(&handle->lock);
1232 return ret;
1233 }
1234
UsbdBulkAsyncGetAsmData(UsbdBufferHandle * handle,UsbRequestParams * params,uint16_t maxPacketSize)1235 int32_t UsbdDispatcher::UsbdBulkAsyncGetAsmData(
1236 UsbdBufferHandle *handle, UsbRequestParams *params, uint16_t maxPacketSize)
1237 {
1238 if (handle == nullptr || params == nullptr || handle->size < 1 || maxPacketSize < 1) {
1239 HDF_LOGE("%{public}s:invalid param", __func__);
1240 return HDF_ERR_INVALID_PARAM;
1241 }
1242
1243 int32_t ret = HDF_ERR_INVALID_PARAM;
1244 OsalMutexLock(&handle->lock);
1245 if (handle->cur < handle->size) {
1246 params->dataReq.length =
1247 (handle->size - handle->cur) < maxPacketSize ? (handle->size - handle->cur) : maxPacketSize;
1248 params->dataReq.buffer = handle->starAddr + handle->cur;
1249 handle->cur += params->dataReq.length;
1250 ret = HDF_SUCCESS;
1251 } else {
1252 params->dataReq.length = 0;
1253 params->dataReq.buffer = nullptr;
1254 HDF_LOGE("%{public}s:invalid param", __func__);
1255 ret = HDF_DEV_ERR_NODATA;
1256 }
1257 OsalMutexUnlock(&handle->lock);
1258 return ret;
1259 }
1260
UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle * handle,uint32_t * reqLen,uint16_t maxPacketSize)1261 int32_t UsbdDispatcher::UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle *handle, uint32_t *reqLen, uint16_t maxPacketSize)
1262 {
1263 if (handle == nullptr || reqLen == nullptr || handle->size < 1 || maxPacketSize < 1) {
1264 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1265 return HDF_ERR_INVALID_PARAM;
1266 }
1267
1268 uint32_t tlen = 0;
1269 OsalMutexLock(&handle->lock);
1270 if (handle->cur < handle->size) {
1271 tlen = handle->size - handle->cur;
1272 tlen = tlen < maxPacketSize ? tlen : maxPacketSize;
1273 handle->cur += tlen;
1274 }
1275 OsalMutexUnlock(&handle->lock);
1276 *reqLen = tlen;
1277 return HDF_SUCCESS;
1278 }
1279
UsbdBulkASyncReqWriteAutoSubmit(UsbRequest * request)1280 int32_t UsbdDispatcher::UsbdBulkASyncReqWriteAutoSubmit(UsbRequest *request)
1281 {
1282 UsbRequestParams params;
1283 UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1284 int32_t ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params));
1285 if (ret != EOK) {
1286 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1287 return ret;
1288 }
1289
1290 params.userData = static_cast<void *>(db);
1291 ret = UsbdBulkAsyncGetAsmData(&db->list->pList->asmHandle, ¶ms, db->list->pList->pipe.maxPacketSize);
1292 if (ret != HDF_SUCCESS) {
1293 UsbdBulkASyncReqNodeSetNoUse(db);
1294 return ret;
1295 }
1296 db->request->compInfo.status = USB_REQUEST_COMPLETED;
1297 ret = UsbFillRequest(request, db->list->pList->ifHandle, ¶ms);
1298 if (ret != HDF_SUCCESS) {
1299 UsbdBulkASyncReqNodeSetNoUse(db);
1300 HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1301 return ret;
1302 }
1303 ret = UsbSubmitRequestAsync(request);
1304 if (ret != HDF_SUCCESS) {
1305 UsbdBulkASyncReqNodeSetNoUse(db);
1306 HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1307 }
1308 return ret;
1309 }
1310
UsbdBulkASyncReqReadAutoSubmit(UsbRequest * request)1311 int32_t UsbdDispatcher::UsbdBulkASyncReqReadAutoSubmit(UsbRequest *request)
1312 {
1313 uint32_t readLen = 0;
1314 UsbdBulkASyncReqNode *db = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1315 int32_t ret =
1316 UsbdBulkASyncPutAsmData(&db->list->pList->asmHandle, request->compInfo.buffer, request->compInfo.actualLength);
1317 if (ret != HDF_SUCCESS) {
1318 HDF_LOGE("%{public}s:%{public}d UsbdBulkASyncPutAsmData error size:%{public}d ret:%{public}d", __func__,
1319 __LINE__, request->compInfo.actualLength, ret);
1320 UsbdBulkASyncReqNodeSetNoUse(db);
1321 return ret;
1322 }
1323
1324 ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1325 if (ret != HDF_SUCCESS || readLen < 1) {
1326 UsbdBulkASyncReqNodeSetNoUse(db);
1327 HDF_LOGE("%{public}s:invalid param", __func__);
1328 return HDF_DEV_ERR_NODATA;
1329 }
1330 db->request->compInfo.status = USB_REQUEST_COMPLETED;
1331 UsbHostRequest *hostRequest = reinterpret_cast<UsbIfRequest *>(request)->hostRequest;
1332 if (readLen != static_cast<uint32_t>(hostRequest->length)) {
1333 UsbRequestParams params;
1334 ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params));
1335 if (ret != EOK) {
1336 HDF_LOGE("%{public}s: %{public}d memcpy_s failed", __func__, ret);
1337 return ret;
1338 }
1339
1340 params.dataReq.length = readLen;
1341 params.userData = static_cast<void *>(db);
1342 ret = UsbFillRequest(request, db->list->pList->ifHandle, ¶ms);
1343 if (ret != HDF_SUCCESS) {
1344 UsbdBulkASyncReqNodeSetNoUse(db);
1345 HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d ", __func__, ret);
1346 return ret;
1347 }
1348 }
1349 ret = UsbSubmitRequestAsync(request);
1350 if (ret != HDF_SUCCESS) {
1351 UsbdBulkASyncReqNodeSetNoUse(db);
1352 HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d ", __func__, ret);
1353 }
1354 return ret;
1355 }
1356
UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest * request)1357 void UsbdDispatcher::UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest *request)
1358 {
1359 if (request == nullptr) {
1360 HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1361 return;
1362 }
1363
1364 int32_t ret = HDF_SUCCESS;
1365 UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1366 int32_t status = request->compInfo.status;
1367 if (status != 0) {
1368 UsbdBulkASyncReqNodeSetNoUse(node);
1369 ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1370 if (ret != HDF_SUCCESS) {
1371 HDF_LOGE("%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed, ret:%{public}d"
1372 "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1373 }
1374 return;
1375 }
1376
1377 ret = UsbdBulkASyncReqWriteAutoSubmit(request);
1378 if (ret == HDF_DEV_ERR_NODATA) {
1379 int32_t count = DListGetCount(&node->list->eList);
1380 if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1381 ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1382 if (ret != HDF_SUCCESS) {
1383 HDF_LOGE("%{public}s: %{public}d UsbdBulkWriteRemoteCallback failed", __func__, __LINE__);
1384 }
1385 return;
1386 }
1387 } else if (ret != HDF_SUCCESS) {
1388 ret = UsbdBulkWriteRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1389 if (ret != HDF_SUCCESS) {
1390 HDF_LOGE(
1391 "%{public}s:%{public}d UsbdBulkWriteRemoteCallback failed ret:%{public}d id:%{public}d",
1392 __func__, __LINE__, ret, node->id);
1393 }
1394 return;
1395 }
1396 }
1397
UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest * request)1398 void UsbdDispatcher::UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest *request)
1399 {
1400 if (request == nullptr) {
1401 HDF_LOGE("%{public}s: %{public}d request is nullptr", __func__, __LINE__);
1402 return;
1403 }
1404
1405 int32_t ret = HDF_SUCCESS;
1406 UsbdBulkASyncReqNode *node = static_cast<UsbdBulkASyncReqNode *>(request->compInfo.userData);
1407 int32_t status = request->compInfo.status;
1408 if (status != 0) {
1409 UsbdBulkASyncReqNodeSetNoUse(node);
1410 ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, status, &node->list->pList->asmHandle);
1411 if (ret != HDF_SUCCESS) {
1412 HDF_LOGE("%{public}s:%{public}d UsbdBulkReadRemoteCallback failed, ret:%{public}d"
1413 "id:%{public}d status:%{public}d", __func__, __LINE__, ret, node->id, status);
1414 }
1415 return;
1416 }
1417
1418 ret = UsbdBulkASyncReqReadAutoSubmit(request);
1419 if (ret == HDF_DEV_ERR_NODATA) {
1420 int32_t count = DListGetCount(&node->list->eList);
1421 if (count >= USBD_BULKASYNCREQ_NUM_MAX) {
1422 ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, HDF_SUCCESS, &node->list->pList->asmHandle);
1423 if (ret != HDF_SUCCESS) {
1424 HDF_LOGE("%{public}s: %{public}d UsbdBulkReadRemoteCallback failed", __func__, __LINE__);
1425 }
1426 return;
1427 }
1428 } else if (ret != HDF_SUCCESS) {
1429 ret = UsbdBulkReadRemoteCallback(node->list->pList->cb, ret, &node->list->pList->asmHandle);
1430 if (ret != HDF_SUCCESS) {
1431 HDF_LOGE(
1432 "%{public}s:%{public}d UsbdBulkReadRemoteCallback failed ret:%{public}d id:%{public}d",
1433 __func__, __LINE__, ret, node->id);
1434 }
1435 return;
1436 }
1437 }
1438
UsbdBulkASyncReqFillParams(UsbPipeInfo * pipe,UsbRequestParams * params,uint8_t * buffer)1439 int32_t UsbdDispatcher::UsbdBulkASyncReqFillParams(UsbPipeInfo *pipe, UsbRequestParams *params, uint8_t *buffer)
1440 {
1441 params->interfaceId = pipe->interfaceId;
1442 params->pipeAddress = pipe->pipeDirection | pipe->pipeAddress;
1443 params->pipeId = pipe->pipeId;
1444 params->requestType = USB_REQUEST_PARAMS_DATA_TYPE;
1445 params->timeout = USB_CTRL_SET_TIMEOUT;
1446 params->dataReq.numIsoPackets = 0;
1447 params->dataReq.directon = static_cast<UsbRequestDirection>((pipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1);
1448 params->dataReq.length = pipe->maxPacketSize;
1449
1450 if (pipe->pipeDirection == USB_PIPE_DIRECTION_OUT) {
1451 params->callback = UsbdBulkASyncWriteCallbackAutoSubmit;
1452 params->dataReq.buffer = buffer;
1453 } else {
1454 params->callback = UsbdBulkASyncReadCallbackAutoSubmit;
1455 }
1456 return HDF_SUCCESS;
1457 }
1458
UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode * req)1459 int32_t UsbdDispatcher::UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode *req)
1460 {
1461 UsbRequestParams params;
1462 int32_t ret = memcpy_s(¶ms, sizeof(params), &req->list->pList->params, sizeof(params));
1463 if (ret != EOK) {
1464 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1465 return ret;
1466 }
1467
1468 params.userData = static_cast<void *>(req);
1469 ret = UsbdBulkAsyncGetAsmData(&req->list->pList->asmHandle, ¶ms, req->list->pList->pipe.maxPacketSize);
1470 if (ret != HDF_SUCCESS) {
1471 UsbdBulkASyncReqNodeSetNoUse(req);
1472 HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmData ret:%{public}d", __func__, ret);
1473 return ret;
1474 }
1475 req->request->compInfo.status = USB_REQUEST_COMPLETED;
1476 ret = UsbFillRequest(req->request, req->list->pList->ifHandle, ¶ms);
1477 if (ret != HDF_SUCCESS) {
1478 UsbdBulkASyncReqNodeSetNoUse(req);
1479 HDF_LOGE("%{public}s:UsbFillRequest ret:%{public}d", __func__, ret);
1480 return ret;
1481 }
1482 ret = UsbSubmitRequestAsync(req->request);
1483 if (ret != HDF_SUCCESS) {
1484 UsbdBulkASyncReqNodeSetNoUse(req);
1485 HDF_LOGE("%{public}s:UsbSubmitRequestAsync ret:%{public}d", __func__, ret);
1486 }
1487 return ret;
1488 }
1489
UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode * db)1490 int32_t UsbdDispatcher::UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode *db)
1491 {
1492 uint32_t readLen = 0;
1493 int32_t ret = UsbdBulkAsyncGetAsmReqLen(&db->list->pList->asmHandle, &readLen, db->list->pList->pipe.maxPacketSize);
1494 if (ret != HDF_SUCCESS || readLen == 0) {
1495 UsbdBulkASyncReqNodeSetNoUse(db);
1496 HDF_LOGE("%{public}s:UsbdBulkAsyncGetAsmReqLen failed, readLen:%{public}u", __func__, readLen);
1497 return HDF_DEV_ERR_NODATA;
1498 }
1499
1500 db->request->compInfo.status = USB_REQUEST_COMPLETED;
1501 UsbRequestParams params;
1502 ret = memcpy_s(¶ms, sizeof(params), &db->list->pList->params, sizeof(params));
1503 if (ret != EOK) {
1504 HDF_LOGE("%{public}s:%{public}d memcpy_s failed", __func__, ret);
1505 return ret;
1506 }
1507
1508 params.dataReq.length = readLen;
1509 params.userData = static_cast<void *>(db);
1510 ret = UsbFillRequest(db->request, db->list->pList->ifHandle, ¶ms);
1511 if (ret != HDF_SUCCESS) {
1512 HDF_LOGE("%{public}s:UsbFillRequest failed", __func__);
1513 UsbdBulkASyncReqNodeSetNoUse(db);
1514 return ret;
1515 }
1516
1517 ret = UsbSubmitRequestAsync(db->request);
1518 if (ret != HDF_SUCCESS) {
1519 HDF_LOGE("%{public}s:UsbSubmitRequestAsync failed", __func__);
1520 UsbdBulkASyncReqNodeSetNoUse(db);
1521 }
1522 return ret;
1523 }
1524 } // namespace V1_2
1525 } // namespace Usb
1526 } // namespace HDI
1527 } // namespace OHOS
1528