1 /*
2 * Copyright (c) 2023-2025 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 <hdf_base.h>
17 #include <iproxy_broker.h>
18 #include <shared_mutex>
19 #include "v1_1/usb_ddk_service.h"
20
21 #include "ddk_pnp_listener_mgr.h"
22 #include "ipc_skeleton.h"
23 #include "libusb_adapter.h"
24 #include "usb_ddk_hash.h"
25 #include "usb_ddk_interface.h"
26 #include "usb_ddk_permission.h"
27 #include "usb_driver_manager.h"
28 #include "usb_raw_api.h"
29 #include "usbd_wrapper.h"
30 #define HDF_LOG_TAG usb_ddk_service
31
32 namespace OHOS {
33 namespace HDI {
34 namespace Usb {
35 namespace Ddk {
36 namespace V1_1 {
37 // 32 means size of uint32_t
38 #define GET_BUS_NUM(devHandle) ((uint8_t)((devHandle) >> 32))
39 #define GET_DEV_NUM(devHandle) ((uint8_t)((devHandle)&0xFFFFFFFF))
40 #define USB_RECIP_MASK 0x1F
41 #define GET_CTRL_REQ_RECIP(requestType) ((requestType)&USB_RECIP_MASK)
42 #define TRANS_DIRECTION_OFFSET 7
43 #define GET_CTRL_REQ_DIR(requestType) ((requestType) >> TRANS_DIRECTION_OFFSET)
44 #define REQ_TYPE_OFFERT 5
45 #define REQ_TYPE_MASK 0x3
46 #define GET_CTRL_REQ_TYPE(requestType) (((requestType) >> REQ_TYPE_OFFERT) & REQ_TYPE_MASK)
47
48 #define MAX_BUFF_SIZE 16384
49 #define MAX_CONTROL_BUFF_SIZE 1024
50 constexpr size_t DEVICE_DESCRIPROR_LENGTH = 18;
51 constexpr int32_t API_VERSION_ID_18 = 18;
52 static const std::string PERMISSION_NAME = "ohos.permission.ACCESS_DDK_USB";
53 static pthread_rwlock_t g_rwLock = PTHREAD_RWLOCK_INITIALIZER;
54 #ifdef LIBUSB_ENABLE
55 static std::shared_ptr<OHOS::HDI::Usb::V1_2::LibusbAdapter> g_DdkLibusbAdapter =
56 V1_2::LibusbAdapter::GetInstance();
57 constexpr uint8_t INTERFACE_ID_INVALID = 255;
58 static std::unordered_map<uint64_t, uint8_t> g_InterfaceMap;
59 std::shared_mutex g_MutexInterfaceMap;
60 #endif // LIBUSB_ENABLE
61
UsbDdkImplGetInstance(void)62 extern "C" IUsbDdk *UsbDdkImplGetInstance(void)
63 {
64 return new (std::nothrow) UsbDdkService();
65 }
66
FillReadRequestParams(const UsbControlRequestSetup & setup,const uint32_t length,const uint32_t timeout,UsbRequestParams & params)67 void FillReadRequestParams(const UsbControlRequestSetup &setup, const uint32_t length,
68 const uint32_t timeout, UsbRequestParams ¶ms)
69 {
70 if (memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams)) != EOK) {
71 HDF_LOGW("%{public}s memset_s failed", __func__);
72 }
73 params.interfaceId = USB_CTRL_INTERFACE_ID;
74 params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
75 params.timeout = timeout;
76 params.ctrlReq.target = static_cast<UsbRequestTargetType>(GET_CTRL_REQ_RECIP(setup.requestType));
77 params.ctrlReq.reqType = setup.requestType;
78 params.ctrlReq.directon = static_cast<UsbRequestDirection>(GET_CTRL_REQ_DIR(setup.requestType));
79 params.ctrlReq.request = setup.requestCmd;
80 params.ctrlReq.value = setup.value;
81 params.ctrlReq.index = setup.index;
82 params.ctrlReq.length = length;
83 }
84
FillWriteRequestParams(const UsbControlRequestSetup & setup,const std::vector<uint8_t> & data,const uint32_t timeout,UsbRequestParams & params)85 void FillWriteRequestParams(const UsbControlRequestSetup &setup, const std::vector<uint8_t> &data,
86 const uint32_t timeout, UsbRequestParams ¶ms)
87 {
88 if (memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams)) != EOK) {
89 HDF_LOGW("%{public}s memset_s failed", __func__);
90 }
91 params.interfaceId = USB_CTRL_INTERFACE_ID;
92 params.pipeAddress = 0;
93 params.pipeId = 0;
94 params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE;
95 params.timeout = timeout;
96 params.ctrlReq.target = static_cast<UsbRequestTargetType>(GET_CTRL_REQ_RECIP(setup.requestType));
97 params.ctrlReq.reqType = setup.requestType;
98 params.ctrlReq.directon = static_cast<UsbRequestDirection>(GET_CTRL_REQ_DIR(setup.requestType));
99 params.ctrlReq.request = setup.requestCmd;
100 params.ctrlReq.value = setup.value;
101 params.ctrlReq.index = setup.index;
102 params.ctrlReq.buffer = (void *)data.data();
103 params.ctrlReq.length = data.size();
104 }
105
FillPipeRequestParams(const UsbRequestPipe & pipe,const uint32_t length,UsbRequestParams & params)106 void FillPipeRequestParams(const UsbRequestPipe &pipe, const uint32_t length, UsbRequestParams ¶ms)
107 {
108 if (memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams)) != EOK) {
109 HDF_LOGW("%{public}s memset_s failed", __func__);
110 }
111 params.pipeId = pipe.endpoint;
112 params.pipeAddress = pipe.endpoint;
113 params.requestType = USB_REQUEST_PARAMS_DATA_TYPE;
114 params.timeout = pipe.timeout;
115 params.dataReq.length = length;
116 }
117
FillPipeRequestParamsWithAshmem(const UsbRequestPipe & pipe,const UsbAshmem & ashmem,UsbRequestParams & params)118 void FillPipeRequestParamsWithAshmem(const UsbRequestPipe &pipe, const UsbAshmem &ashmem, UsbRequestParams ¶ms)
119 {
120 if (memset_s(¶ms, sizeof(struct UsbRequestParams), 0, sizeof(struct UsbRequestParams)) != EOK) {
121 HDF_LOGE("%{public}s memset_s failed", __func__);
122 }
123 params.pipeId = pipe.endpoint;
124 params.pipeAddress = pipe.endpoint;
125 params.requestType = USB_REQUEST_PARAMS_DATA_TYPE;
126 params.timeout = pipe.timeout;
127 params.dataReq.length = ashmem.bufferLength;
128 }
129
CheckCompleteStatus(struct UsbRequest * request)130 int32_t CheckCompleteStatus(struct UsbRequest *request)
131 {
132 if (request == nullptr) {
133 return HDF_FAILURE;
134 }
135 int32_t apiVersion = 0;
136 int32_t ret = DdkPermissionManager::GetHapApiVersion(apiVersion);
137 if (ret != HDF_SUCCESS) {
138 HDF_LOGE("%{public}s get hap api version failed %{public}d", __func__, ret);
139 return ret;
140 }
141
142 if (apiVersion >= API_VERSION_ID_18 && request->compInfo.status != USB_REQUEST_COMPLETED) {
143 return HDF_ERR_INVALID_PARAM;
144 }
145 return HDF_SUCCESS;
146 }
147
148 #ifdef LIBUSB_ENABLE
GetInterfaceId(uint64_t interfaceHandle)149 uint8_t GetInterfaceId(uint64_t interfaceHandle)
150 {
151 std::shared_lock<std::shared_mutex> interfaceLock(g_MutexInterfaceMap);
152 auto it = g_InterfaceMap.find(interfaceHandle);
153 if (it == g_InterfaceMap.end()) {
154 HDF_LOGE("%{public}s find interfaceId failed", __func__);
155 return INTERFACE_ID_INVALID;
156 }
157 HDF_LOGD("%{public}s find interfaceId success. interfaceId=%{public}d", __func__, it->second);
158 return it->second;
159 }
160
EraseInterfaceId(uint64_t interfaceHandle)161 void EraseInterfaceId(uint64_t interfaceHandle)
162 {
163 std::unique_lock<std::shared_mutex> interfaceLock(g_MutexInterfaceMap);
164 auto it = g_InterfaceMap.find(interfaceHandle);
165 if (it == g_InterfaceMap.end()) {
166 HDF_LOGE("%{public}s find interfaceId failed", __func__);
167 return ;
168 }
169 g_InterfaceMap.erase(interfaceHandle);
170 HDF_LOGD("%{public}s erase interfaceId success.", __func__);
171 }
172 #endif // LIBUSB_ENABLE
173
ReleaseUsbInterface(uint64_t interfaceHandle)174 int32_t ReleaseUsbInterface(uint64_t interfaceHandle)
175 {
176 #ifndef LIBUSB_ENABLE
177 uint64_t handle = 0;
178 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
179 if (ret != HDF_SUCCESS) {
180 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
181 return ret;
182 }
183 pthread_rwlock_wrlock(&g_rwLock);
184 UsbDdkDelHashRecord(interfaceHandle);
185 struct UsbInterface *interface = nullptr;
186 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
187 ret = GetInterfaceByHandle(handleConvert, &interface);
188 if (ret != HDF_SUCCESS) {
189 HDF_LOGE("%{public}s get interface failed %{public}d", __func__, ret);
190 pthread_rwlock_unlock(&g_rwLock);
191 return ret;
192 }
193
194 ret = UsbCloseInterface(handleConvert, false);
195 if (ret != HDF_SUCCESS) {
196 HDF_LOGE("%{public}s close interface failed %{public}d", __func__, ret);
197 pthread_rwlock_unlock(&g_rwLock);
198 return ret;
199 }
200
201 ret = UsbReleaseInterface(interface);
202 pthread_rwlock_unlock(&g_rwLock);
203 return ret;
204 #else
205 struct InterfaceInfo infoTemp;
206 int32_t ret = GetInterfaceInfoByVal(interfaceHandle, infoTemp);
207 if (ret != HDF_SUCCESS) {
208 HDF_LOGE("%{public}s infoTemp failed", __func__);
209 return HDF_FAILURE;
210 }
211 UsbDdkDelHashRecord(interfaceHandle);
212 uint8_t interfaceId = GetInterfaceId(interfaceHandle);
213 if (interfaceId == INTERFACE_ID_INVALID) {
214 HDF_LOGE("%{public}s get interfaceId failed", __func__);
215 return HDF_FAILURE;
216 }
217 ret = g_DdkLibusbAdapter->ReleaseInterface({infoTemp.busNum, infoTemp.devNum}, interfaceId);
218 if (ret != HDF_SUCCESS) {
219 HDF_LOGE("%{public}s failed", __func__);
220 }
221 EraseInterfaceId(interfaceHandle);
222 g_DdkLibusbAdapter->CloseDevice({infoTemp.busNum, infoTemp.devNum});
223 return ret;
224 #endif // LIBUSB_ENABLE
225 }
226
UsbdPnpEventHandler(void * priv,uint32_t id,HdfSBuf * data)227 static int32_t UsbdPnpEventHandler(void *priv, uint32_t id, HdfSBuf *data)
228 {
229 if (id == USB_PNP_NOTIFY_REMOVE_DEVICE) {
230 uint32_t infoSize;
231 struct UsbPnpNotifyMatchInfoTable *infoTable = nullptr;
232 auto flag = HdfSbufReadBuffer(data, (const void **)(&infoTable), &infoSize);
233 if ((!flag) || (infoTable == nullptr)) {
234 HDF_LOGE("%{public}s: fail to read infoTable in event data, flag = %{public}d", __func__, flag);
235 return HDF_ERR_INVALID_PARAM;
236 }
237
238 std::vector<uint64_t> interfaceHandleList;
239 if (UsbDdkGetAllRecords({0, infoTable->busNum, infoTable->devNum}, interfaceHandleList)) {
240 for (auto interfaceHandle : interfaceHandleList) {
241 HDF_LOGD("%{public}s: need release interface, handle: %{public}" PRIu64, __func__, interfaceHandle);
242 ReleaseUsbInterface(interfaceHandle);
243 }
244 }
245 }
246 return HDF_SUCCESS;
247 }
248
249 static HdfDevEventlistener *g_pnpListener = nullptr;
250
Init()251 int32_t UsbDdkService::Init()
252 {
253 HDF_LOGI("usb ddk init");
254 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
255 HDF_LOGE("%{public}s: no permission", __func__);
256 return HDF_ERR_NOPERM;
257 }
258 if (g_pnpListener == nullptr) {
259 g_pnpListener = new HdfDevEventlistener();
260 if (g_pnpListener == nullptr) {
261 HDF_LOGE("%{public}s: create listener failed", __func__);
262 return HDF_ERR_MALLOC_FAIL;
263 }
264 g_pnpListener->callBack = UsbdPnpEventHandler;
265 if (DdkListenerMgrAdd(g_pnpListener) != HDF_SUCCESS) {
266 HDF_LOGE("%{public}s: add listener failed", __func__);
267 delete g_pnpListener;
268 g_pnpListener = nullptr;
269 return HDF_FAILURE;
270 }
271 }
272
273 return UsbInitHostSdk(nullptr);
274 }
275
Release()276 int32_t UsbDdkService::Release()
277 {
278 HDF_LOGI("usb ddk exit");
279 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
280 HDF_LOGE("%{public}s: no permission", __func__);
281 return HDF_ERR_NOPERM;
282 }
283
284 DdkPermissionManager::Reset();
285 return UsbExitHostSdk(nullptr);
286 }
287
GetDeviceDescriptor(uint64_t deviceId,UsbDeviceDescriptor & desc)288 int32_t UsbDdkService::GetDeviceDescriptor(uint64_t deviceId, UsbDeviceDescriptor &desc)
289 {
290 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
291 HDF_LOGE("%{public}s: no permission", __func__);
292 return HDF_ERR_NOPERM;
293 }
294 #ifndef LIBUSB_ENABLE
295 UsbRawHandle *rawHandle = UsbRawOpenDevice(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
296 if (rawHandle == nullptr) {
297 HDF_LOGE("%{public}s open device failed", __func__);
298 return HDF_FAILURE;
299 }
300
301 UsbRawDevice *rawDevice = UsbRawGetDevice(rawHandle);
302 if (rawDevice == nullptr) {
303 HDF_LOGE("%{public}s get device failed", __func__);
304 (void)UsbRawCloseDevice(rawHandle);
305 return HDF_FAILURE;
306 }
307
308 int32_t ret = UsbRawGetDeviceDescriptor(rawDevice, reinterpret_cast<::UsbDeviceDescriptor *>(&desc));
309 if (ret != HDF_SUCCESS) {
310 HDF_LOGW("%{public}s get desc failed %{public}d", __func__, ret);
311 }
312 (void)UsbRawCloseDevice(rawHandle);
313 return ret;
314 #else
315 HDF_LOGD("%{public}s enter", __func__);
316 std::vector<uint8_t> descriptor(DEVICE_DESCRIPROR_LENGTH);
317 if (g_DdkLibusbAdapter == nullptr) {
318 HDF_LOGE("%{public}s g_DdkLibusbAdapter is nullptr", __func__);
319 return HDF_FAILURE;
320 }
321 int32_t ret = g_DdkLibusbAdapter->GetDeviceDescriptor({GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, descriptor);
322 if (ret != HDF_SUCCESS) {
323 HDF_LOGE("%{public}s get device descriptor failed", __func__);
324 return HDF_FAILURE;
325 }
326 ret = memcpy_s(&desc, sizeof(desc), descriptor.data(), sizeof(desc));
327 if (ret != EOK) {
328 HDF_LOGE("%{public}s: memcpy_s failed", __func__);
329 return HDF_FAILURE;
330 }
331 HDF_LOGD("%{public}s leave", __func__);
332 return HDF_SUCCESS;
333 #endif // LIBUSB_ENABLE
334 }
335
GetConfigDescriptor(uint64_t deviceId,uint8_t configIndex,std::vector<uint8_t> & configDesc)336 int32_t UsbDdkService::GetConfigDescriptor(uint64_t deviceId, uint8_t configIndex, std::vector<uint8_t> &configDesc)
337 {
338 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
339 HDF_LOGE("%{public}s: no permission", __func__);
340 return HDF_ERR_NOPERM;
341 }
342 #ifndef LIBUSB_ENABLE
343 UsbRawHandle *rawHandle = UsbRawOpenDevice(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
344 if (rawHandle == nullptr) {
345 HDF_LOGE("%{public}s open device failed", __func__);
346 return HDF_FAILURE;
347 }
348
349 struct UsbConfigDescriptor tmpDesc {};
350 int32_t ret = GetRawConfigDescriptor(
351 rawHandle, configIndex, reinterpret_cast<uint8_t *>(&tmpDesc), sizeof(struct UsbConfigDescriptor));
352 if (ret <= 0) {
353 HDF_LOGW("%{public}s get config desc failed %{public}d", __func__, ret);
354 (void)UsbRawCloseDevice(rawHandle);
355 return ret;
356 }
357
358 std::vector<uint8_t> tmpBuffer(tmpDesc.wTotalLength);
359 ret = GetRawConfigDescriptor(rawHandle, configIndex, tmpBuffer.data(), tmpDesc.wTotalLength);
360 if (ret <= 0) {
361 HDF_LOGW("%{public}s get config desc failed %{public}d", __func__, ret);
362 (void)UsbRawCloseDevice(rawHandle);
363 return ret;
364 }
365
366 if (static_cast<size_t>(ret) != tmpBuffer.size()) {
367 HDF_LOGE("%{public}s config desc invalid length : %{public}d, bufferSize:%{public}zu", __func__, ret,
368 tmpBuffer.size());
369 return HDF_FAILURE;
370 }
371
372 configDesc = tmpBuffer;
373
374 (void)UsbRawCloseDevice(rawHandle);
375 return HDF_SUCCESS;
376 #else
377 if (g_DdkLibusbAdapter == nullptr) {
378 HDF_LOGE("%{public}s g_DdkLibusbAdapter is nullptr", __func__);
379 return HDF_FAILURE;
380 }
381 return g_DdkLibusbAdapter->GetConfigDescriptor({GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)},
382 configIndex, configDesc);
383 #endif // LIBUSB_ENABLE
384 }
385
ClaimInterface(uint64_t deviceId,uint8_t interfaceIndex,uint64_t & interfaceHandle)386 int32_t UsbDdkService::ClaimInterface(uint64_t deviceId, uint8_t interfaceIndex, uint64_t &interfaceHandle)
387 {
388 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
389 HDF_LOGE("%{public}s: no permission", __func__);
390 return HDF_ERR_NOPERM;
391 }
392 #ifndef LIBUSB_ENABLE
393 struct UsbInterface *interface =
394 UsbClaimInterface(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId), interfaceIndex);
395 if (interface == nullptr) {
396 HDF_LOGE("%{public}s claim failed", __func__);
397 return HDF_FAILURE;
398 }
399
400 UsbInterfaceHandle *handle = UsbOpenInterface(interface);
401 if (handle == nullptr) {
402 HDF_LOGE("%{public}s open failed", __func__);
403 return HDF_FAILURE;
404 }
405
406 int32_t ret = UsbDdkHash({(uint64_t)handle, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, interfaceHandle);
407 if (ret != HDF_SUCCESS) {
408 HDF_LOGE("%{public}s hash failed %{public}d", __func__, ret);
409 }
410 HDF_LOGD("%{public}s: claim handle: %{public}" PRIu64, __func__, interfaceHandle);
411 return ret;
412 #else
413 int32_t ret = g_DdkLibusbAdapter->OpenDevice({GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)});
414 if (ret != HDF_SUCCESS) {
415 HDF_LOGE("OpenDevice is error");
416 return HDF_FAILURE;
417 }
418 static std::atomic<int64_t> addr(0);
419 int64_t addrNumber = addr.fetch_add(1, std::memory_order_relaxed);
420 ret = UsbDdkHash({addrNumber, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, interfaceHandle);
421 if (ret != HDF_SUCCESS) {
422 HDF_LOGE("%{public}s hash failed %{public}d", __func__, ret);
423 }
424 ret = g_DdkLibusbAdapter->ClaimInterface({GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, interfaceIndex, true);
425 if (ret != HDF_SUCCESS) {
426 HDF_LOGE("ClaimInterface is failed");
427 return HDF_FAILURE;
428 }
429 std::unique_lock<std::shared_mutex> interfaceLock(g_MutexInterfaceMap);
430 g_InterfaceMap[interfaceHandle] = interfaceIndex;
431 return HDF_SUCCESS;
432 #endif // LIBUSB_ENABLE
433 }
434
ReleaseInterface(uint64_t interfaceHandle)435 int32_t UsbDdkService::ReleaseInterface(uint64_t interfaceHandle)
436 {
437 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
438 HDF_LOGE("%{public}s: no permission", __func__);
439 return HDF_ERR_NOPERM;
440 }
441 HDF_LOGD("%{public}s: release handle: %{public}" PRIu64, __func__, interfaceHandle);
442 return ReleaseUsbInterface(interfaceHandle);
443 }
444
SelectInterfaceSetting(uint64_t interfaceHandle,uint8_t settingIndex)445 int32_t UsbDdkService::SelectInterfaceSetting(uint64_t interfaceHandle, uint8_t settingIndex)
446 {
447 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
448 HDF_LOGE("%{public}s: no permission", __func__);
449 return HDF_ERR_NOPERM;
450 }
451
452 uint64_t handle = 0;
453 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
454 if (ret != HDF_SUCCESS) {
455 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
456 return ret;
457 }
458 #ifndef LIBUSB_ENABLE
459 struct UsbInterface *interface = nullptr;
460 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
461 return UsbSelectInterfaceSetting(handleConvert, settingIndex, &interface);
462 #else
463 struct InterfaceInfo infoTemp;
464 ret = GetInterfaceInfoByVal(interfaceHandle, infoTemp);
465 if (ret != HDF_SUCCESS) {
466 HDF_LOGE("%{public}s infoTemp failed", __func__);
467 return HDF_FAILURE;
468 }
469 uint8_t interfaceId = GetInterfaceId(interfaceHandle);
470 if (interfaceId == INTERFACE_ID_INVALID) {
471 HDF_LOGE("%{public}s get interfaceId failed", __func__);
472 return HDF_FAILURE;
473 }
474 return g_DdkLibusbAdapter->SetInterface({infoTemp.busNum, infoTemp.devNum}, interfaceId, settingIndex);
475 #endif // LIBUSB_ENABLE
476 }
477
GetCurrentInterfaceSetting(uint64_t interfaceHandle,uint8_t & settingIndex)478 int32_t UsbDdkService::GetCurrentInterfaceSetting(uint64_t interfaceHandle, uint8_t &settingIndex)
479 {
480 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
481 HDF_LOGE("%{public}s: no permission", __func__);
482 return HDF_ERR_NOPERM;
483 }
484
485 uint64_t handle = 0;
486 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
487 if (ret != HDF_SUCCESS) {
488 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
489 return ret;
490 }
491 #ifndef LIBUSB_ENABLE
492 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
493 return UsbGetInterfaceSetting(handleConvert, &settingIndex);
494 #else
495 struct InterfaceInfo infoTemp;
496 ret = GetInterfaceInfoByVal(interfaceHandle, infoTemp);
497 if (ret != HDF_SUCCESS) {
498 HDF_LOGE("%{public}s infoTemp failed", __func__);
499 return HDF_FAILURE;
500 }
501 return g_DdkLibusbAdapter->GetCurrentInterfaceSetting({infoTemp.busNum, infoTemp.devNum}, settingIndex);
502 #endif // LIBUSB_ENABLE
503 }
504
SendControlReadRequest(uint64_t interfaceHandle,const UsbControlRequestSetup & setup,uint32_t timeout,std::vector<uint8_t> & data)505 int32_t UsbDdkService::SendControlReadRequest(
506 uint64_t interfaceHandle, const UsbControlRequestSetup &setup, uint32_t timeout, std::vector<uint8_t> &data)
507 {
508 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
509 HDF_LOGE("%{public}s: no permission", __func__);
510 return HDF_ERR_NOPERM;
511 }
512
513 uint64_t handle = 0;
514 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
515 if (ret != HDF_SUCCESS) {
516 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
517 return ret;
518 }
519 #ifndef LIBUSB_ENABLE
520 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
521 uint32_t length = setup.length > MAX_CONTROL_BUFF_SIZE ? MAX_CONTROL_BUFF_SIZE : setup.length;
522 struct UsbRequest *request = UsbAllocRequest(handleConvert, 0, static_cast<int32_t>(length));
523 if (request == nullptr) {
524 HDF_LOGE("%{public}s alloc request failed", __func__);
525 return HDF_DEV_ERR_NO_MEMORY;
526 }
527
528 struct UsbRequestParams params;
529 FillReadRequestParams(setup, length, timeout, params);
530 ret = UsbFillRequest(request, handleConvert, ¶ms);
531 if (ret != HDF_SUCCESS) {
532 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
533 goto FINISHED;
534 }
535
536 ret = UsbSubmitRequestSync(request);
537 if (ret != HDF_SUCCESS) {
538 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
539 goto FINISHED;
540 }
541
542 data.assign(request->compInfo.buffer, request->compInfo.buffer + request->compInfo.actualLength);
543 FINISHED:
544 (void)UsbFreeRequest(request);
545 return ret;
546 #else
547 struct InterfaceInfo infoTemp;
548 ret = GetInterfaceInfoByVal(interfaceHandle, infoTemp);
549 if (ret != HDF_SUCCESS) {
550 HDF_LOGE("%{public}s infoTemp failed", __func__);
551 return HDF_FAILURE;
552 }
553 uint8_t reqType = static_cast<uint8_t>(setup.requestType);
554 uint8_t reqCmd = static_cast<uint8_t>(setup.requestCmd);
555 uint32_t length = setup.length > MAX_CONTROL_BUFF_SIZE ? MAX_CONTROL_BUFF_SIZE : setup.length;
556 return g_DdkLibusbAdapter->ControlTransferReadwithLength({infoTemp.busNum, infoTemp.devNum},
557 {reqType, reqCmd, setup.value, setup.index, length, timeout}, data);
558 #endif // LIBUSB_ENABLE
559 }
560
SendControlWriteRequest(uint64_t interfaceHandle,const UsbControlRequestSetup & setup,uint32_t timeout,const std::vector<uint8_t> & data)561 int32_t UsbDdkService::SendControlWriteRequest(
562 uint64_t interfaceHandle, const UsbControlRequestSetup &setup, uint32_t timeout, const std::vector<uint8_t> &data)
563 {
564 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
565 HDF_LOGE("%{public}s: no permission", __func__);
566 return HDF_ERR_NOPERM;
567 }
568
569 uint64_t handle = 0;
570 int32_t ret = UsbDdkUnHash(interfaceHandle, handle);
571 if (ret != HDF_SUCCESS) {
572 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
573 return ret;
574 }
575 #ifndef LIBUSB_ENABLE
576 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
577 struct UsbRequest *request = UsbAllocRequest(handleConvert, 0, MAX_CONTROL_BUFF_SIZE);
578 if (request == nullptr) {
579 HDF_LOGE("%{public}s alloc request failed", __func__);
580 return HDF_DEV_ERR_NO_MEMORY;
581 }
582
583 struct UsbRequestParams params;
584 FillWriteRequestParams(setup, data, timeout, params);
585 ret = UsbFillRequest(request, handleConvert, ¶ms);
586 if (ret != HDF_SUCCESS) {
587 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
588 (void)UsbFreeRequest(request);
589 return ret;
590 }
591
592 ret = UsbSubmitRequestSync(request);
593 if (ret != HDF_SUCCESS) {
594 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
595 (void)UsbFreeRequest(request);
596 return ret;
597 }
598 ret = CheckCompleteStatus(request);
599 (void)UsbFreeRequest(request);
600 return ret;
601 #else
602 struct InterfaceInfo infoTemp;
603 ret = GetInterfaceInfoByVal(interfaceHandle, infoTemp);
604 if (ret != HDF_SUCCESS) {
605 HDF_LOGE("%{public}s infoTemp failed", __func__);
606 return HDF_FAILURE;
607 }
608 ret = g_DdkLibusbAdapter->ControlTransferWrite({infoTemp.busNum, infoTemp.devNum},
609 {setup.requestType, setup.requestCmd, setup.value, setup.index, timeout}, data);
610 HDF_LOGD("%{public}s ret%{public}d", __func__, ret);
611 return (ret == HDF_SUCCESS) ? HDF_SUCCESS : HDF_ERR_INVALID_PARAM;
612 #endif // LIBUSB_ENABLE
613 }
614
SendPipeRequest(const UsbRequestPipe & pipe,uint32_t size,uint32_t offset,uint32_t length,uint32_t & transferedLength)615 int32_t UsbDdkService::SendPipeRequest(
616 const UsbRequestPipe &pipe, uint32_t size, uint32_t offset, uint32_t length, uint32_t &transferedLength)
617 {
618 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
619 HDF_LOGE("%{public}s: no permission", __func__);
620 return HDF_ERR_NOPERM;
621 }
622
623 uint64_t handle = 0;
624 int32_t ret = UsbDdkUnHash(pipe.interfaceHandle, handle);
625 if (ret != HDF_SUCCESS) {
626 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
627 return ret;
628 }
629 #ifndef LIBUSB_ENABLE
630 pthread_rwlock_rdlock(&g_rwLock);
631 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
632 struct UsbRequest *request = UsbAllocRequestByMmap(handleConvert, 0, size);
633 if (request == nullptr) {
634 HDF_LOGE("%{public}s alloc request failed", __func__);
635 pthread_rwlock_unlock(&g_rwLock);
636 return HDF_DEV_ERR_NO_MEMORY;
637 }
638
639 struct UsbRequestParams params;
640 FillPipeRequestParams(pipe, length, params);
641 ret = UsbFillRequestByMmap(request, handleConvert, ¶ms);
642 if (ret != HDF_SUCCESS) {
643 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
644 goto FINISHED;
645 }
646
647 ret = UsbSubmitRequestSync(request);
648 if (ret != HDF_SUCCESS) {
649 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
650 goto FINISHED;
651 }
652
653 transferedLength = request->compInfo.actualLength;
654 FINISHED:
655 (void)UsbFreeRequestByMmap(request);
656 pthread_rwlock_unlock(&g_rwLock);
657 return ret;
658 #else
659 struct InterfaceInfo infoTemp;
660 ret = GetInterfaceInfoByVal(pipe.interfaceHandle, infoTemp);
661 if (ret != HDF_SUCCESS) {
662 HDF_LOGE("%{public}s infoTemp failed", __func__);
663 return HDF_FAILURE;
664 }
665 return g_DdkLibusbAdapter->SendPipeRequest({infoTemp.busNum, infoTemp.devNum}, pipe.endpoint, size,
666 transferedLength, pipe.timeout);
667 #endif // LIBUSB_ENABLE
668 }
669
SubmitRequestWithAshmem(const UsbRequestPipe & pipe,const UsbAshmem & ashmem,uint32_t & transferredLength,uint64_t handle)670 int32_t SubmitRequestWithAshmem(const UsbRequestPipe &pipe, const UsbAshmem &ashmem, uint32_t &transferredLength,
671 uint64_t handle)
672 {
673 pthread_rwlock_rdlock(&g_rwLock);
674 const UsbInterfaceHandle *handleConvert = reinterpret_cast<const UsbInterfaceHandle *>(handle);
675 struct UsbRequest *request = UsbAllocRequestByAshmem(handleConvert, 0, ashmem.size, ashmem.ashmemFd);
676 if (request == nullptr) {
677 HDF_LOGE("%{public}s alloc request failed", __func__);
678 close(ashmem.ashmemFd);
679 pthread_rwlock_unlock(&g_rwLock);
680 return HDF_DEV_ERR_NO_MEMORY;
681 }
682
683 struct UsbRequestParams params;
684 FillPipeRequestParamsWithAshmem(pipe, ashmem, params);
685 int32_t ret = UsbFillRequestByMmap(request, handleConvert, ¶ms);
686 if (ret != HDF_SUCCESS) {
687 HDF_LOGE("%{public}s fill request failed %{public}d", __func__, ret);
688 goto FINISHED;
689 }
690
691 ret = UsbSubmitRequestSync(request);
692 if (ret != HDF_SUCCESS) {
693 HDF_LOGE("%{public}s submit request failed %{public}d", __func__, ret);
694 goto FINISHED;
695 }
696
697 transferredLength = request->compInfo.actualLength;
698 FINISHED:
699 (void)UsbFreeRequestByMmap(request);
700 close(ashmem.ashmemFd);
701 pthread_rwlock_unlock(&g_rwLock);
702 return ret;
703 }
704
SendPipeRequestWithAshmem(const UsbRequestPipe & pipe,const UsbAshmem & ashmem,uint32_t & transferredLength)705 int32_t UsbDdkService::SendPipeRequestWithAshmem(
706 const UsbRequestPipe &pipe, const UsbAshmem &ashmem, uint32_t &transferredLength)
707 {
708 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
709 HDF_LOGE("%{public}s: no permission", __func__);
710 close(ashmem.ashmemFd);
711 return HDF_ERR_NOPERM;
712 }
713
714 uint64_t handle = 0;
715 int32_t ret = UsbDdkUnHash(pipe.interfaceHandle, handle);
716 if (ret != HDF_SUCCESS) {
717 HDF_LOGE("%{public}s unhash failed %{public}d", __func__, ret);
718 close(ashmem.ashmemFd);
719 return ret;
720 }
721 #ifndef LIBUSB_ENABLE
722 return SubmitRequestWithAshmem(pipe, ashmem, transferredLength, handle);
723 #else
724 struct InterfaceInfo infoTemp;
725 ret = GetInterfaceInfoByVal(pipe.interfaceHandle, infoTemp);
726 if (ret != HDF_SUCCESS) {
727 HDF_LOGE("%{public}s infoTemp failed", __func__);
728 return HDF_FAILURE;
729 }
730 return g_DdkLibusbAdapter->SendPipeRequestWithAshmem({infoTemp.busNum, infoTemp.devNum}, pipe.endpoint,
731 {ashmem.ashmemFd, ashmem.size}, transferredLength, pipe.timeout);
732 #endif // LIBUSB_ENABLE
733 }
734
GetDeviceMemMapFd(uint64_t deviceId,int & fd)735 int32_t UsbDdkService::GetDeviceMemMapFd(uint64_t deviceId, int &fd)
736 {
737 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
738 HDF_LOGE("%{public}s: no permission", __func__);
739 return HDF_ERR_NOPERM;
740 }
741 #ifndef LIBUSB_ENABLE
742 int32_t ret = UsbGetDeviceMemMapFd(nullptr, GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId));
743 if (ret < 0) {
744 HDF_LOGE("%{public}s UsbGetDeviceMemMapFd failed %{public}d", __func__, ret);
745 return ret;
746 }
747 fd = ret;
748 HDF_LOGI("%{public}s:%{public}d fd:%{public}d", __func__, __LINE__, fd);
749 return HDF_SUCCESS;
750 #else
751 return g_DdkLibusbAdapter->GetDeviceMemMapFd({GET_BUS_NUM(deviceId), GET_DEV_NUM(deviceId)}, fd);
752 #endif // LIBUSB_ENABLE
753 }
754
GetDevices(std::vector<uint64_t> & deviceIds)755 int32_t UsbDdkService::GetDevices(std::vector<uint64_t> &deviceIds)
756 {
757 if (!DdkPermissionManager::VerifyPermission(PERMISSION_NAME)) {
758 HDF_LOGE("%{public}s: no permission", __func__);
759 return HDF_ERR_NOPERM;
760 }
761
762 #ifndef LIBUSB_ENABLE
763 return HDF_ERR_NOT_SUPPORT;
764 #else
765 uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
766 std::vector<uint16_t> vendorIds;
767 DriverAbilityInfo driverInfo;
768 int32_t ret = UsbDriverManager::GetInstance().QueryDriverInfo(tokenId, driverInfo);
769 if (!ret) {
770 HDF_LOGW("%{public}s: not find driver info", __func__);
771 return HDF_SUCCESS;
772 }
773 vendorIds = driverInfo.vids;
774
775 std::vector<struct OHOS::HDI::Usb::V1_2::DeviceInfo> devices;
776 g_DdkLibusbAdapter->GetDevices(devices);
777 if (devices.empty()) {
778 HDF_LOGW("%{public}s: devices is empty", __func__);
779 return HDF_SUCCESS;
780 }
781
782 for (auto device : devices) {
783 for (auto vid : vendorIds) {
784 if (device.vendorId == vid) {
785 deviceIds.push_back(device.deviceId);
786 break;
787 }
788 }
789 }
790
791 return HDF_SUCCESS;
792 #endif // LIBUSB_ENABLE
793 }
794
UpdateDriverInfo(const DriverAbilityInfo & driverInfo)795 int32_t UsbDdkService::UpdateDriverInfo(const DriverAbilityInfo &driverInfo)
796 {
797 if (UsbDriverManager::GetInstance().UpdateDriverInfo(driverInfo)) {
798 return HDF_SUCCESS;
799 }
800 return HDF_FAILURE;
801 }
802
RemoveDriverInfo(const std::string & driverUid)803 int32_t UsbDdkService::RemoveDriverInfo(const std::string &driverUid)
804 {
805 if (UsbDriverManager::GetInstance().RemoveDriverInfo(driverUid)) {
806 return HDF_SUCCESS;
807 }
808 return HDF_FAILURE;
809 }
810 } // namespace V1_1
811 } // namespace Ddk
812 } // namespace Usb
813 } // namespace HDI
814 } // namespace OHOS
815