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