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