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 #ifndef USBFN_ADAPTER_H 17 #define USBFN_ADAPTER_H 18 19 #include <stdbool.h> 20 #include <sys/mman.h> 21 #include "hdf_slist.h" 22 #include "hdf_dlist.h" 23 #include "osal_mutex.h" 24 #include "osal_file.h" 25 #include "osal_mem.h" 26 #include "securec.h" 27 #include "hdf_log.h" 28 #include "usbfn_interface.h" 29 #include "usbfn_device.h" 30 #include "usb_ddk.h" 31 32 #define FCONFIG_IOC_MAGIC 'c' 33 #define FCONFIG_CMD_MAKE_GADGET _IO(FCONFIG_IOC_MAGIC, 1) 34 #define FCONFIG_CMD_DROP_GADGET _IO(FCONFIG_IOC_MAGIC, 2) 35 #define FCONFIG_CMD_WRITE_DEV_DESC _IO(FCONFIG_IOC_MAGIC, 3) 36 #define FCONFIG_CMD_ADD_CONFIG _IO(FCONFIG_IOC_MAGIC, 4) 37 #define FCONFIG_CMD_REMOVE_CONFIG _IO(FCONFIG_IOC_MAGIC, 5) 38 #define FCONFIG_CMD_WRITE_STRINGS _IO(FCONFIG_IOC_MAGIC, 6) 39 #define FCONFIG_CMD_MAKE_FUNCTION _IO(FCONFIG_IOC_MAGIC, 7) 40 #define FCONFIG_CMD_DROP_FUNCTION _IO(FCONFIG_IOC_MAGIC, 8) 41 #define FCONFIG_CMD_ENABLE_UDC _IO(FCONFIG_IOC_MAGIC, 9) 42 #define FCONFIG_CMD_DISABLE_UDC _IO(FCONFIG_IOC_MAGIC, 10) 43 #define FCONFIG_CMD_CHAGE_DEVINFO _IO(FCONFIG_IOC_MAGIC, 11) 44 #define FCONFIG_CMD_CHAGE_DEVSTRING _IO(FCONFIG_IOC_MAGIC, 12) 45 46 #define GENERIC_IOC_MAGIC 'g' 47 #define GENERIC_CMD_FREE_MEM _IO(GENERIC_IOC_MAGIC, 1) 48 #define GENERIC_CMD_CANCEL_REQUEST _IO(GENERIC_IOC_MAGIC, 2) 49 #define GENERIC_CMD_GET_PIPE_INFO _IO(GENERIC_IOC_MAGIC, 3) 50 51 #define GENERIC_CMD_GET_EP0_EVENT _IO(GENERIC_IOC_MAGIC, 4) 52 #define GENERIC_CMD_ENDPOINT_IO _IO(GENERIC_IOC_MAGIC, 5) 53 #define GENERIC_CMD_GET_REQ_STATUS _IO(GENERIC_IOC_MAGIC, 6) 54 55 struct FconfigString { 56 uint32_t len; 57 char *s; 58 }; 59 60 struct FconfigUsbString { 61 uint8_t id; 62 struct FconfigString str; 63 }; 64 65 struct FconfigDevStrings { 66 struct FconfigString gadgetName; 67 uint16_t language; 68 uint32_t strCount; 69 struct FconfigUsbString *strings; 70 } __attribute__((packed)); 71 72 struct FconfigDevDesc { 73 struct FconfigString gadgetName; 74 struct UsbDeviceDescriptor devDesc; 75 } __attribute__((packed)); 76 77 struct FconfigCfgDesc { 78 struct FconfigString gadgetName; 79 struct FconfigString configName; 80 struct UsbConfigDescriptor cfgDesc; 81 } __attribute__((packed)); 82 83 struct FconfigFuncInfo { 84 struct FconfigString gadgetName; 85 struct FconfigString configName; 86 struct FconfigString funcName; 87 }; 88 89 struct FconfigUdcInfo { 90 struct FconfigString gadgetName; 91 struct FconfigString udcName; 92 }; 93 94 struct FconfigProp { 95 const char *propName; 96 uint16_t propValue; 97 }; 98 99 struct FconfigPropSting { 100 uint16_t lang; 101 const char *propName; 102 const char *propValue; 103 }; 104 105 struct FconfigDevdescInfo { 106 struct FconfigString gadgetName; 107 struct FconfigProp prop; 108 }; 109 110 struct FconfigDevDescString { 111 struct FconfigString gadgetName; 112 struct FconfigPropSting prop; 113 }; 114 115 struct FconfigPollFd { 116 int32_t fd; 117 uint32_t revents; 118 int32_t events; 119 }; 120 121 #define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, struct UsbEndpointDescriptor) 122 123 #define FUNCTIONFS_NEWFN _IOW('g', 60, struct FuncNew) 124 #define FUNCTIONFS_DELFN _IOW('g', 61, struct FuncNew) 125 #define FUNCTIONFS_ENDPOINT_GET_REQ_STATUS _IOW('g', 48, struct IoData) 126 #define FUNCTIONFS_ENDPOINT_WRITE _IOW('g', 49, struct IoData) 127 #define FUNCTIONFS_ENDPOINT_READ _IOW('g', 50, struct IoData) 128 #define FUNCTIONFS_ENDPOINT_RW_CANCEL _IOW('g', 51, struct IoData) 129 #define FUNCTIONFS_ENDPOINT_QUEUE_INIT _IO('g', 52) 130 #define FUNCTIONFS_ENDPOINT_QUEUE_DEL _IO('g', 53) 131 #define FUNCTIONFS_ENDPOINT_RELEASE_BUF _IOR('g', 54, struct GenericMemory) 132 #define FUNCTIONFS_ENDPOINT_GET_EP0_EVENT _IOR('g', 56, struct UsbFnReqEvent) 133 134 #define FUNCTION_GENERIC "f_generic" 135 #define CONFIGFS_DIR "/config/usb_gadget" 136 #define USBFN_DEV "/dev/usbfn" 137 #define MAX_REQUEST 64 138 #define MAX_NAMELEN 64 139 #define MAX_PATHLEN 128 140 141 #define USB_EVENT_COUNT 10 142 #define MAX_EP 16 143 #define MAX_BUFLEN 2048 144 145 struct UsbDeviceFunctionsInfo { 146 const char *functionName; 147 uint32_t numberMask; 148 }; 149 150 struct UsbFnCtrlEvent { 151 union { 152 struct UsbFnCtrlRequest setup; 153 } __attribute__((packed)) u; 154 uint8_t type; 155 uint8_t pad[3]; 156 } __attribute__((packed)); 157 158 typedef enum { 159 USB_EP0_INVALID, 160 USB_EP0_CTRL_EVENT, 161 USB_EP0_IO_COMPLETED, 162 } UsbEp0EventType; 163 164 struct FuncNew { 165 uint32_t nameLen; 166 char name[MAX_NAMELEN]; 167 }; 168 169 struct IoData { 170 uint32_t aio; /* 0 for sync ,1 for async */ 171 uint32_t read; /* 0 for write ,1 for read */ 172 uint32_t len; /* the len of this io request */ 173 uint32_t timeout; /* sync timeout */ 174 uint64_t buf; /* the address of map buf */ 175 }; 176 177 struct GenericMemory { 178 uint32_t size; 179 uint64_t buf; 180 }; 181 182 struct UsbFnReqEvent { 183 uint64_t buf; 184 uint32_t actual; 185 int32_t status; 186 }; 187 188 struct UsbEp0Event { 189 union { 190 struct UsbFnCtrlEvent ctrlEvent; 191 struct UsbFnReqEvent reqEvent; 192 }; 193 UsbEp0EventType type; 194 }; 195 #define MAX_EP0_NUM 5 196 struct UsbFnEventAll { 197 int32_t ep0[MAX_EP0_NUM]; 198 uint8_t ep0Num; 199 struct UsbEp0Event ep0Event[MAX_EP0_NUM]; 200 int32_t epx[MAX_EP]; 201 uint8_t epNum; 202 struct UsbFnReqEvent *reqEvent[MAX_EP]; 203 uint8_t numEvent[MAX_EP]; 204 }; 205 206 struct UsbFnAdapterOps { 207 int32_t (*createDevice)(const char *udcName, const char *devName, struct UsbFnDeviceDesc *descriptor); 208 int32_t (*delDevice)(const char *devName, const char *udcName, struct UsbFnDeviceDesc *descriptor); 209 210 int32_t (*openPipe)(const char *interfaceName, int32_t epIndex); 211 int32_t (*closePipe)(int32_t ep); 212 int32_t (*getPipeInfo)(int32_t ep, struct UsbFnPipeInfo *pipeInfo); 213 214 int32_t (*queueInit)(int32_t ep); 215 int32_t (*queueDel)(int32_t ep); 216 int32_t (*releaseBuf)(int32_t ep, const struct GenericMemory *mem); 217 int32_t (*pipeIo)(int32_t ep, struct IoData *ioData); 218 int32_t (*cancelIo)(int32_t ep, const struct IoData *ioData); 219 int32_t (*getReqStatus)(int32_t ep, const struct IoData *ioData); 220 uint8_t *(*mapAddr)(int32_t ep, uint32_t len); 221 int32_t (*unmapAddr)(uint8_t *mapAddr, uint32_t len); 222 int32_t (*pollEvent)(struct UsbFnEventAll *event, int32_t timeout); 223 224 int32_t (*writeUDC)(const char *deviceName, const char *udcName, int32_t enable); 225 int32_t (*writeProp)(const char *deviceName, const char *propName, uint32_t propValue); 226 int32_t (*writeDesString)(const char *deviceName, 227 uint16_t lang, const char *stringName, const char *stringValue); 228 }; 229 230 struct RawUsbRamTestList { 231 uintptr_t address; 232 uint32_t size; 233 struct DListHead list; 234 struct OsalMutex lock; 235 }; 236 237 struct UsbFnAdapterOps *UsbFnAdapterGetOps(void); 238 void *UsbFnMemAlloc(size_t size); 239 void *UsbFnMemCalloc(size_t size); 240 void UsbFnMemFree(const void *mem); 241 int32_t UsbFnAdpMemTestTrigger(bool enable); 242 243 #endif /* USBFN_ADAPTER_H */ 244