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