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