• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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