1 /*
2 * Copyright (c) 2021-2023 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 "usb_raw_api_library.h"
17 #include "linux_adapter.h"
18 #include "usbd_wrapper.h"
19 #include "usb_interface_pool.h"
20
21 #define HDF_LOG_TAG USB_RAW_API_LIBRARY
22
23 struct UsbSession *g_usbRawDefaultSession = NULL;
24
SyncRequestCallback(const void * requestArg)25 static void SyncRequestCallback(const void *requestArg)
26 {
27 struct UsbHostRequest *request = (struct UsbHostRequest *)requestArg;
28 if (request == NULL || request->userData == NULL) {
29 HDF_LOGE("%{public}s:%{public}d invalid param requestArg.", __func__, __LINE__);
30 return;
31 }
32
33 int32_t *completed = request->userData;
34 *completed = 1;
35 OsalSemPost(&request->sem);
36 }
37
ControlRequestGetData(const struct UsbHostRequest * request)38 static inline unsigned char *ControlRequestGetData(const struct UsbHostRequest *request)
39 {
40 return request->buffer + USB_RAW_CONTROL_SETUP_SIZE;
41 }
42
HandleSyncRequestCompletion(const struct UsbHostRequest * request,struct UsbRequestData * requestData)43 static int32_t HandleSyncRequestCompletion(const struct UsbHostRequest *request, struct UsbRequestData *requestData)
44 {
45 int32_t ret;
46 uint32_t waitTime;
47
48 if (request->timeout == USB_RAW_REQUEST_TIME_ZERO_MS) {
49 waitTime = HDF_WAIT_FOREVER;
50 } else {
51 waitTime = request->timeout;
52 }
53
54 ret = OsalSemWait((struct OsalSem *)&request->sem, waitTime);
55 if (ret == HDF_ERR_TIMEOUT) {
56 RawCancelRequest(request);
57 RawHandleRequestCompletion((struct UsbHostRequest *)request, USB_REQUEST_TIMEOUT);
58 } else if (ret != HDF_SUCCESS) {
59 HDF_LOGE("%{public}s:%{public}d OsalSemWait failed, ret = %{public}d ", __func__, __LINE__, ret);
60 goto OUT;
61 }
62
63 if (requestData->requested) {
64 *(requestData->requested) = request->actualLength;
65 }
66
67 switch (request->status) {
68 case USB_REQUEST_COMPLETED:
69 ret = HDF_SUCCESS;
70 break;
71 case USB_REQUEST_TIMEOUT:
72 ret = HDF_ERR_TIMEOUT;
73 break;
74 case USB_REQUEST_NO_DEVICE:
75 ret = HDF_DEV_ERR_NO_DEVICE;
76 break;
77 case USB_REQUEST_STALL:
78 case USB_REQUEST_OVERFLOW:
79 case USB_REQUEST_ERROR:
80 case USB_REQUEST_CANCELLED:
81 ret = HDF_ERR_IO;
82 break;
83 default:
84 HDF_LOGW("%{public}s: unrecognised status code %{public}d", __func__, request->status);
85 ret = HDF_FAILURE;
86 break;
87 }
88
89 OUT:
90 OsalSemDestroy((struct OsalSem *)&request->sem);
91 return ret;
92 }
93
HandleSyncRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData,unsigned char type)94 static int32_t HandleSyncRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
95 const struct UsbRequestData *requestData, unsigned char type)
96 {
97 int32_t ret;
98 static int32_t completed = 0;
99
100 if (UsbEndpointDirOut(requestData->endPoint)) {
101 ret = memcpy_s(request->buffer, request->bufLen, requestData->data, requestData->length);
102 if (ret != EOK) {
103 HDF_LOGE("%{public}s:%{public}d memcpy_s fail!", __func__, __LINE__);
104 return ret;
105 }
106 }
107
108 request->devHandle = (struct UsbDeviceHandle *)devHandle;
109 request->endPoint = requestData->endPoint;
110 request->requestType = type;
111 request->timeout = requestData->timeout;
112 request->length = requestData->length;
113 request->userData = &completed;
114 request->callback = SyncRequestCallback;
115 request->userCallback = NULL;
116
117 ret = OsalSemInit(&request->sem, 0);
118 if (ret != HDF_SUCCESS) {
119 HDF_LOGE("%{public}s:%{public}d OsalSemInit failed, ret=%{public}d ", __func__, __LINE__, ret);
120 return ret;
121 }
122
123 ret = RawSubmitRequest(request);
124 if (ret < 0) {
125 OsalSemDestroy(&request->sem);
126 return ret;
127 }
128
129 return HandleSyncRequestCompletion(request, (struct UsbRequestData *)requestData);
130 }
131
GetInterfaceNumberDes(const struct UsbDescriptorHeader * header,uint8_t nIntf[],uint8_t nAlts[],int32_t * num)132 static void GetInterfaceNumberDes(
133 const struct UsbDescriptorHeader *header, uint8_t nIntf[], uint8_t nAlts[], int32_t *num)
134 {
135 uint8_t inum;
136 int32_t i;
137 struct UsbInterfaceDescriptor *desc = NULL;
138
139 desc = (struct UsbInterfaceDescriptor *)header;
140 if (desc->bLength < USB_DDK_DT_INTERFACE_SIZE) {
141 HDF_LOGW("%{public}s: invalid interface descriptor length %{public}d, skipping", __func__, desc->bLength);
142 return;
143 }
144
145 inum = desc->bInterfaceNumber;
146 for (i = 0; i < *num; ++i) {
147 if (nIntf[i] == inum) {
148 break;
149 }
150 }
151 if (i < *num) {
152 if (nAlts[i] < USB_MAXALTSETTING) {
153 ++nAlts[i];
154 }
155 } else if (*num < USB_MAXINTERFACES) {
156 nIntf[*num] = inum;
157 nAlts[*num] = 1;
158 ++*num;
159 }
160 }
161
GetInterfaceNumber(const uint8_t * buffer,size_t size,uint8_t nIntf[],uint8_t nAlts[])162 static int32_t GetInterfaceNumber(const uint8_t *buffer, size_t size, uint8_t nIntf[], uint8_t nAlts[])
163 {
164 struct UsbDescriptorHeader *header = NULL;
165 const uint8_t *buffer2;
166 size_t size2;
167 int32_t num = 0;
168
169 for ((buffer2 = buffer, size2 = size); size2 > 0; (buffer2 += header->bLength, size2 -= header->bLength)) {
170 if (size2 < sizeof(struct UsbDescriptorHeader)) {
171 HDF_LOGW("%{public}s: descriptor has %{public}zu excess bytes", __func__, size2);
172 break;
173 }
174 header = (struct UsbDescriptorHeader *)buffer2;
175 if ((header->bLength > size2) || (header->bLength < sizeof(struct UsbDescriptorHeader))) {
176 HDF_LOGW("%{public}s: invalid descriptor length %{public}hhu, skipping remainder",
177 __func__, header->bLength);
178 break;
179 }
180
181 if (header->bDescriptorType == USB_DDK_DT_INTERFACE) {
182 GetInterfaceNumberDes(header, nIntf, nAlts, &num);
183 }
184 }
185
186 return num;
187 }
188
FindNextDescriptor(const uint8_t * buffer,size_t size)189 static int32_t FindNextDescriptor(const uint8_t *buffer, size_t size)
190 {
191 struct UsbDescriptorHeader *h = NULL;
192 const uint8_t *buffer0 = buffer;
193
194 while (size > 0) {
195 h = (struct UsbDescriptorHeader *)buffer;
196 if (h->bDescriptorType == USB_DDK_DT_INTERFACE || h->bDescriptorType == USB_DDK_DT_ENDPOINT) {
197 break;
198 }
199 buffer += h->bLength;
200 size -= h->bLength;
201 }
202
203 return buffer - buffer0;
204 }
GetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIdx,uint8_t * buffer,size_t size)205 static int32_t GetConfigDescriptor(const struct UsbDevice *dev, uint8_t configIdx, uint8_t *buffer, size_t size)
206 {
207 int32_t ret;
208 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
209
210 if (dev == NULL) {
211 HDF_LOGE("%{public}s: invalid param", __func__);
212 return HDF_ERR_INVALID_PARAM;
213 }
214
215 if (!osAdapterOps->getConfigDescriptor) {
216 HDF_LOGE("%{public}s: getConfigDescriptor is null", __func__);
217 return HDF_ERR_NOT_SUPPORT;
218 }
219
220 ret = osAdapterOps->getConfigDescriptor(dev, configIdx, buffer, size);
221 if (ret < 0) {
222 HDF_LOGE("%{public}s: getConfigDescriptor error = %{public}d", __func__, ret);
223 return ret;
224 }
225
226 if (ret < USB_DDK_DT_CONFIG_SIZE) {
227 HDF_LOGE("%{public}s: short config descriptor read error = %{public}d", __func__, ret);
228 return HDF_ERR_IO;
229 } else if (ret != (int)size) {
230 HDF_LOGE("%{public}s: short config descriptor read size = %{public}zu, ret = %{public}d", __func__, size, ret);
231 }
232
233 return ret;
234 }
235
GetRawConfigDescriptor(const UsbRawHandle * rawHandle,uint8_t configIndex,uint8_t * configDesc,uint32_t configDescLen)236 int32_t GetRawConfigDescriptor(
237 const UsbRawHandle *rawHandle, uint8_t configIndex, uint8_t *configDesc, uint32_t configDescLen)
238 {
239 if (rawHandle == NULL || configDesc == NULL) {
240 HDF_LOGE("%{public}s: invalid param", __func__);
241 return HDF_ERR_INVALID_PARAM;
242 }
243
244 struct UsbDeviceHandle *devHandle = (struct UsbDeviceHandle *)rawHandle;
245 return GetConfigDescriptor(devHandle->dev, configIndex, configDesc, configDescLen);
246 }
247
ParseDescriptor(const void * source,enum UsbRawDescriptorType bDescriptorType,void * dest)248 static void ParseDescriptor(const void *source, enum UsbRawDescriptorType bDescriptorType, void *dest)
249 {
250 int32_t ret;
251
252 if (source == NULL) {
253 HDF_LOGE("%{public}s: invalid param", __func__);
254 return;
255 }
256
257 switch (bDescriptorType) {
258 case USB_RAW_CONFIG_DESCRIPTOR_TYPE: {
259 struct UsbConfigDescriptor *desc = (struct UsbConfigDescriptor *)dest;
260 ret = memcpy_s(dest, sizeof(struct UsbConfigDescriptor), source, USB_DDK_DT_CONFIG_SIZE);
261 if (ret != EOK) {
262 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
263 break;
264 }
265 desc->wTotalLength = LE16_TO_CPU(desc->wTotalLength);
266 break;
267 }
268 case USB_RAW_INTERFACE_DESCRIPTOR_TYPE: {
269 ret = memcpy_s(dest, sizeof(struct UsbInterfaceDescriptor), source, USB_DDK_DT_INTERFACE_SIZE);
270 if (ret != EOK) {
271 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
272 }
273 break;
274 }
275 case USB_RAW_ENDPOINT_DESCRIPTOR_TYPE: {
276 struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)dest;
277 ret = memcpy_s(dest, sizeof(struct UsbEndpointDescriptor), source, USB_DDK_DT_ENDPOINT_SIZE);
278 if (ret != EOK) {
279 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
280 break;
281 }
282 desc->wMaxPacketSize = LE16_TO_CPU(desc->wMaxPacketSize);
283 break;
284 }
285 case USB_RAW_AUDIO_ENDPOINT_DESCRIPTOR_TYPE: {
286 struct UsbEndpointDescriptor *desc = (struct UsbEndpointDescriptor *)dest;
287 ret = memcpy_s(dest, sizeof(struct UsbEndpointDescriptor), source, USB_DDK_DT_ENDPOINT_AUDIO_SIZE);
288 if (ret != EOK) {
289 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
290 break;
291 }
292 desc->wMaxPacketSize = LE16_TO_CPU(desc->wMaxPacketSize);
293 break;
294 }
295 default:
296 HDF_LOGE("%{public}s: error bDescriptorType = %{public}d", __func__, bDescriptorType);
297 break;
298 }
299 }
300
ClearEndpoint(struct UsbRawEndpointDescriptor * endPoint)301 static void ClearEndpoint(struct UsbRawEndpointDescriptor *endPoint)
302 {
303 if ((endPoint != NULL) && (endPoint->extra != NULL)) {
304 RawUsbMemFree((void *)endPoint->extra);
305 endPoint->extra = NULL;
306 }
307 }
308
ParseEndpoint(struct UsbRawEndpointDescriptor * endPoint,const uint8_t * buffer,int32_t size)309 static int32_t ParseEndpoint(struct UsbRawEndpointDescriptor *endPoint, const uint8_t *buffer, int32_t size)
310 {
311 const uint8_t *buffer0 = buffer;
312 const struct UsbDescriptorHeader *header = NULL;
313 void *extra = NULL;
314 int32_t len;
315 int32_t ret;
316
317 if (size < DESC_HEADER_LENGTH) {
318 HDF_LOGE("%{public}s:size = %{public}d is short endPoint descriptor ", __func__, size);
319 return HDF_ERR_IO;
320 }
321
322 header = (const struct UsbDescriptorHeader *)buffer;
323 if ((header->bDescriptorType != USB_DDK_DT_ENDPOINT) || (header->bLength > size)) {
324 HDF_LOGE("%{public}s:%{public}d unexpected descriptor, type = 0x%{public}x, length = %{public}hhu",
325 __func__, __LINE__, header->bDescriptorType, header->bLength);
326 return buffer - buffer0;
327 } else if (header->bLength < USB_DDK_DT_ENDPOINT_SIZE) {
328 HDF_LOGE("%{public}s:%{public}d invalid endpoint length = %{public}hhu", __func__, __LINE__, header->bLength);
329 return HDF_ERR_IO;
330 }
331
332 if (header->bLength >= USB_DDK_DT_ENDPOINT_AUDIO_SIZE) {
333 ParseDescriptor(buffer, USB_RAW_AUDIO_ENDPOINT_DESCRIPTOR_TYPE, endPoint);
334 } else {
335 ParseDescriptor(buffer, USB_RAW_ENDPOINT_DESCRIPTOR_TYPE, endPoint);
336 }
337
338 buffer += header->bLength;
339 size -= header->bLength;
340
341 len = FindNextDescriptor(buffer, size);
342 if (!len) {
343 return buffer - buffer0;
344 }
345
346 extra = RawUsbMemAlloc((size_t)len);
347 if (extra == NULL) {
348 return HDF_ERR_MALLOC_FAIL;
349 }
350
351 ret = memcpy_s(extra, len + endPoint->extraLength, buffer, len);
352 if (ret != EOK) {
353 HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
354 RawUsbMemFree(extra);
355 return HDF_ERR_IO;
356 }
357 endPoint->extra = extra;
358 endPoint->extraLength = len;
359
360 return buffer + len - buffer0;
361 }
362
ClearInterface(const struct UsbRawInterface * usbInterface)363 static void ClearInterface(const struct UsbRawInterface *usbInterface)
364 {
365 struct UsbRawInterfaceDescriptor *infPtr = NULL;
366 uint8_t i;
367 uint8_t j;
368
369 if (usbInterface == NULL) {
370 HDF_LOGE("%{public}s:%{public}d usbInterface is null", __func__, __LINE__);
371 return;
372 }
373
374 if (usbInterface->numAltsetting > USB_MAXALTSETTING) {
375 HDF_LOGE("%{public}s:%{public}d numAltsetting = %{public}hhu is error",
376 __func__, __LINE__, usbInterface->numAltsetting);
377 return;
378 }
379
380 for (i = 0; i < usbInterface->numAltsetting; i++) {
381 infPtr = (struct UsbRawInterfaceDescriptor *)(usbInterface->altsetting + i);
382 if (infPtr == NULL) {
383 HDF_LOGE("%{public}s:%{public}d altsetting is null", __func__, __LINE__);
384 continue;
385 }
386
387 if (infPtr->extra != NULL) {
388 RawUsbMemFree((void *)infPtr->extra);
389 infPtr->extra = NULL;
390 }
391
392 if (infPtr->endPoint != NULL) {
393 for (j = 0; j < infPtr->interfaceDescriptor.bNumEndpoints; j++) {
394 ClearEndpoint((struct UsbRawEndpointDescriptor *)infPtr->endPoint + j);
395 }
396
397 RawUsbMemFree((void *)infPtr->endPoint);
398 infPtr->endPoint = NULL;
399 }
400 }
401
402 RawUsbMemFree((void *)usbInterface);
403 }
404
RawParseDescriptor(int32_t size,const uint8_t * buffer,enum UsbRawDescriptorType bDescriptorType,const struct UsbRawInterfaceDescriptor * ifp)405 static int32_t RawParseDescriptor(int32_t size, const uint8_t *buffer, enum UsbRawDescriptorType bDescriptorType,
406 const struct UsbRawInterfaceDescriptor *ifp)
407 {
408 int32_t ret = HDF_SUCCESS;
409
410 ParseDescriptor(buffer, bDescriptorType, (void *)ifp);
411 if ((ifp->interfaceDescriptor.bDescriptorType != USB_DDK_DT_INTERFACE) ||
412 (ifp->interfaceDescriptor.bLength > size)) {
413 HDF_LOGE("%{public}s: unexpected descriptor: type = 0x%{public}x, size = %{public}d", __func__,
414 ifp->interfaceDescriptor.bDescriptorType, size);
415 ret = HDF_FAILURE;
416 } else if ((ifp->interfaceDescriptor.bLength < USB_DDK_DT_INTERFACE_SIZE) ||
417 (ifp->interfaceDescriptor.bNumEndpoints > USB_MAXENDPOINTS)) {
418 HDF_LOGE("%{public}s: invalid descriptor: length = %{public}u, numEndpoints = %{public}u ", __func__,
419 ifp->interfaceDescriptor.bLength, ifp->interfaceDescriptor.bNumEndpoints);
420 ret = HDF_ERR_IO;
421 }
422
423 return ret;
424 }
425
ParseInterfaceCopy(struct UsbRawInterfaceDescriptor * const ifp,int32_t len,const uint8_t * buffer)426 static int32_t ParseInterfaceCopy(struct UsbRawInterfaceDescriptor * const ifp, int32_t len, const uint8_t *buffer)
427 {
428 int32_t ret;
429
430 ifp->extra = RawUsbMemAlloc((size_t)len);
431 if (!ifp->extra) {
432 ret = HDF_ERR_MALLOC_FAIL;
433 return ret;
434 }
435
436 ret = memcpy_s((void *)ifp->extra, len + ifp->extraLength, buffer, len);
437 if (ret != EOK) {
438 HDF_LOGE("%{public}s:%{public}d memcpy_s failed, ret = %{public}d", __func__, __LINE__, ret);
439 RawUsbMemFree((void *)ifp->extra);
440 ifp->extra = NULL;
441 return ret;
442 }
443 ifp->extraLength = len;
444 return ret;
445 }
446
ParseInterfaceEndpoint(struct UsbRawInterfaceDescriptor * ifp,const uint8_t ** buffer,int32_t * size)447 static int32_t ParseInterfaceEndpoint(struct UsbRawInterfaceDescriptor *ifp, const uint8_t **buffer, int32_t *size)
448 {
449 struct UsbRawEndpointDescriptor *endPoint = NULL;
450 int32_t ret = HDF_SUCCESS;
451
452 if (ifp->interfaceDescriptor.bNumEndpoints > 0) {
453 endPoint = RawUsbMemCalloc(ifp->interfaceDescriptor.bNumEndpoints * sizeof(*endPoint));
454 if (endPoint == NULL) {
455 ret = HDF_ERR_MALLOC_FAIL;
456 return ret;
457 }
458
459 ifp->endPoint = endPoint;
460 for (uint8_t i = 0; i < ifp->interfaceDescriptor.bNumEndpoints; i++) {
461 ret = ParseEndpoint(endPoint + i, *buffer, *size);
462 if (ret == 0) {
463 ifp->interfaceDescriptor.bNumEndpoints = i;
464 break;
465 } else if (ret < 0) {
466 return ret;
467 }
468
469 *buffer += ret;
470 *size -= ret;
471 }
472 }
473 return ret;
474 }
475
ParseInterface(struct UsbRawInterface * usbInterface,const uint8_t * buffer,int32_t size)476 static int32_t ParseInterface(struct UsbRawInterface *usbInterface, const uint8_t *buffer, int32_t size)
477 {
478 const uint8_t *buffer0 = buffer;
479 int32_t interfaceNumber = -1; // initial value of interfaceNumber is -1
480 const struct UsbInterfaceDescriptor *ifDesc = NULL;
481 struct UsbRawInterfaceDescriptor *ifp = NULL;
482
483 if (usbInterface == NULL || usbInterface->numAltsetting > USB_MAXALTSETTING) {
484 HDF_LOGE("%{public}s: usbInterface is null or numAltsetting is invalid", __func__);
485 return HDF_DEV_ERR_NORANGE;
486 }
487
488 while (size >= USB_DDK_DT_INTERFACE_SIZE) {
489 ifp = (struct UsbRawInterfaceDescriptor *)(usbInterface->altsetting + usbInterface->numAltsetting);
490 int32_t ret = RawParseDescriptor(size, buffer, USB_RAW_INTERFACE_DESCRIPTOR_TYPE, ifp);
491 if (ret == HDF_FAILURE) {
492 return buffer - buffer0;
493 } else if (ret == HDF_ERR_IO) {
494 HDF_LOGE("%{public}s: RawParseDescriptor failed", __func__);
495 return ret;
496 }
497
498 usbInterface->numAltsetting++;
499 ifp->extra = NULL;
500 ifp->extraLength = 0;
501 ifp->endPoint = NULL;
502 if (interfaceNumber == -1) {
503 interfaceNumber = ifp->interfaceDescriptor.bInterfaceNumber;
504 }
505
506 buffer += ifp->interfaceDescriptor.bLength;
507 size -= (int)ifp->interfaceDescriptor.bLength;
508 int32_t len = FindNextDescriptor(buffer, size);
509 if (len != 0) {
510 if (ParseInterfaceCopy(ifp, len, buffer) != EOK) {
511 HDF_LOGE("%{public}s: ParseInterfaceCopy failed", __func__);
512 return HDF_FAILURE;
513 }
514 buffer += len;
515 size -= len;
516 }
517
518 ret = ParseInterfaceEndpoint(ifp, &buffer, &size);
519 if (ret < HDF_SUCCESS) {
520 HDF_LOGE("%{public}s: ParseInterfaceEndpoint, ret less than zero", __func__);
521 return ret;
522 }
523
524 ifDesc = (const struct UsbInterfaceDescriptor *)buffer;
525 bool tempFlag = (size < USB_DDK_DT_INTERFACE_SIZE) || (ifDesc->bDescriptorType != USB_DDK_DT_INTERFACE) ||
526 (ifDesc->bInterfaceNumber != interfaceNumber);
527 if (tempFlag == true) {
528 return buffer - buffer0;
529 }
530 }
531
532 return buffer - buffer0;
533 }
534
ParseConfigurationDes(struct UsbRawConfigDescriptor * config,const uint8_t * buffer,int32_t size,struct UsbRawInterface * usbInterface,const uint8_t * nIntf)535 static int32_t ParseConfigurationDes(struct UsbRawConfigDescriptor *config, const uint8_t *buffer, int32_t size,
536 struct UsbRawInterface *usbInterface, const uint8_t *nIntf)
537 {
538 int32_t ret, len;
539 uint8_t i;
540
541 len = FindNextDescriptor(buffer, size);
542 if (len != 0) {
543 config->extra = RawUsbMemAlloc(len);
544 if (config->extra == NULL) {
545 ret = HDF_ERR_MALLOC_FAIL;
546 RawClearConfiguration(config);
547 return ret;
548 }
549
550 ret = memcpy_s((void *)config->extra, len + config->extraLength, buffer, len);
551 if (ret != EOK) {
552 HDF_LOGE("%{public}s:%{public}d memcpy_s failed! ret = %{public}d", __func__, __LINE__, ret);
553 RawClearConfiguration(config);
554 return ret;
555 }
556 config->extraLength = len;
557 buffer += len;
558 size -= len;
559 }
560
561 while (size > 0) {
562 struct UsbInterfaceDescriptor *ifDesc = (struct UsbInterfaceDescriptor *)buffer;
563 if (config->configDescriptor.bNumInterfaces >= USB_MAXINTERFACES) {
564 HDF_LOGE("%{public}d: bNumInterfaces overlong.", config->configDescriptor.bNumInterfaces);
565 RawClearConfiguration(config);
566 return HDF_FAILURE;
567 }
568 for (i = 0; i < config->configDescriptor.bNumInterfaces; ++i) {
569 if (nIntf[i] == ifDesc->bInterfaceNumber) {
570 usbInterface = (struct UsbRawInterface *)config->interface[i];
571 break;
572 }
573 }
574 ret = ParseInterface(usbInterface, buffer, size);
575 if (ret < 0) {
576 RawClearConfiguration(config);
577 return ret;
578 }
579 buffer += ret;
580 size -= ret;
581 }
582
583 return size;
584 }
585
ParseConfiguration(struct UsbRawConfigDescriptor * config,const uint8_t * buffer,int32_t size)586 static int32_t ParseConfiguration(struct UsbRawConfigDescriptor *config, const uint8_t *buffer, int32_t size)
587 {
588 struct UsbRawInterface *usbInterface = NULL;
589 uint8_t nIntf[USB_MAXINTERFACES] = {0};
590 uint8_t nAlts[USB_MAXINTERFACES] = {0};
591 int32_t intfNum;
592
593 if (size < USB_DDK_DT_CONFIG_SIZE || config == NULL) {
594 HDF_LOGE("%{public}s:%{public}d size = %{public}d is short, or config is null!", __func__, __LINE__, size);
595 return HDF_ERR_IO;
596 }
597
598 ParseDescriptor(buffer, USB_RAW_CONFIG_DESCRIPTOR_TYPE, config);
599 if ((config->configDescriptor.bDescriptorType != USB_DDK_DT_CONFIG) ||
600 (config->configDescriptor.bLength < USB_DDK_DT_CONFIG_SIZE) ||
601 (config->configDescriptor.bLength > (uint8_t)size) ||
602 (config->configDescriptor.bNumInterfaces > USB_MAXINTERFACES)) {
603 HDF_LOGE("%{public}s:%{public}d invalid descriptor: type = 0x%{public}x, length = %{public}u",
604 __func__, __LINE__, config->configDescriptor.bDescriptorType, config->configDescriptor.bLength);
605 return HDF_ERR_IO;
606 }
607
608 intfNum = GetInterfaceNumber(buffer, size, nIntf, nAlts);
609 config->configDescriptor.bNumInterfaces = (uint8_t)intfNum;
610
611 for (int32_t i = 0; i < intfNum; ++i) {
612 uint8_t j = nAlts[i];
613 if (j > USB_MAXALTSETTING) {
614 HDF_LOGW("%{public}s: too many alternate settings: %{public}hhu", __func__, j);
615 nAlts[i] = USB_MAXALTSETTING;
616 j = USB_MAXALTSETTING;
617 }
618 usbInterface = RawUsbMemCalloc(sizeof(struct UsbRawInterface) + sizeof(struct UsbRawInterfaceDescriptor) * j);
619 config->interface[i] = usbInterface;
620 if (usbInterface == NULL) {
621 return HDF_ERR_MALLOC_FAIL;
622 }
623 }
624
625 buffer += config->configDescriptor.bLength;
626 size -= (int32_t)config->configDescriptor.bLength;
627
628 return ParseConfigurationDes(config, buffer, size, usbInterface, nIntf);
629 }
630
DescToConfig(const uint8_t * buf,int32_t size,struct UsbRawConfigDescriptor ** const config)631 static int32_t DescToConfig(const uint8_t *buf, int32_t size, struct UsbRawConfigDescriptor ** const config)
632 {
633 struct UsbRawConfigDescriptor *tmpConfig = RawUsbMemCalloc(sizeof(struct UsbRawConfigDescriptor));
634 int32_t ret;
635
636 if (tmpConfig == NULL) {
637 HDF_LOGE("%{public}s: RawUsbMemCalloc failed", __func__);
638 return HDF_ERR_MALLOC_FAIL;
639 }
640
641 ret = ParseConfiguration(tmpConfig, buf, size);
642 if (ret < 0) {
643 HDF_LOGE("%{public}s: ParseConfiguration failed with error = %{public}d", __func__, ret);
644 RawUsbMemFree(tmpConfig);
645 tmpConfig = NULL;
646 return ret;
647 } else if (ret > 0) {
648 HDF_LOGW("%{public}s: still %{public}d bytes of descriptor data left", __func__, ret);
649 }
650
651 *config = tmpConfig;
652
653 return ret;
654 }
655
ControlRequestCompletion(const struct UsbHostRequest * request,struct UsbControlRequestData * requestData)656 static int32_t ControlRequestCompletion(const struct UsbHostRequest *request, struct UsbControlRequestData *requestData)
657 {
658 int32_t ret;
659 uint32_t waitTime;
660
661 if (request->timeout == USB_RAW_REQUEST_TIME_ZERO_MS) {
662 waitTime = HDF_WAIT_FOREVER;
663 } else {
664 waitTime = request->timeout;
665 }
666
667 ret = OsalSemWait((struct OsalSem *)&request->sem, waitTime);
668 if (ret == HDF_ERR_TIMEOUT) {
669 RawCancelRequest(request);
670 RawHandleRequestCompletion((struct UsbHostRequest *)request, USB_REQUEST_TIMEOUT);
671 } else if (ret != HDF_SUCCESS) {
672 HDF_LOGE("%{public}s:%{public}d OsalSemWait failed, ret=%{public}d ", __func__, __LINE__, ret);
673 goto OUT;
674 }
675
676 if ((requestData->requestType & USB_DDK_ENDPOINT_DIR_MASK) == USB_PIPE_DIRECTION_IN) {
677 ret = memcpy_s(requestData->data, request->actualLength + requestData->length, ControlRequestGetData(request),
678 request->actualLength);
679 if (ret != EOK) {
680 HDF_LOGE("%{public}s:%{public}d memcpy_s failed! ret = %{public}d", __func__, __LINE__, ret);
681 goto OUT;
682 }
683 }
684
685 switch (request->status) {
686 case USB_REQUEST_COMPLETED:
687 ret = request->actualLength;
688 break;
689 case USB_REQUEST_TIMEOUT:
690 ret = HDF_ERR_TIMEOUT;
691 break;
692 case USB_REQUEST_NO_DEVICE:
693 ret = HDF_DEV_ERR_NO_DEVICE;
694 break;
695 case USB_REQUEST_STALL:
696 case USB_REQUEST_OVERFLOW:
697 case USB_REQUEST_ERROR:
698 case USB_REQUEST_CANCELLED:
699 ret = HDF_ERR_IO;
700 break;
701 default:
702 HDF_LOGW("%{public}s: status = %{public}d is unrecognised", __func__, request->status);
703 ret = HDF_FAILURE;
704 }
705
706 OUT:
707 OsalSemDestroy((struct OsalSem *)&request->sem);
708 return ret;
709 }
710
RawGetSession(const struct UsbSession * session)711 struct UsbSession *RawGetSession(const struct UsbSession *session)
712 {
713 return (struct UsbSession *)(session ? session : g_usbRawDefaultSession);
714 }
715
RawInit(struct UsbSession ** session)716 int32_t RawInit(struct UsbSession **session)
717 {
718 int32_t ret;
719 struct UsbSession *tempSession = NULL;
720 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
721
722 if (session == NULL && g_usbRawDefaultSession != NULL) {
723 AdapterAtomicInc(&g_usbRawDefaultSession->refCount);
724 return HDF_SUCCESS;
725 }
726
727 tempSession = (struct UsbSession *)RawUsbMemCalloc(sizeof(*tempSession));
728 if (tempSession == NULL) {
729 return HDF_ERR_MALLOC_FAIL;
730 }
731 OsalAtomicSet(&tempSession->refCount, 1);
732 HdfSListInit(&tempSession->usbDevs);
733 DListHeadInit(&tempSession->ifacePoolList);
734 OsalMutexInit(&tempSession->lock);
735 if (session == NULL && g_usbRawDefaultSession == NULL) {
736 g_usbRawDefaultSession = tempSession;
737 HDF_LOGI("%{public}s: created default context", __func__);
738 }
739
740 if (osAdapterOps->init) {
741 ret = osAdapterOps->init(tempSession);
742 if (ret < 0) {
743 HDF_LOGE("%{public}s: init error, return %{public}d", __func__, ret);
744 goto ERR_FREE_SESSION;
745 }
746 } else {
747 ret = HDF_ERR_NOT_SUPPORT;
748 goto ERR_FREE_SESSION;
749 }
750
751 if (session != NULL) {
752 *session = tempSession;
753 }
754
755 return HDF_SUCCESS;
756
757 ERR_FREE_SESSION:
758 if (tempSession == g_usbRawDefaultSession) {
759 g_usbRawDefaultSession = NULL;
760 }
761
762 RawUsbMemFree(tempSession);
763 return ret;
764 }
765
RawExit(const struct UsbSession * session)766 int32_t RawExit(const struct UsbSession *session)
767 {
768 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
769 struct UsbSession *realSession = RawGetSession(session);
770 if (realSession == NULL || AdapterAtomicDec(&realSession->refCount) > 0) {
771 return HDF_SUCCESS;
772 }
773
774 if (osAdapterOps->exit) {
775 osAdapterOps->exit(realSession);
776 }
777 if (realSession == g_usbRawDefaultSession) {
778 g_usbRawDefaultSession = NULL;
779 }
780
781 OsalMutexDestroy(&realSession->lock);
782 RawUsbMemFree(realSession);
783
784 return HDF_SUCCESS;
785 }
786
RawOpenDevice(const struct UsbSession * session,uint8_t busNum,uint8_t usbAddr)787 struct UsbDeviceHandle *RawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
788 {
789 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
790 struct UsbSession *realSession = NULL;
791
792 if (osAdapterOps->openDevice == NULL) {
793 HDF_LOGE("%{public}s: openDevice is null", __func__);
794 return NULL;
795 }
796
797 realSession = RawGetSession(session);
798 if (realSession == NULL) {
799 return NULL;
800 }
801
802 return osAdapterOps->openDevice(realSession, busNum, usbAddr);
803 }
804
RawCloseDevice(const struct UsbDeviceHandle * devHandle)805 int32_t RawCloseDevice(const struct UsbDeviceHandle *devHandle)
806 {
807 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
808
809 if (devHandle == NULL) {
810 HDF_LOGE("%{public}s devHandle is null", __func__);
811 return HDF_ERR_INVALID_PARAM;
812 }
813
814 if (osAdapterOps->closeDevice) {
815 osAdapterOps->closeDevice((struct UsbDeviceHandle *)devHandle);
816 } else {
817 return HDF_ERR_NOT_SUPPORT;
818 }
819
820 return HDF_SUCCESS;
821 }
822
RawClaimInterface(struct UsbDeviceHandle * devHandle,int32_t interfaceNumber)823 int32_t RawClaimInterface(struct UsbDeviceHandle *devHandle, int32_t interfaceNumber)
824 {
825 int32_t ret;
826 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
827
828 if (devHandle == NULL || interfaceNumber < 0 || interfaceNumber >= USB_MAXINTERFACES) {
829 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
830 return HDF_ERR_INVALID_PARAM;
831 }
832
833 OsalMutexLock(&devHandle->lock);
834 if ((devHandle->claimedInterfaces) & (1U << (uint32_t)interfaceNumber)) {
835 ret = HDF_SUCCESS;
836 goto OUT;
837 }
838
839 if (!osAdapterOps->claimInterface) {
840 ret = HDF_ERR_NOT_SUPPORT;
841 goto OUT;
842 }
843
844 ret = osAdapterOps->claimInterface(devHandle, (unsigned int)interfaceNumber);
845 if (ret == HDF_SUCCESS) {
846 devHandle->claimedInterfaces |= 1U << (uint32_t)interfaceNumber;
847 }
848
849 OUT:
850 OsalMutexUnlock(&devHandle->lock);
851
852 return ret;
853 }
854
RawClaimInterfaceForce(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)855 int32_t RawClaimInterfaceForce(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
856 {
857 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
858
859 if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
860 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
861 return HDF_ERR_INVALID_PARAM;
862 }
863 if (((devHandle->claimedInterfaces) & (1U << interfaceNumber)) != 0) {
864 return HDF_SUCCESS;
865 }
866
867 OsalMutexLock(&devHandle->lock);
868 int32_t ret = osAdapterOps->detachKernelDriverAndClaim(devHandle, interfaceNumber);
869 if (ret == HDF_SUCCESS) {
870 devHandle->claimedInterfaces |= 1U << interfaceNumber;
871 }
872 OsalMutexUnlock(&devHandle->lock);
873 return ret;
874 }
875
RawDetachInterface(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)876 int32_t RawDetachInterface(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
877 {
878 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
879
880 if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
881 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
882 return HDF_ERR_INVALID_PARAM;
883 }
884 HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
885 if (((devHandle->detachedInterfaces) & (1U << interfaceNumber)) != 0) {
886 return HDF_SUCCESS;
887 }
888
889 OsalMutexLock(&devHandle->lock);
890 int32_t ret = osAdapterOps->detachKernelDriver(devHandle, interfaceNumber);
891 if (ret >= 0) {
892 devHandle->detachedInterfaces |= 1U << interfaceNumber;
893 devHandle->attachedInterfaces &= ~(1U << interfaceNumber);
894 OsalMutexUnlock(&devHandle->lock);
895 return HDF_SUCCESS;
896 }
897 OsalMutexUnlock(&devHandle->lock);
898 return HDF_FAILURE;
899 }
900
RawAttachInterface(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)901 int32_t RawAttachInterface(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
902 {
903 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
904
905 if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
906 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
907 return HDF_ERR_INVALID_PARAM;
908 }
909 HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
910 if (((devHandle->attachedInterfaces) & (1U << interfaceNumber)) != 0) {
911 return HDF_SUCCESS;
912 }
913
914 OsalMutexLock(&devHandle->lock);
915 int32_t ret = osAdapterOps->attachKernelDriver(devHandle, interfaceNumber);
916 if (ret >= 0) {
917 devHandle->attachedInterfaces |= 1U << interfaceNumber;
918 devHandle->detachedInterfaces &= ~(1U << interfaceNumber);
919 OsalMutexUnlock(&devHandle->lock);
920 return HDF_SUCCESS;
921 }
922 OsalMutexUnlock(&devHandle->lock);
923 return HDF_FAILURE;
924 }
925
AllocRequest(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,size_t length)926 struct UsbHostRequest *AllocRequest(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, size_t length)
927 {
928 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
929
930 if (osAdapterOps->allocRequest == NULL) {
931 return NULL;
932 }
933
934 return osAdapterOps->allocRequest(devHandle, isoPackets, length);
935 }
936
AllocRequestByMmap(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,size_t length)937 struct UsbHostRequest *AllocRequestByMmap(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, size_t length)
938 {
939 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
940
941 if (osAdapterOps->allocRequestByMmap == NULL) {
942 return NULL;
943 }
944
945 return osAdapterOps->allocRequestByMmap(devHandle, isoPackets, length);
946 }
947
FreeRequest(const struct UsbHostRequest * request)948 int32_t FreeRequest(const struct UsbHostRequest *request)
949 {
950 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
951 if (osAdapterOps->freeRequest == NULL) {
952 return HDF_ERR_NOT_SUPPORT;
953 }
954
955 return osAdapterOps->freeRequest((struct UsbHostRequest *)request);
956 }
957
FreeRequestByMmap(const struct UsbHostRequest * request)958 int32_t FreeRequestByMmap(const struct UsbHostRequest *request)
959 {
960 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
961 if (osAdapterOps->freeRequestByMmap == NULL) {
962 return HDF_ERR_NOT_SUPPORT;
963 }
964
965 return osAdapterOps->freeRequestByMmap((struct UsbHostRequest *)request);
966 }
967
RawFillBulkRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)968 int32_t RawFillBulkRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
969 const struct UsbFillRequestData *fillRequestData)
970 {
971 if (request == NULL || request->buffer == NULL || devHandle == NULL || fillRequestData == NULL) {
972 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
973 return HDF_ERR_INVALID_PARAM;
974 }
975
976 if (UsbEndpointDirOut(fillRequestData->endPoint)) {
977 if (fillRequestData->buffer == NULL) {
978 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
979 return HDF_ERR_INVALID_PARAM;
980 }
981 if (memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length) != EOK) {
982 HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
983 return HDF_FAILURE;
984 }
985 }
986 request->devHandle = (struct UsbDeviceHandle *)devHandle;
987 request->endPoint = fillRequestData->endPoint;
988 request->requestType = USB_PIPE_TYPE_BULK;
989 request->timeout = fillRequestData->timeout;
990 request->length = fillRequestData->length;
991 request->userData = fillRequestData->userData;
992 request->callback = fillRequestData->callback;
993 request->userCallback = fillRequestData->userCallback;
994
995 return HDF_SUCCESS;
996 }
997
RawFillControlSetup(const unsigned char * setup,const struct UsbControlRequestData * requestData)998 int32_t RawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData)
999 {
1000 struct UsbRawControlSetup *setupData = (struct UsbRawControlSetup *)setup;
1001
1002 if (setup == NULL || requestData == NULL) {
1003 HDF_LOGE("%{public}s: invalid param", __func__);
1004 return HDF_ERR_INVALID_PARAM;
1005 }
1006
1007 setupData->requestType = requestData->requestType;
1008 setupData->request = requestData->requestCmd;
1009 setupData->value = CPU_TO_LE16(requestData->value);
1010 setupData->index = CPU_TO_LE16(requestData->index);
1011 setupData->length = CPU_TO_LE16(requestData->length);
1012
1013 return HDF_SUCCESS;
1014 }
1015
RawFillControlRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1016 int32_t RawFillControlRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1017 const struct UsbFillRequestData *fillRequestData)
1018 {
1019 if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1020 HDF_LOGE("%{public}s: invalid param", __func__);
1021 return HDF_ERR_INVALID_PARAM;
1022 }
1023
1024 request->devHandle = (struct UsbDeviceHandle *)devHandle;
1025 request->endPoint = fillRequestData->endPoint;
1026 request->requestType = USB_PIPE_TYPE_CONTROL;
1027 request->timeout = fillRequestData->timeout;
1028 request->userData = fillRequestData->userData;
1029 request->callback = fillRequestData->callback;
1030 request->userCallback = fillRequestData->userCallback;
1031 request->length = fillRequestData->length;
1032
1033 return HDF_SUCCESS;
1034 }
1035
RawFillInterruptRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1036 int32_t RawFillInterruptRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1037 const struct UsbFillRequestData *fillRequestData)
1038 {
1039 if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1040 HDF_LOGE("%{public}s:%{public}d param is null!", __func__, __LINE__);
1041 return HDF_ERR_INVALID_PARAM;
1042 }
1043
1044 if (UsbEndpointDirOut(fillRequestData->endPoint)) {
1045 if (memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length) != EOK) {
1046 HDF_LOGE("%{public}s:%{public}d memcpy_s failed!", __func__, __LINE__);
1047 return HDF_FAILURE;
1048 }
1049 }
1050 request->devHandle = (struct UsbDeviceHandle *)devHandle;
1051 request->endPoint = fillRequestData->endPoint;
1052 request->requestType = USB_PIPE_TYPE_INTERRUPT;
1053 request->timeout = fillRequestData->timeout;
1054 request->length = fillRequestData->length;
1055 request->userData = fillRequestData->userData;
1056 request->callback = fillRequestData->callback;
1057 request->userCallback = fillRequestData->userCallback;
1058
1059 return HDF_SUCCESS;
1060 }
1061
RawFillInterruptRequestByMmap(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1062 int32_t RawFillInterruptRequestByMmap(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1063 const struct UsbFillRequestData *fillRequestData)
1064 {
1065 if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1066 HDF_LOGE("%{public}s:%{public}d param is null!", __func__, __LINE__);
1067 return HDF_ERR_INVALID_PARAM;
1068 }
1069
1070 request->devHandle = (struct UsbDeviceHandle *)devHandle;
1071 request->endPoint = fillRequestData->endPoint;
1072 request->requestType = USB_PIPE_TYPE_INTERRUPT;
1073 request->timeout = fillRequestData->timeout;
1074 request->length = fillRequestData->length;
1075 request->userData = fillRequestData->userData;
1076 request->callback = fillRequestData->callback;
1077 request->userCallback = fillRequestData->userCallback;
1078
1079 return HDF_SUCCESS;
1080 }
1081
RawFillIsoRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbFillRequestData * fillRequestData)1082 int32_t RawFillIsoRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1083 const struct UsbFillRequestData *fillRequestData)
1084 {
1085 if (request == NULL || devHandle == NULL || fillRequestData == NULL) {
1086 HDF_LOGE("%{public}s:%{public}d param is NULL!", __func__, __LINE__);
1087 return HDF_ERR_INVALID_PARAM;
1088 }
1089
1090 if (UsbEndpointDirOut(fillRequestData->endPoint)) {
1091 int32_t ret = memcpy_s(request->buffer, request->bufLen, fillRequestData->buffer, fillRequestData->length);
1092 if (ret != EOK) {
1093 HDF_LOGE("%{public}s:%{public}d memcpy_s fail!", __func__, __LINE__);
1094 return ret;
1095 }
1096 }
1097 request->devHandle = (struct UsbDeviceHandle *)devHandle;
1098 request->endPoint = fillRequestData->endPoint;
1099 request->requestType = USB_PIPE_TYPE_ISOCHRONOUS;
1100 request->timeout = fillRequestData->timeout;
1101 request->length = fillRequestData->length;
1102 request->numIsoPackets = fillRequestData->numIsoPackets;
1103 request->userData = fillRequestData->userData;
1104 request->callback = fillRequestData->callback;
1105 request->userCallback = fillRequestData->userCallback;
1106
1107 return HDF_SUCCESS;
1108 }
1109
RawSendControlRequest(struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbControlRequestData * requestData)1110 int32_t RawSendControlRequest(struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1111 const struct UsbControlRequestData *requestData)
1112 {
1113 struct UsbFillRequestData fillRequestData = {0};
1114 unsigned char *setup = NULL;
1115 int32_t completed = 0;
1116 int32_t ret;
1117
1118 if (request == NULL || request->buffer == NULL || devHandle == NULL || requestData == NULL) {
1119 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1120 return HDF_ERR_INVALID_PARAM;
1121 }
1122
1123 setup = request->buffer;
1124 RawFillControlSetup(setup, requestData);
1125 if ((requestData->requestType & USB_DDK_ENDPOINT_DIR_MASK) == USB_PIPE_DIRECTION_OUT) {
1126 fillRequestData.endPoint = 0;
1127 fillRequestData.length = requestData->length;
1128 if (requestData->length > 0) {
1129 ret = memcpy_s(request->buffer + USB_RAW_CONTROL_SETUP_SIZE, fillRequestData.length, requestData->data,
1130 requestData->length);
1131 if (ret != EOK) {
1132 HDF_LOGE("%{public}s:%{public}d memcpy_s fail, requestData.length=%{public}d",
1133 __func__, __LINE__, requestData->length);
1134 return ret;
1135 }
1136 }
1137 fillRequestData.length = USB_RAW_CONTROL_SETUP_SIZE + requestData->length;
1138 } else {
1139 fillRequestData.endPoint = (0x1 << USB_DIR_OFFSET);
1140 }
1141 fillRequestData.userCallback = NULL;
1142 fillRequestData.callback = SyncRequestCallback;
1143 fillRequestData.userData = &completed;
1144 fillRequestData.timeout = requestData->timeout;
1145 RawFillControlRequest(request, devHandle, &fillRequestData);
1146
1147 ret = OsalSemInit(&request->sem, 0);
1148 if (ret != HDF_SUCCESS) {
1149 HDF_LOGE("%{public}s:%{public}d OsalSemInit failed, ret = %{public}d ", __func__, __LINE__, ret);
1150 return ret;
1151 }
1152
1153 ret = RawSubmitRequest(request);
1154 if (ret < 0) {
1155 OsalSemDestroy(&request->sem);
1156 return ret;
1157 }
1158
1159 return ControlRequestCompletion(request, (struct UsbControlRequestData *)requestData);
1160 }
1161
RawSendBulkRequest(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData)1162 int32_t RawSendBulkRequest(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1163 const struct UsbRequestData *requestData)
1164 {
1165 if (request == NULL || devHandle == NULL || requestData == NULL) {
1166 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1167 return HDF_ERR_INVALID_PARAM;
1168 }
1169
1170 return HandleSyncRequest((struct UsbHostRequest *)request, devHandle, requestData, USB_PIPE_TYPE_BULK);
1171 }
1172
RawSendInterruptRequest(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRequestData * requestData)1173 int32_t RawSendInterruptRequest(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1174 const struct UsbRequestData *requestData)
1175 {
1176 if (request == NULL || devHandle == NULL || requestData == NULL) {
1177 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1178 return HDF_ERR_INVALID_PARAM;
1179 }
1180
1181 return HandleSyncRequest((struct UsbHostRequest *)request, devHandle, requestData, USB_PIPE_TYPE_INTERRUPT);
1182 }
1183
RawAllocRequest(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,int32_t length)1184 struct UsbHostRequest *RawAllocRequest(const struct UsbDeviceHandle *devHandle, int32_t isoPackets, int32_t length)
1185 {
1186 struct UsbHostRequest *request = NULL;
1187 request = (struct UsbHostRequest *)AllocRequest(devHandle, isoPackets, length);
1188 if (request == NULL) {
1189 HDF_LOGE("%{public}s:%{public}d RawMemAlloc failed", __func__, __LINE__);
1190 return NULL;
1191 }
1192 return request;
1193 }
1194
RawAllocRequestByMmap(const struct UsbDeviceHandle * devHandle,int32_t isoPackets,int32_t length)1195 struct UsbHostRequest *RawAllocRequestByMmap(
1196 const struct UsbDeviceHandle *devHandle, int32_t isoPackets, int32_t length)
1197 {
1198 struct UsbHostRequest *request = NULL;
1199 request = (struct UsbHostRequest *)AllocRequestByMmap(devHandle, isoPackets, length);
1200 if (request == NULL) {
1201 HDF_LOGE("%{public}s:%{public}d RawMemAlloc failed", __func__, __LINE__);
1202 return NULL;
1203 }
1204 return request;
1205 }
1206
RawFreeRequest(const struct UsbHostRequest * request)1207 int32_t RawFreeRequest(const struct UsbHostRequest *request)
1208 {
1209 if (request == NULL) {
1210 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1211 return HDF_ERR_INVALID_PARAM;
1212 }
1213 return FreeRequest(request);
1214 }
1215
RawFreeRequestByMmap(const struct UsbHostRequest * request)1216 int32_t RawFreeRequestByMmap(const struct UsbHostRequest *request)
1217 {
1218 if (request == NULL) {
1219 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1220 return HDF_ERR_INVALID_PARAM;
1221 }
1222 return FreeRequestByMmap(request);
1223 }
1224
RawGetConfigDescriptor(const struct UsbDevice * dev,uint8_t configIndex,struct UsbRawConfigDescriptor ** const config)1225 int32_t RawGetConfigDescriptor(
1226 const struct UsbDevice *dev, uint8_t configIndex, struct UsbRawConfigDescriptor ** const config)
1227 {
1228 int32_t ret;
1229 union UsbiConfigDescBuf tmpConfig;
1230 uint16_t configLen;
1231 uint8_t *buf = NULL;
1232
1233 if (dev == NULL) {
1234 HDF_LOGE("%{public}s: invalid param", __func__);
1235 return HDF_ERR_INVALID_PARAM;
1236 }
1237
1238 ret = GetConfigDescriptor(dev, configIndex, tmpConfig.buf, sizeof(tmpConfig.buf));
1239 if (ret < HDF_SUCCESS) {
1240 HDF_LOGE("%{public}s:%{public}d ret=%{public}d", __func__, __LINE__, ret);
1241 return ret;
1242 }
1243 configLen = LE16_TO_CPU(tmpConfig.desc.wTotalLength);
1244 buf = RawUsbMemAlloc(configLen);
1245 if (buf == NULL) {
1246 HDF_LOGE("%{public}s:%{public}d RawUsbMemAlloc failed", __func__, __LINE__);
1247 return HDF_ERR_MALLOC_FAIL;
1248 }
1249
1250 ret = GetConfigDescriptor(dev, configIndex, buf, configLen);
1251 if (ret >= HDF_SUCCESS) {
1252 ret = DescToConfig(buf, ret, config);
1253 }
1254
1255 RawUsbMemFree(buf);
1256 buf = NULL;
1257
1258 return ret;
1259 }
1260
RawClearConfiguration(struct UsbRawConfigDescriptor * config)1261 void RawClearConfiguration(struct UsbRawConfigDescriptor *config)
1262 {
1263 uint8_t i;
1264
1265 if (config == NULL) {
1266 HDF_LOGE("%{public}s:%{public}d config is NULL", __func__, __LINE__);
1267 return;
1268 }
1269
1270 for (i = 0; i < config->configDescriptor.bNumInterfaces; i++) {
1271 ClearInterface((const struct UsbRawInterface *)(config->interface[i]));
1272 config->interface[i] = NULL;
1273 }
1274
1275 if (config->extra != NULL) {
1276 RawUsbMemFree((void *)config->extra);
1277 config->extra = NULL;
1278 }
1279 }
1280
RawGetConfiguration(const struct UsbDeviceHandle * devHandle,int32_t * config)1281 int32_t RawGetConfiguration(const struct UsbDeviceHandle *devHandle, int32_t *config)
1282 {
1283 int32_t ret;
1284 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1285 uint8_t tmp = 0;
1286
1287 if (devHandle == NULL || config == NULL) {
1288 HDF_LOGE("%{public}s:%{public}d param is null", __func__, __LINE__);
1289 return HDF_ERR_INVALID_PARAM;
1290 }
1291
1292 if (!osAdapterOps->getConfiguration) {
1293 HDF_LOGE("%{public}s:%{public}d adapter don't support getConfiguration", __func__, __LINE__);
1294 return HDF_ERR_NOT_SUPPORT;
1295 }
1296
1297 ret = osAdapterOps->getConfiguration(devHandle, &tmp);
1298 *config = tmp;
1299 return ret;
1300 }
1301
RawUsbControlMsg(const struct UsbDeviceHandle * devHandle,struct UsbControlRequestData * ctrlData)1302 int32_t RawUsbControlMsg(const struct UsbDeviceHandle *devHandle, struct UsbControlRequestData *ctrlData)
1303 {
1304 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1305 if (devHandle == NULL || ctrlData == NULL) {
1306 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1307 return HDF_ERR_INVALID_PARAM;
1308 }
1309
1310 if (!osAdapterOps->usbControlMsg) {
1311 HDF_LOGE("%{public}s:%{public}d not support control msg operation", __func__, __LINE__);
1312 return HDF_ERR_NOT_SUPPORT;
1313 }
1314 return osAdapterOps->usbControlMsg(devHandle, ctrlData);
1315 }
1316
RawUsbGetUsbSpeed(const struct UsbDeviceHandle * devHandle)1317 int32_t RawUsbGetUsbSpeed(const struct UsbDeviceHandle *devHandle)
1318 {
1319 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1320 if (devHandle == NULL) {
1321 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1322 return HDF_ERR_INVALID_PARAM;
1323 }
1324
1325 if (!osAdapterOps->getUsbSpeed) {
1326 HDF_LOGE("%{public}s:%{public}d not support get usb speed operation", __func__, __LINE__);
1327 return HDF_ERR_NOT_SUPPORT;
1328 }
1329 return osAdapterOps->getUsbSpeed(devHandle);
1330 }
1331
RawSetConfiguration(const struct UsbDeviceHandle * devHandle,int32_t configuration)1332 int32_t RawSetConfiguration(const struct UsbDeviceHandle *devHandle, int32_t configuration)
1333 {
1334 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1335
1336 if (configuration < -1 || configuration > (int)0xFF) {
1337 HDF_LOGE("%{public}s: invalid param", __func__);
1338 return HDF_ERR_INVALID_PARAM;
1339 }
1340 if (!osAdapterOps->setConfiguration) {
1341 return HDF_ERR_NOT_SUPPORT;
1342 }
1343
1344 return osAdapterOps->setConfiguration((struct UsbDeviceHandle *)devHandle, configuration);
1345 }
1346
RawGetDescriptor(const struct UsbHostRequest * request,const struct UsbDeviceHandle * devHandle,const struct UsbRawDescriptorParam * param,const unsigned char * data)1347 int32_t RawGetDescriptor(const struct UsbHostRequest *request, const struct UsbDeviceHandle *devHandle,
1348 const struct UsbRawDescriptorParam *param, const unsigned char *data)
1349 {
1350 int32_t ret;
1351 struct UsbControlRequestData requestData;
1352
1353 if (request == NULL || devHandle == NULL || param == NULL || data == NULL) {
1354 HDF_LOGE("%{public}s:%{public}d param is NULL!", __func__, __LINE__);
1355 return HDF_ERR_INVALID_PARAM;
1356 }
1357
1358 requestData.requestType = USB_PIPE_DIRECTION_IN;
1359 requestData.requestCmd = USB_REQUEST_GET_DESCRIPTOR;
1360 requestData.value = (uint16_t)((param->descType << BYTE_LENGTH) | param->descIndex);
1361 requestData.index = 0;
1362 requestData.data = (unsigned char *)data;
1363 requestData.length = (uint16_t)param->length;
1364 requestData.timeout = USB_RAW_REQUEST_DEFAULT_TIMEOUT;
1365 ret = RawSendControlRequest((struct UsbHostRequest *)request, devHandle, &requestData);
1366
1367 return ret;
1368 }
1369
RawGetDevice(const struct UsbDeviceHandle * devHandle)1370 struct UsbDevice *RawGetDevice(const struct UsbDeviceHandle *devHandle)
1371 {
1372 if (devHandle == NULL) {
1373 HDF_LOGE("%{public}s: invalid param", __func__);
1374 return NULL;
1375 }
1376
1377 return devHandle->dev;
1378 }
1379
RawGetDeviceDescriptor(const struct UsbDevice * dev,struct UsbDeviceDescriptor * desc)1380 int32_t RawGetDeviceDescriptor(const struct UsbDevice *dev, struct UsbDeviceDescriptor *desc)
1381 {
1382 if (dev == NULL || desc == NULL || sizeof(dev->deviceDescriptor) != USB_DDK_DT_DEVICE_SIZE) {
1383 HDF_LOGE("%{public}s: struct UsbDeviceDescriptor is not expected size", __func__);
1384 return HDF_ERR_INVALID_PARAM;
1385 }
1386
1387 *desc = dev->deviceDescriptor;
1388 return HDF_SUCCESS;
1389 }
1390
RawAttachKernelDriver(struct UsbDeviceHandle * devHandle,uint8_t interfaceNumber)1391 void RawAttachKernelDriver(struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber)
1392 {
1393 if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES) {
1394 HDF_LOGE("%{public}s param is NULL or interfaceNumber = %{public}d is out of range", __func__, interfaceNumber);
1395 return;
1396 }
1397
1398 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1399 if (osAdapterOps->attachKernelDriver == NULL) {
1400 HDF_LOGE("%{public}s: releaseInterface not support", __func__);
1401 return;
1402 }
1403
1404 OsalMutexLock(&devHandle->lock);
1405 osAdapterOps->attachKernelDriver(devHandle, interfaceNumber);
1406 OsalMutexUnlock(&devHandle->lock);
1407 return;
1408 }
1409
RawReleaseInterface(struct UsbDeviceHandle * devHandle,int32_t interfaceNumber)1410 int32_t RawReleaseInterface(struct UsbDeviceHandle *devHandle, int32_t interfaceNumber)
1411 {
1412 int32_t ret;
1413 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1414
1415 if (devHandle == NULL || interfaceNumber < 0 || interfaceNumber >= USB_MAXINTERFACES) {
1416 HDF_LOGE(
1417 "%{public}s:%{public}d param is NULL or interfaceNumber = %{public}d is out of range",
1418 __func__, __LINE__, interfaceNumber);
1419 return HDF_ERR_INVALID_PARAM;
1420 }
1421
1422 OsalMutexLock(&devHandle->lock);
1423 if (!(devHandle->claimedInterfaces & (1U << (uint32_t)interfaceNumber))) {
1424 ret = HDF_ERR_BAD_FD;
1425 goto OUT;
1426 }
1427
1428 if (!osAdapterOps->releaseInterface) {
1429 ret = HDF_ERR_NOT_SUPPORT;
1430 goto OUT;
1431 }
1432
1433 ret = osAdapterOps->releaseInterface(devHandle, (unsigned int)interfaceNumber);
1434 if (ret == HDF_SUCCESS) {
1435 devHandle->claimedInterfaces &= ~(1U << (uint32_t)interfaceNumber);
1436 }
1437
1438 OUT:
1439 OsalMutexUnlock(&devHandle->lock);
1440
1441 return ret;
1442 }
1443
RawResetDevice(const struct UsbDeviceHandle * devHandle)1444 int32_t RawResetDevice(const struct UsbDeviceHandle *devHandle)
1445 {
1446 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1447
1448 if (!osAdapterOps->resetDevice) {
1449 return HDF_ERR_NOT_SUPPORT;
1450 }
1451
1452 return osAdapterOps->resetDevice(devHandle);
1453 }
1454
RawSubmitRequest(const struct UsbHostRequest * request)1455 int32_t RawSubmitRequest(const struct UsbHostRequest *request)
1456 {
1457 int32_t ret;
1458 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1459
1460 if (request == NULL) {
1461 HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
1462 return HDF_ERR_INVALID_PARAM;
1463 }
1464
1465 if (!osAdapterOps->submitRequest) {
1466 return HDF_ERR_NOT_SUPPORT;
1467 }
1468
1469 ret = osAdapterOps->submitRequest((struct UsbHostRequest *)request);
1470 if (ret != HDF_SUCCESS) {
1471 HDF_LOGE("%{public}s:%{public}d ret = %{public}d", __func__, __LINE__, ret);
1472 }
1473
1474 return ret;
1475 }
1476
RawCancelRequest(const struct UsbHostRequest * request)1477 int32_t RawCancelRequest(const struct UsbHostRequest *request)
1478 {
1479 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1480
1481 if (!osAdapterOps->cancelRequest) {
1482 return HDF_ERR_NOT_SUPPORT;
1483 }
1484
1485 return osAdapterOps->cancelRequest((struct UsbHostRequest *)request);
1486 }
1487
RawHandleRequest(const struct UsbDeviceHandle * devHandle)1488 int32_t RawHandleRequest(const struct UsbDeviceHandle *devHandle)
1489 {
1490 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1491 int32_t ret;
1492
1493 if (!osAdapterOps->urbCompleteHandle) {
1494 return HDF_ERR_NOT_SUPPORT;
1495 }
1496
1497 ret = osAdapterOps->urbCompleteHandle(devHandle);
1498 if (ret < 0) {}
1499
1500 return ret;
1501 }
1502
RawClearHalt(const struct UsbDeviceHandle * devHandle,uint8_t pipeAddress)1503 int32_t RawClearHalt(const struct UsbDeviceHandle *devHandle, uint8_t pipeAddress)
1504 {
1505 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1506 unsigned int endPoint = pipeAddress;
1507
1508 if (osAdapterOps->clearHalt == NULL) {
1509 return HDF_ERR_NOT_SUPPORT;
1510 }
1511
1512 return osAdapterOps->clearHalt(devHandle, endPoint);
1513 }
1514
RawHandleRequestCompletion(struct UsbHostRequest * request,UsbRequestStatus status)1515 int32_t RawHandleRequestCompletion(struct UsbHostRequest *request, UsbRequestStatus status)
1516 {
1517 if (request == NULL) {
1518 HDF_LOGE("%{public}s:%{public}d request is NULL!", __func__, __LINE__);
1519 return HDF_ERR_INVALID_PARAM;
1520 }
1521
1522 request->status = status;
1523 if (request->callback) {
1524 request->callback((void *)request);
1525 }
1526
1527 return HDF_SUCCESS;
1528 }
1529
RawSetInterfaceAltsetting(const struct UsbDeviceHandle * devHandle,uint8_t interfaceNumber,uint8_t settingIndex)1530 int32_t RawSetInterfaceAltsetting(
1531 const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber, uint8_t settingIndex)
1532 {
1533 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1534
1535 if (osAdapterOps->setInterfaceAltsetting == NULL) {
1536 return HDF_ERR_NOT_SUPPORT;
1537 }
1538
1539 return osAdapterOps->setInterfaceAltsetting(devHandle, interfaceNumber, settingIndex);
1540 }
1541
RawGetTid(void)1542 UsbRawTidType RawGetTid(void)
1543 {
1544 return UsbAdapterGetTid();
1545 }
1546
RawRegisterSignal(void)1547 int32_t RawRegisterSignal(void)
1548 {
1549 return UsbAdapterRegisterSignal();
1550 }
1551
RawKillSignal(struct UsbDeviceHandle * devHandle,UsbRawTidType tid)1552 int32_t RawKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid)
1553 {
1554 return UsbAdapterKillSignal(devHandle, tid);
1555 }
1556
RawInitPnpService(enum UsbPnpNotifyServiceCmd cmdType,struct UsbPnpAddRemoveInfo infoData)1557 int32_t RawInitPnpService(enum UsbPnpNotifyServiceCmd cmdType, struct UsbPnpAddRemoveInfo infoData)
1558 {
1559 if (cmdType != USB_PNP_NOTIFY_ADD_INTERFACE && cmdType != USB_PNP_NOTIFY_REMOVE_INTERFACE) {
1560 HDF_LOGE("%{public}s:%{public}d invalid param cmdType", __func__, __LINE__);
1561 return HDF_ERR_INVALID_PARAM;
1562 }
1563
1564 int32_t ret;
1565 struct HdfIoService *serv = HdfIoServiceBind(USB_HOST_PNP_SERVICE_NAME);
1566 if (serv == NULL || serv->dispatcher == NULL || serv->dispatcher->Dispatch == NULL) {
1567 ret = HDF_FAILURE;
1568 HDF_LOGE("%{public}s:%d failed to get service %s", __func__, __LINE__, USB_HOST_PNP_SERVICE_NAME);
1569 return ret;
1570 }
1571
1572 struct HdfSBuf *pnpData = HdfSbufObtainDefaultSize();
1573 struct HdfSBuf *pnpReply = HdfSbufObtainDefaultSize();
1574 if (pnpData == NULL || pnpReply == NULL) {
1575 ret = HDF_FAILURE;
1576 HDF_LOGE("%{public}s:%{public}d GetService err", __func__, __LINE__);
1577 goto ERR_SBUF;
1578 }
1579
1580 if (!HdfSbufWriteBuffer(pnpData, (const void *)(&infoData), sizeof(struct UsbPnpAddRemoveInfo))) {
1581 HDF_LOGE("%{public}s:%{public}d sbuf write infoData failed", __func__, __LINE__);
1582 ret = HDF_FAILURE;
1583 goto OUT;
1584 }
1585
1586 ret = serv->dispatcher->Dispatch(&serv->object, cmdType, pnpData, pnpReply);
1587 if (ret != HDF_SUCCESS) {
1588 HDF_LOGE("%{public}s:%{public}d Dispatch USB_PNP_NOTIFY_REMOVE_TEST failed ret = %{public}d",
1589 __func__, __LINE__, ret);
1590 goto OUT;
1591 }
1592
1593 int32_t replyData = 0;
1594 if (!HdfSbufReadInt32(pnpReply, &replyData)) {
1595 HDF_LOGE("%{public}s:HdfSbufReadInt32 failed", __func__);
1596 ret = HDF_FAILURE;
1597 goto OUT;
1598 }
1599 if (replyData != INT32_MAX) {
1600 HDF_LOGE("%{public}s:%{public}d cmdType = %{public}d reply failed", __func__, __LINE__, cmdType);
1601 ret = HDF_FAILURE;
1602 goto OUT;
1603 }
1604 ret = HDF_SUCCESS;
1605 HDF_LOGI("%{public}s:%{public}d cmdType = %{public}d reply success", __func__, __LINE__, cmdType);
1606
1607 OUT:
1608 HdfSbufRecycle(pnpData);
1609 HdfSbufRecycle(pnpReply);
1610 ERR_SBUF:
1611 HdfIoServiceRecycle(serv);
1612
1613 return ret;
1614 }
1615
RawRequestListInit(struct UsbDevice * deviceObj)1616 void RawRequestListInit(struct UsbDevice *deviceObj)
1617 {
1618 if (deviceObj == NULL) {
1619 HDF_LOGE("%{public}s:%{public}d deviceObj is NULL!", __func__, __LINE__);
1620 return;
1621 }
1622
1623 OsalMutexInit(&deviceObj->requestLock);
1624 HdfSListInit(&deviceObj->requestList);
1625 }
1626
RawUsbMemAlloc(size_t size)1627 void *RawUsbMemAlloc(size_t size)
1628 {
1629 return RawUsbMemCalloc(size);
1630 }
1631
RawUsbMemCalloc(size_t size)1632 void *RawUsbMemCalloc(size_t size)
1633 {
1634 if (size == 0) {
1635 HDF_LOGE("%{public}s:%{public}d size is 0", __func__, __LINE__);
1636 return NULL;
1637 }
1638
1639 void *buf = OsalMemCalloc(size);
1640 if (buf == NULL) {
1641 HDF_LOGE("%{public}s: %{public}d, OsalMemCalloc failed", __func__, __LINE__);
1642 return NULL;
1643 }
1644
1645 return buf;
1646 }
1647
RawUsbMemFree(void * mem)1648 void RawUsbMemFree(void *mem)
1649 {
1650 if (mem == NULL) {
1651 HDF_LOGE("%{public}s:%{public}d mem is null.", __func__, __LINE__);
1652 return;
1653 }
1654
1655 if (mem != NULL) {
1656 OsalMemFree(mem);
1657 mem = NULL;
1658 }
1659 }
1660
RawGetInterfaceActiveStatus(struct UsbDeviceHandle * devHandle,uint32_t interfaceNumber)1661 bool RawGetInterfaceActiveStatus(struct UsbDeviceHandle *devHandle, uint32_t interfaceNumber)
1662 {
1663 struct UsbOsAdapterOps *osAdapterOps = UsbAdapterGetOps();
1664 if (devHandle == NULL || interfaceNumber >= USB_MAXINTERFACES || osAdapterOps->claimInterface == NULL) {
1665 HDF_LOGE("%{public}s:%{public}d HDF_ERR_INVALID_PARAM", __func__, __LINE__);
1666 return false;
1667 }
1668 HDF_LOGI("interfaceNumber = %{public}u", interfaceNumber);
1669
1670 OsalMutexLock(&devHandle->lock);
1671 bool ret = osAdapterOps->getInterfaceActiveStatus(devHandle, interfaceNumber);
1672 OsalMutexUnlock(&devHandle->lock);
1673 return ret;
1674 }
1675
RawUsbCloseCtlProcess(const UsbInterfaceHandle * interfaceHandle)1676 int32_t RawUsbCloseCtlProcess(const UsbInterfaceHandle *interfaceHandle)
1677 {
1678 return UsbCloseCtlProcess(interfaceHandle);
1679 }