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 HDF_USB_SERIAL_RAWAPI_H
17#define HDF_USB_SERIAL_RAWAPI_H
18
19#include "data_fifo.h"
20#include "hdf_device_desc.h"
21#include "usb_raw_api.h"
22
23#define USB_MAX_INTERFACES      32
24#define DATARATE                9600
25#define DATA_BITS_LENGTH        8
26#define ACM_NW                  16
27#define ACM_NR                  16
28#define READ_BUF_SIZE           8192
29#define USB_CTRL_SET_TIMEOUT    5000
30#define USB_PIPE_DIR_OFFSET     7
31
32typedef enum {
33    CMD_OPEN_PARM = 0,
34    CMD_CLOSE_PARM,
35    CMD_WRITE_PARM,
36    CMD_READ_PARM,
37    CMD_GET_BAUDRATE,
38    CMD_SET_BAUDRATE,
39    CMD_WRITE_DATA_SYNC,
40    CMD_READ_DATA_SYNC,
41    CMD_CLASS_CTRL_SYNC,
42    CMD_STD_CTRL_GET_DESCRIPTOR_CMD,
43    CMD_STD_CTRL_GET_STATUS_CMD,
44    CMD_STD_CTRL_GET_CONFIGURATION,
45    CMD_STD_CTRL_GET_INTERFACE,
46    CMD_STD_CTRL_GET_DESCRIPTOR_ASYNC,
47    CMD_ADD_INTERFACE,
48    CMD_REMOVE_INTERFACE,
49} SerialOPCmd;
50
51typedef enum {
52    HOST_ACM_SYNC_READ = 1,
53    HOST_ACM_SYNC_WRITE,
54    HOST_ACM_ASYNC_READ,
55    HOST_ACM_ASYNC_WRITE,
56    HOST_ACM_CTRL_READ,
57    HOST_ACM_CTRL_WRITE,
58    HOST_ACM_CTRL_CLASS_SYNC,
59    HOST_ACM_CTRL_GET_STATUS,
60    HOST_ACM_CTRL_SYNC_DESCRIPTOR,
61    HOST_ACM_CTRL_ASYNC_DESCRIPTOR,
62    HOST_ACM_CTRL_GET_CONFIGURATION,
63    HOST_ACM_CTRL_GET_INTERFACE,
64    HOST_ACM_SPEED_TEST,
65    HOST_ACM_SET_BAUDRATE,
66    HOST_ACM_GET_BAUDRATE,
67    HOST_ACM_ADD_INTERFACE,
68    HOST_ACM_REMOVE_INTERFACE,
69} AcmModuleTestCmdType;
70
71typedef enum {
72    USB_RAW_IO_PROCESS_RUNNING,
73    USB_RAW_IO_PROCESS_STOP,
74    USB_RAW_IO_PROCESS_STOPED
75} UsbRawIoProcessStatusType;
76
77struct AcmDevice;
78struct AcmWb {
79    struct UsbRawRequest *request;
80    struct AcmDevice *instance;
81    uint8_t *buf;
82    uint32_t len;
83    int32_t use;
84};
85
86struct AcmRb {
87    uint8_t *base;
88    int32_t size;
89    int32_t index;
90    int32_t use;
91    struct AcmDevice *instance;
92};
93
94struct SerialDevice {
95    struct AcmDevice *acm;
96    struct UsbCdcLineCoding lineCoding;
97    struct OsalMutex lock;
98    struct DataFifo readFifo;
99};
100
101struct UsbEndpoint {
102    uint8_t addr;
103    uint8_t interval;
104    uint16_t maxPacketSize;
105};
106
107struct AcmDevice {
108    struct IDeviceIoService service;
109    struct HdfDeviceObject *device;
110    uint8_t ctrlIface;
111    uint8_t dataIface;
112    struct UsbEndpoint *notifyEp;
113    struct UsbEndpoint *dataInEp;
114    struct UsbEndpoint *dataOutEp;
115    struct UsbRawConfigDescriptor *config;
116    struct AcmWb wb[ACM_NW];
117    struct AcmRb rb[ACM_NR];
118    struct OsalMutex writeLock;
119    struct OsalMutex readLock;
120    struct UsbRawRequest *notifyReq;
121    struct UsbRawRequest *readReq[ACM_NR];
122    struct UsbRawRequest *writeReq;
123    struct UsbRawRequest *ctrlReq;
124    struct OsalMutex lock;
125    UsbRawHandle *devHandle;
126    struct UsbSession *session;
127    struct SerialDevice *port;
128    uint32_t nbIndex;
129    uint32_t nbSize;
130    int32_t transmitting;
131    uint8_t busNum;
132    uint8_t devAddr;
133    uint8_t interfaceCnt;
134    uint8_t *notificationBuffer;
135    uint8_t interfaceIndex[USB_MAX_INTERFACES];
136    struct UsbCdcLineCoding lineCoding;
137    struct OsalThread ioThread;
138    bool initFlag;
139};
140
141#endif /* HDF_USB_SERIAL_RAWAPI_H */
142