1 /*
2 * Copyright (c) 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 "v1_0/usb_ddk_service.h"
17
18 #include <hdf_base.h>
19 #include <iproxy_broker.h>
20
21 #include "ddk_pnp_listener_mgr.h"
22 #include "usb_ddk_hash.h"
23 #include "usb_ddk_interface.h"
24 #include "usb_ddk_permission.h"
25 #include "usb_raw_api.h"
26 #include "usbd_wrapper.h"
27 #define HDF_LOG_TAG usb_ddk_service
28
29 namespace OHOS {
30 namespace HDI {
31 namespace Usb {
32 namespace Ddk {
33 namespace V1_0 {
34 // 32 means size of uint32_t
35 #define GET_BUS_NUM(devHandle) ((uint8_t)((devHandle) >> 32))
36 #define GET_DEV_NUM(devHandle) ((uint8_t)((devHandle)&0xFFFFFFFF))
37 #define USB_RECIP_MASK 0x1F
38 #define GET_CTRL_REQ_RECIP(requestType) ((requestType)&USB_RECIP_MASK)
39 #define TRANS_DIRECTION_OFFSET 7
40 #define GET_CTRL_REQ_DIR(requestType) ((requestType) >> TRANS_DIRECTION_OFFSET)
41 #define REQ_TYPE_OFFERT 5
42 #define REQ_TYPE_MASK 0x3
43 #define GET_CTRL_REQ_TYPE(requestType) (((requestType) >> REQ_TYPE_OFFERT) & REQ_TYPE_MASK)
44
45 #define MAX_BUFF_SIZE 16384
46 #define MAX_CONTROL_BUFF_SIZE 1024
47
48 static const std::string PERMISSION_NAME = "ohos.permission.ACCESS_DDK_USB";
49 static std::mutex g_infMutex;
UsbDdkImplGetInstance(void)50 extern "C" IUsbDdk *UsbDdkImplGetInstance(void)
51 {
52 return new (std::nothrow) UsbDdkService();
53 }
54
ReleaseUsbInterface(uint64_t interfaceHandle)55 int32_t ReleaseUsbInterface(uint64_t interfaceHandle)
56 {
57 std::lock_guard<std::mutex> lock(g_infMutex);
58 uint64_t handle = 0;
59 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
60 if (ret != HDF_SUCCESS) {
61 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
62 return ret;
63 }
64 UsbDdkDelHashRecord(interfaceHandle);
65
66 struct UsbInterface *interface = nullptr;
67 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
68 ret = GetInterfaceByHandle(handleConvert, &interface);
69 if (ret != HDF_SUCCESS) {
70 HDF_LOGE("%{public}s get interface failed %{public}d", __func__, ret);
71 return ret;
72 }
73
74 ret = UsbCloseInterface(handleConvert, false);
75 if (ret != HDF_SUCCESS) {
76 HDF_LOGE("%{public}s close interface failed %{public}d", __func__, ret);
77 return ret;
78 }
79
80 return UsbReleaseInterface(interface);
81 }
82
UsbdPnpEventHandler(void * priv,uint32_t id,HdfSBuf * data)83 static int32_t UsbdPnpEventHandler(void *priv, uint32_t id, HdfSBuf *data)
84 {
85 if (id == USB_PNP_NOTIFY_REMOVE_DEVICE) {
86 uint32_t infoSize;
87 struct UsbPnpNotifyMatchInfoTable *infoTable = NULL;
88 auto flag = HdfSbufReadBuffer(data, (const void **)(&infoTable), &infoSize);
89 if ((!flag) || (infoTable == NULL)) {
90 HDF_LOGE("%{public}s: fail to read infoTable in event data, flag = %{public}d", __func__, flag);
91 return HDF_ERR_INVALID_PARAM;
92 }
93
94 uint64_t interfaceHandle = 0;
95 if (UsbDdkGetRecordByVal({0, infoTable->busNum, infoTable->devNum}, interfaceHandle)) {
96 HDF_LOGD("%{public}s: need release interface", __func__);
97 ReleaseUsbInterface(interfaceHandle);
98 }
99 }
100 return HDF_SUCCESS;
101 }
102
103 static HdfDevEventlistener *g_pnpListener = nullptr;
104
Init()105 int32_t UsbDdkService::Init()
106 {
107 HDF_LOGI("usb ddk init");
108 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
109 HDF_LOGE("%{public}s: no permission", __func__);
110 return HDF_ERR_NOPERM;
111 }
112 if (g_pnpListener == nullptr) {
113 g_pnpListener = new HdfDevEventlistener();
114 if (g_pnpListener == nullptr) {
115 HDF_LOGE("%{public}s: create listener failed", __func__);
116 return HDF_ERR_MALLOC_FAIL;
117 }
118 g_pnpListener->callBack = UsbdPnpEventHandler;
119 if (DdkListenerMgrAdd(g_pnpListener) != HDF_SUCCESS) {
120 HDF_LOGE("%{public}s: add listener failed", __func__);
121 delete g_pnpListener;
122 g_pnpListener = nullptr;
123 return HDF_FAILURE;
124 }
125 }
126
127 return UsbInitHostSdk(nullptr);
128 }
129
Release()130 int32_t UsbDdkService::Release()
131 {
132 HDF_LOGI("usb ddk exit");
133 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
134 HDF_LOGE("%{public}s: no permission", __func__);
135 return HDF_ERR_NOPERM;
136 }
137
138 DdkPermissionManager::Reset();
139 return UsbExitHostSdk(nullptr);
140 }
141
GetDeviceDescriptor(uint64_t deviceId,UsbDeviceDescriptor & desc)142 int32_t UsbDdkService::GetDeviceDescriptor(uint64_t deviceId, UsbDeviceDescriptor &desc)
143 {
144 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
145 HDF_LOGE("%{public}s: no permission", __func__);
146 return HDF_ERR_NOPERM;
147 }
148
149 UsbRawHandle *rawHandle = UsbRawOpenDevice(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
150 if (rawHandle == nullptr) {
151 HDF_LOGE("%{public}s open device failed", __func__);
152 return HDF_FAILURE;
153 }
154
155 UsbRawDevice *rawDevice = UsbRawGetDevice(rawHandle);
156 if (rawDevice == nullptr) {
157 HDF_LOGE("%{public}s get device failed", __func__);
158 (void)UsbRawCloseDevice(rawHandle);
159 return HDF_FAILURE;
160 }
161
162 int32_t ret = UsbRawGetDeviceDescriptor(rawDevice, reinterpret_cast<::UsbDeviceDescriptor *>(&desc));
163 if (ret != HDF_SUCCESS) {
164 HDF_LOGW("%{public}s get desc failed %{public}d", __func__, ret);
165 }
166 (void)UsbRawCloseDevice(rawHandle);
167 return ret;
168 }
169
GetConfigDescriptor(uint64_t deviceId,uint8_t configIndex,std::vector<uint8_t> & configDesc)170 int32_t UsbDdkService::GetConfigDescriptor(uint64_t deviceId, uint8_t configIndex, std::vector<uint8_t> &configDesc)
171 {
172 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
173 HDF_LOGE("%{public}s: no permission", __func__);
174 return HDF_ERR_NOPERM;
175 }
176
177 UsbRawHandle *rawHandle = UsbRawOpenDevice(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
178 if (rawHandle == nullptr) {
179 HDF_LOGE("%{public}s open device failed", __func__);
180 return HDF_FAILURE;
181 }
182
183 struct UsbConfigDescriptor tmpDesc {};
184 int32_t ret = GetRawConfigDescriptor(
185 rawHandle, configIndex, reinterpret_cast<uint8_t *>(&tmpDesc), sizeof(struct UsbConfigDescriptor));
186 if (ret <= 0) {
187 HDF_LOGW("%{public}s get config desc failed %{public}d", __func__, ret);
188 (void)UsbRawCloseDevice(rawHandle);
189 return ret;
190 }
191
192 std::vector<uint8_t> tmpBuffer(tmpDesc.wTotalLength);
193 ret = GetRawConfigDescriptor(rawHandle, configIndex, tmpBuffer.data(), tmpDesc.wTotalLength);
194 if (ret <= 0) {
195 HDF_LOGW("%{public}s get config desc failed %{public}d", __func__, ret);
196 (void)UsbRawCloseDevice(rawHandle);
197 return ret;
198 }
199
200 if (static_cast<size_t>(ret) != tmpBuffer.size()) {
201 HDF_LOGE("%{public}s config desc invalid length : %{public}d, bufferSize:%{public}zu", __func__, ret,
202 tmpBuffer.size());
203 return HDF_FAILURE;
204 }
205
206 configDesc = tmpBuffer;
207
208 (void)UsbRawCloseDevice(rawHandle);
209 return HDF_SUCCESS;
210 }
211
ClaimInterface(uint64_t deviceId,uint8_t interfaceIndex,uint64_t & interfaceHandle)212 int32_t UsbDdkService::ClaimInterface(uint64_t deviceId, uint8_t interfaceIndex, uint64_t &interfaceHandle)
213 {
214 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
215 HDF_LOGE("%{public}s: no permission", __func__);
216 return HDF_ERR_NOPERM;
217 }
218
219 struct UsbInterface *interface =
220 UsbClaimInterface(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId), interfaceIndex);
221 if (interface == nullptr) {
222 HDF_LOGE("%{public}s claim failed", __func__);
223 return HDF_FAILURE;
224 }
225
226 UsbInterfaceHandle *handle = UsbOpenInterface(interface);
227 if (handle == nullptr) {
228 HDF_LOGE("%{public}s open failed", __func__);
229 return HDF_FAILURE;
230 }
231
232 int32_t ret = UsbDdkHash({(uint64_t)handle, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, interfaceHandle);
233 if (ret != HDF_SUCCESS) {
234 HDF_LOGE("%{public}s hash failed %{public}d", __func__, ret);
235 }
236 return ret;
237 }
238
ReleaseInterface(uint64_t interfaceHandle)239 int32_t UsbDdkService::ReleaseInterface(uint64_t interfaceHandle)
240 {
241 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
242 HDF_LOGE("%{public}s: no permission", __func__);
243 return HDF_ERR_NOPERM;
244 }
245
246 return ReleaseUsbInterface(interfaceHandle);
247 }
248
SelectInterfaceSetting(uint64_t interfaceHandle,uint8_t settingIndex)249 int32_t UsbDdkService::SelectInterfaceSetting(uint64_t interfaceHandle, uint8_t settingIndex)
250 {
251 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
252 HDF_LOGE("%{public}s: no permission", __func__);
253 return HDF_ERR_NOPERM;
254 }
255
256 uint64_t handle = 0;
257 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
258 if (ret != HDF_SUCCESS) {
259 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
260 return ret;
261 }
262
263 struct UsbInterface *interface = nullptr;
264 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
265 return UsbSelectInterfaceSetting(handleConvert, settingIndex, &interface);
266 }
267
GetCurrentInterfaceSetting(uint64_t interfaceHandle,uint8_t & settingIndex)268 int32_t UsbDdkService::GetCurrentInterfaceSetting(uint64_t interfaceHandle, uint8_t &settingIndex)
269 {
270 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
271 HDF_LOGE("%{public}s: no permission", __func__);
272 return HDF_ERR_NOPERM;
273 }
274
275 uint64_t handle = 0;
276 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
277 if (ret != HDF_SUCCESS) {
278 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
279 return ret;
280 }
281
282 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
283 return UsbGetInterfaceSetting(handleConvert, &settingIndex);
284 }
285
SendControlReadRequest(uint64_t interfaceHandle,const UsbControlRequestSetup & setup,uint32_t timeout,std::vector<uint8_t> & data)286 int32_t UsbDdkService::SendControlReadRequest(
287 uint64_t interfaceHandle, const UsbControlRequestSetup &setup, uint32_t timeout, std::vector<uint8_t> &data)
288 {
289 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
290 HDF_LOGE("%{public}s: no permission", __func__);
291 return HDF_ERR_NOPERM;
292 }
293
294 uint64_t handle = 0;
295 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
296 if (ret != HDF_SUCCESS) {
297 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
298 return ret;
299 }
300
301 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
302 uint32_t length = setup.length > MAX_CONTROL_BUFF_SIZE ? MAX_CONTROL_BUFF_SIZE : setup.length;
303 struct UsbRequest *request = UsbAllocRequest(handleConvert, 0, static_cast<int32_t>(length));
304 if (request == nullptr) {
305 HDF_LOGE("%{public}s alloc request failed", __func__);
306 return HDF_DEV_ERR_NO_MEMORY;
307 }
308
309 struct UsbRequestParams params;
310 (void)memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams));
311 params.interfaceId = USB_CTRL_INTERFACE_ID;
312 params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
313 params.timeout = timeout;
314 params.ctrlReq.target = static_cast<UsbRequestTargetType>(GET_CTRL_REQ_RECIP(setup.requestType));
315 params.ctrlReq.reqType = setup.requestType;
316 params.ctrlReq.directon = static_cast<UsbRequestDirection>(GET_CTRL_REQ_DIR(setup.requestType));
317 params.ctrlReq.request = setup.requestCmd;
318 params.ctrlReq.value = setup.value;
319 params.ctrlReq.index = setup.index;
320 params.ctrlReq.length = length;
321
322 ret = UsbFillRequest(request, handleConvert, ¶ms);
323 if (ret != HDF_SUCCESS) {
324 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
325 goto FINISHED;
326 }
327
328 ret = UsbSubmitRequestSync(request);
329 if (ret != HDF_SUCCESS) {
330 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
331 goto FINISHED;
332 }
333
334 data.assign(request->compInfo.buffer, request->compInfo.buffer + request->compInfo.actualLength);
335 FINISHED:
336 (void)UsbFreeRequest(request);
337 return ret;
338 }
339
SendControlWriteRequest(uint64_t interfaceHandle,const UsbControlRequestSetup & setup,uint32_t timeout,const std::vector<uint8_t> & data)340 int32_t UsbDdkService::SendControlWriteRequest(
341 uint64_t interfaceHandle, const UsbControlRequestSetup &setup, uint32_t timeout, const std::vector<uint8_t> &data)
342 {
343 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
344 HDF_LOGE("%{public}s: no permission", __func__);
345 return HDF_ERR_NOPERM;
346 }
347
348 uint64_t handle = 0;
349 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
350 if (ret != HDF_SUCCESS) {
351 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
352 return ret;
353 }
354
355 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
356 struct UsbRequest *request = UsbAllocRequest(handleConvert, 0, MAX_CONTROL_BUFF_SIZE);
357 if (request == nullptr) {
358 HDF_LOGE("%{public}s alloc request failed", __func__);
359 return HDF_DEV_ERR_NO_MEMORY;
360 }
361
362 struct UsbRequestParams params;
363 (void)memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams));
364 params.interfaceId = USB_CTRL_INTERFACE_ID;
365 params.pipeAddress = 0;
366 params.pipeId = 0;
367 params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
368 params.timeout = timeout;
369 params.ctrlReq.target = static_cast<UsbRequestTargetType>(GET_CTRL_REQ_RECIP(setup.requestType));
370 params.ctrlReq.reqType = setup.requestType;
371 params.ctrlReq.directon = static_cast<UsbRequestDirection>(GET_CTRL_REQ_DIR(setup.requestType));
372 params.ctrlReq.request = setup.requestCmd;
373 params.ctrlReq.value = setup.value;
374 params.ctrlReq.index = setup.index;
375 params.ctrlReq.buffer = (void *)data.data();
376 params.ctrlReq.length = data.size();
377
378 ret = UsbFillRequest(request, handleConvert, ¶ms);
379 if (ret != HDF_SUCCESS) {
380 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
381 goto FINISHED;
382 }
383
384 ret = UsbSubmitRequestSync(request);
385 if (ret != HDF_SUCCESS) {
386 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
387 goto FINISHED;
388 }
389
390 FINISHED:
391 (void)UsbFreeRequest(request);
392 return ret;
393 }
394
SendPipeRequest(const UsbRequestPipe & pipe,uint32_t size,uint32_t offset,uint32_t length,uint32_t & transferedLength)395 int32_t UsbDdkService::SendPipeRequest(
396 const UsbRequestPipe &pipe, uint32_t size, uint32_t offset, uint32_t length, uint32_t &transferedLength)
397 {
398 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
399 HDF_LOGE("%{public}s: no permission", __func__);
400 return HDF_ERR_NOPERM;
401 }
402
403 std::lock_guard<std::mutex> lock(g_infMutex);
404 uint64_t handle = 0;
405 int32_t ret = UsbDdkUnHash(pipe.interfaceHandle, handle);
406 if (ret != HDF_SUCCESS) {
407 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
408 return ret;
409 }
410
411 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
412 struct UsbRequest *request = UsbAllocRequestByMmap(handleConvert, 0, size);
413 if (request == nullptr) {
414 HDF_LOGE("%{public}s alloc request failed", __func__);
415 return HDF_DEV_ERR_NO_MEMORY;
416 }
417
418 struct UsbRequestParams params;
419 (void)memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams));
420 params.pipeId = pipe.endpoint;
421 params.pipeAddress = pipe.endpoint;
422 params.requestType = USB_REQUEST_PARAMS_DATA_TYPE;
423 params.timeout = pipe.timeout;
424 params.dataReq.length = length;
425
426 ret = UsbFillRequestByMmap(request, handleConvert, ¶ms);
427 if (ret != HDF_SUCCESS) {
428 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
429 goto FINISHED;
430 }
431
432 ret = UsbSubmitRequestSync(request);
433 if (ret != HDF_SUCCESS) {
434 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
435 goto FINISHED;
436 }
437
438 transferedLength = request->compInfo.actualLength;
439 FINISHED:
440 (void)UsbFreeRequestByMmap(request);
441 return ret;
442 }
443
SendPipeRequestWithAshmem(const UsbRequestPipe & pipe,const UsbAshmem & ashmem,uint32_t & transferredLength)444 int32_t UsbDdkService::SendPipeRequestWithAshmem(
445 const UsbRequestPipe &pipe, const UsbAshmem &ashmem, uint32_t &transferredLength)
446 {
447 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
448 HDF_LOGE("%{public}s: no permission", __func__);
449 return HDF_ERR_NOPERM;
450 }
451
452 std::lock_guard<std::mutex> lock(g_infMutex);
453 uint64_t handle = 0;
454 int32_t ret = UsbDdkUnHash(pipe.interfaceHandle, handle);
455 if (ret != HDF_SUCCESS) {
456 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
457 return ret;
458 }
459
460 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
461 struct UsbRequest *request = UsbAllocRequestByAshmem(handleConvert, 0, ashmem.size, ashmem.ashmemFd);
462 if (request == nullptr) {
463 HDF_LOGE("%{public}s alloc request failed", __func__);
464 return HDF_DEV_ERR_NO_MEMORY;
465 }
466
467 struct UsbRequestParams params;
468 (void)memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams));
469 params.pipeId = pipe.endpoint;
470 params.pipeAddress = pipe.endpoint;
471 params.requestType = USB_REQUEST_PARAMS_DATA_TYPE;
472 params.timeout = pipe.timeout;
473 params.dataReq.length = ashmem.bufferLength;
474
475 ret = UsbFillRequestByMmap(request, handleConvert, ¶ms);
476 if (ret != HDF_SUCCESS) {
477 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
478 goto FINISHED;
479 }
480
481 ret = UsbSubmitRequestSync(request);
482 if (ret != HDF_SUCCESS) {
483 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
484 goto FINISHED;
485 }
486
487 transferredLength = request->compInfo.actualLength;
488 FINISHED:
489 (void)UsbFreeRequestByMmap(request);
490 return ret;
491 }
492
GetDeviceMemMapFd(uint64_t deviceId,int & fd)493 int32_t UsbDdkService::GetDeviceMemMapFd(uint64_t deviceId, int &fd)
494 {
495 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
496 HDF_LOGE("%{public}s: no permission", __func__);
497 return HDF_ERR_NOPERM;
498 }
499
500 int32_t ret = UsbGetDeviceMemMapFd(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
501 if (ret < 0) {
502 HDF_LOGE("%{public}s UsbGetDeviceMemMapFd failed %{public}d", __func__, ret);
503 return ret;
504 }
505 fd = ret;
506 HDF_LOGI("%{public}s:%{public}d fd:%{public}d", __func__, __LINE__, fd);
507 return HDF_SUCCESS;
508 }
509 } // namespace V1_0
510 } // namespace Ddk
511 } // namespace Usb
512 } // namespace HDI
513 } // namespace OHOS
514