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