1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#ifndef USBFN_ADAPTER_H
17094332d3Sopenharmony_ci#define USBFN_ADAPTER_H
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_ci#include <stdbool.h>
20094332d3Sopenharmony_ci#include <sys/mman.h>
21094332d3Sopenharmony_ci#include "hdf_slist.h"
22094332d3Sopenharmony_ci#include "hdf_dlist.h"
23094332d3Sopenharmony_ci#include "osal_mutex.h"
24094332d3Sopenharmony_ci#include "osal_file.h"
25094332d3Sopenharmony_ci#include "osal_mem.h"
26094332d3Sopenharmony_ci#include "securec.h"
27094332d3Sopenharmony_ci#include "hdf_log.h"
28094332d3Sopenharmony_ci#include "usbfn_interface.h"
29094332d3Sopenharmony_ci#include "usbfn_device.h"
30094332d3Sopenharmony_ci#include "usb_ddk.h"
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_ci#define FCONFIG_IOC_MAGIC                'c'
33094332d3Sopenharmony_ci#define FCONFIG_CMD_MAKE_GADGET          _IO(FCONFIG_IOC_MAGIC, 1)
34094332d3Sopenharmony_ci#define FCONFIG_CMD_DROP_GADGET          _IO(FCONFIG_IOC_MAGIC, 2)
35094332d3Sopenharmony_ci#define FCONFIG_CMD_WRITE_DEV_DESC       _IO(FCONFIG_IOC_MAGIC, 3)
36094332d3Sopenharmony_ci#define FCONFIG_CMD_ADD_CONFIG           _IO(FCONFIG_IOC_MAGIC, 4)
37094332d3Sopenharmony_ci#define FCONFIG_CMD_REMOVE_CONFIG        _IO(FCONFIG_IOC_MAGIC, 5)
38094332d3Sopenharmony_ci#define FCONFIG_CMD_WRITE_STRINGS        _IO(FCONFIG_IOC_MAGIC, 6)
39094332d3Sopenharmony_ci#define FCONFIG_CMD_MAKE_FUNCTION        _IO(FCONFIG_IOC_MAGIC, 7)
40094332d3Sopenharmony_ci#define FCONFIG_CMD_DROP_FUNCTION        _IO(FCONFIG_IOC_MAGIC, 8)
41094332d3Sopenharmony_ci#define FCONFIG_CMD_ENABLE_UDC           _IO(FCONFIG_IOC_MAGIC, 9)
42094332d3Sopenharmony_ci#define FCONFIG_CMD_DISABLE_UDC          _IO(FCONFIG_IOC_MAGIC, 10)
43094332d3Sopenharmony_ci#define FCONFIG_CMD_CHAGE_DEVINFO        _IO(FCONFIG_IOC_MAGIC, 11)
44094332d3Sopenharmony_ci#define FCONFIG_CMD_CHAGE_DEVSTRING      _IO(FCONFIG_IOC_MAGIC, 12)
45094332d3Sopenharmony_ci
46094332d3Sopenharmony_ci#define GENERIC_IOC_MAGIC               'g'
47094332d3Sopenharmony_ci#define GENERIC_CMD_FREE_MEM            _IO(GENERIC_IOC_MAGIC, 1)
48094332d3Sopenharmony_ci#define GENERIC_CMD_CANCEL_REQUEST      _IO(GENERIC_IOC_MAGIC, 2)
49094332d3Sopenharmony_ci#define GENERIC_CMD_GET_PIPE_INFO       _IO(GENERIC_IOC_MAGIC, 3)
50094332d3Sopenharmony_ci
51094332d3Sopenharmony_ci#define GENERIC_CMD_GET_EP0_EVENT       _IO(GENERIC_IOC_MAGIC, 4)
52094332d3Sopenharmony_ci#define GENERIC_CMD_ENDPOINT_IO         _IO(GENERIC_IOC_MAGIC, 5)
53094332d3Sopenharmony_ci#define GENERIC_CMD_GET_REQ_STATUS      _IO(GENERIC_IOC_MAGIC, 6)
54094332d3Sopenharmony_ci
55094332d3Sopenharmony_cistruct FconfigString {
56094332d3Sopenharmony_ci    uint32_t                      len;
57094332d3Sopenharmony_ci    char                          *s;
58094332d3Sopenharmony_ci};
59094332d3Sopenharmony_ci
60094332d3Sopenharmony_cistruct FconfigUsbString {
61094332d3Sopenharmony_ci    uint8_t                       id;
62094332d3Sopenharmony_ci    struct FconfigString         str;
63094332d3Sopenharmony_ci};
64094332d3Sopenharmony_ci
65094332d3Sopenharmony_cistruct FconfigDevStrings {
66094332d3Sopenharmony_ci    struct FconfigString    gadgetName;
67094332d3Sopenharmony_ci    uint16_t                language;
68094332d3Sopenharmony_ci    uint32_t                strCount;
69094332d3Sopenharmony_ci    struct FconfigUsbString *strings;
70094332d3Sopenharmony_ci} __attribute__((packed));
71094332d3Sopenharmony_ci
72094332d3Sopenharmony_cistruct FconfigDevDesc {
73094332d3Sopenharmony_ci    struct FconfigString        gadgetName;
74094332d3Sopenharmony_ci    struct UsbDeviceDescriptor  devDesc;
75094332d3Sopenharmony_ci} __attribute__((packed));
76094332d3Sopenharmony_ci
77094332d3Sopenharmony_cistruct FconfigCfgDesc {
78094332d3Sopenharmony_ci    struct FconfigString        gadgetName;
79094332d3Sopenharmony_ci    struct FconfigString        configName;
80094332d3Sopenharmony_ci    struct UsbConfigDescriptor  cfgDesc;
81094332d3Sopenharmony_ci} __attribute__((packed));
82094332d3Sopenharmony_ci
83094332d3Sopenharmony_cistruct FconfigFuncInfo {
84094332d3Sopenharmony_ci    struct FconfigString        gadgetName;
85094332d3Sopenharmony_ci    struct FconfigString        configName;
86094332d3Sopenharmony_ci    struct FconfigString        funcName;
87094332d3Sopenharmony_ci};
88094332d3Sopenharmony_ci
89094332d3Sopenharmony_cistruct FconfigUdcInfo {
90094332d3Sopenharmony_ci    struct FconfigString      gadgetName;
91094332d3Sopenharmony_ci    struct FconfigString      udcName;
92094332d3Sopenharmony_ci};
93094332d3Sopenharmony_ci
94094332d3Sopenharmony_cistruct FconfigProp {
95094332d3Sopenharmony_ci    const char  *propName;
96094332d3Sopenharmony_ci    uint16_t    propValue;
97094332d3Sopenharmony_ci};
98094332d3Sopenharmony_ci
99094332d3Sopenharmony_cistruct FconfigPropSting {
100094332d3Sopenharmony_ci    uint16_t    lang;
101094332d3Sopenharmony_ci    const char  *propName;
102094332d3Sopenharmony_ci    const char  *propValue;
103094332d3Sopenharmony_ci};
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_cistruct FconfigDevdescInfo {
106094332d3Sopenharmony_ci    struct FconfigString      gadgetName;
107094332d3Sopenharmony_ci    struct FconfigProp        prop;
108094332d3Sopenharmony_ci};
109094332d3Sopenharmony_ci
110094332d3Sopenharmony_cistruct FconfigDevDescString {
111094332d3Sopenharmony_ci    struct FconfigString      gadgetName;
112094332d3Sopenharmony_ci    struct FconfigPropSting   prop;
113094332d3Sopenharmony_ci};
114094332d3Sopenharmony_ci
115094332d3Sopenharmony_cistruct FconfigPollFd {
116094332d3Sopenharmony_ci    int32_t fd;
117094332d3Sopenharmony_ci    uint32_t revents;
118094332d3Sopenharmony_ci    int32_t events;
119094332d3Sopenharmony_ci};
120094332d3Sopenharmony_ci
121094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_DESC             _IOR('g', 130, struct UsbEndpointDescriptor)
122094332d3Sopenharmony_ci
123094332d3Sopenharmony_ci#define FUNCTIONFS_NEWFN                     _IOW('g', 60, struct FuncNew)
124094332d3Sopenharmony_ci#define FUNCTIONFS_DELFN                     _IOW('g', 61, struct FuncNew)
125094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_GET_REQ_STATUS   _IOW('g', 48, struct IoData)
126094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_WRITE            _IOW('g', 49, struct IoData)
127094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_READ             _IOW('g', 50, struct IoData)
128094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_RW_CANCEL        _IOW('g', 51, struct IoData)
129094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_QUEUE_INIT       _IO('g', 52)
130094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_QUEUE_DEL        _IO('g', 53)
131094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_RELEASE_BUF      _IOR('g', 54, struct GenericMemory)
132094332d3Sopenharmony_ci#define FUNCTIONFS_ENDPOINT_GET_EP0_EVENT    _IOR('g', 56, struct UsbFnReqEvent)
133094332d3Sopenharmony_ci
134094332d3Sopenharmony_ci#define FUNCTION_GENERIC "f_generic"
135094332d3Sopenharmony_ci#define CONFIGFS_DIR "/config/usb_gadget"
136094332d3Sopenharmony_ci#define USBFN_DEV "/dev/usbfn"
137094332d3Sopenharmony_ci#define MAX_REQUEST         64
138094332d3Sopenharmony_ci#define MAX_NAMELEN         64
139094332d3Sopenharmony_ci#define MAX_PATHLEN         128
140094332d3Sopenharmony_ci
141094332d3Sopenharmony_ci#define USB_EVENT_COUNT 10
142094332d3Sopenharmony_ci#define MAX_EP          16
143094332d3Sopenharmony_ci#define MAX_BUFLEN      2048
144094332d3Sopenharmony_ci
145094332d3Sopenharmony_cistruct UsbDeviceFunctionsInfo {
146094332d3Sopenharmony_ci    const char *functionName;
147094332d3Sopenharmony_ci    uint32_t numberMask;
148094332d3Sopenharmony_ci};
149094332d3Sopenharmony_ci
150094332d3Sopenharmony_cistruct UsbFnCtrlEvent {
151094332d3Sopenharmony_ci    union {
152094332d3Sopenharmony_ci        struct UsbFnCtrlRequest  setup;
153094332d3Sopenharmony_ci    } __attribute__((packed))    u;
154094332d3Sopenharmony_ci    uint8_t                      type;
155094332d3Sopenharmony_ci    uint8_t                      pad[3];
156094332d3Sopenharmony_ci} __attribute__((packed));
157094332d3Sopenharmony_ci
158094332d3Sopenharmony_citypedef enum {
159094332d3Sopenharmony_ci    USB_EP0_INVALID,
160094332d3Sopenharmony_ci    USB_EP0_CTRL_EVENT,
161094332d3Sopenharmony_ci    USB_EP0_IO_COMPLETED,
162094332d3Sopenharmony_ci} UsbEp0EventType;
163094332d3Sopenharmony_ci
164094332d3Sopenharmony_cistruct FuncNew {
165094332d3Sopenharmony_ci    uint32_t nameLen;
166094332d3Sopenharmony_ci    char     name[MAX_NAMELEN];
167094332d3Sopenharmony_ci};
168094332d3Sopenharmony_ci
169094332d3Sopenharmony_cistruct IoData {
170094332d3Sopenharmony_ci    uint32_t aio;       /* 0 for sync ,1 for async */
171094332d3Sopenharmony_ci    uint32_t read;      /* 0 for write ,1 for read */
172094332d3Sopenharmony_ci    uint32_t len;       /* the len of this io request */
173094332d3Sopenharmony_ci    uint32_t timeout;   /* sync timeout */
174094332d3Sopenharmony_ci    uint64_t buf;       /* the address of map buf */
175094332d3Sopenharmony_ci};
176094332d3Sopenharmony_ci
177094332d3Sopenharmony_cistruct GenericMemory {
178094332d3Sopenharmony_ci    uint32_t size;
179094332d3Sopenharmony_ci    uint64_t buf;
180094332d3Sopenharmony_ci};
181094332d3Sopenharmony_ci
182094332d3Sopenharmony_cistruct UsbFnReqEvent {
183094332d3Sopenharmony_ci    uint64_t buf;
184094332d3Sopenharmony_ci    uint32_t actual;
185094332d3Sopenharmony_ci    int32_t      status;
186094332d3Sopenharmony_ci};
187094332d3Sopenharmony_ci
188094332d3Sopenharmony_cistruct UsbEp0Event {
189094332d3Sopenharmony_ci    union {
190094332d3Sopenharmony_ci        struct UsbFnCtrlEvent ctrlEvent;
191094332d3Sopenharmony_ci        struct UsbFnReqEvent reqEvent;
192094332d3Sopenharmony_ci    };
193094332d3Sopenharmony_ci    UsbEp0EventType type;
194094332d3Sopenharmony_ci};
195094332d3Sopenharmony_ci#define MAX_EP0_NUM 5
196094332d3Sopenharmony_cistruct UsbFnEventAll {
197094332d3Sopenharmony_ci    int32_t ep0[MAX_EP0_NUM];
198094332d3Sopenharmony_ci    uint8_t ep0Num;
199094332d3Sopenharmony_ci    struct UsbEp0Event ep0Event[MAX_EP0_NUM];
200094332d3Sopenharmony_ci    int32_t epx[MAX_EP];
201094332d3Sopenharmony_ci    uint8_t epNum;
202094332d3Sopenharmony_ci    struct UsbFnReqEvent *reqEvent[MAX_EP];
203094332d3Sopenharmony_ci    uint8_t numEvent[MAX_EP];
204094332d3Sopenharmony_ci};
205094332d3Sopenharmony_ci
206094332d3Sopenharmony_cistruct UsbFnAdapterOps {
207094332d3Sopenharmony_ci    int32_t (*createDevice)(const char *udcName, const char *devName, struct UsbFnDeviceDesc *descriptor);
208094332d3Sopenharmony_ci    int32_t (*delDevice)(const char *devName, const char *udcName, struct UsbFnDeviceDesc *descriptor);
209094332d3Sopenharmony_ci
210094332d3Sopenharmony_ci    int32_t (*openPipe)(const char *interfaceName, int32_t epIndex);
211094332d3Sopenharmony_ci    int32_t (*closePipe)(int32_t ep);
212094332d3Sopenharmony_ci    int32_t (*getPipeInfo)(int32_t ep, struct UsbFnPipeInfo *pipeInfo);
213094332d3Sopenharmony_ci
214094332d3Sopenharmony_ci    int32_t (*queueInit)(int32_t ep);
215094332d3Sopenharmony_ci    int32_t (*queueDel)(int32_t ep);
216094332d3Sopenharmony_ci    int32_t (*releaseBuf)(int32_t ep, const struct GenericMemory *mem);
217094332d3Sopenharmony_ci    int32_t (*pipeIo)(int32_t ep, struct IoData *ioData);
218094332d3Sopenharmony_ci    int32_t (*cancelIo)(int32_t ep, const struct IoData *ioData);
219094332d3Sopenharmony_ci    int32_t (*getReqStatus)(int32_t ep, const struct IoData *ioData);
220094332d3Sopenharmony_ci    uint8_t *(*mapAddr)(int32_t ep, uint32_t len);
221094332d3Sopenharmony_ci    int32_t (*unmapAddr)(uint8_t *mapAddr, uint32_t len);
222094332d3Sopenharmony_ci    int32_t (*pollEvent)(struct UsbFnEventAll *event, int32_t timeout);
223094332d3Sopenharmony_ci
224094332d3Sopenharmony_ci    int32_t (*writeUDC)(const char *deviceName, const char *udcName, int32_t enable);
225094332d3Sopenharmony_ci    int32_t (*writeProp)(const char *deviceName, const char *propName, uint32_t propValue);
226094332d3Sopenharmony_ci    int32_t (*writeDesString)(const char *deviceName,
227094332d3Sopenharmony_ci        uint16_t lang, const char *stringName, const char *stringValue);
228094332d3Sopenharmony_ci};
229094332d3Sopenharmony_ci
230094332d3Sopenharmony_cistruct RawUsbRamTestList {
231094332d3Sopenharmony_ci    uintptr_t address;
232094332d3Sopenharmony_ci    uint32_t size;
233094332d3Sopenharmony_ci    struct DListHead list;
234094332d3Sopenharmony_ci    struct OsalMutex lock;
235094332d3Sopenharmony_ci};
236094332d3Sopenharmony_ci
237094332d3Sopenharmony_cistruct UsbFnAdapterOps *UsbFnAdapterGetOps(void);
238094332d3Sopenharmony_civoid *UsbFnMemAlloc(size_t size);
239094332d3Sopenharmony_civoid *UsbFnMemCalloc(size_t size);
240094332d3Sopenharmony_civoid UsbFnMemFree(const void *mem);
241094332d3Sopenharmony_ci
242094332d3Sopenharmony_ci#endif /* USBFN_ADAPTER_H */
243