• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <stdarg.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/eventfd.h>
25 #include <sys/ioctl.h>
26 #include <poll.h>
27 #include <sys/stat.h>
28 #include <sys/types.h>
29 #include <unistd.h>
30 #include "osal_time.h"
31 
32 #define HDF_LOG_TAG adapter_if
33 #define SLEEP_100MS 100000
34 #define DELAY_100MS 100
35 #define OPEN_CNT 30
36 
37 static struct RawUsbRamTestList *g_usbRamTestHead = NULL;
38 static bool g_usbRamTestFlag = false;
39 
IsDirExist(const char * dir)40 static bool IsDirExist(const char *dir)
41 {
42     if (NULL == dir) {
43         return false;
44     }
45     if (NULL == opendir(dir)) {
46         return false;
47     }
48     return true;
49 }
50 
IsDir(const char * path)51 static bool IsDir(const char *path)
52 {
53     struct stat statBuf;
54     if (lstat(path, &statBuf) == 0) {
55         return S_ISDIR(statBuf.st_mode) != 0;
56     }
57     return false;
58 }
59 
GetFilePath(const char * path,const char * fileName,char * filePath)60 static void GetFilePath(const char *path, const char *fileName, char *filePath)
61 {
62     int32_t ret = strcpy_s(filePath, MAX_PATHLEN - 1, path);
63     if (ret != EOK) {
64         HDF_LOGE("%s: strcpy_s failure!", __func__);
65         return;
66     }
67 
68     if (filePath[strlen(path) - 1] != '/') {
69         ret = strcat_s(filePath, MAX_PATHLEN - 1, "/");
70         if (ret != EOK) {
71             HDF_LOGE("%s: strcat_s failure!", __func__);
72             return;
73         }
74     }
75 
76     ret = strcat_s(filePath, MAX_PATHLEN - 1, fileName);
77     if (ret != EOK) {
78         HDF_LOGE("%s: strcat_s failure!", __func__);
79     }
80 }
81 
IsSpecialDir(const char * path)82 static bool IsSpecialDir(const char *path)
83 {
84     return (strcmp(path, ".") == 0) || strcmp(path, "..") == 0;
85 }
86 
DeleteFile(const char * path)87 static void DeleteFile(const char *path)
88 {
89     DIR *dir = NULL;
90     struct dirent *dirInfo = NULL;
91     char filePath[PATH_MAX];
92 
93     if (IsDir(path)) {
94         if ((dir = opendir(path)) == NULL) {
95             return;
96         }
97         while ((dirInfo = readdir(dir)) != NULL) {
98             GetFilePath(path, dirInfo->d_name, filePath);
99             if (IsSpecialDir(dirInfo->d_name)) {
100                 continue;
101             }
102             closedir(dir);
103             DeleteFile(filePath);
104             remove(filePath);
105         }
106     }
107 }
108 
IsDeviceDirExist(const char * deviceName)109 static bool IsDeviceDirExist(const char *deviceName)
110 {
111     char tmp[MAX_PATHLEN] = {0};
112     int32_t ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s", CONFIGFS_DIR, deviceName);
113     if (ret < 0) {
114         HDF_LOGE("%s: snprintf_s failed", __func__);
115         return false;
116     }
117 
118     return IsDirExist(tmp);
119 }
120 
UsbFnWriteFile(const char * path,const char * str)121 static int32_t UsbFnWriteFile(const char *path, const char *str)
122 {
123     int32_t ret;
124     if (strlen(str) == 0) {
125         return 0;
126     }
127     FILE *fp = fopen(path, "w");
128     if (fp == NULL) {
129         HDF_LOGE("%s: UsbFnWriteFile failure!", __func__);
130         return HDF_ERR_BAD_FD;
131     }
132     ret = fwrite(str, strlen(str), 1, fp);
133     if (ret != 1) {
134         if (fclose(fp)) {
135             return HDF_FAILURE;
136         }
137         return HDF_FAILURE;
138     }
139     if (fclose(fp)) {
140         return HDF_FAILURE;
141     }
142     return 0;
143 }
144 
UsbFnWriteProp(const char * deviceName,const char * propName,uint32_t propValue)145 static int32_t UsbFnWriteProp(const char *deviceName, const char *propName, uint32_t propValue)
146 {
147     char tmp[MAX_PATHLEN] = {0};
148     char tmpVal[MAX_NAMELEN] = {0};
149     int32_t ret;
150     if (deviceName == NULL || propName == NULL) {
151         HDF_LOGE("%s: INVALID PARAM!", __func__);
152         return HDF_ERR_INVALID_PARAM;
153     }
154     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/%s",
155         CONFIGFS_DIR, deviceName, propName);
156     if (ret < 0) {
157         HDF_LOGE("%s: snprintf_s failed", __func__);
158         return HDF_ERR_IO;
159     }
160 
161     ret = snprintf_s(tmpVal, MAX_NAMELEN, MAX_NAMELEN - 1, "0x%x", propValue);
162     if (ret < 0) {
163         HDF_LOGE("%s: snprintf_s failed", __func__);
164         return HDF_ERR_IO;
165     }
166 
167     return UsbFnWriteFile(tmp, tmpVal);
168 }
169 
UsbFnWriteConfString(const char * deviceName,int32_t configVal,uint16_t lang,const char * stringValue)170 static int32_t UsbFnWriteConfString(const char *deviceName,
171     int32_t configVal, uint16_t lang, const char *stringValue)
172 {
173     int32_t ret;
174     char tmp[MAX_PATHLEN] = {0};
175     char tmpPath[MAX_PATHLEN] = {0};
176     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/configs/b.%d/strings/0x%x",
177                      CONFIGFS_DIR, deviceName, configVal, lang);
178     if (ret < 0) {
179         HDF_LOGE("%s: snprintf_s failed", __func__);
180         return HDF_ERR_IO;
181     }
182 
183     if (!IsDirExist(tmp)) {
184         ret = mkdir(tmp, S_IREAD | S_IWRITE);
185         if (ret) {
186             HDF_LOGE("%s: mkdir failure!", __func__);
187             return HDF_ERR_IO;
188         }
189     }
190 
191     ret = snprintf_s(tmpPath, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/configuration", tmp);
192     if (ret < 0) {
193         HDF_LOGE("%s: snprintf_s failed", __func__);
194         return HDF_ERR_IO;
195     }
196 
197     ret = UsbFnWriteFile(tmpPath, stringValue);
198     return ret;
199 }
200 
UsbFnWriteDesString(const char * deviceName,uint16_t lang,const char * stringName,const char * stringValue)201 static int32_t UsbFnWriteDesString(const char *deviceName,
202     uint16_t lang, const char *stringName, const char *stringValue)
203 {
204     int32_t ret;
205     char tmp[MAX_PATHLEN] = {0};
206     char tmpPath[MAX_PATHLEN] = {0};
207     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/strings/0x%x",
208         CONFIGFS_DIR, deviceName, lang);
209     if (ret < 0) {
210         HDF_LOGE("%s: snprintf_s failed", __func__);
211         return HDF_ERR_IO;
212     }
213     if (!IsDirExist(tmp)) {
214         ret = mkdir(tmp, S_IREAD | S_IWRITE);
215         if (ret) {
216             HDF_LOGE("%s: mkdir failure!", __func__);
217             return HDF_ERR_IO;
218         }
219     }
220 
221     ret = snprintf_s(tmpPath, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s", tmp, stringName);
222     if (ret < 0) {
223         HDF_LOGE("%s: snprintf_s failed", __func__);
224         return HDF_ERR_IO;
225     }
226 
227     ret = UsbFnWriteFile(tmpPath, stringValue);
228     return ret;
229 }
230 
UsbFnAdapterCreateFunc(const char * configPath,const char * funcPath)231 static int32_t UsbFnAdapterCreateFunc(const char *configPath, const char *funcPath)
232 {
233     int32_t ret;
234 
235     ret = mkdir(funcPath, S_IREAD | S_IWRITE);
236     if (ret) {
237         HDF_LOGE("%s: mkdir failure!", __func__);
238         return HDF_ERR_IO;
239     }
240 
241     ret = symlink(funcPath, configPath);
242     if (ret) {
243         HDF_LOGE("%s: symlink failed", __func__);
244         return HDF_ERR_IO;
245     }
246     usleep(SLEEP_100MS);
247     return 0;
248 }
249 
UsbFnReadFile(const char * path,char * str,uint16_t len)250 static int32_t UsbFnReadFile(const char *path, char *str, uint16_t len)
251 {
252     int32_t ret;
253     FILE *fp = fopen(path, "r");
254     if (fp == NULL) {
255         HDF_LOGE("%s: fopen failure!", __func__);
256         return HDF_ERR_BAD_FD;
257     }
258     ret = fread(str, len, 1, fp);
259     if (ret < 0) {
260         if (fclose(fp)) {
261             return HDF_FAILURE;
262         }
263         return HDF_ERR_IO;
264     }
265     if (fclose(fp)) {
266         return HDF_FAILURE;
267     }
268     return 0;
269 }
270 
UsbFnAdapterWriteUDC(const char * deviceName,const char * udcName,int32_t enable)271 static int32_t UsbFnAdapterWriteUDC(const char *deviceName, const char *udcName, int32_t enable)
272 {
273     int32_t ret, i;
274     char tmp[MAX_PATHLEN] = {0};
275     char udcTmp[MAX_NAMELEN] = {0};
276     char tmpCmd[MAX_PATHLEN] = {0};
277     if (deviceName == NULL || udcName == NULL || IsDeviceDirExist(deviceName) == false) {
278         return HDF_ERR_INVALID_PARAM;
279     }
280 
281     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/UDC", CONFIGFS_DIR, deviceName);
282     if (ret < 0) {
283         HDF_LOGE("%s: snprintf_s failed", __func__);
284         return HDF_ERR_IO;
285     }
286     if (enable) {
287         (void)UsbFnWriteFile(tmp, udcName);
288         for (i = 0; i < OPEN_CNT; i++) {
289             (void)UsbFnReadFile(tmp, udcTmp, strlen(udcName));
290             if (!strcmp(udcName, udcTmp)) {
291                 return 0;
292             }
293             usleep(SLEEP_100MS);
294         }
295         if (strcmp(udcName, udcTmp)) {
296             return HDF_ERR_IO;
297         }
298     } else {
299         ret = snprintf_s(tmpCmd, MAX_PATHLEN, MAX_PATHLEN - 1, "echo \"\" > %s/%s/UDC",
300             CONFIGFS_DIR, deviceName);
301         if (ret < 0) {
302             HDF_LOGE("%s: snprintf_s failed", __func__);
303             return HDF_ERR_IO;
304         }
305         system(tmpCmd);
306     }
307     return 0;
308 }
309 
UsbFnAdapterOpenFn(void)310 static int32_t UsbFnAdapterOpenFn(void)
311 {
312     int32_t i;
313     int32_t ep = -1;
314     for (i = 0; i < OPEN_CNT; i++) {
315         ep = open(USBFN_DEV, O_RDWR);
316         if (ep > 0) {
317             break;
318         }
319         usleep(SLEEP_100MS);
320     }
321     if (ep < 0) {
322         HDF_LOGE("func not alloc!");
323     }
324     return ep;
325 }
326 
UsbFnAdapterClosefn(int32_t fd)327 static int32_t UsbFnAdapterClosefn(int32_t fd)
328 {
329     if (fd <= 0) {
330         return HDF_ERR_INVALID_PARAM;
331     }
332     return close(fd);
333 }
334 
UsbFnAdapterCreatInterface(const char * interfaceName,int32_t nameLen)335 static int32_t UsbFnAdapterCreatInterface(const char *interfaceName, int32_t nameLen)
336 {
337     int32_t ret;
338     int32_t fd;
339     struct FuncNew fnnew;
340     if (interfaceName == NULL || nameLen <= 0) {
341         return HDF_ERR_INVALID_PARAM;
342     }
343     fd = UsbFnAdapterOpenFn();
344     if (fd <= 0) {
345         HDF_LOGE("%s: UsbFnAdapterOpenFn failure!",  __func__);
346         return HDF_ERR_IO;
347     }
348 
349     fnnew.nameLen = nameLen;
350     ret = snprintf_s(fnnew.name, MAX_NAMELEN, MAX_NAMELEN - 1, "%s", interfaceName);
351     if (ret < 0) {
352         HDF_LOGE("%s: snprintf_s failed", __func__);
353         return HDF_ERR_IO;
354     }
355     ret = ioctl(fd, FUNCTIONFS_NEWFN, &fnnew);
356     if (ret) {
357         HDF_LOGE("%s: FUNCTIONFS_NEWFN failure!",  __func__);
358         return HDF_ERR_IO;
359     }
360     ret = UsbFnAdapterClosefn(fd);
361     usleep(SLEEP_100MS);
362     return ret;
363 }
364 
UsbFnAdapterDelInterface(const char * interfaceName,int32_t nameLen)365 static int32_t UsbFnAdapterDelInterface(const char *interfaceName, int32_t nameLen)
366 {
367     int32_t ret;
368     struct FuncNew fnnew;
369     if (interfaceName == NULL || nameLen <= 0) {
370         return HDF_ERR_INVALID_PARAM;
371     }
372 
373     int32_t fd = UsbFnAdapterOpenFn();
374     if (fd <= 0) {
375         return HDF_ERR_IO;
376     }
377 
378     fnnew.nameLen = nameLen;
379     ret = snprintf_s(fnnew.name, MAX_NAMELEN, MAX_NAMELEN - 1, "%s", interfaceName);
380     if (ret < 0) {
381         HDF_LOGE("%s: snprintf_s failed", __func__);
382         return HDF_ERR_IO;
383     }
384     ret = ioctl(fd, FUNCTIONFS_DELFN, &fnnew);
385     if (ret) {
386         HDF_LOGE("%s: FUNCTIONFS_DELFN failure!",  __func__);
387         return HDF_ERR_IO;
388     }
389     ret = UsbFnAdapterClosefn(fd);
390     return ret;
391 }
392 
UsbFnAdapterOpenPipe(const char * interfaceName,int32_t epIndex)393 static int32_t UsbFnAdapterOpenPipe(const char *interfaceName, int32_t epIndex)
394 {
395     if (interfaceName == NULL || epIndex < 0) {
396         return HDF_ERR_INVALID_PARAM;
397     }
398 
399     char epName[MAX_NAMELEN];
400     int32_t ret = snprintf_s(epName, MAX_NAMELEN, MAX_NAMELEN - 1, "/dev/functionfs/%s.ep%d", interfaceName, epIndex);
401     if (ret < 0) {
402         HDF_LOGE("%s: snprintf_s failed", __func__);
403         return HDF_ERR_IO;
404     }
405 
406     int32_t ep = -1;
407     for (int32_t i = 0; i < OPEN_CNT; i++) {
408         ep = open(epName, O_RDWR);
409         if (ep > 0) {
410             break;
411         }
412         usleep(SLEEP_100MS);
413     }
414     if (ep < 0) {
415         HDF_LOGE("unable to open %s", epName);
416         return HDF_DEV_ERR_NO_DEVICE;
417     }
418     return ep;
419 }
420 
UsbFnAdapterClosePipe(int32_t ep)421 static int32_t UsbFnAdapterClosePipe(int32_t ep)
422 {
423     if (ep <= 0) {
424         return HDF_ERR_INVALID_PARAM;
425     }
426 
427     return close(ep);
428 }
429 
GetHeaderStr(struct UsbFnStrings ** strings,struct UsbFunctionfsStringsHead * headerStr)430 static void GetHeaderStr(struct UsbFnStrings **strings,
431     struct UsbFunctionfsStringsHead *headerStr)
432 {
433     uint32_t i, j;
434     uint32_t langCount = 0;
435     uint32_t strCount;
436     uint32_t len = 0;
437     for (i = 0; strings[i] != NULL; i++) {
438         langCount++;
439         for (j = 0; strings[i]->strings[j].s; j++) {
440             len += strlen(strings[i]->strings[j].s) + sizeof(char);
441         }
442         strCount = j;
443     }
444     headerStr->magic = htole32(FUNCTIONFS_STRINGS_MAGIC);
445     headerStr->length = htole32(sizeof(struct UsbFunctionfsStringsHead) +
446         langCount * sizeof(uint16_t) + len);
447     headerStr->str_count = strCount;
448     headerStr->lang_count = langCount;
449 }
450 
UsbFnWriteStrings(int32_t ep0,struct UsbFnStrings ** strings)451 static int32_t UsbFnWriteStrings(int32_t ep0, struct UsbFnStrings **strings)
452 {
453     uint8_t *str = NULL;
454     uint8_t *whereDec = NULL;
455     uint32_t i, j;
456     int32_t ret;
457     struct UsbFunctionfsStringsHead headerStr = {0};
458 
459     GetHeaderStr(strings, &headerStr);
460     str = UsbFnMemCalloc(headerStr.length);
461     if (str == NULL) {
462         return HDF_ERR_MALLOC_FAIL;
463     }
464 
465     whereDec = str;
466     ret = memcpy_s(whereDec, headerStr.length, &headerStr,
467         sizeof(struct UsbFunctionfsStringsHead));
468     if (ret != EOK) {
469         goto ERR;
470     }
471     whereDec += sizeof(struct UsbFunctionfsStringsHead);
472 
473     for (i = 0; i < headerStr.lang_count; i++) {
474         ret = memcpy_s(whereDec, headerStr.length - (whereDec - str),
475             &strings[i]->language, sizeof(uint16_t));
476         if (ret != EOK) {
477             goto ERR;
478         }
479         whereDec += sizeof(uint16_t);
480         for (j = 0; j < headerStr.str_count; j++) {
481             if (strlen(strings[i]->strings[j].s)) {
482                 ret = memcpy_s(whereDec, headerStr.length - (whereDec - str),
483                     strings[i]->strings[j].s, strlen(strings[i]->strings[j].s));
484                 whereDec += strlen(strings[i]->strings[j].s) + sizeof(char);
485             } else {
486                 break;
487             }
488             if (ret != EOK) {
489                 goto ERR;
490             }
491         }
492     }
493 
494     if (write(ep0, str, headerStr.length) < 0) {
495         goto ERR;
496     }
497     UsbFnMemFree(str);
498     return 0;
499 ERR:
500     UsbFnMemFree(str);
501     return HDF_FAILURE;
502 }
503 
CopyCount(uint8_t ** whereDec,uint32_t fsCount,uint32_t hsCount,uint32_t ssCount)504 static int32_t CopyCount(uint8_t **whereDec, uint32_t fsCount, uint32_t hsCount, uint32_t ssCount)
505 {
506     int32_t ret;
507     if (fsCount) {
508         ret = memcpy_s(*whereDec, sizeof(uint32_t), &fsCount, sizeof(uint32_t));
509         if (ret != EOK) {
510             return HDF_FAILURE;
511         }
512         *whereDec += sizeof(uint32_t);
513     }
514     if (hsCount) {
515         ret = memcpy_s(*whereDec, sizeof(uint32_t), &hsCount, sizeof(uint32_t));
516         if (ret != EOK) {
517             return HDF_FAILURE;
518         }
519         *whereDec += sizeof(uint32_t);
520     }
521     if (ssCount) {
522         ret = memcpy_s(*whereDec, sizeof(uint32_t), &ssCount, sizeof(uint32_t));
523         if (ret != EOK) {
524             return HDF_FAILURE;
525         }
526         *whereDec += sizeof(uint32_t);
527     }
528 
529     return 0;
530 }
531 
WriteFuncDescriptors(uint8_t ** whereDec,struct UsbDescriptorHeader ** headDes)532 static int32_t WriteFuncDescriptors(uint8_t **whereDec, struct UsbDescriptorHeader **headDes)
533 {
534     int32_t ret;
535     int32_t i;
536 
537     for (i = 0; headDes[i] != NULL; i++) {
538         ret = memcpy_s(*whereDec, headDes[i]->bLength, headDes[i], headDes[i]->bLength);
539         if (ret != EOK) {
540             HDF_LOGE("%s: memcpy_s failure!", __func__);
541             return HDF_FAILURE;
542         }
543         *whereDec += headDes[i]->bLength;
544     }
545     return 0;
546 }
547 
GetCountAndHead(struct UsbFunctionfsDescsHeadV2 * header,uint32_t * fsCount,uint32_t * hsCount,uint32_t * ssCount,const struct UsbFnFunction * func)548 void GetCountAndHead(struct UsbFunctionfsDescsHeadV2 *header, uint32_t *fsCount,
549     uint32_t *hsCount, uint32_t *ssCount, const struct UsbFnFunction *func)
550 {
551     int32_t i;
552     uint32_t lenCount = 0;
553     uint32_t lenDes = 0;
554     *fsCount = 0;
555     *hsCount = 0;
556     *ssCount = 0;
557 
558     for (i = 0; func->fsDescriptors[i] != NULL; i++) {
559         (*fsCount)++;
560         lenDes += func->fsDescriptors[i]->bLength;
561     }
562     for (i = 0; func->hsDescriptors[i] != NULL; i++) {
563         (*hsCount)++;
564         lenDes += func->hsDescriptors[i]->bLength;
565     }
566     for (i = 0; func->ssDescriptors[i] != NULL; i++) {
567         (*ssCount)++;
568         lenDes += func->ssDescriptors[i]->bLength;
569     }
570 
571     if (*fsCount) {
572         lenCount += sizeof(uint32_t);
573         header->flags |= htole32(FUNCTIONFS_HAS_FS_DESC);
574     }
575     if (*hsCount) {
576         lenCount += sizeof(uint32_t);
577         header->flags |= htole32(FUNCTIONFS_HAS_HS_DESC);
578     }
579     if (*ssCount) {
580         lenCount += sizeof(uint32_t);
581         header->flags |= htole32(FUNCTIONFS_HAS_SS_DESC);
582     }
583 
584     header->magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2);
585     header->length = htole32(sizeof(struct UsbFunctionfsDescsHeadV2) + lenCount + lenDes);
586 }
587 
UsbFnAdapterCreatPipes(int32_t ep0,const struct UsbFnFunction * func)588 static int32_t UsbFnAdapterCreatPipes(int32_t ep0, const struct UsbFnFunction *func)
589 {
590     uint8_t *dec = NULL;
591     uint8_t *whereDec = NULL;
592     int32_t ret;
593     uint32_t fsCount;
594     uint32_t hsCount;
595     uint32_t ssCount;
596     struct UsbFunctionfsDescsHeadV2 header = {0};
597 
598     GetCountAndHead(&header, &fsCount, &hsCount, &ssCount, func);
599 
600     dec = UsbFnMemCalloc(header.length);
601     if (dec == NULL) {
602         HDF_LOGE("%s: UsbFnMemCalloc failure!", __func__);
603         return HDF_ERR_MALLOC_FAIL;
604     }
605     whereDec = dec;
606 
607     ret = memcpy_s(whereDec, header.length, &header,
608         sizeof(struct UsbFunctionfsDescsHeadV2));
609     if (ret != EOK) {
610         return HDF_FAILURE;
611     }
612     whereDec += sizeof(struct UsbFunctionfsDescsHeadV2);
613 
614     ret = CopyCount(&whereDec, fsCount, hsCount, ssCount);
615     if (ret != EOK) {
616         return HDF_FAILURE;
617     }
618 
619     ret = WriteFuncDescriptors(&whereDec, func->fsDescriptors);
620     if (ret != EOK) {
621         return HDF_FAILURE;
622     }
623 
624     ret = WriteFuncDescriptors(&whereDec, func->hsDescriptors);
625     if (ret != EOK) {
626         return HDF_FAILURE;
627     }
628 
629     ret = WriteFuncDescriptors(&whereDec, func->ssDescriptors);
630     if (ret != EOK) {
631         return HDF_FAILURE;
632     }
633 
634     if (write(ep0, dec, header.length) < 0) {
635         HDF_LOGE("unable do write descriptors");
636         UsbFnMemFree(dec);
637         return HDF_ERR_IO;
638     }
639 
640     UsbFnMemFree(dec);
641     ret = UsbFnWriteStrings(ep0, func->strings);
642 
643     usleep(SLEEP_100MS);
644     return ret;
645 }
646 
WriteDeviceId(const char * devName,const struct UsbDeviceDescriptor * desc)647 static int32_t WriteDeviceId(const char *devName, const struct UsbDeviceDescriptor *desc)
648 {
649     int32_t ret;
650     ret = UsbFnWriteProp(devName, "idVendor", desc->idVendor);
651     if (ret) {
652         return HDF_ERR_INVALID_PARAM;
653     }
654     ret = UsbFnWriteProp(devName, "idProduct", desc->idProduct);
655     if (ret) {
656         return HDF_ERR_INVALID_PARAM;
657     }
658     ret = UsbFnWriteProp(devName, "bcdUSB", desc->bcdUSB);
659     if (ret) {
660         return HDF_ERR_INVALID_PARAM;
661     }
662     ret = UsbFnWriteProp(devName, "bcdDevice", desc->bcdDevice);
663     if (ret) {
664         return HDF_ERR_INVALID_PARAM;
665     }
666     ret = UsbFnWriteProp(devName, "bDeviceClass", desc->bDeviceClass);
667     if (ret) {
668         return HDF_ERR_INVALID_PARAM;
669     }
670     ret = UsbFnWriteProp(devName, "bDeviceSubClass", desc->bDeviceSubClass);
671     if (ret) {
672         return HDF_ERR_INVALID_PARAM;
673     }
674     ret = UsbFnWriteProp(devName, "bDeviceProtocol", desc->bDeviceProtocol);
675     if (ret) {
676         return HDF_ERR_INVALID_PARAM;
677     }
678     ret = UsbFnWriteProp(devName, "bMaxPacketSize0", desc->bMaxPacketSize0);
679     if (ret) {
680         return HDF_ERR_INVALID_PARAM;
681     }
682     return 0;
683 }
684 
WriteDeviceDescriptor(const char * devName,const struct UsbDeviceDescriptor * desc,struct UsbFnStrings ** strings)685 static int32_t WriteDeviceDescriptor(const char *devName,
686     const struct UsbDeviceDescriptor *desc, struct UsbFnStrings **strings)
687 {
688     int32_t i, ret;
689     ret = WriteDeviceId(devName, desc);
690     if (ret) {
691         return HDF_ERR_INVALID_PARAM;
692     }
693 
694     for (i = 0; strings[i] != NULL; i++) {
695         ret = UsbFnWriteDesString(devName, strings[i]->language, "manufacturer",
696             strings[i]->strings[desc->iManufacturer].s);
697         if (ret) {
698             return HDF_ERR_INVALID_PARAM;
699         }
700         ret = UsbFnWriteDesString(devName, strings[i]->language, "product",
701             strings[i]->strings[desc->iProduct].s);
702         if (ret) {
703             return HDF_ERR_INVALID_PARAM;
704         }
705         ret = UsbFnWriteDesString(devName, strings[i]->language, "serialnumber",
706             strings[i]->strings[desc->iSerialNumber].s);
707         if (ret) {
708             return HDF_ERR_INVALID_PARAM;
709         }
710     }
711     return 0;
712 }
713 
CreatDeviceDir(const char * devName)714 static int32_t CreatDeviceDir(const char *devName)
715 {
716     int32_t ret;
717     char tmp[MAX_PATHLEN];
718     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
719     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s", CONFIGFS_DIR, devName);
720     if (ret < 0) {
721         return HDF_ERR_IO;
722     }
723     if (!IsDirExist(tmp)) {
724         ret = mkdir(tmp, S_IREAD | S_IWRITE);
725         if (ret) {
726             HDF_LOGE("%s: mkdir failure!", __func__);
727             return HDF_ERR_IO;
728         }
729     }
730     return 0;
731 }
732 
WriteConfPowerAttributes(const char * devName,struct UsbFnConfiguration * config,uint8_t confVal)733 static int32_t WriteConfPowerAttributes(const char *devName,
734     struct UsbFnConfiguration *config, uint8_t confVal)
735 {
736     int32_t ret;
737     char configName[MAX_PATHLEN];
738     char tmp[MAX_PATHLEN], val[MAX_NAMELEN];
739     memset_s(configName, MAX_PATHLEN, 0, MAX_PATHLEN);
740     ret = snprintf_s(configName, MAX_PATHLEN, MAX_PATHLEN - 1,
741         "%s/%s/configs/b.%d", CONFIGFS_DIR, devName, confVal);
742     if (ret < 0) {
743         return HDF_ERR_IO;
744     }
745     if (!IsDirExist(configName)) {
746         ret = mkdir(configName, S_IREAD | S_IWRITE);
747         if (ret) {
748             return HDF_ERR_IO;
749         }
750     }
751     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
752     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/MaxPower", configName);
753     if (ret < 0) {
754         return HDF_ERR_IO;
755     }
756     memset_s(val, MAX_NAMELEN, 0, MAX_NAMELEN);
757     ret = snprintf_s(val, MAX_NAMELEN, MAX_NAMELEN - 1, "%d", config->maxPower);
758     if (ret < 0) {
759         return HDF_ERR_IO;
760     }
761     ret = UsbFnWriteFile(tmp, val);
762     if (ret < 0) {
763         return HDF_ERR_INVALID_PARAM;
764     }
765 
766     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
767     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/bmAttributes", configName);
768     if (ret < 0) {
769         return HDF_ERR_IO;
770     }
771     memset_s(val, MAX_NAMELEN, 0, MAX_NAMELEN);
772     ret = snprintf_s(val, MAX_NAMELEN, MAX_NAMELEN - 1, "0x%x", config->attributes);
773     if (ret < 0) {
774         return HDF_ERR_IO;
775     }
776     ret = UsbFnWriteFile(tmp, val);
777     if (ret < 0) {
778         return HDF_ERR_INVALID_PARAM;
779     }
780     return 0;
781 }
782 
CreatKernelFunc(const char * devName,const struct UsbFnFunction * functions,uint8_t confVal)783 static int32_t CreatKernelFunc(const char *devName, const struct UsbFnFunction *functions,
784     uint8_t confVal)
785 {
786     int32_t ret;
787     char configPath[MAX_PATHLEN];
788     char funcPath[MAX_PATHLEN];
789 
790     memset_s(funcPath, MAX_PATHLEN, 0, MAX_PATHLEN);
791     ret = snprintf_s(funcPath, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/functions/%s",
792         CONFIGFS_DIR, devName, functions->funcName);
793     if (ret < 0) {
794         return HDF_ERR_IO;
795     }
796 
797     memset_s(configPath, MAX_PATHLEN, 0, MAX_PATHLEN);
798     ret = snprintf_s(configPath, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/configs/b.%d/%s",
799         CONFIGFS_DIR, devName, confVal, functions->funcName);
800     if (ret < 0) {
801         return HDF_ERR_IO;
802     }
803     ret = UsbFnAdapterCreateFunc(configPath, funcPath);
804     if (ret) {
805         HDF_LOGE("%s: UsbFnAdapterCreateFunc failure!",  __func__);
806         return HDF_ERR_IO;
807     }
808     return ret;
809 }
810 
811 static void CleanConfigFs(const char *devName, const char *funcName);
CreatFunc(const char * devName,const struct UsbFnFunction * functions,uint8_t confVal)812 static int32_t CreatFunc(const char *devName, const struct UsbFnFunction *functions,
813     uint8_t confVal)
814 {
815     int32_t fd, ret;
816     char interfaceName[MAX_NAMELEN];
817 
818     ret = CreatKernelFunc(devName, functions, confVal);
819     if (ret < 0) {
820         return HDF_ERR_IO;
821     }
822 
823     memset_s(interfaceName, MAX_NAMELEN, 0, MAX_NAMELEN);
824     ret = snprintf_s(interfaceName, MAX_NAMELEN, MAX_NAMELEN - 1, "%s", functions->funcName);
825     if (ret < 0) {
826         return HDF_ERR_IO;
827     }
828     ret = UsbFnAdapterCreatInterface(interfaceName, strlen(interfaceName));
829     if (ret) {
830         HDF_LOGE("%s: UsbFnAdapterCreatInterface failure!",  __func__);
831         CleanConfigFs(devName, interfaceName);
832         return HDF_ERR_IO;
833     }
834 
835     fd = UsbFnAdapterOpenPipe(interfaceName, 0);
836     if (fd <= 0) {
837         HDF_LOGE("%s: UsbFnAdapterOpenPipe failure!",  __func__);
838         CleanConfigFs(devName, interfaceName);
839         return HDF_ERR_IO;
840     }
841     ret = UsbFnAdapterCreatPipes(fd, functions);
842     if (ret) {
843         HDF_LOGE("%s: UsbFnAdapterCreatPipes failure!",  __func__);
844         return HDF_ERR_IO;
845     }
846     ret = UsbFnAdapterClosePipe(fd);
847     if (ret) {
848         HDF_LOGE("%s: UsbFnAdapterClosePipe failure!",  __func__);
849         return HDF_ERR_IO;
850     }
851     return 0;
852 }
853 
DelConfigDevice(const char * deviceName)854 static void DelConfigDevice(const char *deviceName)
855 {
856     int32_t ret;
857     char tmp[MAX_PATHLEN];
858     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
859     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1,
860         "%s/%s/configs", CONFIGFS_DIR, deviceName);
861     if (ret < 0) {
862         return;
863     }
864     DeleteFile(tmp);
865 
866     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
867     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1,
868         "%s/%s/functions", CONFIGFS_DIR, deviceName);
869     if (ret < 0) {
870         return;
871     }
872     DeleteFile(tmp);
873 
874     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
875     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1,
876         "%s/%s/strings", CONFIGFS_DIR, deviceName);
877     if (ret < 0) {
878         return;
879     }
880     DeleteFile(tmp);
881 
882     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
883     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1,
884         "%s/%s", CONFIGFS_DIR, deviceName);
885     if (ret < 0) {
886         return;
887     }
888     rmdir(tmp);
889 }
890 
CleanConfigFs(const char * devName,const char * funcName)891 static void CleanConfigFs(const char *devName, const char *funcName)
892 {
893     int32_t ret;
894     char tmp[MAX_PATHLEN];
895 
896     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
897     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/configs/b.1/%s",
898         CONFIGFS_DIR, devName, funcName);
899     if (ret < 0) {
900         return;
901     }
902     remove(tmp);
903 
904     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
905     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/functions/%s",
906         CONFIGFS_DIR, devName, funcName);
907     if (ret < 0) {
908         return;
909     }
910     remove(tmp);
911 }
912 
CleanFunction(const char * devName,const char * funcName)913 static void CleanFunction(const char *devName, const char *funcName)
914 {
915     int32_t ret;
916     ret = UsbFnAdapterDelInterface(funcName, strlen(funcName));
917     if (ret) {
918         HDF_LOGE("%s: UsbFnAdapterDelInterface failure!", __func__);
919         return;
920     }
921     CleanConfigFs(devName, funcName);
922 }
923 
UsbFnAdapterCleanDevice(const char * devName)924 static void UsbFnAdapterCleanDevice(const char *devName)
925 {
926     int32_t ret;
927     char tmp[MAX_PATHLEN];
928     DIR *dir = NULL;
929     struct dirent *ptr = NULL;
930 
931     memset_s(tmp, MAX_PATHLEN, 0, MAX_PATHLEN);
932     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/functions/",
933         CONFIGFS_DIR, devName);
934     if (ret < 0) {
935         HDF_LOGE("%s: snprintf_s failed", __func__);
936         return;
937     }
938     if ((dir = opendir(tmp)) == NULL) {
939         return;
940     }
941     while ((ptr = readdir(dir)) != NULL) {
942         if (strncmp(ptr->d_name, FUNCTION_GENERIC, strlen(FUNCTION_GENERIC))) {
943             continue;
944         }
945         CleanFunction(devName, ptr->d_name);
946     }
947     closedir(dir);
948 }
949 
UsbFnAdapterDelDevice(const char * deviceName,const char * udcName,struct UsbFnDeviceDesc * des)950 static int32_t UsbFnAdapterDelDevice(const char *deviceName, const char *udcName,
951     struct UsbFnDeviceDesc *des)
952 {
953     uint32_t i, j;
954     int32_t ret;
955     if (deviceName == NULL) {
956         return HDF_ERR_INVALID_PARAM;
957     }
958     ret = UsbFnAdapterWriteUDC(deviceName, udcName, 0);
959     if (ret < 0) {
960         return ret;
961     }
962     for (i = 0; des->configs[i] != NULL; i++) {
963         for (j = 0; des->configs[i]->functions[j] != NULL; j++) {
964             if (strncmp(des->configs[i]->functions[j]->funcName,
965                 FUNCTION_GENERIC, strlen(FUNCTION_GENERIC))) {
966                 CleanConfigFs(deviceName, des->configs[i]->functions[j]->funcName);
967                 continue;
968             }
969             if (des->configs[i]->functions[j]->enable == false) {
970                 continue;
971             }
972             CleanFunction(deviceName, des->configs[i]->functions[j]->funcName);
973         }
974     }
975 
976     if (strcmp("g1", deviceName)) {
977         DelConfigDevice(deviceName);
978     }
979     return 0;
980 }
981 
UsbFnAdapterWaitUDC(const char * deviceName,const char * udcName)982 static int32_t UsbFnAdapterWaitUDC(const char *deviceName, const char *udcName)
983 {
984     int32_t ret, i;
985     char tmp[MAX_PATHLEN] = {0};
986     char udcTmp[MAX_NAMELEN] = {0};
987     if (deviceName == NULL || udcName == NULL || IsDeviceDirExist(deviceName) == false) {
988         return HDF_ERR_INVALID_PARAM;
989     }
990 
991     ret = snprintf_s(tmp, MAX_PATHLEN, MAX_PATHLEN - 1, "%s/%s/UDC", CONFIGFS_DIR, deviceName);
992     if (ret < 0) {
993         HDF_LOGE("%s: snprintf_s failed", __func__);
994         return HDF_ERR_IO;
995     }
996     for (i = 0; i < OPEN_CNT * 0x2; i++) {
997         (void)UsbFnReadFile(tmp, udcTmp, strlen(udcName));
998         if (!strcmp(udcName, udcTmp)) {
999             HDF_LOGD("%s: hdc enable udc!", __func__);
1000             return 0;
1001         }
1002         OsalMDelay(DELAY_100MS);
1003     }
1004     return HDF_ERR_IO;
1005 }
1006 
EnableDevice(const char * udcName,const char * devName,struct UsbFnDeviceDesc * descriptor)1007 static int32_t EnableDevice(const char *udcName,
1008     const char *devName, struct UsbFnDeviceDesc *descriptor)
1009 {
1010     int32_t ret;
1011     (void)UsbFnAdapterWriteUDC(devName, "none", 0);
1012     if (!UsbFnAdapterWaitUDC(devName, udcName)) {
1013         return 0;
1014     }
1015     ret = UsbFnAdapterWriteUDC(devName, udcName, 1);
1016     if (ret) {
1017         (void)UsbFnAdapterDelDevice(devName, udcName, descriptor);
1018     }
1019     return ret;
1020 }
1021 
1022 #define FFS_ADB "/config/usb_gadget/g1/functions/ffs.adb"
1023 #define FFS_CONFIG "/config/usb_gadget/g1/configs/b.1/f1"
1024 
CreateFun(struct UsbFnFunction * function,const char * devName,uint8_t * confVal,int32_t * ret)1025 static bool CreateFun(struct UsbFnFunction *function, const char *devName, uint8_t *confVal, int32_t *ret)
1026 {
1027     if (strncmp(function->funcName,
1028         FUNCTION_GENERIC, strlen(FUNCTION_GENERIC))) {
1029         *ret = CreatKernelFunc(devName, function, *confVal);
1030     } else {
1031         if (function->enable == false) {
1032             return false;
1033         }
1034         *ret = CreatFunc(devName, function, *confVal);
1035     }
1036     return true;
1037 }
1038 
UsbFnAdapterCreateDevice(const char * udcName,const char * devName,struct UsbFnDeviceDesc * descriptor)1039 static int32_t UsbFnAdapterCreateDevice(const char *udcName,
1040     const char *devName, struct UsbFnDeviceDesc *descriptor)
1041 {
1042     uint32_t i, j;
1043     int32_t ret;
1044     uint8_t confVal;
1045 
1046     (void)symlink(FFS_ADB, FFS_CONFIG);
1047 
1048     UsbFnAdapterCleanDevice(devName);
1049 
1050     ret = CreatDeviceDir(devName);
1051     if (ret) {
1052         return HDF_ERR_IO;
1053     }
1054 
1055     ret = WriteDeviceDescriptor(devName, descriptor->deviceDesc, descriptor->deviceStrings);
1056     if (ret) {
1057         HDF_LOGE("%s: WriteDeviceDescriptor failure!", __func__);
1058         return HDF_ERR_IO;
1059     }
1060 
1061     for (i = 0; descriptor->configs[i] != NULL; i++) {
1062         confVal = descriptor->configs[i]->configurationValue;
1063         ret = WriteConfPowerAttributes(devName, descriptor->configs[i], confVal);
1064         if (ret) {
1065             HDF_LOGE("%s: WriteConfPowerAttributes failure!", __func__);
1066             return HDF_ERR_IO;
1067         }
1068 
1069         for (j = 0; descriptor->deviceStrings[j] != NULL; j++) {
1070             ret = UsbFnWriteConfString(devName, confVal, descriptor->deviceStrings[j]->language,
1071                 descriptor->deviceStrings[j]->strings[descriptor->configs[i]->iConfiguration].s);
1072             if (ret < 0) {
1073                 HDF_LOGE("%s: UsbFnWriteConfString failure!", __func__);
1074                 return HDF_ERR_INVALID_PARAM;
1075             }
1076         }
1077 
1078         for (j = 0; descriptor->configs[i]->functions[j] != NULL; j++) {
1079             if (!CreateFun(descriptor->configs[i]->functions[j], devName, &confVal, &ret)) {
1080                 continue;
1081             }
1082             if (ret < 0) {
1083                 HDF_LOGE("%s: CreatFunc failure!", __func__);
1084                 (void)UsbFnAdapterWriteUDC(devName, "none", 0);
1085                 (void)UsbFnAdapterWriteUDC(devName, udcName, 1);
1086                 return HDF_ERR_INVALID_PARAM;
1087             }
1088         }
1089     }
1090 
1091     return EnableDevice(udcName, devName, descriptor);
1092 }
1093 
UsbFnAdapterGetPipeInfo(int32_t ep,struct UsbFnPipeInfo * pipeInfo)1094 static int32_t UsbFnAdapterGetPipeInfo(int32_t ep, struct UsbFnPipeInfo *pipeInfo)
1095 {
1096     int32_t ret;
1097     if (ep <= 0 || pipeInfo == NULL) {
1098         return HDF_ERR_INVALID_PARAM;
1099     }
1100 
1101     struct UsbEndpointDescriptor desc;
1102     ret = ioctl(ep, FUNCTIONFS_ENDPOINT_DESC, &desc);
1103     if (ret) {
1104         HDF_LOGE("%s: FUNCTIONFS_ENDPOINT_DESC failure!", __func__);
1105         return HDF_ERR_IO;
1106     }
1107 
1108     pipeInfo->type = desc.bmAttributes;
1109     pipeInfo->dir = USB_PIPE_DIRECTION_OUT;
1110     if (desc.bEndpointAddress & 0x80) {
1111         pipeInfo->dir = USB_PIPE_DIRECTION_IN;
1112     }
1113 
1114     pipeInfo->maxPacketSize = desc.wMaxPacketSize;
1115     pipeInfo->interval = desc.bInterval;
1116 
1117     return ret;
1118 }
1119 
UsbFnAdapterQueueInit(int32_t ep)1120 int32_t UsbFnAdapterQueueInit(int32_t ep)
1121 {
1122     if (ep <= 0) {
1123         return HDF_ERR_INVALID_PARAM;
1124     }
1125     return ioctl(ep, FUNCTIONFS_ENDPOINT_QUEUE_INIT, 0);
1126 }
1127 
UsbFnAdapterQueueDel(int32_t ep)1128 static int32_t UsbFnAdapterQueueDel(int32_t ep)
1129 {
1130     if (ep <= 0) {
1131         return HDF_ERR_INVALID_PARAM;
1132     }
1133 
1134     return ioctl(ep, FUNCTIONFS_ENDPOINT_QUEUE_DEL, 0);
1135 }
1136 
UsbFnAdapterReleaseBuf(int32_t ep,const struct GenericMemory * mem)1137 static int32_t UsbFnAdapterReleaseBuf(int32_t ep, const struct GenericMemory *mem)
1138 {
1139     if (ep <= 0 || mem == NULL) {
1140         return HDF_ERR_INVALID_PARAM;
1141     }
1142 
1143     return ioctl(ep, FUNCTIONFS_ENDPOINT_RELEASE_BUF, mem);
1144 }
1145 
UsbFnAdapterPipeIo(int32_t ep,struct IoData * ioData)1146 static int32_t UsbFnAdapterPipeIo(int32_t ep, struct IoData *ioData)
1147 {
1148     int32_t ret;
1149     if (ep <= 0 || ioData == NULL) {
1150         return HDF_ERR_INVALID_PARAM;
1151     }
1152 
1153     if (ioData->read) {
1154         ret = ioctl(ep, FUNCTIONFS_ENDPOINT_READ, ioData);
1155     } else {
1156         ret = ioctl(ep, FUNCTIONFS_ENDPOINT_WRITE, ioData);
1157     }
1158 
1159     return ret;
1160 }
1161 
UsbFnAdapterCancelIo(int32_t ep,const struct IoData * ioData)1162 static int32_t UsbFnAdapterCancelIo(int32_t ep, const struct IoData *ioData)
1163 {
1164     if (ep <= 0 || ioData == NULL) {
1165         return HDF_ERR_INVALID_PARAM;
1166     }
1167     return ioctl(ep, FUNCTIONFS_ENDPOINT_RW_CANCEL, ioData);
1168 }
1169 
UsbFnAdapterMapAddr(int32_t ep,uint32_t len)1170 static uint8_t *UsbFnAdapterMapAddr(int32_t ep, uint32_t len)
1171 {
1172     if (ep <= 0) {
1173         return NULL;
1174     }
1175 
1176     return mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, ep, 0);
1177 }
1178 
UsbFnAdapterUnmapAddr(uint8_t * mapAddr,uint32_t len)1179 static int32_t UsbFnAdapterUnmapAddr(uint8_t *mapAddr, uint32_t len)
1180 {
1181     if (mapAddr == NULL) {
1182         return HDF_ERR_INVALID_PARAM;
1183     }
1184 
1185     return munmap(mapAddr, len);
1186 }
1187 
Ep0Event(struct UsbFnEventAll * event,struct pollfd * pfds)1188 static void Ep0Event(struct UsbFnEventAll *event, struct pollfd *pfds)
1189 {
1190     int32_t ret;
1191     uint8_t i;
1192     for (i = 0; i < event->ep0Num; i++) {
1193         if ((uint32_t)pfds[i].revents & POLLIN) {
1194             ret = read(event->ep0[i], &event->ep0Event[i].ctrlEvent, sizeof(struct UsbFnCtrlEvent));
1195             if (!ret) {
1196                 HDF_LOGE("unable to read event from ep0");
1197             }
1198             event->ep0Event[i].type = USB_EP0_CTRL_EVENT;
1199         } else if ((uint32_t)pfds[i].revents & POLLOUT) {
1200             ret = ioctl(event->ep0[i], FUNCTIONFS_ENDPOINT_GET_EP0_EVENT, &event->ep0Event[i].reqEvent);
1201             if (!ret) {
1202                 HDF_LOGE("unable to read reqEvent from ep0");
1203             }
1204             event->ep0Event[i].type = USB_EP0_IO_COMPLETED;
1205         }
1206     }
1207 }
1208 
EpEvent(struct UsbFnEventAll * event,struct pollfd * pfds)1209 static void EpEvent(struct UsbFnEventAll *event, struct pollfd *pfds)
1210 {
1211     uint8_t i;
1212     for (i = 0; i < event->epNum; i++) {
1213         if ((pfds[i + event->ep0Num].revents & POLLIN)) {
1214             event->numEvent[i] = read(event->epx[i], event->reqEvent[i],
1215                 MAX_REQUEST * sizeof(struct UsbFnReqEvent)) / sizeof(struct UsbFnReqEvent);
1216             if (!event->numEvent[i]) {
1217                 HDF_LOGE("unable to read indexBuf from ep#");
1218             }
1219         }
1220     }
1221 }
1222 
UsbFnAdapterPollEvent(struct UsbFnEventAll * event,int32_t timeout)1223 static int32_t UsbFnAdapterPollEvent(struct UsbFnEventAll *event, int32_t timeout)
1224 {
1225     int32_t ret;
1226     uint8_t i;
1227     struct pollfd *pfds = NULL;
1228 
1229     if (event == NULL) {
1230         return HDF_ERR_INVALID_PARAM;
1231     }
1232     if (event->ep0Num + event->epNum == 0) {
1233         return HDF_ERR_INVALID_PARAM;
1234     }
1235     pfds = UsbFnMemCalloc((event->ep0Num + event->epNum) * sizeof(struct pollfd));
1236     if (pfds == NULL) {
1237         return HDF_ERR_MALLOC_FAIL;
1238     }
1239     for (i = 0; i < event->ep0Num; i++) {
1240         if (event->ep0[i] <= 0) {
1241             UsbFnMemFree(pfds);
1242             HDF_LOGE("%s: ep[%d] = %d", __func__, i, event->ep0[i]);
1243             return HDF_ERR_INVALID_PARAM;
1244         }
1245         pfds[i].fd = event->ep0[i];
1246         pfds[i].events = POLLIN | POLLOUT;
1247     }
1248     for (i = 0; i < event->epNum; i++) {
1249         if (event->epx[i] <= 0) {
1250             UsbFnMemFree(pfds);
1251             HDF_LOGE("%s: ep[%d] = %d", __func__, i, event->epx[i]);
1252             return HDF_ERR_INVALID_PARAM;
1253         }
1254         pfds[i + event->ep0Num].fd = event->epx[i];
1255         pfds[i + event->ep0Num].events = POLLIN;
1256     }
1257     ret = poll(pfds, event->ep0Num + event->epNum, timeout);
1258     if (ret == 0) {
1259         UsbFnMemFree(pfds);
1260         return HDF_ERR_TIMEOUT;
1261     } else if (ret < 0) {
1262         HDF_LOGE("%s: interrupt", __func__);
1263         UsbFnMemFree(pfds);
1264         return HDF_ERR_IO;
1265     }
1266     Ep0Event(event, pfds);
1267     EpEvent(event, pfds);
1268     UsbFnMemFree(pfds);
1269     return 0;
1270 }
1271 
UsbFnAdapterRequestGetStatus(int32_t ep,const struct IoData * ioData)1272 static int32_t UsbFnAdapterRequestGetStatus(int32_t ep, const struct IoData *ioData)
1273 {
1274     if (ep <= 0 || ioData == NULL) {
1275         return HDF_ERR_INVALID_PARAM;
1276     }
1277     return ioctl(ep, FUNCTIONFS_ENDPOINT_GET_REQ_STATUS, ioData);
1278 }
1279 
UsbFnMemAlloc(size_t size)1280 void *UsbFnMemAlloc(size_t size)
1281 {
1282     return UsbFnMemCalloc(size);
1283 }
1284 
UsbFnMemCalloc(size_t size)1285 void *UsbFnMemCalloc(size_t size)
1286 {
1287     void *buf = NULL;
1288     struct RawUsbRamTestList *testEntry = NULL;
1289     struct RawUsbRamTestList *pos = NULL;
1290     uint32_t totalSize = 0;
1291     int32_t ret = 0;
1292 
1293     buf = OsalMemAlloc(size);
1294     if (buf == NULL) {
1295         HDF_LOGE("%{public}s: %{public}d, OsalMemAlloc failed", __func__, __LINE__);
1296         return NULL;
1297     }
1298     ret = memset_s(buf, size, 0, size);
1299     if (ret != EOK) {
1300         HDF_LOGE("%{public}s: %{public}d, memset_s failed", __func__, __LINE__);
1301         OsalMemFree(buf);
1302         return NULL;
1303     }
1304 
1305     if (g_usbRamTestFlag) {
1306         if (g_usbRamTestHead == NULL) {
1307             g_usbRamTestHead = OsalMemAlloc(sizeof(struct RawUsbRamTestList));
1308             OsalMutexInit(&g_usbRamTestHead->lock);
1309             DListHeadInit(&g_usbRamTestHead->list);
1310         }
1311         testEntry = OsalMemAlloc(sizeof(struct RawUsbRamTestList));
1312         testEntry->address = (uintptr_t)buf;
1313         testEntry->size = size;
1314 
1315         OsalMutexLock(&g_usbRamTestHead->lock);
1316         DListInsertTail(&testEntry->list, &g_usbRamTestHead->list);
1317         DLIST_FOR_EACH_ENTRY(pos, &g_usbRamTestHead->list, struct RawUsbRamTestList, list) {
1318             totalSize += pos->size;
1319         }
1320         OsalMutexUnlock(&g_usbRamTestHead->lock);
1321 
1322         HDF_LOGE("%{public}s add size=%{public}d totalSize=%{public}d", __func__, (uint32_t)size, totalSize);
1323     }
1324     return buf;
1325 }
1326 
UsbFnMemFree(const void * mem)1327 void UsbFnMemFree(const void *mem)
1328 {
1329     struct RawUsbRamTestList *pos = NULL;
1330     struct RawUsbRamTestList *tmp = NULL;
1331     uint32_t totalSize = 0;
1332     uint32_t size = 0;
1333 
1334     if (mem == NULL) {
1335         return;
1336     }
1337 
1338     if ((g_usbRamTestFlag == true) && (g_usbRamTestHead != NULL)) {
1339         OsalMutexLock(&g_usbRamTestHead->lock);
1340         DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &g_usbRamTestHead->list, struct RawUsbRamTestList, list) {
1341             if (pos->address == (uintptr_t)mem) {
1342                 size = pos->size;
1343                 DListRemove(&pos->list);
1344                 OsalMemFree(pos);
1345                 continue;
1346             }
1347             totalSize += pos->size;
1348         }
1349         OsalMutexUnlock(&g_usbRamTestHead->lock);
1350         HDF_LOGE("%{public}s rm size=%{public}d totalSize=%{public}d", __func__, size, totalSize);
1351     }
1352 
1353     if (mem != NULL) {
1354         OsalMemFree((void *)mem);
1355     }
1356 }
1357 
UsbFnAdpMemTestTrigger(bool enable)1358 int32_t UsbFnAdpMemTestTrigger(bool enable)
1359 {
1360     g_usbRamTestFlag = enable;
1361     return HDF_SUCCESS;
1362 }
1363 
1364 static struct UsbFnAdapterOps g_usbFnAdapter = {
1365     .createDevice = UsbFnAdapterCreateDevice,
1366     .delDevice = UsbFnAdapterDelDevice,
1367 
1368     .openPipe = UsbFnAdapterOpenPipe,
1369     .closePipe = UsbFnAdapterClosePipe,
1370     .getPipeInfo = UsbFnAdapterGetPipeInfo,
1371 
1372     .queueInit = UsbFnAdapterQueueInit,
1373     .queueDel = UsbFnAdapterQueueDel,
1374     .releaseBuf = UsbFnAdapterReleaseBuf,
1375     .pipeIo = UsbFnAdapterPipeIo,
1376     .cancelIo = UsbFnAdapterCancelIo,
1377     .getReqStatus = UsbFnAdapterRequestGetStatus,
1378     .mapAddr = UsbFnAdapterMapAddr,
1379     .unmapAddr = UsbFnAdapterUnmapAddr,
1380     .pollEvent = UsbFnAdapterPollEvent,
1381     .writeUDC = UsbFnAdapterWriteUDC,
1382     .writeProp = UsbFnWriteProp,
1383     .writeDesString = UsbFnWriteDesString,
1384 };
1385 
UsbFnAdapterGetOps(void)1386 struct UsbFnAdapterOps *UsbFnAdapterGetOps(void)
1387 {
1388     return &g_usbFnAdapter;
1389 }
1390 
1391