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