1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef USB_TEST_H
10 #define USB_TEST_H
11 
12 #include "data_fifo.h"
13 #include "hdf_device_desc.h"
14 #include "platform_if.h"
15 #include "implementation/global_implementation.h"
16 #include "usb_ddk.h"
17 #include "usb_ddk_interface.h"
18 
19 enum UsbTestCmd {
20     USB_WRITE_TEST = 0,
21     USB_HOSTSDK_INIT_001_TEST,
22     USB_HOSTSDK_EXIT_001_TEST,
23     USB_HOSTSDK_INIT_002_TEST,
24     USB_HOSTSDK_EXIT_002_TEST,
25     USB_HOSTSDK_INIT_003_TEST,
26     USB_HOSTSDK_INIT_004_TEST,
27     USB_HOSTSDK_INIT_005_TEST,
28     USB_HOSTSDK_CLAIM_INTERFACE_001_TEST,
29     USB_HOSTSDK_RELEASE_INTERFACE_001_TEST,
30     USB_HOSTSDK_CLAIM_INTERFACE_002_TEST,
31     USB_HOSTSDK_RELEASE_INTERFACE_002_TEST,
32     USB_HOSTSDK_CLAIM_INTERFACE_003_TEST,
33     USB_HOSTSDK_RELEASE_INTERFACE_003_TEST,
34     USB_HOSTSDK_CLAIM_INTERFACE_004_TEST,
35     USB_HOSTSDK_CLAIM_INTERFACE_005_TEST,
36     USB_HOSTSDK_CLAIM_INTERFACE_006_TEST,
37     USB_HOSTSDK_OPEN_INTERFACE_001_TEST,
38     USB_HOSTSDK_CLOSE_INTERFACE_001_TEST,
39     USB_HOSTSDK_OPEN_INTERFACE_002_TEST,
40     USB_HOSTSDK_CLOSE_INTERFACE_002_TEST,
41     USB_HOSTSDK_OPEN_INTERFACE_003_TEST,
42     USB_HOSTSDK_CLOSE_INTERFACE_003_TEST,
43     USB_HOSTSDK_OPEN_INTERFACE_004_TEST,
44     USB_HOSTSDK_OPEN_INTERFACE_005_TEST,
45     USB_HOSTSDK_CLOSE_INTERFACE_005_TEST,
46     USB_HOSTSDK_OPEN_INTERFACE_006_TEST,
47     USB_HOSTSDK_SELECT_INTERFACE_001_TEST,
48     USB_HOSTSDK_SELECT_INTERFACE_002_TEST,
49     USB_HOSTSDK_SELECT_INTERFACE_003_TEST,
50     USB_HOSTSDK_SELECT_INTERFACE_004_TEST,
51     USB_HOSTSDK_SELECT_INTERFACE_005_TEST,
52     USB_HOSTSDK_SELECT_INTERFACE_006_TEST,
53     USB_HOSTSDK_CLAIM_INTERFACE_007_TEST,
54     USB_HOSTSDK_CLAIM_INTERFACE_008_TEST,
55     USB_HOSTSDK_GET_PIPE_001_TEST,
56     USB_HOSTSDK_GET_PIPE_002_TEST,
57     USB_HOSTSDK_GET_PIPE_003_TEST,
58     USB_HOSTSDK_GET_PIPE_004_TEST,
59     USB_HOSTSDK_GET_PIPE_005_TEST,
60     USB_HOSTSDK_GET_PIPE_006_TEST,
61     USB_HOSTSDK_GET_PIPE_007_TEST,
62     USB_HOSTSDK_GET_PIPE_008_TEST,
63     USB_HOSTSDK_ALLOC_REQUEST_001_TEST,
64     USB_HOSTSDK_ALLOC_REQUEST_002_TEST,
65     USB_HOSTSDK_FREE_REQUEST_001_TEST,
66     USB_HOSTSDK_ALLOC_REQUEST_003_TEST,
67     USB_HOSTSDK_ALLOC_REQUEST_004_TEST,
68     USB_HOSTSDK_FREE_REQUEST_002_TEST,
69     USB_HOSTSDK_ALLOC_REQUEST_005_TEST,
70     USB_HOSTSDK_ALLOC_REQUEST_006_TEST,
71     USB_HOSTSDK_FREE_REQUEST_003_TEST,
72     USB_HOSTSDK_ALLOC_REQUEST_007_TEST,
73     USB_HOSTSDK_ALLOC_REQUEST_008_TEST,
74 
75     USB_HOSTSDK_ALLOC_REQUEST_010_TEST,
76     USB_HOSTSDK_ALLOC_REQUEST_011_TEST,
77     USB_HOSTSDK_FREE_REQUEST_006_TEST,
78     USB_HOSTSDK_FILL_ISO_REQUEST_001_TEST,
79     USB_HOSTSDK_FILL_ISO_REQUEST_002_TEST,
80     USB_HOSTSDK_FILL_ISO_REQUEST_003_TEST,
81     USB_HOSTSDK_FILL_ISO_REQUEST_004_TEST,
82     USB_HOSTSDK_FILL_ISO_REQUEST_005_TEST,
83     USB_HOSTSDK_FILL_ISO_REQUEST_006_TEST,
84 
85     USB_HOSTSDK_FREE_REQUEST_004_TEST,
86     USB_HOSTSDK_ALLOC_REQUEST_009_TEST,
87     USB_HOSTSDK_FILL_REQUEST_001_TEST,
88     USB_HOSTSDK_FILL_REQUEST_002_TEST,
89     USB_HOSTSDK_FILL_REQUEST_003_TEST,
90     USB_HOSTSDK_FILL_REQUEST_004_TEST,
91     USB_HOSTSDK_SUBMIT_REQUEST_SYNC_001_TEST,
92     USB_HOSTSDK_SUBMIT_REQUEST_SYNC_002_TEST,
93     USB_HOSTSDK_SUBMIT_REQUEST_SYNC_003_TEST,
94     USB_HOSTSDK_SUBMIT_REQUEST_SYNC_004_TEST,
95     USB_HOSTSDK_FILL_REQUEST_005_TEST,
96     USB_HOSTSDK_FILL_REQUEST_006_TEST,
97     USB_HOSTSDK_FILL_REQUEST_007_TEST,
98     USB_HOSTSDK_FILL_REQUEST_008_TEST,
99     USB_HOSTSDK_SUBMIT_REQUEST_ASYNC_001_TEST,
100     USB_HOSTSDK_SUBMIT_CANCEL_REQUEST_001_TEST,
101     USB_HOSTSDK_SUBMIT_REQUEST_ASYNC_002_TEST,
102     USB_HOSTSDK_SUBMIT_CANCEL_REQUEST_002_TEST,
103     USB_HOSTSDK_SUBMIT_REQUEST_ASYNC_003_TEST,
104     USB_HOSTSDK_SUBMIT_CANCEL_REQUEST_003_TEST,
105     USB_HOSTSDK_SUBMIT_REQUEST_ASYNC_004_TEST,
106     USB_HOSTSDK_SUBMIT_CANCEL_REQUEST_004_TEST,
107     USB_HOSTSDK_CLEAR_INTERFACE_HALT_002_TEST,
108     USB_HOSTSDK_CLEAR_INTERFACE_HALT_003_TEST,
109     USB_HOSTSDK_CLEAR_INTERFACE_HALT_004_TEST,
110     USB_HOSTSDK_REMOVE_INTERFACE_001_TEST,
111     USB_HOSTSDK_ADD_INTERFACE_001_TEST,
112     USB_HOSTSDK_REMOVE_INTERFACE_002_TEST,
113     USB_HOSTSDK_ADD_INTERFACE_002_TEST,
114     USB_HOSTSDK_REMOVE_INTERFACE_003_TEST,
115     USB_HOSTSDK_ADD_INTERFACE_003_TEST,
116     USB_HOSTSDK_CLOSE_INTERFACE_006_TEST,
117 };
118 
119 #define TARGET_MASK             0x3
120 #define REQUEST_TYPE_MASK       0x3
121 
122 #define DATARATE                9600
123 #define DATA_BITS_LENGTH        8
124 #define ACM_NW                  16
125 #define ACM_NR                  16
126 #define READ_BUF_SIZE           8192
127 #define DIRECTION_MASK          0x1
128 #define USB_CTRL_SET_TIMEOUT    5000
129 #define USB_PIPE_DIR_OFFSET     7
130 #define USB_DEVICE_VENDOR_ID    0x12D1
131 #define USB_DEVICE_PRODUCT_ID   0x5000
132 #define USB_MAX_BYTE            255
133 
134 struct AcmDevice;
135 
136 struct AcmWb {
137     struct UsbRequest *request;
138     struct AcmDevice *instance;
139     uint8_t *buf;
140     uint32_t len;
141     int32_t use;
142 };
143 
144 struct AcmRb {
145     uint8_t *base;
146     int32_t size;
147     int32_t index;
148     int32_t use;
149     struct AcmDevice *instance;
150 };
151 
152 struct SerialDevice {
153     struct AcmDevice *acm;
154     struct UsbCdcLineCoding lineCoding;
155     struct OsalMutex lock;
156     struct DataFifo readFifo;
157 };
158 
159 struct AcmDevice {
160     struct IDeviceIoService service;
161     struct HdfDeviceObject *device;
162     struct UsbInterface *ctrIface;
163     struct UsbInterface *intIface;
164     struct UsbInterface *dataIface;
165     struct UsbPipeInfo *ctrPipe;
166     struct UsbPipeInfo *intPipe;
167     struct UsbPipeInfo *dataInPipe;
168     struct UsbPipeInfo *dataOutPipe;
169     struct UsbPipeInfo *isoPipe;
170     struct AcmWb wb[ACM_NW];
171     struct AcmRb rb[ACM_NR];
172     struct UsbPipeInfo wPipeInfo;
173     struct OsalMutex writeLock;
174     struct OsalMutex readLock;
175     uint8_t *notificationBuffer;
176     struct UsbRequest *notifyReq;
177     struct UsbRequest *readReq[ACM_NR];
178     struct UsbRequest *writeReq;
179     struct UsbRequest *ctrlReq;
180     struct UsbRequest *isoReq;
181     struct OsalMutex lock;
182     struct UsbInterface *itface;
183     UsbInterfaceHandle *devHandle;
184     UsbInterfaceHandle *data_devHandle;
185     UsbInterfaceHandle *ctrl_devHandle;
186     UsbInterfaceHandle *int_devHandle;
187     UsbInterfaceHandle *iso_devHandle;
188     struct UsbSession *session;
189     struct SerialDevice *port;
190     uint32_t nbIndex;
191     uint32_t nbSize;
192     int32_t transmitting;
193     int32_t ctrlReqNum;
194     uint8_t busNum;
195     uint8_t devAddr;
196     uint8_t interfaceIndex;
197     uint32_t ctrlSize;
198     uint32_t intSize;
199     uint32_t writeSize;
200     uint32_t readSize;
201     struct UsbCdcLineCoding lineCoding;
202 };
203 
204 struct UsbTest {
205     struct IDeviceIoService service;
206     struct HdfDeviceObject *device;
207     int32_t (*TestEntry)(struct UsbTest *test, int32_t cmd);
208     uint32_t port;
209     uint32_t len;
210     uint8_t *wbuf;
211     uint8_t *rbuf;
212     DevHandle handle;
213 };
214 
215 struct TestControlMsgData {
216     uint8_t request;
217     uint8_t requestType;
218     uint16_t value;
219     uint16_t index;
220     void *data;
221     uint16_t size;
222 };
223 
224 
225 struct UsbTestFunc {
226     enum UsbTestCmd type;
227     int32_t (*Func)(void);
228 };
229 
230 #define BITS_PER_WORD   10
231 #define MAX_SPEED_HZ    10000000
232 #define USB_LOOP_NUM    100
233 #define USB_ISO_PACKAT_CNT 16
234 
235 #define USB_RAW_REQUEST_TIME_ZERO_MS 0
236 
237 int32_t UsbTestEntry(int32_t cmd);
238 #endif /* USB_TEST_H */
239