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