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