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