• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params)
69 {
70     if (memset_s(&params, 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 &params)
87 {
88     if (memset_s(&params, 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 &params)
107 {
108     if (memset_s(&params, 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 &params)
119 {
120     if (memset_s(&params, 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, &params);
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, &params);
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, &params);
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, &params);
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