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