1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 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 USBD_H 17094332d3Sopenharmony_ci#define USBD_H 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_ci#include "data_fifo.h" 20094332d3Sopenharmony_ci#include "hdf_base.h" 21094332d3Sopenharmony_ci#include "hdf_device_desc.h" 22094332d3Sopenharmony_ci#include "osal_sem.h" 23094332d3Sopenharmony_ci#include "refbase.h" 24094332d3Sopenharmony_ci#include "iremote_object.h" 25094332d3Sopenharmony_ci#include "usb_ddk.h" 26094332d3Sopenharmony_ci#include "usb_ddk_interface.h" 27094332d3Sopenharmony_ci#include "usb_session.h" 28094332d3Sopenharmony_ci#include "usbd_type.h" 29094332d3Sopenharmony_ci#include "v1_1/iusb_interface.h" 30094332d3Sopenharmony_ci#include "v1_0/iusbd_bulk_callback.h" 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_ci#define USB_MAX_INTERFACES 32 33094332d3Sopenharmony_ci#define USB_MAX_DEVICE_NUMBERS 127 34094332d3Sopenharmony_ci#define DIRECTION_MASK 0x1 35094332d3Sopenharmony_ci#define USB_CTRL_SET_TIMEOUT 5000 36094332d3Sopenharmony_ci#define USB_PIPE_DIR_OFFSET 7 37094332d3Sopenharmony_ci#define MAX_SUBSCRIBER 10 38094332d3Sopenharmony_ci#define USBD_BULKASYNCREQ_NUM_MAX 64 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_cinamespace OHOS { 41094332d3Sopenharmony_cinamespace HDI { 42094332d3Sopenharmony_cinamespace Usb { 43094332d3Sopenharmony_cinamespace V1_1 { 44094332d3Sopenharmony_cistruct UsbdBulkASyncReqList; 45094332d3Sopenharmony_cistruct UsbdBulkASyncList; 46094332d3Sopenharmony_ciclass UsbImpl; 47094332d3Sopenharmony_cistruct UsbdBufferHandle { 48094332d3Sopenharmony_ci int32_t fd; /**< buffer fd, -1 if not supported */ 49094332d3Sopenharmony_ci uint32_t size; /* < size of memory */ 50094332d3Sopenharmony_ci uint8_t *starAddr; 51094332d3Sopenharmony_ci uint32_t cur; 52094332d3Sopenharmony_ci uint32_t rcur; 53094332d3Sopenharmony_ci uint8_t cbflg; 54094332d3Sopenharmony_ci struct OsalMutex lock; 55094332d3Sopenharmony_ci}; 56094332d3Sopenharmony_ci 57094332d3Sopenharmony_cistruct UsbdBulkASyncReqNode { 58094332d3Sopenharmony_ci struct DListHead node; 59094332d3Sopenharmony_ci struct UsbRequest *request; 60094332d3Sopenharmony_ci struct UsbdBulkASyncReqList *list; 61094332d3Sopenharmony_ci int32_t use; 62094332d3Sopenharmony_ci int32_t id; 63094332d3Sopenharmony_ci}; 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_cistruct UsbdBulkASyncReqList { 66094332d3Sopenharmony_ci struct UsbdBulkASyncReqNode node[USBD_BULKASYNCREQ_NUM_MAX]; 67094332d3Sopenharmony_ci struct UsbdBulkASyncList *pList; 68094332d3Sopenharmony_ci struct DListHead eList; 69094332d3Sopenharmony_ci struct DListHead uList; 70094332d3Sopenharmony_ci struct OsalMutex elock; 71094332d3Sopenharmony_ci struct OsalMutex ulock; 72094332d3Sopenharmony_ci}; 73094332d3Sopenharmony_ci 74094332d3Sopenharmony_cistruct UsbdBulkASyncList { 75094332d3Sopenharmony_ci struct HostDevice *instance; 76094332d3Sopenharmony_ci struct UsbdBulkASyncList *next; 77094332d3Sopenharmony_ci UsbInterfaceHandle *ifHandle; 78094332d3Sopenharmony_ci sptr<HDI::Usb::V1_1::IUsbdBulkCallback> cb; 79094332d3Sopenharmony_ci struct UsbdBulkASyncReqList rList; 80094332d3Sopenharmony_ci struct UsbPipeInfo pipe; 81094332d3Sopenharmony_ci struct UsbRequestParams params; 82094332d3Sopenharmony_ci struct UsbdBufferHandle asmHandle; 83094332d3Sopenharmony_ci uint8_t ifId; 84094332d3Sopenharmony_ci uint8_t epId; 85094332d3Sopenharmony_ci}; 86094332d3Sopenharmony_ci 87094332d3Sopenharmony_cistruct HostDevice { 88094332d3Sopenharmony_ci struct HdfSListNode node; 89094332d3Sopenharmony_ci struct DataFifo readFifo; 90094332d3Sopenharmony_ci struct HdfSList requestQueue; 91094332d3Sopenharmony_ci struct OsalMutex requestLock; 92094332d3Sopenharmony_ci struct HdfSList reqSyncList; 93094332d3Sopenharmony_ci struct OsalMutex reqSyncLock; 94094332d3Sopenharmony_ci struct HdfSList reqASyncList; 95094332d3Sopenharmony_ci struct OsalMutex reqASyncLock; 96094332d3Sopenharmony_ci struct OsalMutex writeLock; 97094332d3Sopenharmony_ci struct OsalMutex readLock; 98094332d3Sopenharmony_ci struct OsalMutex lock; 99094332d3Sopenharmony_ci struct UsbRequest *ctrlReq; 100094332d3Sopenharmony_ci struct UsbInterface *ctrIface; 101094332d3Sopenharmony_ci struct UsbPipeInfo *ctrPipe; 102094332d3Sopenharmony_ci struct UsbdBulkASyncList *bulkASyncList; 103094332d3Sopenharmony_ci UsbInterfaceHandle *ctrDevHandle; 104094332d3Sopenharmony_ci UsbImpl *service; 105094332d3Sopenharmony_ci struct UsbInterface *iface[USB_MAX_INTERFACES]; 106094332d3Sopenharmony_ci UsbInterfaceHandle *devHandle[USB_MAX_INTERFACES]; 107094332d3Sopenharmony_ci uint8_t interfaceIndex[USB_MAX_INTERFACES]; 108094332d3Sopenharmony_ci uint8_t busNum; 109094332d3Sopenharmony_ci uint8_t devAddr; 110094332d3Sopenharmony_ci uint8_t interfaceCnt; 111094332d3Sopenharmony_ci bool initFlag; 112094332d3Sopenharmony_ci}; 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_cistruct RequestMsg { 115094332d3Sopenharmony_ci struct UsbRequest *request; 116094332d3Sopenharmony_ci void *clientData; 117094332d3Sopenharmony_ci uint32_t clientLength; 118094332d3Sopenharmony_ci void *buffer; 119094332d3Sopenharmony_ci uint32_t length; 120094332d3Sopenharmony_ci}; 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_cistruct UsbControlParams { 123094332d3Sopenharmony_ci uint8_t request; 124094332d3Sopenharmony_ci UsbRequestTargetType target; 125094332d3Sopenharmony_ci uint8_t reqType; 126094332d3Sopenharmony_ci UsbRequestDirection directon; 127094332d3Sopenharmony_ci uint16_t value; 128094332d3Sopenharmony_ci uint16_t index; 129094332d3Sopenharmony_ci void *data; 130094332d3Sopenharmony_ci uint16_t size; 131094332d3Sopenharmony_ci}; 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_cistruct UsbDescriptorParams { 134094332d3Sopenharmony_ci UsbInterfaceHandle *devHandle; 135094332d3Sopenharmony_ci struct UsbRequest *request; 136094332d3Sopenharmony_ci uint8_t type; 137094332d3Sopenharmony_ci uint8_t index; 138094332d3Sopenharmony_ci void *buf; 139094332d3Sopenharmony_ci uint16_t size; 140094332d3Sopenharmony_ci}; 141094332d3Sopenharmony_ci 142094332d3Sopenharmony_cistruct UsbdService { 143094332d3Sopenharmony_ci struct IDeviceIoService service; 144094332d3Sopenharmony_ci struct HdfDeviceObject *device; 145094332d3Sopenharmony_ci struct UsbdSubscriber *subscriber; 146094332d3Sopenharmony_ci struct UsbSession *session; 147094332d3Sopenharmony_ci struct HdfSList devList; 148094332d3Sopenharmony_ci struct OsalMutex lock; 149094332d3Sopenharmony_ci}; 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_cistruct UsbdRequestSync { 152094332d3Sopenharmony_ci struct HdfSListNode node; 153094332d3Sopenharmony_ci struct UsbRequest *request; 154094332d3Sopenharmony_ci UsbInterfaceHandle *ifHandle; 155094332d3Sopenharmony_ci struct OsalMutex lock; 156094332d3Sopenharmony_ci struct UsbPipeInfo pipe; 157094332d3Sopenharmony_ci struct UsbRequestParams params; 158094332d3Sopenharmony_ci uint8_t endPointAddr; 159094332d3Sopenharmony_ci}; 160094332d3Sopenharmony_ci 161094332d3Sopenharmony_cistruct UsbdRequestASync { 162094332d3Sopenharmony_ci struct HdfSListNode node; 163094332d3Sopenharmony_ci struct HdfSListNode qNode; 164094332d3Sopenharmony_ci UsbInterfaceHandle *ifHandle; 165094332d3Sopenharmony_ci struct RequestMsg reqMsg; 166094332d3Sopenharmony_ci struct OsalMutex lock; 167094332d3Sopenharmony_ci struct UsbPipeInfo pipe; 168094332d3Sopenharmony_ci struct UsbRequestParams params; 169094332d3Sopenharmony_ci uint8_t endPointAddr; 170094332d3Sopenharmony_ci uint8_t status; 171094332d3Sopenharmony_ci}; 172094332d3Sopenharmony_ci 173094332d3Sopenharmony_cistruct UsbdSubscriber { 174094332d3Sopenharmony_ci sptr<IUsbdSubscriber> subscriber; 175094332d3Sopenharmony_ci void *impl; 176094332d3Sopenharmony_ci struct HdfDevEventlistener usbPnpListener; 177094332d3Sopenharmony_ci sptr<IRemoteObject> remote; 178094332d3Sopenharmony_ci void *deathRecipient; 179094332d3Sopenharmony_ci}; 180094332d3Sopenharmony_ci} // namespace V1_1 181094332d3Sopenharmony_ci} // namespace Usb 182094332d3Sopenharmony_ci} // namespace HDI 183094332d3Sopenharmony_ci} // namespace OHOS 184094332d3Sopenharmony_ci#endif // USBD_H 185