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_HOST_SDK_RAW_SPEED_H
17 #define USB_HOST_SDK_RAW_SPEED_H
18 
19 #include "hdf_base.h"
20 #include "hdf_device_desc.h"
21 #include "osal_atomic.h"
22 #include "usb_raw_api.h"
23 #include "data_fifo.h"
24 
25 #define TEST_LENGTH             512
26 #define TEST_CYCLE              30
27 #define TEST_TIME               0xffffffff
28 #define TEST_PRINT_TIME         2
29 #define TEST_PRINT_TIME_UINT    1000
30 #define TEST_RECV_COUNT         10000
31 #define TEST_BYTE_COUNT         1024
32 #define TEST_FLOAT_COUNT        (1.0)
33 #define TEST_SLEEP_TIME         10
34 
35 #define TEST_WRITE              true
36 #define TEST_READ               false
37 #define USB_MAX_INTERFACES      32
38 #define DATARATE                9600
39 #define DATA_BITS_LENGTH        8
40 #define ACM_NW                  30
41 #define ACM_NR                  30
42 #define READ_BUF_SIZE           8192
43 #define USB_CTRL_SET_TIMEOUT    0
44 #define USB_PIPE_DIR_OFFSET     7
45 
46 typedef enum {
47     TEST_ZERO_TYPE = 0,
48     TEST_ONE_TYPE,
49     TEST_TWO_TYPE,
50     TEST_THREE_TYPE,
51     TEST_FOUR_TYPE,
52     TEST_FIVE_TYPE,
53     TEST_SIX_TYPE,
54 } TestCountType;
55 
56 typedef enum {
57     CMD_OPEN_PARM = 0,
58     CMD_CLOSE_PARM,
59     CMD_WRITE_PARM,
60     CMD_READ_PARM,
61     CMD_GET_BAUDRATE,
62     CMD_SET_BAUDRATE,
63     CMD_WRITE_DATA_SYNC,
64     CMD_READ_DATA_SYNC,
65     CMD_CLASS_CTRL_SYNC,
66     CMD_STD_CTRL_GET_DESCRIPTOR_CMD,
67     CMD_STD_CTRL_GET_STATUS_CMD,
68     CMD_STD_CTRL_GET_CONFIGURATION,
69     CMD_STD_CTRL_GET_INTERFACE,
70     CMD_STD_CTRL_GET_DESCRIPTOR_ASYNC,
71     CMD_ADD_INTERFACE,
72     CMD_REMOVE_INTERFACE,
73 } SerialOPCmd;
74 
75 struct AcmDevice;
76 struct AcmDb {
77     struct UsbRawRequest *request;
78     struct AcmDevice *instance;
79     uint8_t *buf;
80     int32_t len;
81     int32_t use;
82 };
83 
84 struct SerialDevice {
85     struct AcmDevice *acm;
86     struct UsbCdcLineCoding lineCoding;
87     struct OsalMutex lock;
88     struct DataFifo readFifo;
89 };
90 
91 struct UsbEndpoint {
92     uint8_t addr;
93     uint8_t interval;
94     uint16_t maxPacketSize;
95 };
96 
97 struct AcmDevice {
98     struct IDeviceIoService service;
99     struct HdfDeviceObject *device;
100     uint8_t ctrlIface;
101     uint8_t dataIface;
102     struct UsbEndpoint *notifyEp;
103     struct UsbEndpoint *dataInEp;
104     struct UsbEndpoint *dataOutEp;
105     struct UsbEndpoint *dataEp;
106     struct UsbRawConfigDescriptor *config;
107     struct AcmDb db[TEST_CYCLE];
108     struct OsalMutex writeLock;
109     struct OsalMutex readLock;
110     struct UsbRawRequest *notifyReq;
111     struct UsbRawRequest *readReq[ACM_NR];
112     struct UsbRawRequest *writeReq;
113     struct UsbRawRequest *ctrlReq;
114     uint32_t dataSize;
115     struct OsalMutex lock;
116     UsbRawHandle *devHandle;
117     struct UsbSession *session;
118     struct SerialDevice *port;
119     uint32_t nbIndex;
120     uint32_t nbSize;
121     int32_t transmitting;
122     uint8_t busNum;
123     uint8_t devAddr;
124     uint8_t interfaceCnt;
125     uint8_t *notificationBuffer;
126     uint8_t interfaceIndex[USB_MAX_INTERFACES];
127     struct UsbCdcLineCoding lineCoding;
128     struct OsalThread ioThread;
129     struct OsalThread ioSendThread;
130 };
131 
132 #endif /* USB_HOST_SDK_RAW_SPEED_H */
133