1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "adapter_if.h"
17 #include <dirent.h>
18 #include <endian.h>
19 #include <fcntl.h>
20 #include <poll.h>
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/ioctl.h>
26 #include <sys/stat.h>
27 #include <sys/types.h>
28 #include <unistd.h>
29
30 #include "usb_handle.h"
31 #include "usbd_wrapper.h"
32
33 #define HDF_LOG_TAG adapter_if
34 #define SLEEP_TIME 100000
35 #define OPEN_CNT 30
36
UsbFnAdapterOpenFn(void)37 static int32_t UsbFnAdapterOpenFn(void)
38 {
39 int32_t i;
40 int32_t ep;
41 for (i = 0; i < OPEN_CNT; i++) {
42 ep = handle_open("/dev/fconfig");
43 if (ep > 0) {
44 break;
45 }
46 usleep(SLEEP_TIME);
47 }
48 if (ep < 0) {
49 HDF_LOGE("func not alloc!");
50 }
51 return ep;
52 }
53
UsbFnAdapterClosefn(int32_t fd)54 static int32_t UsbFnAdapterClosefn(int32_t fd)
55 {
56 if (fd < 0) {
57 return HDF_ERR_INVALID_PARAM;
58 }
59 return handle_close(fd);
60 }
61
UsbFnAdapterCreateFconfigString(struct FconfigString * const configString,const char * name)62 static int32_t UsbFnAdapterCreateFconfigString(struct FconfigString * const configString, const char *name)
63 {
64 if (configString == NULL || name == NULL) {
65 HDF_LOGE("%{public}s: configName is NULL", __func__);
66 return HDF_ERR_IO;
67 }
68
69 size_t strLen = strlen(name);
70 configString->len = (uint32_t)strLen;
71 configString->s = UsbFnMemCalloc(strLen + 1);
72 if (configString->s == NULL) {
73 HDF_LOGE("%{public}s: UsbFnMemCalloc failed!", __func__);
74 return HDF_ERR_MALLOC_FAIL;
75 }
76
77 int32_t ret = memcpy_s(configString->s, (strLen + 1), name, strLen);
78 if (ret != EOK) {
79 HDF_LOGE("%{public}s: memcpy_s failed!", __func__);
80 UsbFnMemFree(configString->s);
81 configString->s = NULL;
82 return HDF_ERR_MALLOC_FAIL;
83 }
84
85 *(configString->s + configString->len) = '\0';
86 return 0;
87 }
88
UsbFnAdapterWriteGadget(int32_t fd,int32_t cmd,struct FconfigString * gadgetName)89 static int32_t UsbFnAdapterWriteGadget(int32_t fd, int32_t cmd, struct FconfigString *gadgetName)
90 {
91 int32_t ret;
92
93 if (gadgetName == NULL) {
94 HDF_LOGE("%{public}s: udcName is NULL", __func__);
95 return HDF_ERR_IO;
96 }
97 ret = handle_ioctl(fd, cmd, gadgetName);
98 if (ret != 0) {
99 HDF_LOGE("%{public}s: ioctl failed!", __func__);
100 return HDF_ERR_IO;
101 }
102 return 0;
103 }
104
UsbFnAdapterWriteDevDesc(int32_t fd,struct FconfigString * const gadgetName,const struct UsbFnDeviceDesc * const descriptor)105 static int32_t UsbFnAdapterWriteDevDesc(
106 int32_t fd, struct FconfigString * const gadgetName, const struct UsbFnDeviceDesc * const descriptor)
107 {
108 struct FconfigDevDesc devDesc;
109
110 if (gadgetName == NULL || descriptor == NULL) {
111 HDF_LOGE("%{public}s: udcName is NULL", __func__);
112 return HDF_ERR_IO;
113 }
114
115 devDesc.gadgetName.len = gadgetName->len;
116 devDesc.gadgetName.s = gadgetName->s;
117 int32_t ret = memcpy_s(&devDesc.devDesc, sizeof(devDesc.devDesc), descriptor->deviceDesc, sizeof(devDesc.devDesc));
118 if (ret != EOK) {
119 HDF_LOGE("%{public}s: memcpy_s failed!", __func__);
120 return HDF_ERR_MALLOC_FAIL;
121 }
122
123 ret = handle_ioctl(fd, FCONFIG_CMD_WRITE_DEV_DESC, &devDesc);
124 if (ret != 0) {
125 HDF_LOGE("%{public}s: ioctl failed!", __func__);
126 return HDF_ERR_MALLOC_FAIL;
127 }
128
129 return 0;
130 }
131
UsbFnAdapterWriteDevString(int32_t fd,struct FconfigDevStrings * const devStrings,const struct UsbFnStrings * const usbFnString)132 static int32_t UsbFnAdapterWriteDevString(
133 int32_t fd, struct FconfigDevStrings * const devStrings, const struct UsbFnStrings * const usbFnString)
134 {
135 struct UsbString *usbString = NULL;
136 int32_t jCount;
137 int32_t ret;
138
139 devStrings->language = usbFnString->language;
140 devStrings->strCount = 0;
141 usbString = usbFnString->strings;
142 while (usbString->s) {
143 devStrings->strCount++;
144 usbString++;
145 }
146 devStrings->strings = UsbFnMemCalloc((devStrings->strCount + 1) * sizeof(struct FconfigUsbString));
147 if (devStrings->strings == NULL) {
148 HDF_LOGE("%{public}s: UsbFnMemCalloc failed!", __func__);
149 return HDF_ERR_MALLOC_FAIL;
150 }
151 devStrings->strings[devStrings->strCount].str.len = 0;
152 devStrings->strings[devStrings->strCount].str.s = NULL;
153 usbString = usbFnString->strings;
154 for (jCount = 0; jCount < (int)devStrings->strCount; jCount++) {
155 devStrings->strings[jCount].id = usbString[jCount].id;
156 ret = UsbFnAdapterCreateFconfigString(&devStrings->strings[jCount].str, usbString[jCount].s);
157 if (ret != HDF_SUCCESS) {
158 HDF_LOGE("%{public}s: create string failed!", __func__);
159 UsbFnMemFree(devStrings->strings[jCount].str.s);
160 goto FAIL;
161 }
162 }
163 ret = handle_ioctl(fd, FCONFIG_CMD_WRITE_STRINGS, devStrings);
164 if (ret != 0) {
165 HDF_LOGE("%{public}s: ioctl failed!", __func__);
166 goto FAIL;
167 }
168 for (jCount = 0; jCount < (int)devStrings->strCount; jCount++) {
169 UsbFnMemFree(devStrings->strings[jCount].str.s);
170 }
171 UsbFnMemFree(devStrings->strings);
172 return 0;
173 FAIL:
174 while ((--jCount) >= 0) {
175 UsbFnMemFree(devStrings->strings[jCount].str.s);
176 }
177 UsbFnMemFree(devStrings->strings);
178 return -1;
179 }
180
UsbFnAdapterWriteDevStrings(int32_t fd,struct FconfigString * const gadgetName,const struct UsbFnDeviceDesc * descriptor)181 static int32_t UsbFnAdapterWriteDevStrings(
182 int32_t fd, struct FconfigString * const gadgetName, const struct UsbFnDeviceDesc *descriptor)
183 {
184 if (gadgetName == NULL || descriptor == NULL) {
185 HDF_LOGE("%{public}s: udcName is NULL", __func__);
186 return HDF_ERR_IO;
187 }
188
189 struct FconfigDevStrings devStrings;
190 devStrings.gadgetName.len = gadgetName->len;
191 devStrings.gadgetName.s = gadgetName->s;
192 for (uint32_t iCount = 0; descriptor->deviceStrings[iCount]; iCount++) {
193 int32_t ret = UsbFnAdapterWriteDevString(fd, &devStrings, descriptor->deviceStrings[iCount]);
194 if (ret != 0) {
195 HDF_LOGE("%{public}s: UsbFnAdapterWriteDevString failed", __func__);
196 return HDF_ERR_IO;
197 }
198 }
199 return 0;
200 }
201
UsbFnAdapterFillConfigDesc(struct UsbConfigDescriptor * const cfgDesc,struct UsbFnConfiguration * const usbFnConfig)202 static int32_t UsbFnAdapterFillConfigDesc(
203 struct UsbConfigDescriptor * const cfgDesc, struct UsbFnConfiguration * const usbFnConfig)
204 {
205 if (cfgDesc == NULL || usbFnConfig == NULL) {
206 HDF_LOGE("%{public}s: name is NULL", __func__);
207 return HDF_ERR_IO;
208 }
209 cfgDesc->bConfigurationValue = usbFnConfig->configurationValue;
210 cfgDesc->bmAttributes = usbFnConfig->attributes;
211 cfgDesc->bMaxPower = usbFnConfig->maxPower;
212 cfgDesc->iConfiguration = usbFnConfig->iConfiguration;
213 return 0;
214 }
215
UsbFnAdapterOpenPipe(const char * funcName,int32_t epIndex)216 static int32_t UsbFnAdapterOpenPipe(const char *funcName, int32_t epIndex)
217 {
218 int32_t ret;
219 char epName[MAX_NAMELEN];
220 const char *pName = &epName[0];
221 int32_t i;
222 int32_t ep;
223 if (funcName == NULL || epIndex < 0) {
224 return HDF_ERR_INVALID_PARAM;
225 }
226
227 ret = snprintf_s(epName, MAX_NAMELEN, MAX_NAMELEN - 1, "/dev/%s/ep%d", funcName, epIndex);
228 if (ret < 0) {
229 HDF_LOGE("%{public}s: snprintf_s failed", __func__);
230 return HDF_ERR_IO;
231 }
232
233 for (i = 0; i < OPEN_CNT; i++) {
234 ep = handle_open(pName);
235 if (ep > 0) {
236 break;
237 }
238 usleep(SLEEP_TIME);
239 }
240 if (ep < 0) {
241 HDF_LOGE("unable to open %{public}s", epName);
242 return HDF_ERR_IO;
243 }
244 return ep;
245 }
246
UsbFnAdapterClosePipe(int32_t ep)247 static int32_t UsbFnAdapterClosePipe(int32_t ep)
248 {
249 if (ep < 0) {
250 return HDF_ERR_INVALID_PARAM;
251 }
252
253 return handle_close(ep);
254 }
255
GetHeaderStr(struct UsbFnStrings ** const strings,struct UsbFunctionfsStringsHead * headerStr)256 static void GetHeaderStr(struct UsbFnStrings ** const strings, struct UsbFunctionfsStringsHead *headerStr)
257 {
258 uint32_t i, j;
259 uint32_t langCount = 0;
260 uint32_t strCount = 0;
261 uint32_t len = 0;
262 for (i = 0; strings[i] != NULL; i++) {
263 langCount++;
264 for (j = 0; strings[i]->strings[j].s; j++) {
265 len += strlen(strings[i]->strings[j].s) + sizeof(char);
266 }
267 strCount = j;
268 }
269 headerStr->magic = htole32(FUNCTIONFS_STRINGS_MAGIC);
270 headerStr->length = htole32(sizeof(struct UsbFunctionfsStringsHead) + langCount * sizeof(uint16_t) + len);
271 headerStr->strCount = strCount;
272 headerStr->langCount = langCount;
273 }
274
UsbFnWriteStrings(int32_t ep0,struct UsbFnStrings ** const strings)275 static int32_t UsbFnWriteStrings(int32_t ep0, struct UsbFnStrings ** const strings)
276 {
277 uint8_t *str = NULL;
278 uint8_t *whereDec = NULL;
279 uint32_t i, j;
280 int32_t ret;
281 struct UsbFunctionfsStringsHead headerStr = {0};
282
283 GetHeaderStr(strings, &headerStr);
284 str = UsbFnMemCalloc(headerStr.length);
285 if (str == NULL) {
286 return HDF_ERR_MALLOC_FAIL;
287 }
288
289 whereDec = str;
290 ret = memcpy_s(whereDec, headerStr.length, &headerStr, sizeof(struct UsbFunctionfsStringsHead));
291 if (ret != EOK) {
292 goto ERR;
293 }
294 whereDec += sizeof(struct UsbFunctionfsStringsHead);
295
296 for (i = 0; i < headerStr.langCount; i++) {
297 ret = memcpy_s(whereDec, headerStr.length - (whereDec - str), &strings[i]->language, sizeof(uint16_t));
298 if (ret != EOK) {
299 goto ERR;
300 }
301 whereDec += sizeof(uint16_t);
302 for (j = 0; j < headerStr.strCount; j++) {
303 if (strlen(strings[i]->strings[j].s)) {
304 ret = memcpy_s(whereDec, headerStr.length - (whereDec - str), strings[i]->strings[j].s,
305 strlen(strings[i]->strings[j].s));
306 whereDec += strlen(strings[i]->strings[j].s) + sizeof(char);
307 } else {
308 break;
309 }
310 if (ret != EOK) {
311 goto ERR;
312 }
313 }
314 }
315
316 if (handle_write(ep0, str, headerStr.length) < 0) {
317 goto ERR;
318 }
319 UsbFnMemFree(str);
320 return 0;
321 ERR:
322 UsbFnMemFree(str);
323 return HDF_FAILURE;
324 }
325
GetCountAndHead(struct UsbFunctionfsDescsHeadV2 * header,uint32_t * fsCount,uint32_t * hsCount,uint32_t * ssCount,const struct UsbFnFunction * func)326 static void GetCountAndHead(struct UsbFunctionfsDescsHeadV2 *header, uint32_t *fsCount, uint32_t *hsCount,
327 uint32_t *ssCount, const struct UsbFnFunction *func)
328 {
329 int32_t i;
330 uint32_t lenCount = 0;
331 uint32_t lenDes = 0;
332 *fsCount = 0;
333 *hsCount = 0;
334 *ssCount = 0;
335
336 for (i = 0; func->fsDescriptors[i] != NULL; i++) {
337 (*fsCount)++;
338 lenDes += func->fsDescriptors[i]->bLength;
339 }
340 for (i = 0; func->hsDescriptors[i] != NULL; i++) {
341 (*hsCount)++;
342 lenDes += func->hsDescriptors[i]->bLength;
343 }
344 for (i = 0; func->ssDescriptors[i] != NULL; i++) {
345 (*ssCount)++;
346 lenDes += func->ssDescriptors[i]->bLength;
347 }
348
349 if (*fsCount) {
350 lenCount += sizeof(uint32_t);
351 header->flags |= htole32(FUNCTIONFS_HAS_FS_DESC);
352 }
353 if (*hsCount) {
354 lenCount += sizeof(uint32_t);
355 header->flags |= htole32(FUNCTIONFS_HAS_HS_DESC);
356 }
357 if (*ssCount) {
358 lenCount += sizeof(uint32_t);
359 header->flags |= htole32(FUNCTIONFS_HAS_SS_DESC);
360 }
361
362 header->magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2);
363 header->length = htole32(sizeof(struct UsbFunctionfsDescsHeadV2) + lenCount + lenDes);
364 }
365
WriteFuncDescriptors(uint8_t ** const whereDec,struct UsbDescriptorHeader ** const headDes)366 static int32_t WriteFuncDescriptors(uint8_t ** const whereDec, struct UsbDescriptorHeader ** const headDes)
367 {
368 for (uint32_t i = 0; headDes[i] != NULL; i++) {
369 if (memcpy_s(*whereDec, headDes[i]->bLength, headDes[i], headDes[i]->bLength) != EOK) {
370 HDF_LOGE("%{public}s: memcpy_s failed!", __func__);
371 return HDF_FAILURE;
372 }
373 *whereDec += headDes[i]->bLength;
374 }
375 return 0;
376 }
377
CopyCount(uint8_t ** whereDec,uint32_t fsCount,uint32_t hsCount,uint32_t ssCount)378 static int32_t CopyCount(uint8_t **whereDec, uint32_t fsCount, uint32_t hsCount, uint32_t ssCount)
379 {
380 int32_t ret;
381 if (fsCount) {
382 ret = memcpy_s(*whereDec, sizeof(uint32_t), &fsCount, sizeof(uint32_t));
383 if (ret != EOK) {
384 return HDF_FAILURE;
385 }
386 *whereDec += sizeof(uint32_t);
387 }
388 if (hsCount) {
389 ret = memcpy_s(*whereDec, sizeof(uint32_t), &hsCount, sizeof(uint32_t));
390 if (ret != EOK) {
391 return HDF_FAILURE;
392 }
393 *whereDec += sizeof(uint32_t);
394 }
395 if (ssCount) {
396 ret = memcpy_s(*whereDec, sizeof(uint32_t), &ssCount, sizeof(uint32_t));
397 if (ret != EOK) {
398 return HDF_FAILURE;
399 }
400 *whereDec += sizeof(uint32_t);
401 }
402
403 return 0;
404 }
405
UsbFnAdapterCreatPipes(int32_t ep0,const struct UsbFnFunction * func)406 static int32_t UsbFnAdapterCreatPipes(int32_t ep0, const struct UsbFnFunction *func)
407 {
408 uint8_t *dec = NULL;
409 uint8_t *whereDec = NULL;
410 int32_t ret;
411 uint32_t fsCount;
412 uint32_t hsCount;
413 uint32_t ssCount;
414 struct UsbFunctionfsDescsHeadV2 header = {0};
415
416 GetCountAndHead(&header, &fsCount, &hsCount, &ssCount, func);
417
418 dec = UsbFnMemCalloc(header.length);
419 if (dec == NULL) {
420 HDF_LOGE("%{public}s: UsbFnMemCalloc failed!", __func__);
421 return HDF_ERR_MALLOC_FAIL;
422 }
423 whereDec = dec;
424
425 ret = memcpy_s(whereDec, header.length, &header, sizeof(struct UsbFunctionfsDescsHeadV2));
426 if (ret != EOK) {
427 UsbFnMemFree(dec);
428 return HDF_FAILURE;
429 }
430 whereDec += sizeof(struct UsbFunctionfsDescsHeadV2);
431
432 ret = CopyCount(&whereDec, fsCount, hsCount, ssCount);
433 if (ret != EOK) {
434 UsbFnMemFree(dec);
435 return HDF_FAILURE;
436 }
437
438 ret = WriteFuncDescriptors(&whereDec, func->fsDescriptors);
439 if (ret != EOK) {
440 UsbFnMemFree(dec);
441 return HDF_FAILURE;
442 }
443
444 ret = WriteFuncDescriptors(&whereDec, func->hsDescriptors);
445 if (ret != EOK) {
446 UsbFnMemFree(dec);
447 return HDF_FAILURE;
448 }
449
450 ret = WriteFuncDescriptors(&whereDec, func->ssDescriptors);
451 if (ret != EOK) {
452 UsbFnMemFree(dec);
453 return HDF_FAILURE;
454 }
455
456 if (handle_write(ep0, dec, header.length) < 0) {
457 HDF_LOGE("unable do write descriptors");
458 UsbFnMemFree(dec);
459 return HDF_ERR_IO;
460 }
461
462 UsbFnMemFree(dec);
463 ret = UsbFnWriteStrings(ep0, func->strings);
464 return ret;
465 }
466
UsbFnAdapterPipeCreateAndClose(int32_t fdEp0,struct UsbFnConfiguration * const usbFnConfig,int32_t iCount)467 void UsbFnAdapterPipeCreateAndClose(int32_t fdEp0, struct UsbFnConfiguration * const usbFnConfig, int32_t iCount)
468 {
469 if (UsbFnAdapterCreatPipes(fdEp0, usbFnConfig->functions[iCount]) != HDF_SUCCESS) {
470 goto FAIL2;
471 }
472
473 if (UsbFnAdapterClosePipe(fdEp0) != HDF_SUCCESS) {
474 goto FAIL2;
475 }
476 FAIL2:
477 UsbFnAdapterClosePipe(fdEp0);
478 }
479
UsbFnAdapterWriteFunctions(int32_t fd,struct UsbFnConfiguration * const usbFnConfig,int32_t cmd,struct FconfigString * const gadgetName,struct FconfigString * const configName)480 static int32_t UsbFnAdapterWriteFunctions(int32_t fd, struct UsbFnConfiguration * const usbFnConfig, int32_t cmd,
481 struct FconfigString * const gadgetName, struct FconfigString * const configName)
482 {
483 if (usbFnConfig == NULL || gadgetName == NULL || configName == NULL) {
484 HDF_LOGE("%{public}s: usbFnConfig is NULL", __func__);
485 return HDF_ERR_IO;
486 }
487
488 int32_t fdEp0;
489 struct FconfigFuncInfo funcInfo;
490 funcInfo.gadgetName.len = gadgetName->len;
491 funcInfo.gadgetName.s = gadgetName->s;
492 funcInfo.configName.len = configName->len;
493 funcInfo.configName.s = configName->s;
494 for (uint32_t iCount = 0; usbFnConfig->functions[iCount] != NULL; iCount++) {
495 char tmp[MAX_PATHLEN];
496 if (memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN) != EOK) {
497 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
498 return HDF_FAILURE;
499 }
500 int32_t ret =
501 snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "generic.%s", usbFnConfig->functions[iCount]->funcName);
502 if (ret < 0) {
503 return HDF_ERR_IO;
504 }
505 ret = UsbFnAdapterCreateFconfigString(&funcInfo.funcName, tmp);
506 if (ret != HDF_SUCCESS) {
507 return HDF_ERR_MALLOC_FAIL;
508 }
509 if (handle_ioctl(fd, cmd, &funcInfo) != 0) {
510 goto FAIL;
511 }
512 UsbFnMemFree(funcInfo.funcName.s);
513 if (cmd == FCONFIG_CMD_DROP_FUNCTION) {
514 continue;
515 }
516
517 fdEp0 = UsbFnAdapterOpenPipe(usbFnConfig->functions[iCount]->funcName, 0);
518 if (fd < 0) {
519 goto FAIL;
520 }
521 UsbFnAdapterPipeCreateAndClose(fdEp0, usbFnConfig, iCount);
522 }
523 return 0;
524 FAIL:
525 UsbFnMemFree(funcInfo.funcName.s);
526 return -1;
527 }
528
UsbFnAdapterWriteConfigs(int32_t fd,struct FconfigString * const gadgetName,const struct UsbFnDeviceDesc * const descriptor)529 static int32_t UsbFnAdapterWriteConfigs(
530 int32_t fd, struct FconfigString * const gadgetName, const struct UsbFnDeviceDesc * const descriptor)
531 {
532 struct FconfigCfgDesc configDesc;
533 char tmp[MAX_PATHLEN];
534
535 if (gadgetName == NULL || descriptor == NULL || descriptor->configs == NULL) {
536 HDF_LOGE("%{public}s: name is NULL", __func__);
537 return HDF_ERR_IO;
538 }
539 for (uint32_t iCount = 0; descriptor->configs[iCount]; iCount++) {
540 configDesc.gadgetName.len = gadgetName->len;
541 configDesc.gadgetName.s = gadgetName->s;
542 uint8_t confVal = descriptor->configs[iCount]->configurationValue;
543 if (memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN) != EOK) {
544 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
545 return HDF_FAILURE;
546 }
547 int32_t ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "b.%u", confVal);
548 if (ret < 0) {
549 return HDF_ERR_IO;
550 }
551 ret = UsbFnAdapterCreateFconfigString(&configDesc.configName, tmp);
552 if (ret != HDF_SUCCESS) {
553 HDF_LOGE("%{public}s: create config name failed!", __func__);
554 return HDF_ERR_MALLOC_FAIL;
555 }
556 ret = UsbFnAdapterFillConfigDesc(&configDesc.cfgDesc, descriptor->configs[iCount]);
557 if (ret != HDF_SUCCESS) {
558 HDF_LOGE("%{public}s: UsbFnMemCalloc failed!", __func__);
559 return HDF_ERR_MALLOC_FAIL;
560 }
561 ret = handle_ioctl(fd, FCONFIG_CMD_ADD_CONFIG, &configDesc);
562 if (ret != HDF_SUCCESS) {
563 HDF_LOGE("%{public}s: ioctl failed!", __func__);
564 return HDF_ERR_MALLOC_FAIL;
565 }
566 ret = UsbFnAdapterWriteFunctions(
567 fd, descriptor->configs[iCount], FCONFIG_CMD_MAKE_FUNCTION, gadgetName, &configDesc.configName);
568 if (ret != HDF_SUCCESS) {
569 HDF_LOGE("%{public}s: write func failed!", __func__);
570 return HDF_ERR_MALLOC_FAIL;
571 }
572 UsbFnMemFree(configDesc.configName.s);
573 }
574 return 0;
575 }
576
UsbFnAdapterWriteFcofnigUDC(int32_t fd,int32_t cmd,struct FconfigString * const gadgetName,const char * udcName)577 static int32_t UsbFnAdapterWriteFcofnigUDC(
578 int32_t fd, int32_t cmd, struct FconfigString * const gadgetName, const char *udcName)
579 {
580 int32_t ret;
581 struct FconfigUdcInfo udcInfo;
582
583 if (gadgetName == NULL || udcName == NULL) {
584 return HDF_ERR_INVALID_PARAM;
585 }
586 udcInfo.gadgetName.len = gadgetName->len;
587 udcInfo.gadgetName.s = gadgetName->s;
588 ret = UsbFnAdapterCreateFconfigString(&udcInfo.udcName, udcName);
589 if (ret != HDF_SUCCESS) {
590 HDF_LOGE("%{public}s: create udc_name failed!", __func__);
591 return HDF_ERR_IO;
592 }
593 ret = handle_ioctl(fd, cmd, &udcInfo);
594 if (ret != 0) {
595 HDF_LOGE("%{public}s: ioctl failed!", __func__);
596 }
597 UsbFnMemFree(udcInfo.udcName.s);
598
599 return ret;
600 }
601
UsbFnAdapterCreateDevice(const char * udcName,const char * devName,struct UsbFnDeviceDesc * descriptor)602 static int32_t UsbFnAdapterCreateDevice(const char *udcName, const char *devName, struct UsbFnDeviceDesc *descriptor)
603 {
604 int32_t fd;
605 int32_t ret;
606 struct FconfigString gadgetName;
607
608 fd = UsbFnAdapterOpenFn();
609 if (fd < 0) {
610 return HDF_ERR_IO;
611 }
612 ret = UsbFnAdapterCreateFconfigString(&gadgetName, devName);
613 if (ret != HDF_SUCCESS) {
614 HDF_LOGE("%{public}s: create gadget name failed!", __func__);
615 goto FAIL;
616 }
617 ret = UsbFnAdapterWriteGadget(fd, FCONFIG_CMD_MAKE_GADGET, &gadgetName);
618 if (ret != HDF_SUCCESS) {
619 dprintf("%s: UsbFnAdapterWriteGadget failed!", __func__);
620 goto EXIT;
621 }
622 ret = UsbFnAdapterWriteDevDesc(fd, &gadgetName, descriptor);
623 if (ret != HDF_SUCCESS) {
624 dprintf("%s: UsbFnAdapterWriteDevDesc failed!", __func__);
625 goto EXIT;
626 }
627 ret = UsbFnAdapterWriteDevStrings(fd, &gadgetName, descriptor);
628 if (ret != HDF_SUCCESS) {
629 dprintf("%s: UsbFnAdapterWriteDevStrings failed!", __func__);
630 goto EXIT;
631 }
632 ret = UsbFnAdapterWriteConfigs(fd, &gadgetName, descriptor);
633 if (ret != HDF_SUCCESS) {
634 dprintf("%s: UsbFnAdapterWriteConfigs failed!", __func__);
635 goto EXIT;
636 }
637 ret = UsbFnAdapterWriteFcofnigUDC(fd, FCONFIG_CMD_ENABLE_UDC, &gadgetName, udcName);
638 if (ret != HDF_SUCCESS) {
639 dprintf("%s: UsbFnAdapterWriteFcofnigUDC failed!", __func__);
640 goto EXIT;
641 }
642 dprintf("%s: create device success!\n", __func__);
643 EXIT:
644 UsbFnMemFree(gadgetName.s);
645 FAIL:
646 if (UsbFnAdapterClosefn(fd) != 0) {
647 dprintf("%s[%d] close fconfig failed\n", __func__, __LINE__);
648 }
649
650 return ret;
651 }
652
UsbFnAdapterDelConfigs(int32_t configFd,struct FconfigString * const gadgetName,struct UsbFnDeviceDesc * const descriptor)653 static int32_t UsbFnAdapterDelConfigs(
654 int32_t configFd, struct FconfigString * const gadgetName, struct UsbFnDeviceDesc * const descriptor)
655 {
656 struct FconfigCfgDesc configDesc;
657 struct FconfigString configName;
658 char tmp[MAX_PATHLEN];
659 int32_t ret;
660 int32_t iCount;
661 uint8_t confVal;
662
663 if (gadgetName == NULL || descriptor == NULL) {
664 HDF_LOGE("%{public}s: name is NULL", __func__);
665 return HDF_ERR_INVALID_PARAM;
666 }
667 for (iCount = 0; descriptor->configs[iCount]; iCount++) {
668 configDesc.gadgetName.len = gadgetName->len;
669 configDesc.gadgetName.s = gadgetName->s;
670 confVal = descriptor->configs[iCount]->configurationValue;
671 ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "b.%u", confVal);
672 if (ret < 0) {
673 HDF_LOGE("%{public}s: snprintf_s failed", __func__);
674 return HDF_ERR_IO;
675 }
676 ret = UsbFnAdapterCreateFconfigString(&configName, tmp);
677 if (ret != HDF_SUCCESS) {
678 HDF_LOGE("%{public}s: create config name failed!", __func__);
679 return HDF_ERR_MALLOC_FAIL;
680 }
681 configDesc.configName.len = configName.len;
682 configDesc.configName.s = configName.s;
683 ret = UsbFnAdapterWriteFunctions(
684 configFd, descriptor->configs[iCount], FCONFIG_CMD_DROP_FUNCTION, gadgetName, &configName);
685 if (ret != HDF_SUCCESS) {
686 HDF_LOGE("%{public}s: write func failed!", __func__);
687 goto FAIL;
688 }
689 ret = UsbFnAdapterFillConfigDesc(&configDesc.cfgDesc, descriptor->configs[iCount]);
690 if (ret != HDF_SUCCESS) {
691 HDF_LOGE("%{public}s: UsbFnMemCalloc failed!", __func__);
692 goto FAIL;
693 }
694 ret = handle_ioctl(configFd, FCONFIG_CMD_REMOVE_CONFIG, &configDesc);
695 if (ret != HDF_SUCCESS) {
696 HDF_LOGE("%{public}s: ioctl failed!", __func__);
697 goto FAIL;
698 }
699 UsbFnMemFree(configName.s);
700 }
701 return 0;
702 FAIL:
703 UsbFnMemFree(configName.s);
704 return -1;
705 }
706
UsbFnAdapterDelDevice(const char * devName,const char * udcName,struct UsbFnDeviceDesc * descriptor)707 static int32_t UsbFnAdapterDelDevice(const char *devName, const char *udcName, struct UsbFnDeviceDesc *descriptor)
708 {
709 int32_t configFd;
710 int32_t ret;
711 struct FconfigString gadgetName;
712
713 if (devName == NULL || udcName == NULL || descriptor == NULL) {
714 return HDF_ERR_INVALID_PARAM;
715 }
716 configFd = UsbFnAdapterOpenFn();
717 if (configFd <= 0) {
718 return HDF_ERR_IO;
719 }
720 ret = UsbFnAdapterCreateFconfigString(&gadgetName, devName);
721 if (ret != HDF_SUCCESS) {
722 HDF_LOGE("%{public}s: create gadget_name failed!", __func__);
723 return HDF_ERR_IO;
724 }
725 ret = UsbFnAdapterWriteFcofnigUDC(configFd, FCONFIG_CMD_DISABLE_UDC, &gadgetName, udcName);
726 if (ret != HDF_SUCCESS) {
727 goto FAIL;
728 }
729 ret = UsbFnAdapterDelConfigs(configFd, &gadgetName, descriptor);
730 if (ret != HDF_SUCCESS) {
731 goto FAIL;
732 }
733 ret = UsbFnAdapterWriteGadget(configFd, FCONFIG_CMD_DROP_GADGET, &gadgetName);
734 if (ret != HDF_SUCCESS) {
735 goto FAIL;
736 }
737 ret = UsbFnAdapterClosefn(configFd);
738
739 FAIL:
740 UsbFnMemFree(gadgetName.s);
741 return ret;
742 }
743
UsbFnAdapterGetPipeInfo(int32_t ep,struct UsbFnPipeInfo * const pipeInfo)744 static int32_t UsbFnAdapterGetPipeInfo(int32_t ep, struct UsbFnPipeInfo * const pipeInfo)
745 {
746 if (ep <= 0 || pipeInfo == NULL) {
747 return HDF_ERR_INVALID_PARAM;
748 }
749
750 struct usb_endpoint_descriptor desc;
751 if (memset_s(&desc, sizeof(desc), 0, sizeof(desc)) != EOK) {
752 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
753 return HDF_FAILURE;
754 }
755
756 int32_t ret = handle_ioctl(ep, GENERIC_CMD_GET_PIPE_INFO, &desc);
757 if (ret != HDF_SUCCESS) {
758 HDF_LOGE("%{public}s: FUNCTIONFS_ENDPOINT_DESC failed!", __func__);
759 return HDF_ERR_IO;
760 }
761
762 pipeInfo->type = desc.bmAttributes;
763 pipeInfo->dir = USB_PIPE_DIRECTION_OUT;
764 if (desc.bEndpointAddress & 0x80) {
765 pipeInfo->dir = USB_PIPE_DIRECTION_IN;
766 }
767
768 pipeInfo->maxPacketSize = (desc.wMaxPacketSize[0] | (desc.wMaxPacketSize[1] << 8));
769 pipeInfo->interval = desc.bInterval;
770
771 return 0;
772 }
773
UsbFnAdapterQueueInit(int32_t ep)774 static int32_t UsbFnAdapterQueueInit(int32_t ep)
775 {
776 (void)ep;
777 return 0;
778 }
779
UsbFnAdapterQueueDel(int32_t ep)780 static int32_t UsbFnAdapterQueueDel(int32_t ep)
781 {
782 (void)ep;
783 return 0;
784 }
785
UsbFnAdapterReleaseBuf(int32_t ep,const struct GenericMemory * mem)786 static int32_t UsbFnAdapterReleaseBuf(int32_t ep, const struct GenericMemory *mem)
787 {
788 return handle_ioctl(ep, GENERIC_CMD_FREE_MEM, &mem);
789 }
790
UsbFnAdapterPipeIo(int32_t ep,struct IoData * const ioData)791 static int32_t UsbFnAdapterPipeIo(int32_t ep, struct IoData * const ioData)
792 {
793 int32_t ret;
794 if (ep <= 0 || ioData == NULL) {
795 return HDF_ERR_INVALID_PARAM;
796 }
797 if (ioData->aio) {
798 ret = handle_write(ep, (void *)ioData->buf, ioData->len);
799 } else {
800 ret = handle_ioctl(ep, GENERIC_CMD_ENDPOINT_IO, ioData);
801 }
802 return ret;
803 }
804
UsbFnAdapterCancelIo(int32_t ep,const struct IoData * const ioData)805 static int32_t UsbFnAdapterCancelIo(int32_t ep, const struct IoData * const ioData)
806 {
807 struct GenericMemory mem;
808
809 mem.buf = ioData->buf;
810 mem.size = ioData->len;
811
812 return handle_ioctl(ep, GENERIC_CMD_CANCEL_REQUEST, &mem);
813 }
814
UsbFnAdapterRequestGetStatus(int32_t ep,const struct IoData * ioData)815 static int32_t UsbFnAdapterRequestGetStatus(int32_t ep, const struct IoData *ioData)
816 {
817 if (ep <= 0 || ioData == NULL) {
818 return HDF_ERR_INVALID_PARAM;
819 }
820 return handle_ioctl(ep, GENERIC_CMD_GET_REQ_STATUS, (void *)ioData);
821 }
822
UsbFnAdapterMapAddr(int32_t ep,uint32_t len)823 static uint8_t *UsbFnAdapterMapAddr(int32_t ep, uint32_t len)
824 {
825 return handle_mmap(ep, len);
826 }
827
UsbFnAdapterUnmapAddr(uint8_t * mapAddr,uint32_t len)828 static int32_t UsbFnAdapterUnmapAddr(uint8_t *mapAddr, uint32_t len)
829 {
830 (void)mapAddr;
831 (void)len;
832 return 0;
833 }
834
Ep0Event(struct UsbFnEventAll * const event,struct FconfigPollFd * const pfds)835 static int32_t Ep0Event(struct UsbFnEventAll * const event, struct FconfigPollFd * const pfds)
836 {
837 int32_t ret;
838 uint8_t i;
839 for (i = 0; i < event->ep0Num; i++) {
840 if (pfds[i].revents & POLLIN) {
841 ret = handle_read(event->ep0[i], &event->ep0Event[i].ctrlEvent, sizeof(struct UsbFnCtrlEvent));
842 if (ret < 0) {
843 HDF_LOGE("unable to read event from ep0");
844 return ret;
845 }
846 event->ep0Event[i].type = USB_EP0_CTRL_EVENT;
847 } else if (pfds[i].revents & POLLOUT) {
848 ret = handle_ioctl(event->ep0[i], GENERIC_CMD_GET_EP0_EVENT, &event->ep0Event[i].reqEvent);
849 if (ret < 0) {
850 HDF_LOGE("unable to read reqEvent from ep0");
851 return ret;
852 }
853 event->ep0Event[i].type = USB_EP0_IO_COMPLETED;
854 }
855 }
856 return 0;
857 }
858
EpEvent(struct UsbFnEventAll * const event,struct FconfigPollFd * const pfds)859 static int32_t EpEvent(struct UsbFnEventAll * const event, struct FconfigPollFd * const pfds)
860 {
861 uint8_t i;
862 int32_t ret;
863 for (i = 0; i < event->epNum; i++) {
864 if ((pfds[i + event->ep0Num].revents & POLLIN)) {
865 ret = handle_read(event->epx[i], event->reqEvent[i], MAX_REQUEST * sizeof(struct UsbFnReqEvent));
866 if (ret < 0) {
867 HDF_LOGE("unable to read event from eps");
868 return ret;
869 }
870 event->numEvent[i] = (uint8_t)(ret / sizeof(struct UsbFnReqEvent));
871 }
872 }
873 return 0;
874 }
875
UsbFnAdapterPollEvent(struct UsbFnEventAll * event,int32_t timeout)876 static int32_t UsbFnAdapterPollEvent(struct UsbFnEventAll *event, int32_t timeout)
877 {
878 uint8_t i;
879 struct FconfigPollFd pfds[16] = {0};
880 struct FconfigPollFd *pfd = &pfds[0];
881 if (event == NULL) {
882 return HDF_ERR_INVALID_PARAM;
883 }
884 if ((event->ep0Num + event->epNum) == 0) {
885 return HDF_ERR_INVALID_PARAM;
886 }
887
888 if (memset_s(&pfds, sizeof(pfds), 0, sizeof(pfds)) != EOK) {
889 HDF_LOGE("%{public}s:%{public}d memset_s failed", __func__, __LINE__);
890 return HDF_FAILURE;
891 }
892
893 for (i = 0; i < event->ep0Num; i++) {
894 if (event->ep0[i] <= 0) {
895 HDF_LOGE("%{public}s: ep[%{public}d] = %{public}d", __func__, i, event->ep0[i]);
896 return HDF_ERR_INVALID_PARAM;
897 }
898 pfds[i].fd = event->ep0[i];
899 pfds[i].events = POLLIN | POLLOUT;
900 }
901 for (i = 0; i < event->epNum; i++) {
902 if (event->epx[i] <= 0) {
903 HDF_LOGE("%{public}s: ep[%{public}d] = %{public}d", __func__, i, event->epx[i]);
904 return HDF_ERR_INVALID_PARAM;
905 }
906 pfds[i + event->ep0Num].fd = event->epx[i];
907 pfds[i + event->ep0Num].events = POLLIN;
908 }
909 for (i = 0; i < (event->ep0Num + event->epNum); i++) {
910 pfds[i].revents = (uint32_t)handle_poll(pfds[i].fd, timeout);
911 if (pfds[i].revents < 0) {
912 HDF_LOGE("%{public}s: handle_poll failed", __func__);
913 return HDF_ERR_INVALID_PARAM;
914 }
915 }
916 if (Ep0Event(event, pfd) < 0) {
917 HDF_LOGE("%{public}s: handle_poll failed", __func__);
918 return HDF_ERR_IO;
919 }
920 if (EpEvent(event, pfd) < 0) {
921 HDF_LOGE("%{public}s: handle_poll failed", __func__);
922 return HDF_ERR_IO;
923 }
924 return 0;
925 }
926
UsbFnAdapterWriteUDC(const char * deviceName,const char * udcName,int32_t enable)927 static int32_t UsbFnAdapterWriteUDC(const char *deviceName, const char *udcName, int32_t enable)
928 {
929 struct FconfigUdcInfo udcInfo;
930
931 int32_t configFd = UsbFnAdapterOpenFn();
932 if (configFd <= 0) {
933 return HDF_ERR_IO;
934 }
935
936 int32_t ret = UsbFnAdapterCreateFconfigString(&udcInfo.gadgetName, deviceName);
937 if (ret != HDF_SUCCESS) {
938 HDF_LOGE("%{public}s: create gadget_name failed!", __func__);
939 return HDF_ERR_IO;
940 }
941
942 int32_t cmd = enable ? FCONFIG_CMD_ENABLE_UDC : FCONFIG_CMD_DISABLE_UDC;
943 ret = UsbFnAdapterWriteFcofnigUDC(configFd, cmd, &udcInfo.gadgetName, udcName);
944 if (ret != HDF_SUCCESS) {
945 return HDF_ERR_IO;
946 }
947
948 ret = UsbFnAdapterClosefn(configFd);
949 if (ret != 0) {
950 HDF_LOGE("%{public}s: close failed!", __func__);
951 }
952 return 0;
953 }
954
UsbFnWriteProp(const char * deviceName,const char * propName,uint32_t propValue)955 static int32_t UsbFnWriteProp(const char *deviceName, const char *propName, uint32_t propValue)
956 {
957 struct FconfigDevdescInfo info;
958 if (deviceName == NULL || propName == NULL) {
959 HDF_LOGE("%{public}s: param invail!", __func__);
960 return HDF_ERR_IO;
961 }
962 int32_t ret = UsbFnAdapterCreateFconfigString(&info.gadgetName, deviceName);
963 if (ret != HDF_SUCCESS) {
964 HDF_LOGE("%{public}s: create gadget name failed!", __func__);
965 return HDF_ERR_IO;
966 }
967 info.prop.propName = propName;
968 info.prop.propValue = (uint32_t)propValue;
969 int32_t configFd = UsbFnAdapterOpenFn();
970 if (configFd <= 0) {
971 ret = HDF_ERR_IO;
972 goto FAIL;
973 }
974 ret = handle_ioctl(configFd, FCONFIG_CMD_CHAGE_DEVINFO, &info);
975 if (ret != 0) {
976 HDF_LOGE("%{public}s: ioctl failed!", __func__);
977 goto FAIL;
978 }
979 ret = UsbFnAdapterClosefn(configFd);
980 if (ret != 0) {
981 HDF_LOGE("%{public}s: close failed!", __func__);
982 }
983 FAIL:
984 UsbFnMemFree(info.gadgetName.s);
985
986 return ret;
987 }
988
UsbFnWriteDesString(const char * deviceName,uint16_t lang,const char * stringName,const char * stringValue)989 static int32_t UsbFnWriteDesString(
990 const char *deviceName, uint16_t lang, const char *stringName, const char *stringValue)
991 {
992 struct FconfigDevDescString info;
993 if (deviceName == NULL || stringName == NULL || stringValue == NULL) {
994 HDF_LOGE("%{public}s: param invail!", __func__);
995 return HDF_ERR_IO;
996 }
997 int32_t ret = UsbFnAdapterCreateFconfigString(&info.gadgetName, deviceName);
998 if (ret != HDF_SUCCESS) {
999 HDF_LOGE("%{public}s: create gadget name failed!", __func__);
1000 return HDF_ERR_IO;
1001 }
1002 info.prop.lang = lang;
1003 info.prop.propName = stringName;
1004 info.prop.propValue = stringValue;
1005 int32_t configFd = UsbFnAdapterOpenFn();
1006 if (configFd <= 0) {
1007 dprintf("%s, %d\n", __func__, __LINE__);
1008 ret = HDF_ERR_IO;
1009 goto FAIL;
1010 }
1011 ret = handle_ioctl(configFd, FCONFIG_CMD_CHAGE_DEVSTRING, &info);
1012 if (ret != 0) {
1013 HDF_LOGE("%{public}s: ioctl failed!", __func__);
1014 goto FAIL;
1015 }
1016 ret = UsbFnAdapterClosefn(configFd);
1017 if (ret != 0) {
1018 HDF_LOGE("%{public}s: close failed!", __func__);
1019 }
1020 FAIL:
1021 UsbFnMemFree(info.gadgetName.s);
1022
1023 return ret;
1024 }
1025
UsbFnMemAlloc(size_t size)1026 static void *UsbFnMemAlloc(size_t size)
1027 {
1028 return UsbFnMemCalloc(size);
1029 }
1030
UsbFnMemCalloc(size_t size)1031 static void *UsbFnMemCalloc(size_t size)
1032 {
1033 void *buf = OsalMemCalloc(size);
1034 if (buf == NULL) {
1035 HDF_LOGE("%{public}s: %{public}d, OsalMemCalloc failed", __func__, __LINE__);
1036 return NULL;
1037 }
1038
1039 return buf;
1040 }
1041
UsbFnMemFree(const void * mem)1042 void UsbFnMemFree(const void *mem)
1043 {
1044 if (mem == NULL) {
1045 HDF_LOGE("%{public}s:%{public}d invalid param mem.", __func__, __LINE__);
1046 return;
1047 }
1048
1049 if (mem != NULL) {
1050 OsalMemFree((void *)mem);
1051 mem = NULL;
1052 }
1053 }
1054
1055 static struct UsbFnAdapterOps g_usbFnAdapter = {
1056 .createDevice = UsbFnAdapterCreateDevice,
1057 .delDevice = UsbFnAdapterDelDevice,
1058
1059 .openPipe = UsbFnAdapterOpenPipe,
1060 .closePipe = UsbFnAdapterClosePipe,
1061 .getPipeInfo = UsbFnAdapterGetPipeInfo,
1062
1063 .queueInit = UsbFnAdapterQueueInit,
1064 .queueDel = UsbFnAdapterQueueDel,
1065 .releaseBuf = UsbFnAdapterReleaseBuf,
1066 .pipeIo = UsbFnAdapterPipeIo,
1067 .cancelIo = UsbFnAdapterCancelIo,
1068 .getReqStatus = UsbFnAdapterRequestGetStatus,
1069 .mapAddr = UsbFnAdapterMapAddr,
1070 .unmapAddr = UsbFnAdapterUnmapAddr,
1071 .pollEvent = UsbFnAdapterPollEvent,
1072 .writeUDC = UsbFnAdapterWriteUDC,
1073 .writeProp = UsbFnWriteProp,
1074 .writeDesString = UsbFnWriteDesString,
1075 };
1076
UsbFnAdapterGetOps(void)1077 struct UsbFnAdapterOps *UsbFnAdapterGetOps(void)
1078 {
1079 return &g_usbFnAdapter;
1080 }
1081