• 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 "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 &params)
70 {
71     if (memset_s(&params, 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 &params)
88 {
89     if (memset_s(&params, 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 &params)
108 {
109     if (memset_s(&params, 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 &params)
120 {
121     if (memset_s(&params, 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, &params);
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, &params);
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, &params);
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, &params);
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