1 /*
2  * Copyright (c) 2022 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 OHOS_HDI_USB_V1_1_USBD_DISPATCHER_H
17 #define OHOS_HDI_USB_V1_1_USBD_DISPATCHER_H
18 
19 #include "usbd.h"
20 
21 #define HDF_LOG_TAG Usbd
22 
23 #define MAX_BUFF_SIZE         16384
24 #define MAX_CONTROL_BUFF_SIZE 1024
25 #define READ_BUF_SIZE         8192
26 
27 #define USB_CTRL_SET_TIMEOUT         5000
28 #define GET_STRING_SET_TIMEOUT       50
29 #define USB_PIPE_DIR_OFFSET          7
30 #define CHARFORMAT                   8
31 #define USB_REUQEST_SLEEP_TIME       100
32 #define USB_MAX_DESCRIPTOR_SIZE      256
33 #define USB_BULK_CALLBACK_SLEEP_TIME 500
34 #define USB_BULK_CANCEL_SLEEP_TIME   1000
35 
36 #define OPEN_SLEPP_TIME          1
37 #define SUBMIT_SLEEP_TIME        1
38 #define USBD_ASYNC_GETENODE_TIME 1
39 #define USBD_ASYNC_GETENODE_TRY  3
40 
41 #define POS_STEP 3
42 
43 #define MULTIPLE   3
44 
45 #define USB_RECIP_MASK          0x1F
46 #define ENDPOINT_DIRECTION_MASK 0x1
47 #define CMD_TYPE_MASK           0x3
48 
49 #define MAX_REQUESTASYNC_NUM 20
50 
51 constexpr int32_t CMD_OFFSET_5 = 5;
52 constexpr int32_t DIRECTION_OFFSET_7 = 7;
53 constexpr int32_t TYPE_OFFSET_8 = 8;
54 
55 enum UsbdReqNodeStatus {
56     USBD_REQNODE_INIT,
57     USBD_REQNODE_NOUSE,
58     USBD_REQNODE_USE,
59     USBD_REQNODE_OTHER,
60 };
61 
62 namespace OHOS {
63 namespace HDI {
64 namespace Usb {
65 namespace V1_1 {
66 class UsbImpl;
67 class UsbdDispatcher {
68 public:
69     static int32_t UsbdAllocFifo(DataFifo *fifo, uint32_t size);
70     static void UsbdFreeFifo(DataFifo *fifo);
71     static void UsbdReadCallback(UsbRequest *req);
72     static void UsbdWriteCallback(UsbRequest *req);
73     static int32_t UsbControlSetUp(UsbControlParams *controlParams, UsbControlRequest *controlReq);
74     static UsbInterface *GetUsbInterfaceById(const HostDevice *dev, uint8_t interfaceIndex);
75     static int32_t GetInterfacePipe(
76         const HostDevice *dev, UsbInterface *interface, uint8_t pipeAddr, UsbPipeInfo *pipe);
77     static int32_t GetPipe(const HostDevice *dev, uint8_t interfaceId, uint8_t pipeId, UsbPipeInfo *pipe);
78     static void UsbdFreeCtrlPipe(HostDevice *dev);
79     static int32_t UsbdGetCtrlPipe(HostDevice *dev);
80     static UsbdRequestSync *UsbdFindRequestSync(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr);
81     static UsbdRequestSync *UsbdRequestSyncAlloc(void);
82     static void UsbRequestParamsWSyncInit(UsbRequestParams *params, int32_t timeout, const UsbPipeInfo *pipe);
83     static int32_t UsbdRequestSyncInit(
84         HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestSync *requestSync);
85     static int32_t UsbdRequestSyncInitwithLength(HostDevice *port, UsbInterfaceHandle *ifHandle,
86         UsbPipeInfo *pipe, int32_t length, UsbdRequestSync *requestSync);
87     static int32_t UsbdRequestSyncRelease(UsbdRequestSync *requestSync);
88     static void UsbRequestParamsInit(UsbRequestParams *params, int32_t timeout);
89     static int32_t CtrlTranParamGetReqType(HdfSBuf *data, UsbControlParams *pCtrParams, uint32_t requestType);
90     static int32_t CtrlTransferParamInit(HdfSBuf *data, UsbControlParams *pCtrParams, int32_t *timeout);
91     static void UsbdReleaseInterfaces(HostDevice *dev);
92     static void UsbdCloseInterfaces(HostDevice *dev);
93     static int32_t UsbdOpenInterfaces(HostDevice *dev);
94     static void RemoveDevFromService(UsbImpl *service, HostDevice *port);
95     static int32_t UsbdClaimInterfaces(HostDevice *dev);
96     static int32_t ReturnGetPipes(int32_t ret, HostDevice *dev);
97     static int32_t ReturnOpenInterfaces(int32_t ret, HostDevice *dev);
98     static int32_t ReturnClainInterfaces(int32_t ret, HostDevice *dev);
99     static int32_t UsbdInit(HostDevice *dev);
100     static int32_t UsbdRequestASyncRelease(UsbdRequestASync *request);
101     static int32_t UsbdBulkASyncReqRelease(UsbdBulkASyncReqList *list);
102     static int32_t UsbdBulkASyncListRelease(UsbdBulkASyncList *list);
103     static void UsbdRelease(HostDevice *dev);
104     static int32_t UsbdMallocAndFill(uint8_t *&dataAddr, const std::vector<uint8_t> &data);
105     static int32_t FillReqAyncParams(
106         UsbdRequestASync *userData, UsbPipeInfo *pipe,
107         UsbRequestParams *params, const uint8_t *buffer, uint32_t length);
108     static UsbdRequestASync *UsbdRequestASyncAlloc(void);
109     static int32_t UsbdRequestASyncInit(
110         HostDevice *port, UsbInterfaceHandle *ifHandle, UsbPipeInfo *pipe, UsbdRequestASync *request);
111     static UsbdRequestASync *UsbdRequestASyncCreatAndInsert(HostDevice *port, uint8_t interfaceId, uint8_t pipeAddr);
112     static int32_t HostDeviceInit(HostDevice *port);
113     static int32_t HostDeviceCreate(HostDevice **port);
114     static int32_t FunAttachDevice(HostDevice *port, HdfSBuf *data, HdfSBuf *reply);
115     static int32_t UsbdDeviceCreateAndAttach(const sptr<UsbImpl> &service, uint8_t busNum, uint8_t devAddr);
116     static int32_t FunDetachDevice(HostDevice *port, HdfSBuf *data);
117     static int32_t UsbdDeviceDettach(UsbImpl *service, uint8_t busNum, uint8_t devAddr);
118     static HostDevice *UsbdFindDevForBusNum(UsbImpl *service, uint8_t busNum);
119     static int32_t UsbdRemoveBusDev(UsbImpl *service, uint8_t busNum, const sptr<IUsbdSubscriber> &subscriber);
120     static int32_t UsbdBulkASyncReqInit(UsbdBulkASyncReqList *list, UsbdBulkASyncList *pList);
121     static UsbdBulkASyncList *UsbdBulkASyncListAlloc(HostDevice *port, uint8_t ifId, uint8_t epId);
122     static int32_t UsbdBulkASyncReqNodeSetNoUse(UsbdBulkASyncReqNode *db);
123     static UsbdBulkASyncReqNode *UsbdBulkASyncReqGetENode(UsbdBulkASyncReqList *list);
124     static int32_t UsbdBulkReadRemoteCallback(
125         const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle);
126     static int32_t UsbdBulkWriteRemoteCallback(
127         const sptr<IUsbdBulkCallback> &service, int32_t status, UsbdBufferHandle *handle);
128     static int32_t UsbdBulkASyncPutAsmData(UsbdBufferHandle *handle, uint8_t *buffer, uint32_t len);
129     static int32_t UsbdBulkAsyncGetAsmData(UsbdBufferHandle *handle, UsbRequestParams *params, uint16_t maxPacketSize);
130     static int32_t UsbdBulkAsyncGetAsmReqLen(UsbdBufferHandle *handle, uint32_t *reqLen, uint16_t maxPacketSize);
131     static int32_t UsbdBulkASyncReqWriteAutoSubmit(UsbRequest *request);
132     static int32_t UsbdBulkASyncReqReadAutoSubmit(UsbRequest *request);
133     static void UsbdBulkASyncWriteCallbackAutoSubmit(UsbRequest *request);
134     static void UsbdBulkASyncReadCallbackAutoSubmit(UsbRequest *request);
135     static int32_t UsbdBulkASyncReqFillParams(UsbPipeInfo *pipe, UsbRequestParams *params, uint8_t *buffer);
136     static int32_t UsbdBulkASyncReqWriteSubmit(UsbdBulkASyncReqNode *req);
137     static int32_t UsbdBulkASyncReqReadSubmit(UsbdBulkASyncReqNode *db);
138 };
139 } // namespace V1_1
140 } // namespace Usb
141 } // namespace HDI
142 } // namespace OHOS
143 #endif // OHOS_HDI_USB_V1_1_USBD_DISPATCHER_H
144