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 }