1 /*
2 Copyright (C) 2024 Huawei Device Co., Ltd.
3
4 This file is part of the SANE package.
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <https://www.gnu.org/licenses/>.
18
19 As a special exception, the authors of SANE give permission for
20 additional uses of the libraries contained in this release of SANE.
21
22 The exception is that, if you link a SANE library with other files
23 to produce an executable, this does not by itself cause the
24 resulting executable to be covered by the GNU General Public
25 License. Your use of that executable is in no way restricted on
26 account of linking the SANE library code into it.
27
28 This exception does not, however, invalidate any other reasons why
29 the executable file might be covered by the GNU General Public
30 License.
31
32 If you submit changes to SANE to the maintainers to be included in
33 a subsequent release, you agree by submitting the changes that
34 those changes may be distributed with this exception intact.
35
36 If you write modifications of your own for SANE, it is your choice
37 whether to permit this exception to apply to your modifications.
38 If you do not wish that, delete this exception notice.
39
40 This file provides an interface to use the usb manager.*/
41
42 #include <cstring>
43 #include <string>
44 #include "iusb_srv.h"
45 #include "securec.h"
46 #include "cstring"
47 #include "usb_srv_client.h"
48 #include "usb_manager.h"
49 #include "v1_0/iusb_interface.h"
50 #include "hilog/log.h"
51
52 #define SANE_LOG_TAG "sanekit"
53 #define SANE_HILOG_INFO(...) ((void)HiLogPrint(LOG_APP, LOG_INFO, 0, "sanekit", __VA_ARGS__))
54 #define SANE_HILOG_ERROR(...) ((void)HiLogPrint(LOG_APP, LOG_ERROR, 0, "sanekit", __VA_ARGS__))
55 #define SANE_HILOG_DEBUG(...) ((void)HiLogPrint(LOG_APP, LOG_DEBUG, 0, "sanekit", __VA_ARGS__))
56 #define SANE_HILOG_WARN(...) ((void)HiLogPrint(LOG_APP, LOG_WARN, 0, "sanekit", __VA_ARGS__))
57
58 using namespace OHOS::USB;
59
60 static std::vector<UsbDevice> g_deviceList;
61 static ssize_t g_deviceCount = 0;
62 static uint8_t g_interfaceNumber = 0;
63 static usb_manager_config_descriptor* g_deviceConfig = nullptr;
64 static std::vector<usb_manager_device*> g_refDevices;
65 constexpr int maxUsbInterfaceNum = 1000;
66 constexpr int maxUsbEndpointNum = 1000;
67
68 struct usb_manager_device_handle {
69 UsbDevice device;
70 USBDevicePipe pipe;
71 };
72
73 struct usb_manager_device {
74 UsbDevice device;
75 };
76
77 struct UsbEndPointDes {
78 uint8_t bmAttributes;
79 uint8_t bEndpointAddress;
80 };
81
82 struct UsbInterfaceAltDes{
83 uint8_t bInterfaceClass;
84 std::vector<UsbEndPointDes> endpointDes;
85 };
86
87 struct UsbAltInterface {
88 std::vector<UsbInterfaceAltDes> altDes;
89 };
90
91 namespace {
MemoryFreeDeviceList(usb_manager_device **list)92 void MemoryFreeDeviceList(usb_manager_device **list)
93 {
94 if (list == nullptr) {
95 return;
96 }
97 for (ssize_t i = 0 ; i < g_deviceCount; i++) {
98 if (list[i] != nullptr) {
99 delete list[i];
100 }
101 }
102 delete[] list;
103 list = nullptr;
104 g_deviceCount = 0;
105 }
106
InterfaceConvert(std::vector<UsbInterface> &usbInterfaces, std::vector<UsbAltInterface> &usbAlt)107 void InterfaceConvert(std::vector<UsbInterface> &usbInterfaces, std::vector<UsbAltInterface> &usbAlt)
108 {
109 auto memCopyInter = [&](size_t &i, UsbAltInterface &altInter) {
110 UsbInterfaceAltDes des;
111 des.bInterfaceClass = static_cast<uint8_t>(usbInterfaces[i].GetClass());
112 std::vector<USBEndpoint> &endPoints = usbInterfaces[i].GetEndpoints();
113 for (size_t j = 0; j < endPoints.size(); j++) {
114 UsbEndPointDes pointDes;
115 pointDes.bmAttributes = static_cast<uint8_t>(endPoints[j].GetAttributes());
116 pointDes.bEndpointAddress = static_cast<uint8_t>(endPoints[j].GetAddress());
117 des.endpointDes.push_back(pointDes);
118 }
119 altInter.altDes.push_back(des);
120 };
121 for (size_t i = 0; i < usbInterfaces.size(); i++) {
122 UsbInterface& inter = usbInterfaces[i];
123 if (inter.GetAlternateSetting() == 0) {
124 UsbAltInterface altInter;
125 memCopyInter(i, altInter);
126 usbAlt.push_back(altInter);
127 } else {
128 int id = usbInterfaces[i].GetId();
129 UsbAltInterface &altInter = usbAlt[id];
130 memCopyInter(i, altInter);
131 }
132 }
133 }
134
GetRetConfigAndInterface(usb_manager_device *dev, uint8_t config_index, usb_manager_config_descriptor* &retConfig, usb_manager_interface* &retInterface, std::vector<UsbAltInterface> &usbAlt)135 int GetRetConfigAndInterface(usb_manager_device *dev, uint8_t config_index, usb_manager_config_descriptor* &retConfig,
136 usb_manager_interface* &retInterface, std::vector<UsbAltInterface> &usbAlt)
137 {
138 std::vector<USBConfig> &configs = dev->device.GetConfigs();
139 if (config_index >= configs.size()) {
140 SANE_HILOG_ERROR("%s: config_index(%u) is invalid.", __func__, config_index);
141 return USB_MANAGER_ERROR_INVALID_PARAM;
142 }
143 USBConfig &usbConfig = configs[config_index];
144 SANE_HILOG_DEBUG("%s: config[%u] = %s", __func__, config_index, usbConfig.getJsonString().c_str());
145 std::vector<UsbInterface> &usbInterfaces = usbConfig.GetInterfaces();
146 InterfaceConvert(usbInterfaces, usbAlt);
147 size_t bNumInterfaces = usbAlt.size();
148 if (bNumInterfaces == 0 || bNumInterfaces > maxUsbInterfaceNum) {
149 SANE_HILOG_ERROR("%s: bNumInterfaces(%u) is invalid.", __func__, bNumInterfaces);
150 return USB_MANAGER_ERROR_OTHER;
151 }
152 retConfig = new (std::nothrow) usb_manager_config_descriptor();
153 if (retConfig == nullptr) {
154 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
155 return USB_MANAGER_ERROR_NO_MEM;
156 }
157 if (memset_s(retConfig, sizeof(usb_manager_config_descriptor), 0, sizeof(usb_manager_config_descriptor)) != 0) {
158 SANE_HILOG_ERROR("%s: memset retConfig error.", __func__);
159 delete retConfig;
160 retConfig = nullptr;
161 return USB_MANAGER_ERROR_OTHER;
162 }
163 retConfig->bNumInterfaces = static_cast<uint8_t>(bNumInterfaces);
164 retConfig->bConfigurationValue = static_cast<uint8_t>(usbConfig.GetId());
165 retInterface = new (std::nothrow) usb_manager_interface[bNumInterfaces]{};
166 if (retInterface == nullptr) {
167 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
168 delete retConfig;
169 return USB_MANAGER_ERROR_NO_MEM;
170 }
171 retConfig->interface = retInterface;
172 return USB_MANAGER_SUCCESS;
173 }
174
SetInterfaceDescriptor(std::vector<UsbAltInterface> &usbAlt, usb_manager_interface* retInterface)175 bool SetInterfaceDescriptor(std::vector<UsbAltInterface> &usbAlt, usb_manager_interface* retInterface)
176 {
177 if (retInterface == nullptr) {
178 return false;
179 }
180 for (int i = 0; i < usbAlt.size(); i++) {
181 size_t altSet = usbAlt[i].altDes.size();
182 if (altSet > maxUsbInterfaceNum) {
183 return false;
184 }
185 auto retAltsetting = new (std::nothrow) usb_manager_interface_descriptor[altSet]{};
186 if (retAltsetting == nullptr) {
187 return false;
188 }
189 retInterface[i].altsetting = retAltsetting;
190 retInterface[i].num_altsetting = static_cast<int>(altSet);
191 for (size_t j = 0; j < altSet; j++) {
192 retAltsetting[j].bInterfaceClass = usbAlt[i].altDes[j].bInterfaceClass;
193 size_t endPointsNum = usbAlt[i].altDes[j].endpointDes.size();
194 if (endPointsNum > maxUsbEndpointNum) {
195 return false;
196 }
197 retAltsetting[j].bNumEndpoints = endPointsNum;
198 retAltsetting[j].endpoint = new (std::nothrow) usb_manager_endpoint_descriptor[endPointsNum]{};
199 if (retAltsetting[j].endpoint == nullptr) {
200 return false;
201 }
202 for (int k = 0 ; k < endPointsNum; k++) {
203 uint8_t bmAttr = usbAlt[i].altDes[j].endpointDes[k].bmAttributes;
204 uint8_t bEndpointAddress = usbAlt[i].altDes[j].endpointDes[k].bEndpointAddress;
205 retAltsetting[j].endpoint[k].bmAttributes = bmAttr;
206 retAltsetting[j].endpoint[k].bEndpointAddress = bEndpointAddress;
207 }
208 }
209 }
210 return true;
211 }
212 };
213
usb_manager_init(usb_manager_context **ctx)214 int usb_manager_init(usb_manager_context **ctx)
215 {
216 SANE_HILOG_INFO("%s: begin", __func__);
217 if (ctx == nullptr) {
218 SANE_HILOG_ERROR("%s: ctx is a nullptr.", __func__);
219 return USB_MANAGER_ERROR_INVALID_PARAM;
220 }
221 usb_manager_context *usbmanagerContext = new (std::nothrow) usb_manager_context();
222 if (usbmanagerContext == nullptr) {
223 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
224 return USB_MANAGER_ERROR_NO_MEM;
225 }
226 if (memset_s(usbmanagerContext, sizeof(usb_manager_context), 0 ,sizeof(usb_manager_context)) != 0) {
227 SANE_HILOG_ERROR("%s: memset_s usbmanagerContext error.", __func__);
228 delete usbmanagerContext;
229 return USB_MANAGER_ERROR_OTHER;
230 }
231 *ctx = usbmanagerContext;
232 SANE_HILOG_INFO("%s: end successful", __func__);
233 return USB_MANAGER_SUCCESS;
234 }
235
usb_manager_exit(usb_manager_context *ctx)236 int usb_manager_exit(usb_manager_context *ctx)
237 {
238 SANE_HILOG_INFO("%s: begin", __func__);
239 if (ctx == nullptr) {
240 SANE_HILOG_ERROR("%s: ctx is a nullptr.", __func__);
241 return USB_MANAGER_ERROR_INVALID_PARAM;
242 }
243 delete ctx;
244 ctx = nullptr;
245 for (const auto& refDevice : g_refDevices) {
246 if (refDevice != nullptr) {
247 delete refDevice;
248 }
249 }
250 g_refDevices.clear();
251 SANE_HILOG_INFO("%s: end successful", __func__);
252 return USB_MANAGER_SUCCESS;
253 }
254
usb_manager_get_device_list(usb_manager_context *ctx, usb_manager_device ***list)255 ssize_t usb_manager_get_device_list(usb_manager_context *ctx, usb_manager_device ***list)
256 {
257 SANE_HILOG_INFO("%s: begin", __func__);
258 if (ctx == nullptr || list == nullptr) {
259 SANE_HILOG_ERROR("%s: ctx or list is a nullptr.", __func__);
260 return USB_MANAGER_ERROR_INVALID_PARAM;
261 }
262 g_deviceList.clear();
263 auto ret = UsbSrvClient::GetInstance().GetDevices(g_deviceList);
264 if (ret != USB_MANAGER_SUCCESS) {
265 SANE_HILOG_ERROR("%s: GetDevices exception.", __func__);
266 return USB_MANAGER_ERROR_IO;
267 }
268 g_deviceCount = static_cast<ssize_t>(g_deviceList.size());
269 SANE_HILOG_DEBUG("%s: deviceCount : %d", __func__, g_deviceCount);
270 if (g_deviceCount == 0) {
271 SANE_HILOG_DEBUG("%s: not found device.", __func__);
272 return USB_MANAGER_SUCCESS;
273 }
274 usb_manager_device** usbManagerDeviceList = new (std::nothrow) usb_manager_device* [g_deviceCount]{};
275 if (usbManagerDeviceList == nullptr) {
276 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
277 return USB_MANAGER_ERROR_NO_MEM;
278 }
279 for (ssize_t i = 0; i < g_deviceCount; i++) {
280 usb_manager_device* usbDevice = new (std::nothrow) usb_manager_device();
281 if (usbDevice == nullptr) {
282 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
283 MemoryFreeDeviceList(usbManagerDeviceList);
284 return USB_MANAGER_ERROR_NO_MEM;
285 }
286 usbManagerDeviceList[i] = usbDevice;
287 usbDevice->device = g_deviceList[i];
288 }
289 *list = usbManagerDeviceList;
290 SANE_HILOG_INFO("%s: end successful", __func__);
291 return g_deviceCount;
292 }
293
usb_manager_get_bus_number(usb_manager_device *dev)294 int usb_manager_get_bus_number(usb_manager_device *dev)
295 {
296 SANE_HILOG_INFO("%s: start", __func__);
297 if (dev == nullptr) {
298 SANE_HILOG_ERROR("%s: dev is a nullptr.", __func__);
299 return USB_MANAGER_ERROR_INVALID_PARAM;
300 }
301 SANE_HILOG_INFO("%s: end successful", __func__);
302 return dev->device.GetBusNum();
303 }
304
usb_manager_get_device_address(usb_manager_device *dev)305 int usb_manager_get_device_address(usb_manager_device *dev)
306 {
307 SANE_HILOG_INFO("%s: start", __func__);
308 if (dev == nullptr) {
309 SANE_HILOG_ERROR("%s: dev is a nullptr.", __func__);
310 return USB_MANAGER_ERROR_INVALID_PARAM;
311 }
312 SANE_HILOG_INFO("%s: end successful", __func__);
313 return dev->device.GetDevAddr();
314 }
315
usb_manager_get_device_descriptor(usb_manager_device *dev, usb_manager_device_descriptor *desc)316 int usb_manager_get_device_descriptor(usb_manager_device *dev, usb_manager_device_descriptor *desc)
317 {
318 SANE_HILOG_INFO("%s: start", __func__);
319 if (dev == nullptr || desc == nullptr) {
320 SANE_HILOG_ERROR("%s: dev or desc is a nullptr.", __func__);
321 return USB_MANAGER_ERROR_INVALID_PARAM;
322 }
323 UsbDevice &device = dev->device;
324 desc->idVendor = static_cast<uint16_t>(device.GetVendorId());
325 desc->idProduct = static_cast<uint16_t>(device.GetProductId());
326 desc->bDeviceClass = static_cast<uint8_t>(device.GetClass());
327 desc->bNumConfigurations = static_cast<uint8_t>(device.GetConfigCount());
328 desc->bDeviceSubClass = static_cast<uint8_t>(device.GetSubclass());
329 desc->bDeviceProtocol = static_cast<uint8_t>(device.GetProtocol());
330 SANE_HILOG_INFO("%s: end successful", __func__);
331 return USB_MANAGER_SUCCESS;
332 }
333
usb_manager_open(usb_manager_device *dev, usb_manager_device_handle **dev_handle)334 int usb_manager_open(usb_manager_device *dev, usb_manager_device_handle **dev_handle)
335 {
336 SANE_HILOG_INFO("%s: start", __func__);
337 if (dev == nullptr || dev_handle == nullptr) {
338 SANE_HILOG_ERROR("%s: dev or dev_handle is a nullptr.", __func__);
339 return USB_MANAGER_ERROR_INVALID_PARAM;
340 }
341 auto &usbSrvClient = UsbSrvClient::GetInstance();
342 USBDevicePipe pipe;
343 UsbDevice &device = dev->device;
344 auto ret = usbSrvClient.RequestRight(device.GetName());
345 if (ret != USB_MANAGER_SUCCESS) {
346 SANE_HILOG_ERROR("request right failed ret=%{public}d", ret);
347 return USB_MANAGER_ERROR_ACCESS;
348 }
349 ret = usbSrvClient.OpenDevice(device, pipe);
350 if (ret != USB_MANAGER_SUCCESS) {
351 SANE_HILOG_ERROR("open device failed ret=%{public}d", ret);
352 return USB_MANAGER_ERROR_ACCESS;
353 }
354 auto handle = new (std::nothrow) usb_manager_device_handle();
355 if (handle == nullptr) {
356 SANE_HILOG_ERROR("%s: Not enough memory.", __func__);
357 usbSrvClient.Close(pipe);
358 return USB_MANAGER_ERROR_NO_MEM;
359 }
360 handle->device = device;
361 handle->pipe = pipe;
362 *dev_handle = handle;
363 SANE_HILOG_INFO("%s: end successful", __func__);
364 return USB_MANAGER_SUCCESS;
365 }
366
usb_manager_close(usb_manager_device_handle *dev_handle)367 void usb_manager_close(usb_manager_device_handle *dev_handle)
368 {
369 SANE_HILOG_INFO("%s: start", __func__);
370 if (dev_handle == nullptr) {
371 SANE_HILOG_ERROR("%s: dev_handle is a nullptr", __func__);
372 return;
373 }
374 auto &usbSrvClient = UsbSrvClient::GetInstance();
375 usbSrvClient.Close(dev_handle->pipe);
376 delete dev_handle;
377 dev_handle = nullptr;
378 SANE_HILOG_INFO("%s: end", __func__);
379 return;
380 }
381
usb_manager_get_configuration(usb_manager_device_handle *dev, int *config)382 int usb_manager_get_configuration(usb_manager_device_handle *dev, int *config)
383 {
384 SANE_HILOG_INFO("%s: start", __func__);
385 if (dev == nullptr || config == nullptr) {
386 SANE_HILOG_ERROR("%s: dev or config is a nullptr", __func__);
387 return USB_MANAGER_ERROR_INVALID_PARAM;
388 }
389 UsbDevice &device = dev->device;
390 auto configCount = device.GetConfigCount();
391 SANE_HILOG_DEBUG("%s: configCount = %d", __func__, configCount);
392 *config = configCount;
393 return USB_MANAGER_SUCCESS;
394 }
395
usb_manager_get_config_descriptor(usb_manager_device *dev, uint8_t config_index, usb_manager_config_descriptor **config)396 int usb_manager_get_config_descriptor(usb_manager_device *dev, uint8_t config_index,
397 usb_manager_config_descriptor **config)
398 {
399 SANE_HILOG_INFO("%s: begin", __func__);
400 if (dev == nullptr || config == nullptr || config_index < 0) {
401 SANE_HILOG_ERROR("%s: input param is invalid!", __func__);
402 return USB_MANAGER_ERROR_INVALID_PARAM;
403 }
404 usb_manager_config_descriptor* retConfig = nullptr;
405 usb_manager_interface* retInterface = nullptr;
406 std::vector<UsbAltInterface> usbAlt;
407 auto retStatus = GetRetConfigAndInterface(dev, config_index, retConfig, retInterface, usbAlt);
408 if (retConfig == nullptr || retInterface == nullptr || retStatus != USB_MANAGER_SUCCESS) {
409 SANE_HILOG_ERROR("%s: GetRetConfigAndInterface error!", __func__);
410 return retStatus;
411 }
412 retConfig->interface = retInterface;
413 if (!SetInterfaceDescriptor(usbAlt, retInterface)) {
414 usb_manager_free_config_descriptor(retConfig);
415 return USB_MANAGER_ERROR_NO_MEM;
416 }
417 *config = retConfig;
418 g_deviceConfig = retConfig;
419 SANE_HILOG_INFO("%s: end", __func__);
420 return USB_MANAGER_SUCCESS;
421 }
422
423
usb_manager_free_config_descriptor(usb_manager_config_descriptor *config)424 void usb_manager_free_config_descriptor(usb_manager_config_descriptor *config)
425 {
426 SANE_HILOG_INFO("%s: start", __func__);
427 if (config == nullptr) {
428 SANE_HILOG_ERROR("%s: config is a nullptr", __func__);
429 return;
430 }
431 usb_manager_interface *interface = config->interface;
432 if (interface == nullptr) {
433 SANE_HILOG_ERROR("%s: interface is a nullptr", __func__);
434 delete config;
435 config = nullptr;
436 return;
437 }
438 // release all interface
439 for (int i = 0; i < config->bNumInterfaces; i++) {
440 // release alternate setting
441 size_t altSet = interface[i].num_altsetting;
442 auto altsetting = interface[i].altsetting;
443 if (altsetting == nullptr) {
444 continue;
445 }
446 for (size_t j = 0; j < altSet; j++) {
447 auto endpoints = altsetting[j].endpoint;
448 if (endpoints != nullptr) {
449 // release endpoint array
450 delete[] endpoints;
451 }
452 }
453 delete[] altsetting;
454 }
455
456 delete[] interface;
457 delete config;
458 config = nullptr;
459 SANE_HILOG_INFO("%s: end successful", __func__);
460 return;
461 }
462
usb_manager_free_device_list(usb_manager_device **list, int unref_devices)463 void usb_manager_free_device_list(usb_manager_device **list, int unref_devices)
464 {
465 SANE_HILOG_INFO("%s: start", __func__);
466 if (list == nullptr) {
467 SANE_HILOG_ERROR("%s: list is a nullptr", __func__);
468 return;
469 }
470 MemoryFreeDeviceList(list);
471 SANE_HILOG_INFO("%s: end successful", __func__);
472 }
473
usb_manager_set_configuration(usb_manager_device_handle *dev_handle, int configuration)474 int usb_manager_set_configuration(usb_manager_device_handle *dev_handle, int configuration)
475 {
476 SANE_HILOG_INFO("%s: start", __func__);
477 if (dev_handle == nullptr) {
478 SANE_HILOG_ERROR("%s: dev_handle is a nullptr", __func__);
479 return USB_MANAGER_ERROR_INVALID_PARAM;
480 }
481 UsbDevice &device = dev_handle->device;
482 USBDevicePipe pip;
483 pip.SetBusNum(device.GetBusNum());
484 pip.SetDevAddr(device.GetDevAddr());
485 USBConfig config;
486 config.SetId(configuration);
487 auto ret = UsbSrvClient::GetInstance().SetConfiguration(pip, config);
488 if (ret != USB_MANAGER_SUCCESS) {
489 SANE_HILOG_ERROR("SetConfiguration failed ret=%{public}d", ret);
490 return USB_MANAGER_ERROR_IO;
491 }
492 SANE_HILOG_INFO("%s: end successful", __func__);
493 return USB_MANAGER_SUCCESS;
494 }
495
usb_manager_claim_interface(usb_manager_device_handle *dev_handle, int interface_number)496 int usb_manager_claim_interface(usb_manager_device_handle *dev_handle, int interface_number)
497 {
498 SANE_HILOG_INFO("%s: start", __func__);
499 if (dev_handle == nullptr) {
500 SANE_HILOG_ERROR("%s: dev_handle is a nullptr", __func__);
501 return USB_MANAGER_ERROR_INVALID_PARAM;
502 }
503 auto &usbSrvClient = UsbSrvClient::GetInstance();
504 UsbInterface interface;
505 interface.SetId(interface_number);
506 auto ret = usbSrvClient.ClaimInterface(dev_handle->pipe, interface, true);
507 if (ret != USB_MANAGER_SUCCESS) {
508 SANE_HILOG_ERROR("ClaimInterface failed ret=%{public}d", ret);
509 return USB_MANAGER_ERROR_IO;
510 }
511 g_interfaceNumber = interface_number;
512 SANE_HILOG_INFO("%s: end successful", __func__);
513 return USB_MANAGER_SUCCESS;
514 }
515
usb_manager_release_interface(usb_manager_device_handle *dev_handle, int interface_number)516 int usb_manager_release_interface(usb_manager_device_handle *dev_handle, int interface_number)
517 {
518 SANE_HILOG_INFO("%s: start", __func__);
519 if (dev_handle == nullptr) {
520 SANE_HILOG_ERROR("%s: dev_handle is a nullptr", __func__);
521 return USB_MANAGER_ERROR_INVALID_PARAM;
522 }
523 auto &usbSrvClient = UsbSrvClient::GetInstance();
524 USBDevicePipe &pipe = dev_handle->pipe;
525 SANE_HILOG_DEBUG("%s: interface_number : %d", __func__, interface_number);
526 UsbInterface interface;
527 interface.SetId(interface_number);
528 auto ret = usbSrvClient.ReleaseInterface(pipe, interface);
529 if (ret != USB_MANAGER_SUCCESS) {
530 SANE_HILOG_ERROR("ReleaseInterface failed ret=%{public}d", ret);
531 return USB_MANAGER_ERROR_IO;
532 }
533 g_interfaceNumber = 0;
534 SANE_HILOG_INFO("%s: end successful", __func__);
535 return USB_MANAGER_SUCCESS;
536 }
537
usb_manager_bulk_transfer(usb_manager_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)538 int usb_manager_bulk_transfer(usb_manager_device_handle *dev_handle, unsigned char endpoint,
539 unsigned char *data, int length, int *transferred, unsigned int timeout)
540 {
541 SANE_HILOG_INFO("%s: start", __func__);
542 if (dev_handle == nullptr || data == nullptr || length <= 0 || transferred == nullptr) {
543 SANE_HILOG_ERROR("%s: Invalid input parameter.", __func__);
544 return USB_MANAGER_ERROR_INVALID_PARAM;
545 }
546 USBDevicePipe &pipe = dev_handle->pipe;
547 USBEndpoint usbEndpoint;
548 usbEndpoint.SetInterfaceId(g_interfaceNumber);
549 usbEndpoint.SetAddr(endpoint);
550 auto &usbSrvClient = UsbSrvClient::GetInstance();
551 if (endpoint & USB_MANAGER_ENDPOINT_IN) {
552 // read
553 std::vector<uint8_t> bufferData(length);
554 auto ret = usbSrvClient.BulkTransfer(pipe, usbEndpoint, bufferData, timeout);
555 if (ret != USB_MANAGER_SUCCESS) {
556 SANE_HILOG_INFO("%s: error", __func__);
557 return USB_MANAGER_ERROR_IO;
558 }
559 for (size_t i = 0; i < bufferData.size(); i++) {
560 data[i] = bufferData[i];
561 }
562 } else {
563 // write
564 std::vector<uint8_t> bufferData(length);
565 for (int i = 0; i < length; i++) {
566 bufferData[i] = data[i];
567 }
568 auto ret = usbSrvClient.BulkTransfer(pipe, usbEndpoint, bufferData, timeout);
569 if (ret != USB_MANAGER_SUCCESS) {
570 SANE_HILOG_INFO("%s: error", __func__);
571 return USB_MANAGER_ERROR_IO;
572 }
573 }
574 *transferred = length;
575 SANE_HILOG_INFO("%s: end successful", __func__);
576 return USB_MANAGER_SUCCESS;
577 }
578
usb_manager_control_transfer(usb_manager_device_handle *dev_handle, uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout)579 int usb_manager_control_transfer(usb_manager_device_handle *dev_handle, uint8_t request_type,
580 uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength,
581 unsigned int timeout)
582 {
583 SANE_HILOG_INFO("%s: start", __func__);
584 if (dev_handle == nullptr || data == nullptr || wLength == 0) {
585 return USB_MANAGER_ERROR_INVALID_PARAM;
586 }
587 USBDevicePipe &pipe = dev_handle->pipe;
588 OHOS::HDI::Usb::V1_0::UsbCtrlTransfer ctrl;
589 ctrl.requestType = static_cast<int32_t>(request_type);
590 ctrl.requestCmd = static_cast<int32_t>(bRequest);
591 ctrl.value = static_cast<int32_t>(wValue);
592 ctrl.index = static_cast<int32_t>(wIndex);
593 ctrl.timeout = static_cast<int32_t>(timeout);
594
595 auto &usbSrvClient = UsbSrvClient::GetInstance();
596 std::vector<uint8_t> bufferData(wLength);
597 for (uint16_t i = 0; i < wLength; i++) {
598 bufferData[i] = data[i];
599 }
600 auto ret = usbSrvClient.ControlTransfer(pipe, ctrl, bufferData);
601 if (ret != USB_MANAGER_SUCCESS) {
602 SANE_HILOG_ERROR("ControlTransfer failed ret=%{public}d", ret);
603 return USB_MANAGER_ERROR_IO;
604 }
605 SANE_HILOG_INFO("%s: end successful", __func__);
606 return USB_MANAGER_SUCCESS;
607 }
608
usb_manager_set_interface_alt_setting(usb_manager_device_handle *dev_handle, int interface_number, int alternate_setting)609 int usb_manager_set_interface_alt_setting(usb_manager_device_handle *dev_handle, int interface_number,
610 int alternate_setting)
611 {
612 SANE_HILOG_INFO("%s: start", __func__);
613 if (dev_handle == nullptr) {
614 return USB_MANAGER_ERROR_INVALID_PARAM;
615 }
616 auto &usbSrvClient = UsbSrvClient::GetInstance();
617 USBDevicePipe pipe = dev_handle->pipe;
618 UsbInterface interface;
619 interface.SetId(interface_number);
620 interface.SetAlternateSetting(alternate_setting);
621 auto ret = usbSrvClient.SetInterface(pipe, interface);
622 if (ret != USB_MANAGER_SUCCESS) {
623 SANE_HILOG_ERROR("SetInterface failed ret=%{public}d", ret);
624 return USB_MANAGER_ERROR_IO;
625 }
626 SANE_HILOG_INFO("%s: end successful", __func__);
627 return USB_MANAGER_SUCCESS;
628 }
629
usb_manager_ref_device(usb_manager_device *dev)630 usb_manager_device* usb_manager_ref_device(usb_manager_device *dev)
631 {
632 SANE_HILOG_INFO("%s: start", __func__);
633 if (dev == nullptr) {
634 SANE_HILOG_ERROR("%s: dev is a nullptr!", __func__);
635 return nullptr;
636 }
637 usb_manager_device* refDevice = new (std::nothrow) usb_manager_device();
638 if (refDevice == nullptr) {
639 SANE_HILOG_ERROR("%s: create refDevice error!", __func__);
640 return nullptr;
641 }
642 refDevice->device = dev->device;
643 g_refDevices.push_back(refDevice);
644 SANE_HILOG_INFO("%s: end successful", __func__);
645 return refDevice;
646 }
647
648 // stub
usb_manager_interrupt_transfer(usb_manager_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout)649 int usb_manager_interrupt_transfer(usb_manager_device_handle *dev_handle, unsigned char endpoint,
650 unsigned char *data, int length, int *actual_length, unsigned int timeout)
651 {
652 SANE_HILOG_INFO("%s: start", __func__);
653 SANE_HILOG_INFO("%s: end successful", __func__);
654 return USB_MANAGER_SUCCESS;
655 }
656
657 // stub
usb_manager_clear_halt(usb_manager_device_handle *dev_handle, unsigned char endpoint)658 int usb_manager_clear_halt(usb_manager_device_handle *dev_handle, unsigned char endpoint)
659 {
660 SANE_HILOG_INFO("%s: start", __func__);
661 SANE_HILOG_INFO("%s: end successful", __func__);
662 return USB_MANAGER_SUCCESS;
663 }
664
665 // stub
usb_manager_reset_device(usb_manager_device_handle *dev_handle)666 int usb_manager_reset_device(usb_manager_device_handle *dev_handle)
667 {
668 SANE_HILOG_INFO("%s: start", __func__);
669 SANE_HILOG_INFO("%s: end successful", __func__);
670 return USB_MANAGER_SUCCESS;
671 }