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 USB_INTERFACE_POOL_H 17#define USB_INTERFACE_POOL_H 18 19#include "usb_session.h" 20#include "usb_ddk_device.h" 21#include "usb_ddk_interface.h" 22#include "usb_ddk_request.h" 23#include "usb_raw_api_library.h" 24 25#define INTERFACE_POOL_ID_MAX (128) 26#define INTERFACE_REFCOUNT_UNFORCE (1) 27 28typedef enum { 29 USB_PIPE_INDEX_TYPE, 30 USB_PIPE_DIRECTION_TYPE 31} UsbPipeQueryParaType; 32 33typedef enum { 34 USB_INTERFACE_INTERFACE_INDEX_TYPE, 35 USB_INTERFACE_ALT_SETTINGS_TYPE 36} UsbInterfaceQueryParaType; 37 38typedef enum { 39 USB_POOL_NORMAL_TYPE, 40 USB_POOL_OBJECT_ID_TYPE 41} UsbPoolQueryParaType; 42 43typedef enum { 44 USB_POOL_PROCESS_RUNNING, 45 USB_POOL_PROCESS_STOP, 46 USB_POOL_PROCESS_STOPED 47} UsbPoolProcessStatusType; 48 49struct UsbInterfaceHandleEntity { 50 struct UsbDeviceHandle *devHandle; 51 uint8_t interfaceIndex; 52}; 53struct UsbSdkInterface { 54 struct UsbInterface interface; 55 int32_t parentObjectId; 56 struct DListHead pipeList; 57 struct OsalMutex listLock; 58 UsbInterfaceStatus status; 59 uint8_t altSettingId; 60 struct UsbSession *session; 61 OsalAtomic refCount; 62 bool forceDetachKernelDriver; 63}; 64 65struct UsbInterfacePool { 66 struct UsbObject object; 67 struct UsbSession *session; 68 struct OsalMutex mutex; 69 struct DListHead interfaceList; 70 struct OsalMutex interfaceLock; 71 OsalAtomic refCount; 72 uint8_t busNum; 73 uint8_t devAddr; 74 OsalAtomic ioRefCount; 75 struct OsalThread ioSendProcess; 76 struct OsalThread ioAsyncReceiveProcess; 77 struct UsbMessageQueue submitRequestQueue; 78 UsbRawTidType ioProcessTid; 79 UsbPoolProcessStatusType ioProcessStopStatus; 80 UsbPoolProcessStatusType ioRecvProcessStopStatus; 81 struct OsalMutex ioStopLock; 82 struct UsbDevice *device; 83 struct OsalSem ioSem; 84}; 85 86struct UsbPipeQueryPara { 87 UsbPipeQueryParaType type; 88 union { 89 uint8_t pipeId; 90 UsbPipeDirection pipeDirection; 91 }; 92}; 93 94struct UsbInterfaceQueryPara { 95 UsbInterfaceQueryParaType type; 96 uint8_t interfaceIndex; 97 uint8_t altSettingId; 98}; 99 100struct UsbPoolQueryPara { 101 UsbPoolQueryParaType type; 102 union { 103 struct { 104 uint8_t busNum; 105 uint8_t usbAddr; 106 }; 107 int32_t objectId; 108 }; 109}; 110 111struct UsbIfRequest { 112 struct UsbRequest request; 113 struct UsbHostRequest *hostRequest; 114 bool isSyncReq; 115}__attribute__((aligned(4))); 116 117int32_t UsbIfCreatPipeObj(const struct UsbSdkInterface *interfaceObj, struct UsbPipe **pipeObj); 118int32_t UsbIfCreatInterfaceObj(const struct UsbInterfacePool *interfacePool, struct UsbSdkInterface **interfaceObj); 119HDF_STATUS UsbIfDestroyInterfaceObj( 120 const struct UsbInterfacePool *interfacePool, const struct UsbSdkInterface *interfaceObj); 121int32_t UsbIfCreatInterfacePool(const struct UsbSession *session, uint8_t busNum, uint8_t devAddr, 122 struct UsbInterfacePool **interfacePool); 123int32_t UsbCloseCtlProcess(const UsbInterfaceHandle *interfaceHandle); 124 125#endif /* USB_INTERFACE_POOL_H */ 126